-
Notifications
You must be signed in to change notification settings - Fork 212
151 lines (129 loc) · 6.1 KB
/
Copy pathnightly-publish.yml
File metadata and controls
151 lines (129 loc) · 6.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
name: Publish Pre-release Extension
on:
push:
branches: [main]
workflow_dispatch: # Allows manual triggering.
permissions:
contents: read
concurrency:
group: marketplace-prerelease
cancel-in-progress: false
jobs:
publish-prerelease:
runs-on: ubuntu-latest
environment: marketplace-prerelease
steps:
- name: Checkout code
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- name: Setup Node.js and pnpm
uses: ./.github/actions/setup-node-pnpm
with:
install-args: "--frozen-lockfile"
- name: Validate package identity
run: |
package_name=$(node -p "require('./src/package.json').name")
publisher=$(node -p "require('./src/package.json').publisher")
test "$package_name" = "zoo-code"
test "$publisher" = "ZooCodeOrganization"
- name: Validate publish ref
run: |
if [ "$GITHUB_REF_NAME" != "main" ]; then
echo "Pre-release publishes must run from main, not ${GITHUB_REF_NAME}."
exit 1
fi
- name: Skip if this push is a release merge
id: release-check
run: |
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
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 }}
run: |
node <<'EOF'
const fs = require("fs")
const pkgPath = "src/package.json"
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"))
const [major, minor] = pkg.version.split(".").map(Number)
const prereleaseMinor = minor % 2 === 0 ? minor + 1 : minor + 2
const patch = 100000 + Number(process.env.RUN_NUMBER)
pkg.version = `${major}.${prereleaseMinor}.${patch}`
fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, "\t")}\n`)
fs.appendFileSync(process.env.GITHUB_OUTPUT, `number=${pkg.version}\n`)
console.log(`Pre-release version set to ${pkg.version}`)
EOF
- name: Build workspace packages
if: steps.release-check.outputs.skip != 'true'
env:
PKG_RELEASE_CHANNEL: prerelease
run: |
pnpm --filter @roo-code/build build
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
run: |
mkdir -p bin
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: |
vsix_path="bin/zoo-code-${VERSION_NUMBER}.vsix"
unzip -l "$vsix_path" > /tmp/zoo-code-vsix-contents.txt
grep -q "extension/package.json" /tmp/zoo-code-vsix-contents.txt
grep -q "extension/dist/extension.js" /tmp/zoo-code-vsix-contents.txt
grep -q "extension/webview-ui/build/assets/index.js" /tmp/zoo-code-vsix-contents.txt
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: |
vsix_path="bin/zoo-code-${VERSION_NUMBER}.vsix"
artifact_name=$(unzip -p "$vsix_path" extension/package.json | jq -r '.name')
artifact_publisher=$(unzip -p "$vsix_path" extension/package.json | jq -r '.publisher')
test "$artifact_name" = "zoo-code"
test "$artifact_publisher" = "ZooCodeOrganization"
- 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 --skip-duplicate --packagePath "bin/zoo-code-${VERSION_NUMBER}.vsix"
echo "Published or skipped existing 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