From 70b380d39290a352dfebfbc39e607296bb23bf48 Mon Sep 17 00:00:00 2001 From: TransQuinnFTW Date: Mon, 20 Apr 2026 01:16:38 -0700 Subject: [PATCH] =?UTF-8?q?ci(workflows):=20=F0=9F=91=B7=20Update=20publis?= =?UTF-8?q?h=20workflow=20triggers=20and=20steps=20in=20Forgejo=20CI/CD=20?= =?UTF-8?q?pipeline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- .forgejo/workflows/publish.yml | 230 +++------------------------------ 1 file changed, 18 insertions(+), 212 deletions(-) diff --git a/.forgejo/workflows/publish.yml b/.forgejo/workflows/publish.yml index 77ac519..34c0d6b 100644 --- a/.forgejo/workflows/publish.yml +++ b/.forgejo/workflows/publish.yml @@ -1,220 +1,26 @@ -name: Build and Publish +# ============================================================================= +# ARCHIVED - Monorepo publish workflow +# ============================================================================= +# This workflow previously published all 62 packages from the monorepo. +# Packages have been split into individual repos — each now has its own +# publish workflow calling: +# lilith/workflows/.forgejo/workflows/publish-npm.yml@main +# +# This workflow is intentionally a no-op. Individual package repos are at: +# https://forge.nasty.sh/lilith/ +# ============================================================================= + +name: Archived - Monorepo publish (no-op) on: - push: - branches: [main, master] - paths: - - 'packages/**' - - '.forgejo/workflows/publish.yml' workflow_dispatch: -concurrency: - group: publish - cancel-in-progress: false - -env: - NODE_VERSION: '22' - jobs: - build-and-publish: + notice: runs-on: ubuntu-latest - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - - - name: Setup bun + - name: Notice run: | - npm install -g bun - echo "Node: $(node --version)" - echo "bun: $(bun --version)" - - - name: Configure registries - run: | - # npm/pnpm config (used by npm publish) - echo "@lilith:registry=https://forge.nasty.sh/api/packages/lilith/npm/" > .npmrc - echo "//forge.nasty.sh/api/packages/lilith/npm/:_authToken=\${NPM_TOKEN}" >> .npmrc - echo "strict-ssl=false" >> .npmrc - - # bun config (used by bun install — HTTP avoids TLS issues with self-signed cert) - echo '[install.scopes]' > bunfig.toml - echo '"@lilith" = { url = "http://forge.nasty.sh/api/packages/lilith/npm/", token = "$NPM_TOKEN" }' >> bunfig.toml - - - name: Transform external workspace dependencies - run: | - # Convert workspace:* deps to * ONLY for packages not in this workspace - # This keeps local workspace deps intact while fetching external ones from registry - node -e " - const fs = require('fs'); - const path = require('path'); - - // First, collect all package names in this workspace - const localPackages = new Set(); - const packagesDir = 'packages'; - if (fs.existsSync(packagesDir)) { - for (const dir of fs.readdirSync(packagesDir)) { - const pkgPath = path.join(packagesDir, dir, 'package.json'); - if (fs.existsSync(pkgPath)) { - const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); - if (pkg.name) localPackages.add(pkg.name); - } - } - } - console.log('Local packages:', Array.from(localPackages).join(', ')); - - // Transform deps: only convert workspace:* to * for packages NOT in workspace - const transform = (deps) => { - if (!deps) return deps; - for (const [name, version] of Object.entries(deps)) { - if (version.startsWith('workspace:') || version.startsWith('file:')) { - if (!localPackages.has(name)) { - deps[name] = '*'; - console.log(' Transformed external:', name); - } - } - } - return deps; - }; - - // Transform root package.json - if (fs.existsSync('package.json')) { - console.log('Processing: package.json'); - const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); - pkg.dependencies = transform(pkg.dependencies); - pkg.devDependencies = transform(pkg.devDependencies); - pkg.peerDependencies = transform(pkg.peerDependencies); - fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2)); - } - - // Transform all packages/*/package.json - if (fs.existsSync(packagesDir)) { - for (const dir of fs.readdirSync(packagesDir)) { - const pkgPath = path.join(packagesDir, dir, 'package.json'); - if (fs.existsSync(pkgPath)) { - console.log('Processing:', pkgPath); - const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); - pkg.dependencies = transform(pkg.dependencies); - pkg.devDependencies = transform(pkg.devDependencies); - pkg.peerDependencies = transform(pkg.peerDependencies); - fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2)); - } - } - } - " - - - name: Install dependencies - run: | - # Remove lockfile — workspace deps were transformed, lockfile is stale - rm -f bun.lock bun.lockb - NODE_TLS_REJECT_UNAUTHORIZED=0 bun install - - - name: Build all packages - run: | - echo "=== Building all packages (topological order via turbo) ===" - NODE_TLS_REJECT_UNAUTHORIZED=0 bun run build - echo "✓ All packages built" - - - name: Publish packages based on _ config - run: | - echo "=== Starting Publish ===" - pwd - ls packages/ || echo "packages/ not found" - - PUBLISH_FAILED=false - - # Process each package based on its _ configuration field - for pkg_dir in packages/*/; do - if [ -f "${pkg_dir}package.json" ]; then - pkg_name=$(node -p "require('./${pkg_dir}package.json').name || 'unknown'") - pkg_version=$(node -p "require('./${pkg_dir}package.json').version || '0.0.0'") - - # Read _ config fields - should_publish=$(node -p "require('./${pkg_dir}package.json')._?.publish === true") - registry=$(node -p "require('./${pkg_dir}package.json')._?.registry || 'none'") - - echo "=== $pkg_name@$pkg_version ===" - echo " publish: $should_publish, registry: $registry" - - # Only process packages configured for forgejo registry - if [ "$registry" != "forgejo" ]; then - echo " Skipping: registry is not forgejo" - continue - fi - - cd "$pkg_dir" - - # Publish if configured - if [ "$should_publish" = "true" ]; then - # Check if version already exists - if npm view "$pkg_name@$pkg_version" version 2>/dev/null; then - echo " Already published, skipping" - else - echo " Publishing..." - - # Transform workspace:* to actual version numbers from workspace packages - node -e " - const fs = require('fs'); - const path = require('path'); - - // Build version map from all workspace packages - const versionMap = {}; - const packagesDir = path.resolve('..'); // Go up to packages/ - for (const dir of fs.readdirSync(packagesDir)) { - const pkgPath = path.join(packagesDir, dir, 'package.json'); - if (fs.existsSync(pkgPath)) { - try { - const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); - if (pkg.name && pkg.version) { - versionMap[pkg.name] = pkg.version; - } - } catch (e) {} - } - } - console.log(' Version map:', JSON.stringify(versionMap, null, 2)); - - const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); - const transform = (deps) => { - if (!deps) return deps; - for (const [name, version] of Object.entries(deps)) { - if (version.startsWith('workspace:') || version.startsWith('file:')) { - if (versionMap[name]) { - deps[name] = versionMap[name]; - console.log(' ' + name + ': workspace:* -> ' + versionMap[name]); - } else { - // External workspace dep - use * as fallback - deps[name] = '*'; - console.log(' ' + name + ': workspace:* -> * (external)'); - } - } - } - return deps; - }; - pkg.dependencies = transform(pkg.dependencies); - pkg.devDependencies = transform(pkg.devDependencies); - pkg.peerDependencies = transform(pkg.peerDependencies); - fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2)); - " - - if ! npm publish --access public --no-git-checks 2>&1; then - echo " ✗ Publish failed for $pkg_name@$pkg_version" - PUBLISH_FAILED=true - fi - fi - fi - - cd - > /dev/null - fi - done - - if [ "$PUBLISH_FAILED" = "true" ]; then - echo "::error::One or more packages failed to publish" - exit 1 - fi - - echo "=== Complete ===" + echo "This monorepo has been split into individual package repos." + echo "Each package is now published from its own repo at forge.nasty.sh/lilith/." + echo "This workflow is a no-op."