* feat: add .npmrc support for private npm registries Add a new `npmrc` instance setting that accepts full .npmrc file content for configuring private npm registries. Works with bun (native .npmrc support since 1.1.18), deno (native .npmrc support in 2.x), and the npm proxy (parses default registry + auth token from .npmrc). Legacy `npm_config_registry` and `bunfig_install_scopes` fields are now hidden when empty, so new users only see the .npmrc field. Also fixes a pre-existing race condition where gen_bunfig was called after start_child_process. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * all --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
232 lines
8.3 KiB
YAML
232 lines
8.3 KiB
YAML
name: Backend only integration tests
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- "main"
|
|
paths:
|
|
- "backend/**"
|
|
- ".github/workflows/backend-test.yml"
|
|
pull_request:
|
|
types: [opened, synchronize, reopened]
|
|
paths:
|
|
- "backend/**"
|
|
- ".github/workflows/backend-test.yml"
|
|
|
|
defaults:
|
|
run:
|
|
working-directory: ./backend
|
|
|
|
jobs:
|
|
cargo_test:
|
|
runs-on: ubicloud-standard-16
|
|
services:
|
|
postgres:
|
|
image: postgres
|
|
ports:
|
|
- 5432:5432
|
|
env:
|
|
POSTGRES_DB: windmill
|
|
POSTGRES_PASSWORD: changeme
|
|
POSTGRES_INITDB_ARGS: "-c max_connections=500"
|
|
options: >-
|
|
--health-cmd pg_isready --health-interval 10s --health-timeout 5s
|
|
--health-retries 5 --shm-size=256mb
|
|
mysql:
|
|
image: mysql:8.0
|
|
ports:
|
|
- 3306:3306
|
|
env:
|
|
MYSQL_ROOT_PASSWORD: changeme
|
|
MYSQL_DATABASE: windmill_test
|
|
options: >-
|
|
--health-cmd "mysqladmin ping -h localhost" --health-interval 10s
|
|
--health-timeout 5s --health-retries 5
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-dotnet@v4
|
|
with:
|
|
dotnet-version: "9.0.x"
|
|
- uses: denoland/setup-deno@v2
|
|
with:
|
|
deno-version: v2.x
|
|
- uses: actions/setup-go@v2
|
|
with:
|
|
go-version: 1.21.5
|
|
- uses: oven-sh/setup-bun@v2
|
|
with:
|
|
bun-version: 1.3.8
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: "20"
|
|
- uses: astral-sh/setup-uv@v6.2.1
|
|
with:
|
|
version: "0.9.24"
|
|
- uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: "8.3"
|
|
tools: composer
|
|
- uses: ruby/setup-ruby@v1
|
|
with:
|
|
ruby-version: "3.3"
|
|
bundler-cache: false
|
|
- name: Install PowerShell, mold and clang
|
|
run: |
|
|
sudo apt-get update && sudo apt-get install -y powershell mold clang libcurl4-openssl-dev
|
|
working-directory: /
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
with:
|
|
cache: false
|
|
toolchain: 1.93.0
|
|
- name: Read EE repo commit hash
|
|
run: |
|
|
echo "ee_repo_ref=$(cat ./ee-repo-ref.txt)" >> "$GITHUB_ENV"
|
|
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
repository: windmill-labs/windmill-ee-private
|
|
path: ./windmill-ee-private
|
|
ref: ${{ env.ee_repo_ref }}
|
|
token: ${{ secrets.WINDMILL_EE_PRIVATE_ACCESS }}
|
|
fetch-depth: 0
|
|
|
|
- name: Substitute EE code (EE logic is behind feature flag)
|
|
run: |
|
|
./substitute_ee_code.sh --copy --dir ./windmill-ee-private
|
|
- name: Setup private npm registry with test package
|
|
working-directory: /tmp
|
|
run: |
|
|
set -e
|
|
|
|
# Install Verdaccio globally
|
|
npm install -g verdaccio
|
|
|
|
# Create Verdaccio config that requires authentication for @windmill-test packages
|
|
mkdir -p /tmp/verdaccio/storage
|
|
cat > /tmp/verdaccio/config.yaml << 'VERDACCIO_CONFIG'
|
|
storage: /tmp/verdaccio/storage
|
|
auth:
|
|
htpasswd:
|
|
file: /tmp/verdaccio/htpasswd
|
|
max_users: 100
|
|
uplinks:
|
|
npmjs:
|
|
url: https://registry.npmjs.org/
|
|
packages:
|
|
'@windmill-test/*':
|
|
access: $authenticated
|
|
publish: $authenticated
|
|
'@*/*':
|
|
access: $all
|
|
publish: $authenticated
|
|
proxy: npmjs
|
|
'**':
|
|
access: $all
|
|
publish: $authenticated
|
|
proxy: npmjs
|
|
server:
|
|
keepAliveTimeout: 60
|
|
middlewares:
|
|
audit:
|
|
enabled: true
|
|
log: { type: stdout, format: pretty, level: warn }
|
|
VERDACCIO_CONFIG
|
|
|
|
# Create empty htpasswd file (users will be created via API)
|
|
touch /tmp/verdaccio/htpasswd
|
|
|
|
# Start Verdaccio in background
|
|
verdaccio --config /tmp/verdaccio/config.yaml &
|
|
VERDACCIO_PID=$!
|
|
|
|
# Wait for Verdaccio to be ready
|
|
echo "Waiting for Verdaccio to start..."
|
|
for i in {1..30}; do
|
|
if curl -s http://localhost:4873/-/ping > /dev/null 2>&1; then
|
|
echo "Verdaccio is ready"
|
|
break
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
# Login to get a token
|
|
echo "Getting auth token..."
|
|
RESPONSE=$(curl -s -X PUT \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"name":"testuser","password":"testpass123"}' \
|
|
http://localhost:4873/-/user/org.couchdb.user:testuser)
|
|
|
|
echo "Auth response: $RESPONSE"
|
|
NPM_TOKEN=$(echo "$RESPONSE" | jq -r '.token')
|
|
|
|
if [ -z "$NPM_TOKEN" ] || [ "$NPM_TOKEN" = "null" ]; then
|
|
echo "Failed to get NPM token from response"
|
|
exit 1
|
|
fi
|
|
|
|
echo "NPM_TOKEN=${NPM_TOKEN}" >> $GITHUB_ENV
|
|
{
|
|
echo "TEST_NPMRC<<NPMRC_EOF"
|
|
echo "@windmill-test:registry=http://localhost:4873/"
|
|
echo "//localhost:4873/:_authToken=${NPM_TOKEN}"
|
|
echo "NPMRC_EOF"
|
|
} >> $GITHUB_ENV
|
|
echo "Got NPM token successfully: ${NPM_TOKEN:0:10}..."
|
|
|
|
# Configure npm globally with the auth token
|
|
echo "//localhost:4873/:_authToken=${NPM_TOKEN}" > ~/.npmrc
|
|
echo "Configured ~/.npmrc with auth token"
|
|
|
|
# Create a simple test package
|
|
mkdir -p /tmp/windmill-test-private-pkg
|
|
cat > /tmp/windmill-test-private-pkg/package.json << 'PKG_JSON'
|
|
{
|
|
"name": "@windmill-test/private-pkg",
|
|
"version": "1.0.0",
|
|
"main": "index.js"
|
|
}
|
|
PKG_JSON
|
|
cat > /tmp/windmill-test-private-pkg/index.js << 'PKG_JS'
|
|
module.exports.greet = (name) => `Hello from private package, ${name}!`;
|
|
PKG_JS
|
|
|
|
# Publish to Verdaccio with auth
|
|
cd /tmp/windmill-test-private-pkg
|
|
echo "Publishing package..."
|
|
npm publish --registry http://localhost:4873
|
|
echo "Package published successfully"
|
|
|
|
# Verify the package requires auth by trying anonymous access (should fail)
|
|
rm -f ~/.npmrc
|
|
echo "Testing anonymous access (should fail)..."
|
|
if npm view @windmill-test/private-pkg --registry http://localhost:4873 2>/dev/null; then
|
|
echo "ERROR: Package should require authentication but anonymous access worked"
|
|
exit 1
|
|
fi
|
|
echo "Verified: Package requires authentication for @windmill-test/private-pkg"
|
|
- name: Cache DuckDB FFI module build
|
|
uses: actions/cache@v3
|
|
with:
|
|
path: ./backend/windmill-duckdb-ffi-internal/target
|
|
key: ${{ runner.os }}-duckdb-ffi-${{ hashFiles('./backend/windmill-duckdb-ffi-internal/src/**/*.rs', './backend/windmill-duckdb-ffi-internal/Cargo.toml', './backend/windmill-duckdb-ffi-internal/Cargo.lock') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-duckdb-ffi-
|
|
- name: cargo test
|
|
timeout-minutes: 30
|
|
env:
|
|
SQLX_OFFLINE: true
|
|
DATABASE_URL: postgres://postgres:changeme@localhost:5432/windmill
|
|
DISABLE_EMBEDDING: true
|
|
RUST_LOG: "off"
|
|
RUST_LOG_STYLE: never
|
|
CARGO_NET_GIT_FETCH_WITH_CLI: true
|
|
CARGO_BUILD_JOBS: 12
|
|
WMDEBUG_FORCE_V0_WORKSPACE_DEPENDENCIES: 1
|
|
WMDEBUG_FORCE_RUNNABLE_SETTINGS_V0: 1
|
|
WMDEBUG_FORCE_NO_LEGACY_DEBOUNCING_COMPAT: 1
|
|
TEST_NPM_REGISTRY: "http://localhost:4873/:_authToken=${{ env.NPM_TOKEN }}"
|
|
run: |
|
|
deno --version && bun -v && node --version && go version && python3 --version && php --version && ruby --version && pwsh --version && dotnet --version
|
|
cd windmill-duckdb-ffi-internal && ./build_dev.sh && cd ..
|
|
DENO_PATH=$(which deno) BUN_PATH=$(which bun) NODE_BIN_PATH=$(which node) GO_PATH=$(which go) UV_PATH=$(which uv) PHP_PATH=$(which php) COMPOSER_PATH=$(which composer) RUBY_PATH=$(which ruby) RUBY_BUNDLE_PATH=$(which bundle) RUBY_GEM_PATH=$(which gem) POWERSHELL_PATH=$(which pwsh) DOTNET_PATH=$(which dotnet) cargo test --features enterprise,deno_core,duckdb,license,python,rust,scoped_cache,parquet,private,private_registry_test,csharp,php,ruby,mysql,quickjs,mcp --all -- --nocapture --test-threads=10
|