Skip to content

Commit 21a15e5

Browse files
authored
feat(nightly-publish): adding ovsx pre-release step (#790)
1 parent 1211eaa commit 21a15e5

1 file changed

Lines changed: 58 additions & 4 deletions

File tree

.github/workflows/nightly-publish.yml

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,33 @@ jobs:
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
@@ -76,6 +104,7 @@ jobs:
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: |
@@ -87,6 +116,7 @@ jobs:
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

Comments
 (0)