diff --git a/.github/workflows/nightly-publish.yml b/.github/workflows/nightly-publish.yml index 2487a694f..ad80fd4d4 100644 --- a/.github/workflows/nightly-publish.yml +++ b/.github/workflows/nightly-publish.yml @@ -41,7 +41,33 @@ jobs: exit 1 fi + - name: Skip if this push is a release merge + id: release-check + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + package_version=$(node -p "require('./src/package.json').version") + commit_subject=$(git log -1 --format=%s) + skip=false + + if [[ "$commit_subject" =~ ^chore:\ prepare\ v[0-9]+\.[0-9]+\.[0-9]+\ release ]]; then + echo "Commit '${commit_subject}' looks like a release-prep merge; skipping nightly pre-release." + skip=true + else + release_error=$(gh release view "v${package_version}" 2>&1 >/dev/null) && release_found=true || release_found=false + if [ "$release_found" = "true" ]; then + echo "v${package_version} is already published as a stable release; skipping nightly pre-release." + skip=true + elif [ "$release_error" != "release not found" ]; then + echo "::error::gh release view failed unexpectedly: ${release_error}" + exit 1 + fi + fi + + echo "skip=${skip}" >> "$GITHUB_OUTPUT" + - name: Set pre-release version + if: steps.release-check.outputs.skip != 'true' id: version env: RUN_NUMBER: ${{ github.run_number }} @@ -61,6 +87,7 @@ jobs: EOF - name: Build workspace packages + if: steps.release-check.outputs.skip != 'true' env: PKG_RELEASE_CHANNEL: prerelease run: | @@ -68,6 +95,7 @@ jobs: pnpm --filter @roo-code/vscode-webview build - name: Package pre-release VSIX + if: steps.release-check.outputs.skip != 'true' env: POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} PKG_RELEASE_CHANNEL: prerelease @@ -76,6 +104,7 @@ jobs: pnpm --filter ./src exec vsce package --pre-release --no-dependencies --out ../bin - name: Verify VSIX contents + if: steps.release-check.outputs.skip != 'true' env: VERSION_NUMBER: ${{ steps.version.outputs.number }} run: | @@ -87,6 +116,7 @@ jobs: grep -q "extension/webview-ui/audio/celebration.wav" /tmp/zoo-code-vsix-contents.txt - name: Validate packaged manifest identity + if: steps.release-check.outputs.skip != 'true' env: VERSION_NUMBER: ${{ steps.version.outputs.number }} run: | @@ -98,12 +128,36 @@ jobs: test "$artifact_name" = "zoo-code" test "$artifact_publisher" = "ZooCodeOrganization" - # Open VSX is intentionally excluded: it has no pre-release channel concept, - # so pre-release builds would surface as the latest stable version for all users. - name: Publish pre-release to VS Code Marketplace + if: steps.release-check.outputs.skip != 'true' env: VSCE_PAT: ${{ secrets.VSCE_PAT }} VERSION_NUMBER: ${{ steps.version.outputs.number }} run: | npx @vscode/vsce publish --pre-release --packagePath "bin/zoo-code-${VERSION_NUMBER}.vsix" echo "Published ZooCodeOrganization.zoo-code ${VERSION_NUMBER} as a VS Code Marketplace pre-release" + + # The VSIX built above with `vsce package --pre-release` already carries the + # Microsoft.VisualStudio.Code.PreRelease manifest property, which is what Open + # VSX reads to flag the version. `ovsx publish` ignores --pre-release for an + # already-packaged .vsix (it only applies when ovsx does the packaging itself), + # so it's intentionally omitted here. + # + # Open VSX's "latest" alias resolves to the highest semver across stable and + # pre-release alike (pre-release only breaks ties at equal major.minor.patch), + # so a nightly build can transiently become "latest" until the next stable + # release outranks it. This mirrors how Marketplace pre-release users already + # track the newest published version, so it's an accepted trade-off here too. + - name: Publish pre-release to Open VSX Registry + if: steps.release-check.outputs.skip != 'true' + env: + OVSX_PAT: ${{ secrets.OVSX_PAT }} + VERSION_NUMBER: ${{ steps.version.outputs.number }} + run: | + set -o pipefail + publish_output=$(pnpm exec ovsx publish "bin/zoo-code-${VERSION_NUMBER}.vsix" --skip-duplicate 2>&1 | tee /dev/stderr) + if echo "$publish_output" | grep -q "is already published"; then + echo "ZooCodeOrganization.zoo-code ${VERSION_NUMBER} was already published to Open VSX; skipped." + else + echo "Published ZooCodeOrganization.zoo-code ${VERSION_NUMBER} as an Open VSX pre-release" + fi