4141 exit 1
4242 fi
4343
44+ - name : Skip if this push is a release merge
45+ id : release-check
46+ env :
47+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
48+ run : |
49+ package_version=$(node -p "require('./src/package.json').version")
50+ commit_subject=$(git log -1 --format=%s)
51+ skip=false
52+
53+ if [[ "$commit_subject" =~ ^chore:\ prepare\ v[0-9]+\.[0-9]+\.[0-9]+\ release ]]; then
54+ echo "Commit '${commit_subject}' looks like a release-prep merge; skipping nightly pre-release."
55+ skip=true
56+ else
57+ release_error=$(gh release view "v${package_version}" 2>&1 >/dev/null) && release_found=true || release_found=false
58+ if [ "$release_found" = "true" ]; then
59+ echo "v${package_version} is already published as a stable release; skipping nightly pre-release."
60+ skip=true
61+ elif [[ "$release_error" != *"release not found"* ]]; then
62+ echo "::error::gh release view failed unexpectedly: ${release_error}"
63+ exit 1
64+ fi
65+ fi
66+
67+ echo "skip=${skip}" >> "$GITHUB_OUTPUT"
68+
4469 - name : Set pre-release version
70+ if : steps.release-check.outputs.skip != 'true'
4571 id : version
4672 env :
4773 RUN_NUMBER : ${{ github.run_number }}
@@ -61,13 +87,15 @@ jobs:
6187 EOF
6288
6389 - name : Build workspace packages
90+ if : steps.release-check.outputs.skip != 'true'
6491 env :
6592 PKG_RELEASE_CHANNEL : prerelease
6693 run : |
6794 pnpm --filter @roo-code/build build
6895 pnpm --filter @roo-code/vscode-webview build
6996
7097 - name : Package pre-release VSIX
98+ if : steps.release-check.outputs.skip != 'true'
7199 env :
72100 POSTHOG_API_KEY : ${{ secrets.POSTHOG_API_KEY }}
73101 PKG_RELEASE_CHANNEL : prerelease
76104 pnpm --filter ./src exec vsce package --pre-release --no-dependencies --out ../bin
77105
78106 - name : Verify VSIX contents
107+ if : steps.release-check.outputs.skip != 'true'
79108 env :
80109 VERSION_NUMBER : ${{ steps.version.outputs.number }}
81110 run : |
87116 grep -q "extension/webview-ui/audio/celebration.wav" /tmp/zoo-code-vsix-contents.txt
88117
89118 - name : Validate packaged manifest identity
119+ if : steps.release-check.outputs.skip != 'true'
90120 env :
91121 VERSION_NUMBER : ${{ steps.version.outputs.number }}
92122 run : |
@@ -98,12 +128,36 @@ jobs:
98128 test "$artifact_name" = "zoo-code"
99129 test "$artifact_publisher" = "ZooCodeOrganization"
100130
101- # Open VSX is intentionally excluded: it has no pre-release channel concept,
102- # so pre-release builds would surface as the latest stable version for all users.
103131 - name : Publish pre-release to VS Code Marketplace
132+ if : steps.release-check.outputs.skip != 'true'
104133 env :
105134 VSCE_PAT : ${{ secrets.VSCE_PAT }}
106135 VERSION_NUMBER : ${{ steps.version.outputs.number }}
107136 run : |
108- npx @vscode/vsce publish --pre-release --packagePath "bin/zoo-code-${VERSION_NUMBER}.vsix"
109- echo "Published ZooCodeOrganization.zoo-code ${VERSION_NUMBER} as a VS Code Marketplace pre-release"
137+ npx @vscode/vsce publish --pre-release --skip-duplicate --packagePath "bin/zoo-code-${VERSION_NUMBER}.vsix"
138+ echo "Published or skipped existing ZooCodeOrganization.zoo-code ${VERSION_NUMBER} as a VS Code Marketplace pre-release"
139+
140+ # The VSIX built above with `vsce package --pre-release` already carries the
141+ # Microsoft.VisualStudio.Code.PreRelease manifest property, which is what Open
142+ # VSX reads to flag the version. `ovsx publish` ignores --pre-release for an
143+ # already-packaged .vsix (it only applies when ovsx does the packaging itself),
144+ # so it's intentionally omitted here.
145+ #
146+ # Open VSX's "latest" alias resolves to the highest semver across stable and
147+ # pre-release alike (pre-release only breaks ties at equal major.minor.patch),
148+ # so a nightly build can transiently become "latest" until the next stable
149+ # release outranks it. This mirrors how Marketplace pre-release users already
150+ # track the newest published version, so it's an accepted trade-off here too.
151+ - name : Publish pre-release to Open VSX Registry
152+ if : steps.release-check.outputs.skip != 'true'
153+ env :
154+ OVSX_PAT : ${{ secrets.OVSX_PAT }}
155+ VERSION_NUMBER : ${{ steps.version.outputs.number }}
156+ run : |
157+ set -o pipefail
158+ publish_output=$(pnpm exec ovsx publish "bin/zoo-code-${VERSION_NUMBER}.vsix" --skip-duplicate 2>&1 | tee /dev/stderr)
159+ if echo "$publish_output" | grep -q "is already published"; then
160+ echo "ZooCodeOrganization.zoo-code ${VERSION_NUMBER} was already published to Open VSX; skipped."
161+ else
162+ echo "Published ZooCodeOrganization.zoo-code ${VERSION_NUMBER} as an Open VSX pre-release"
163+ fi
0 commit comments