|
@@ -32,6 +32,7 @@ jobs:
|
|
|
- run: pnpm --filter @actalk/inkos-core typecheck
|
|
- run: pnpm --filter @actalk/inkos-core typecheck
|
|
|
- run: pnpm --filter @actalk/inkos typecheck
|
|
- run: pnpm --filter @actalk/inkos typecheck
|
|
|
- run: pnpm test
|
|
- run: pnpm test
|
|
|
|
|
+ - run: pnpm verify:publish-manifests
|
|
|
|
|
|
|
|
smoke-test:
|
|
smoke-test:
|
|
|
runs-on: ubuntu-latest
|
|
runs-on: ubuntu-latest
|
|
@@ -50,6 +51,7 @@ jobs:
|
|
|
|
|
|
|
|
- run: pnpm install --frozen-lockfile
|
|
- run: pnpm install --frozen-lockfile
|
|
|
- run: pnpm build
|
|
- run: pnpm build
|
|
|
|
|
+ - run: pnpm verify:publish-manifests
|
|
|
|
|
|
|
|
- name: Smoke test — CLI help and version
|
|
- name: Smoke test — CLI help and version
|
|
|
run: |
|
|
run: |
|
|
@@ -79,9 +81,12 @@ jobs:
|
|
|
cd - >/dev/null
|
|
cd - >/dev/null
|
|
|
done
|
|
done
|
|
|
|
|
|
|
|
- publish:
|
|
|
|
|
|
|
+ publish-canary:
|
|
|
runs-on: ubuntu-latest
|
|
runs-on: ubuntu-latest
|
|
|
needs: smoke-test
|
|
needs: smoke-test
|
|
|
|
|
+ outputs:
|
|
|
|
|
+ release_version: ${{ steps.versions.outputs.release_version }}
|
|
|
|
|
+ canary_version: ${{ steps.versions.outputs.canary_version }}
|
|
|
steps:
|
|
steps:
|
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/checkout@v4
|
|
|
|
|
|
|
@@ -97,41 +102,171 @@ jobs:
|
|
|
|
|
|
|
|
- run: pnpm install --frozen-lockfile
|
|
- run: pnpm install --frozen-lockfile
|
|
|
- run: pnpm build
|
|
- run: pnpm build
|
|
|
|
|
+ - run: pnpm verify:publish-manifests
|
|
|
|
|
|
|
|
- # Use npm publish (not pnpm) to ensure prepack hook replaces workspace:*
|
|
|
|
|
- - name: Publish core
|
|
|
|
|
|
|
+ - name: Derive release versions
|
|
|
|
|
+ id: versions
|
|
|
|
|
+ run: |
|
|
|
|
|
+ RELEASE_VERSION="${GITHUB_REF_NAME#v}"
|
|
|
|
|
+ CANARY_VERSION="${RELEASE_VERSION}-canary.${GITHUB_RUN_NUMBER}.${GITHUB_RUN_ATTEMPT}"
|
|
|
|
|
+ echo "release_version=$RELEASE_VERSION" >> "$GITHUB_OUTPUT"
|
|
|
|
|
+ echo "canary_version=$CANARY_VERSION" >> "$GITHUB_OUTPUT"
|
|
|
|
|
+
|
|
|
|
|
+ - name: Rewrite package versions for canary publish
|
|
|
|
|
+ run: |
|
|
|
|
|
+ node scripts/set-package-versions.mjs "${{ steps.versions.outputs.canary_version }}" --root .
|
|
|
|
|
+ pnpm verify:publish-manifests
|
|
|
|
|
+
|
|
|
|
|
+ - name: Publish core canary
|
|
|
|
|
+ working-directory: packages/core
|
|
|
|
|
+ run: pnpm publish --tag canary --access public --no-git-checks
|
|
|
|
|
+ env:
|
|
|
|
|
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
|
|
|
+
|
|
|
|
|
+ - name: Publish CLI canary
|
|
|
|
|
+ working-directory: packages/cli
|
|
|
|
|
+ run: pnpm publish --tag canary --access public --no-git-checks
|
|
|
|
|
+ env:
|
|
|
|
|
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
|
|
|
+
|
|
|
|
|
+ verify-canary:
|
|
|
|
|
+ runs-on: ubuntu-latest
|
|
|
|
|
+ needs: publish-canary
|
|
|
|
|
+ steps:
|
|
|
|
|
+ - uses: actions/setup-node@v4
|
|
|
|
|
+ with:
|
|
|
|
|
+ node-version: 22
|
|
|
|
|
+ registry-url: https://registry.npmjs.org
|
|
|
|
|
+
|
|
|
|
|
+ - name: Verify canary dist-tag and installation
|
|
|
|
|
+ run: |
|
|
|
|
|
+ set -euo pipefail
|
|
|
|
|
+ EXPECTED_CANARY="${{ needs.publish-canary.outputs.canary_version }}"
|
|
|
|
|
+
|
|
|
|
|
+ ACTUAL_CANARY=""
|
|
|
|
|
+ for _ in 1 2 3 4 5 6; do
|
|
|
|
|
+ ACTUAL_CANARY=$(npm view @actalk/inkos@canary version 2>/dev/null || true)
|
|
|
|
|
+ if [ "$ACTUAL_CANARY" = "$EXPECTED_CANARY" ]; then
|
|
|
|
|
+ break
|
|
|
|
|
+ fi
|
|
|
|
|
+ sleep 10
|
|
|
|
|
+ done
|
|
|
|
|
+
|
|
|
|
|
+ if [ "$ACTUAL_CANARY" != "$EXPECTED_CANARY" ]; then
|
|
|
|
|
+ echo "FATAL: canary dist-tag mismatch: expected $EXPECTED_CANARY got ${ACTUAL_CANARY:-<empty>}"
|
|
|
|
|
+ exit 1
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ TMPDIR=$(mktemp -d)
|
|
|
|
|
+ cd "$TMPDIR"
|
|
|
|
|
+ npm init -y
|
|
|
|
|
+ npm install "@actalk/inkos@$EXPECTED_CANARY"
|
|
|
|
|
+
|
|
|
|
|
+ if grep -q '"workspace:' node_modules/@actalk/inkos/package.json; then
|
|
|
|
|
+ echo "FATAL: canary CLI package still contains workspace: protocol"
|
|
|
|
|
+ cat node_modules/@actalk/inkos/package.json | grep workspace
|
|
|
|
|
+ exit 1
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ if grep -q '"workspace:' node_modules/@actalk/inkos-core/package.json; then
|
|
|
|
|
+ echo "FATAL: canary core package still contains workspace: protocol"
|
|
|
|
|
+ cat node_modules/@actalk/inkos-core/package.json | grep workspace
|
|
|
|
|
+ exit 1
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
|
|
+ npx inkos --version
|
|
|
|
|
+ echo "Canary verification passed"
|
|
|
|
|
+ rm -rf "$TMPDIR"
|
|
|
|
|
+
|
|
|
|
|
+ publish-release:
|
|
|
|
|
+ runs-on: ubuntu-latest
|
|
|
|
|
+ needs: [publish-canary, verify-canary]
|
|
|
|
|
+ steps:
|
|
|
|
|
+ - uses: actions/checkout@v4
|
|
|
|
|
+
|
|
|
|
|
+ - uses: pnpm/action-setup@v4
|
|
|
|
|
+ with:
|
|
|
|
|
+ version: 9
|
|
|
|
|
+
|
|
|
|
|
+ - uses: actions/setup-node@v4
|
|
|
|
|
+ with:
|
|
|
|
|
+ node-version: 22
|
|
|
|
|
+ cache: pnpm
|
|
|
|
|
+ registry-url: https://registry.npmjs.org
|
|
|
|
|
+
|
|
|
|
|
+ - run: pnpm install --frozen-lockfile
|
|
|
|
|
+ - run: pnpm build
|
|
|
|
|
+ - run: pnpm verify:publish-manifests
|
|
|
|
|
+
|
|
|
|
|
+ - name: Rewrite package versions for final publish
|
|
|
|
|
+ run: |
|
|
|
|
|
+ node scripts/set-package-versions.mjs "${{ needs.publish-canary.outputs.release_version }}" --root .
|
|
|
|
|
+ pnpm verify:publish-manifests
|
|
|
|
|
+
|
|
|
|
|
+ - name: Publish core latest
|
|
|
working-directory: packages/core
|
|
working-directory: packages/core
|
|
|
- run: npm publish --access public
|
|
|
|
|
|
|
+ run: pnpm publish --access public --no-git-checks
|
|
|
env:
|
|
env:
|
|
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
|
|
|
|
|
|
- - name: Publish CLI
|
|
|
|
|
|
|
+ - name: Publish CLI latest
|
|
|
working-directory: packages/cli
|
|
working-directory: packages/cli
|
|
|
- run: npm publish --access public
|
|
|
|
|
|
|
+ run: pnpm publish --access public --no-git-checks
|
|
|
env:
|
|
env:
|
|
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
|
|
|
|
|
|
- # Post-publish verification: install from npm and check it works
|
|
|
|
|
- - name: Verify published package
|
|
|
|
|
|
|
+ verify-release:
|
|
|
|
|
+ runs-on: ubuntu-latest
|
|
|
|
|
+ needs: [publish-canary, publish-release]
|
|
|
|
|
+ steps:
|
|
|
|
|
+ - uses: actions/setup-node@v4
|
|
|
|
|
+ with:
|
|
|
|
|
+ node-version: 22
|
|
|
|
|
+ registry-url: https://registry.npmjs.org
|
|
|
|
|
+
|
|
|
|
|
+ - name: Verify latest dist-tag and installation
|
|
|
run: |
|
|
run: |
|
|
|
|
|
+ set -euo pipefail
|
|
|
|
|
+ EXPECTED_RELEASE="${{ needs.publish-canary.outputs.release_version }}"
|
|
|
|
|
+
|
|
|
|
|
+ ACTUAL_LATEST=""
|
|
|
|
|
+ for _ in 1 2 3 4 5 6; do
|
|
|
|
|
+ ACTUAL_LATEST=$(npm view @actalk/inkos@latest version 2>/dev/null || true)
|
|
|
|
|
+ if [ "$ACTUAL_LATEST" = "$EXPECTED_RELEASE" ]; then
|
|
|
|
|
+ break
|
|
|
|
|
+ fi
|
|
|
|
|
+ sleep 10
|
|
|
|
|
+ done
|
|
|
|
|
+
|
|
|
|
|
+ if [ "$ACTUAL_LATEST" != "$EXPECTED_RELEASE" ]; then
|
|
|
|
|
+ echo "FATAL: latest dist-tag mismatch: expected $EXPECTED_RELEASE got ${ACTUAL_LATEST:-<empty>}"
|
|
|
|
|
+ exit 1
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
TMPDIR=$(mktemp -d)
|
|
TMPDIR=$(mktemp -d)
|
|
|
cd "$TMPDIR"
|
|
cd "$TMPDIR"
|
|
|
npm init -y
|
|
npm init -y
|
|
|
- npm install @actalk/inkos@latest
|
|
|
|
|
- # Must not contain workspace: in installed package.json
|
|
|
|
|
|
|
+ npm install "@actalk/inkos@$EXPECTED_RELEASE"
|
|
|
|
|
+
|
|
|
if grep -q '"workspace:' node_modules/@actalk/inkos/package.json; then
|
|
if grep -q '"workspace:' node_modules/@actalk/inkos/package.json; then
|
|
|
- echo "FATAL: published package still contains workspace: protocol"
|
|
|
|
|
|
|
+ echo "FATAL: released CLI package still contains workspace: protocol"
|
|
|
cat node_modules/@actalk/inkos/package.json | grep workspace
|
|
cat node_modules/@actalk/inkos/package.json | grep workspace
|
|
|
exit 1
|
|
exit 1
|
|
|
fi
|
|
fi
|
|
|
- # Must be runnable
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if grep -q '"workspace:' node_modules/@actalk/inkos-core/package.json; then
|
|
|
|
|
+ echo "FATAL: released core package still contains workspace: protocol"
|
|
|
|
|
+ cat node_modules/@actalk/inkos-core/package.json | grep workspace
|
|
|
|
|
+ exit 1
|
|
|
|
|
+ fi
|
|
|
|
|
+
|
|
|
npx inkos --version
|
|
npx inkos --version
|
|
|
- echo "Post-publish verification passed"
|
|
|
|
|
|
|
+ echo "Release verification passed"
|
|
|
rm -rf "$TMPDIR"
|
|
rm -rf "$TMPDIR"
|
|
|
|
|
|
|
|
github-release:
|
|
github-release:
|
|
|
runs-on: ubuntu-latest
|
|
runs-on: ubuntu-latest
|
|
|
- needs: publish
|
|
|
|
|
|
|
+ needs: verify-release
|
|
|
steps:
|
|
steps:
|
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/checkout@v4
|
|
|
with:
|
|
with:
|