.github/workflows/release.yml
1
name: release
3
on:
4
push:
5
branches: [main]
6
workflow_dispatch:
8
permissions:
9
contents: read
11
concurrency:
12
group: ${{ github.workflow }}-${{ github.ref }}
13
cancel-in-progress: false
15
jobs:
16
please:
17
name: release please
18
runs-on: ubuntu-24.04
19
permissions:
20
contents: write
21
id-token: write
22
pull-requests: write
23
outputs:
24
released: ${{ steps.release.outputs.release_created }}
25
tag: ${{ steps.release.outputs.tag_name }}
26
upload_url: ${{ steps.release.outputs.upload_url }}
27
version: ${{ steps.release.outputs.version }}
28
steps:
29
- uses: googleapis/release-please-action@45996ed1f6d02564a971a2fa1b5860e934307cf7 # v5.0.0
30
id: release
31
with:
32
config-file: release-please-config.json
33
manifest-file: .release-please-manifest.json
35
plugins:
36
name: publish plugins
37
needs: [please, binaries, image]
38
if: needs.please.outputs.released == 'true'
39
runs-on: ubuntu-24.04
40
permissions:
41
contents: write
42
id-token: write
43
steps:
44
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
45
with:
46
persist-credentials: false
48
- name: setup Node.js
49
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
50
with:
51
node-version: '24.19.0'
52
registry-url: 'https://registry.npmjs.org'
54
- name: package plugins
55
env:
56
VERSION: ${{ needs.please.outputs.version }}
57
run: |
58
set -euo pipefail
59
./scripts/package-agent-plugins.sh "$VERSION" dist
60
(cd dist && sha256sum koment-plugin-*.tar.gz > "koment-plugins_${VERSION}_checksums.txt")
61
ls -l dist
63
- name: publish @koment/opencode-koment to npm
64
env:
65
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
66
VERSION: ${{ needs.please.outputs.version }}
67
run: |
68
set -euo pipefail
69
published_version=$(node -p "require('./dist/opencode-npm/package.json').version")
70
if [ "$published_version" != "$VERSION" ]; then
71
echo "::error::package.json version ($published_version) does not match release version ($VERSION); release-please must own this file."
72
exit 1
73
fi
74
npm publish ./dist/opencode-npm --access public --provenance
76
- name: install cosign
77
uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2
79
- name: sign plugin archives
80
env:
81
VERSION: ${{ needs.please.outputs.version }}
82
run: |
83
set -euo pipefail
84
for archive in dist/koment-plugin-*.tar.gz; do
85
cosign sign-blob --yes --bundle "${archive}.sigstore.json" "$archive"
86
done
87
cosign sign-blob --yes \
88
--bundle "dist/koment-plugins_${VERSION}_checksums.sigstore.json" \
89
"dist/koment-plugins_${VERSION}_checksums.txt"
91
- name: attach to the release
92
env:
93
GH_TOKEN: ${{ github.token }}
94
RELEASE_UPLOAD_URL: ${{ needs.please.outputs.upload_url }}
95
run: |
96
./scripts/upload-release-assets.sh "$RELEASE_UPLOAD_URL" \
97
dist/koment-plugin-*.tar.gz \
98
dist/koment-plugin-*.tar.gz.sigstore.json \
99
dist/koment-plugins_*_checksums.txt \
100
dist/koment-plugins_*.sigstore.json
102
binaries:
103
name: publish binaries
104
needs: please
105
if: needs.please.outputs.released == 'true'
106
runs-on: ubuntu-24.04
107
permissions:
108
contents: write
109
id-token: write
110
steps:
111
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
112
with:
113
persist-credentials: false
114
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
115
with:
116
go-version-file: go.mod
117
cache: true
119
- name: build
120
env:
121
VERSION: ${{ needs.please.outputs.version }}
122
run: |
123
set -euo pipefail
124
mkdir -p dist
125
cp LICENSE README.md dist/
126
for target in linux/amd64 linux/arm64 darwin/amd64 darwin/arm64 windows/amd64 windows/arm64; do
127
os=${target%/*}
128
arch=${target#*/}
129
binary=koment
130
[ "$os" = windows ] && binary=koment.exe
132
CGO_ENABLED=0 GOOS=$os GOARCH=$arch go build -trimpath \
133
-ldflags="-s -w -X main.releaseVersion=${VERSION} -X main.sourceRevision=${GITHUB_SHA} -X github.com/koment-dev/koment/internal/mcp.serverVersion=${VERSION}" \
134
-o "dist/${binary}" ./cmd/koment
136
name="koment_${VERSION}_${os}_${arch}"
137
if [ "$os" = windows ]; then
138
(cd dist && zip -q "${name}.zip" "$binary" LICENSE README.md && rm "$binary")
139
else
140
(cd dist && tar -czf "${name}.tar.gz" "$binary" LICENSE README.md && rm "$binary")
141
fi
142
done
143
rm dist/LICENSE dist/README.md
145
linux_amd64_sha=$(sha256sum "dist/koment_${VERSION}_linux_amd64.tar.gz" | awk '{print $1}')
146
linux_arm64_sha=$(sha256sum "dist/koment_${VERSION}_linux_arm64.tar.gz" | awk '{print $1}')
147
darwin_amd64_sha=$(sha256sum "dist/koment_${VERSION}_darwin_amd64.tar.gz" | awk '{print $1}')
148
darwin_arm64_sha=$(sha256sum "dist/koment_${VERSION}_darwin_arm64.tar.gz" | awk '{print $1}')
149
windows_amd64_sha=$(sha256sum "dist/koment_${VERSION}_windows_amd64.zip" | awk '{print $1}')
150
windows_arm64_sha=$(sha256sum "dist/koment_${VERSION}_windows_arm64.zip" | awk '{print $1}')
152
render() {
153
sed \
154
-e "s/{{VERSION}}/${VERSION}/g" \
155
-e "s/{{LINUX_AMD64_SHA}}/${linux_amd64_sha}/g" \
156
-e "s/{{LINUX_ARM64_SHA}}/${linux_arm64_sha}/g" \
157
-e "s/{{DARWIN_AMD64_SHA}}/${darwin_amd64_sha}/g" \
158
-e "s/{{DARWIN_ARM64_SHA}}/${darwin_arm64_sha}/g" \
159
-e "s/{{WINDOWS_AMD64_SHA}}/${windows_amd64_sha}/g" \
160
-e "s/{{WINDOWS_ARM64_SHA}}/${windows_arm64_sha}/g" \
161
-e "s/{{WINDOWS_AMD64_SHA_UPPER}}/$(printf '%s' "$windows_amd64_sha" | tr '[:lower:]' '[:upper:]')/g" \
162
-e "s/{{WINDOWS_ARM64_SHA_UPPER}}/$(printf '%s' "$windows_arm64_sha" | tr '[:lower:]' '[:upper:]')/g" \
163
"$1" > "$2"
164
}
166
render distribution/package-managers/homebrew/koment.rb.tmpl dist/koment.rb
167
render distribution/package-managers/scoop/koment.json.tmpl dist/koment-scoop.json
168
mkdir -p dist/winget
169
render distribution/package-managers/winget/Koment.Koment.installer.yaml.tmpl dist/winget/Koment.Koment.installer.yaml
170
render distribution/package-managers/winget/Koment.Koment.locale.en-US.yaml.tmpl dist/winget/Koment.Koment.locale.en-US.yaml
171
render distribution/package-managers/winget/Koment.Koment.yaml.tmpl dist/winget/Koment.Koment.yaml
172
(cd dist/winget && zip -q "../koment_${VERSION}_winget.zip" ./*.yaml)
174
(cd dist && sha256sum ./*.tar.gz ./*.zip ./koment.rb ./koment-scoop.json | sed 's| \./| |' > "koment_${VERSION}_checksums.txt")
175
ls -l dist
177
- name: install cosign
178
uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2
180
- name: sign checksum manifest
181
env:
182
VERSION: ${{ needs.please.outputs.version }}
183
run: |
184
cosign sign-blob --yes \
185
--bundle "dist/koment_${VERSION}_checksums.sigstore.json" \
186
"dist/koment_${VERSION}_checksums.txt"
188
- name: attach to the release
189
env:
190
GH_TOKEN: ${{ github.token }}
191
RELEASE_UPLOAD_URL: ${{ needs.please.outputs.upload_url }}
192
run: |
193
./scripts/upload-release-assets.sh "$RELEASE_UPLOAD_URL" \
194
dist/koment_*.tar.gz dist/koment_*.zip dist/koment_*_checksums.txt \
195
dist/koment_*_checksums.sigstore.json dist/koment.rb dist/koment-scoop.json
197
tap:
198
name: publish the homebrew formula
199
needs: [please, binaries]
200
if: needs.please.outputs.released == 'true'
201
runs-on: ubuntu-24.04
202
permissions:
203
contents: read
204
steps:
205
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
206
with:
207
repository: ${{ github.repository_owner }}/homebrew-tap
208
ssh-key: ${{ secrets.HOMEBREW_TAP_DEPLOY_KEY }}
209
persist-credentials: true
211
- name: take the formula this release published
212
env:
213
RELEASE_TAG: ${{ needs.please.outputs.tag }}
214
SOURCE_REPOSITORY: ${{ github.repository }}
215
run: |
216
mkdir -p Formula
217
curl --fail --location --silent --show-error \
218
--retry 6 --retry-all-errors --retry-delay 5 \
219
--output Formula/koment.rb \
220
"https://github.com/${SOURCE_REPOSITORY}/releases/download/${RELEASE_TAG}/koment.rb"
222
- name: reject a formula that does not carry this version
223
env:
224
VERSION: ${{ needs.please.outputs.version }}
225
run: |
226
grep -q "version \"${VERSION}\"" Formula/koment.rb || {
227
echo "the downloaded formula does not declare ${VERSION}"
228
head -5 Formula/koment.rb
229
exit 1
230
}
232
- name: commit the formula
233
env:
234
VERSION: ${{ needs.please.outputs.version }}
235
run: |
236
if git diff --quiet -- Formula/koment.rb; then
237
echo "the tap already carries ${VERSION}"
238
exit 0
239
fi
240
git config user.name "koment-release[bot]"
241
git config user.email "koment-release[bot]@users.noreply.github.com"
242
git add Formula/koment.rb
243
git commit -m "chore: koment ${VERSION}"
244
git push
246
alias:
247
name: move the major version tag
248
needs: [please, verify]
249
if: needs.please.outputs.released == 'true'
250
runs-on: ubuntu-24.04
251
permissions:
252
contents: write
253
steps:
254
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
255
with:
256
fetch-depth: 0
257
persist-credentials: true
259
- name: point the major tag at this release
260
env:
261
RELEASE_TAG: ${{ needs.please.outputs.tag }}
262
VERSION: ${{ needs.please.outputs.version }}
263
run: |
264
case "$VERSION" in
265
*[!0-9.]*)
266
echo "$VERSION is not a plain X.Y.Z release; leaving the major alias where it is"
267
exit 0
268
;;
269
esac
270
major="v${VERSION%%.*}"
271
echo "pointing ${major} at ${RELEASE_TAG}"
272
git config user.name "koment-release[bot]"
273
git config user.email "koment-release[bot]@users.noreply.github.com"
274
git tag -f "$major" "$RELEASE_TAG"
275
git push --force origin "refs/tags/${major}"
277
verify:
278
name: verify the published release
279
needs: [please, binaries]
280
if: needs.please.outputs.released == 'true'
281
runs-on: ${{ matrix.os }}
282
permissions:
283
contents: read
284
strategy:
285
fail-fast: false
286
matrix:
287
os:
288
- ubuntu-24.04
289
- macos-15
290
steps:
291
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
292
with:
293
persist-credentials: false
295
- name: Install the release that was just published
296
id: setup
297
uses: ./
298
with:
299
version: ${{ needs.please.outputs.version }}
301
- name: Verify it is the release this run produced
302
env:
303
INSTALLED_VERSION: ${{ steps.setup.outputs.version }}
304
RELEASED_VERSION: ${{ needs.please.outputs.version }}
305
run: |
306
set -euo pipefail
307
command -v koment
308
koment version
309
test "$INSTALLED_VERSION" = "$RELEASED_VERSION"
310
koment version | grep -q "$RELEASED_VERSION"
312
image:
313
name: publish image
314
needs: please
315
if: needs.please.outputs.released == 'true'
316
runs-on: ubuntu-24.04
317
permissions:
318
contents: read
319
packages: write
320
id-token: write
321
steps:
322
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
323
with:
324
persist-credentials: false
326
- uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
327
- uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
329
- uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
330
with:
331
registry: ghcr.io
332
username: ${{ github.actor }}
333
password: ${{ secrets.GITHUB_TOKEN }}
335
- id: meta
336
uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0
337
with:
338
images: ghcr.io/${{ github.repository }}
339
tags: |
340
type=semver,pattern={{version}},value=${{ needs.please.outputs.tag }}
341
type=semver,pattern={{major}}.{{minor}},value=${{ needs.please.outputs.tag }}
342
type=semver,pattern={{major}},value=${{ needs.please.outputs.tag }}
343
type=raw,value=latest
345
- id: build
346
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
347
with:
348
context: .
349
platforms: linux/amd64,linux/arm64
350
push: true
351
provenance: true
352
sbom: true
353
tags: ${{ steps.meta.outputs.tags }}
354
labels: ${{ steps.meta.outputs.labels }}
355
build-args: |
356
VERSION=${{ needs.please.outputs.version }}
357
REVISION=${{ github.sha }}
358
cache-from: type=gha
359
cache-to: type=gha,mode=max
361
- name: install cosign
362
uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2
364
- name: sign image manifest
365
env:
366
DIGEST: ${{ steps.build.outputs.digest }}
367
IMAGE: ghcr.io/${{ github.repository }}
368
run: cosign sign --yes "${IMAGE}@${DIGEST}"
370
mcp-registry:
371
name: publish MCP registry metadata
372
needs: [please, binaries, image]
373
if: needs.please.outputs.released == 'true'
374
runs-on: ubuntu-24.04
375
permissions:
376
contents: read
377
id-token: write
378
env:
379
MCP_PUBLISHER_SHA256: a06c9096dcb9727c13555b6be26c7effa707b01f06a4c561ba7a3635443cf2cc
380
MCP_PUBLISHER_VERSION: 1.8.1
381
steps:
382
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
383
with:
384
persist-credentials: false
386
- name: Prepare release metadata
387
env:
388
IMAGE: ghcr.io/${{ github.repository }}:${{ needs.please.outputs.version }}
389
VERSION: ${{ needs.please.outputs.version }}
390
run: |
391
mkdir -p /tmp/koment-mcp
392
jq --arg version "$VERSION" --arg image "$IMAGE" \
393
'.version = $version | .packages[0].identifier = $image | del(.packages[0].version)' \
394
server.json > /tmp/koment-mcp/server.json
396
- name: Install MCP publisher
397
run: |
398
archive=/tmp/mcp-publisher.tar.gz
399
curl --fail --location --silent --show-error \
400
--output "$archive" \
401
"https://github.com/modelcontextprotocol/registry/releases/download/v${MCP_PUBLISHER_VERSION}/mcp-publisher_linux_amd64.tar.gz"
402
printf '%s %s\n' "$MCP_PUBLISHER_SHA256" "$archive" | sha256sum --check
403
tar -xzf "$archive" -C /tmp mcp-publisher
405
- name: Publish MCP server
406
working-directory: /tmp/koment-mcp
407
run: |
408
/tmp/mcp-publisher login github-oidc
409
/tmp/mcp-publisher publish
411
chart:
412
name: publish chart
413
needs: [please, binaries, image]
414
if: needs.please.outputs.released == 'true'
415
runs-on: ubuntu-24.04
416
permissions:
417
contents: write
418
packages: write
419
id-token: write
420
env:
421
CHART_VERSION: ${{ needs.please.outputs.version }}
422
REGISTRY_OWNER: ${{ github.repository_owner }}
423
REGISTRY_PASSWORD: ${{ secrets.GITHUB_TOKEN }}
424
REGISTRY_USER: ${{ github.actor }}
425
steps:
426
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
427
with:
428
persist-credentials: false
429
- uses: azure/setup-helm@9bc31f4ebc9c6b171d7bfbaa5d006ae7abdb4310 # v5.0.1
430
- uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2
432
- uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
433
with:
434
registry: ghcr.io
435
username: ${{ github.actor }}
436
password: ${{ secrets.GITHUB_TOKEN }}
438
- name: package and push
439
env:
440
GH_TOKEN: ${{ github.token }}
441
RELEASE_UPLOAD_URL: ${{ needs.please.outputs.upload_url }}
442
run: |
443
helm registry login ghcr.io \
444
--username "$REGISTRY_USER" \
445
--password "$REGISTRY_PASSWORD"
446
helm package distribution/helm/koment --destination /tmp
447
push_output=$(helm push "/tmp/koment-${CHART_VERSION}.tgz" \
448
"oci://ghcr.io/${REGISTRY_OWNER}/charts")
449
printf '%s\n' "$push_output"
450
digest=$(printf '%s\n' "$push_output" | awk '/^Digest:/ {print $2}')
451
test -n "$digest"
452
cosign sign --yes "ghcr.io/${REGISTRY_OWNER}/charts/koment@${digest}"
453
cosign sign-blob --yes \
454
--bundle "/tmp/koment-${CHART_VERSION}.tgz.sigstore.json" \
455
"/tmp/koment-${CHART_VERSION}.tgz"
456
./scripts/upload-release-assets.sh "$RELEASE_UPLOAD_URL" \
457
"/tmp/koment-${CHART_VERSION}.tgz" \
458
"/tmp/koment-${CHART_VERSION}.tgz.sigstore.json"
460
editor:
461
name: publish editor extension
462
needs: [please, binaries]
463
if: needs.please.outputs.released == 'true'
464
runs-on: ubuntu-24.04
465
permissions:
466
contents: write
467
id-token: write
468
env:
469
OVSX_PAT: ${{ secrets.OVSX_PAT }}
470
PUBLISH_EDITOR_MARKETPLACES: ${{ vars.PUBLISH_EDITOR_MARKETPLACES }}
471
VSCE_PAT: ${{ secrets.VSCE_PAT }}
472
steps:
473
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
474
with:
475
persist-credentials: false
477
- uses: jdx/mise-action@3c2e0cf82a5b2e5249f0d3635a4d83d0ae861518 # v4.2.5
478
with:
479
experimental: true
480
install: false
482
- name: install locked editor tools
483
run: mise --cd integrations/editors/vscode install --locked
485
- name: install editor packaging tools
486
run: mise --cd integrations/editors/vscode exec -- npm ci
488
- name: collect the canonical archives
489
env:
490
RELEASE_TAG: ${{ needs.please.outputs.tag }}
491
SOURCE_REPOSITORY: ${{ github.repository }}
492
VERSION: ${{ needs.please.outputs.version }}
493
run: |
494
set -euo pipefail
495
mkdir -p archives
496
base="https://github.com/${SOURCE_REPOSITORY}/releases/download/${RELEASE_TAG}"
497
for target in linux/amd64 linux/arm64 darwin/amd64 darwin/arm64 windows/amd64 windows/arm64; do
498
os=${target%/*}
499
arch=${target#*/}
500
extension=tar.gz
501
[ "$os" = windows ] && extension=zip
502
archive="koment_${VERSION}_${os}_${arch}.${extension}"
503
curl --fail --location --silent --show-error \
504
--retry 6 --retry-all-errors --retry-delay 5 \
505
--output "archives/${archive}" "${base}/${archive}"
506
done
507
curl --fail --location --silent --show-error \
508
--retry 6 --retry-all-errors --retry-delay 5 \
509
--output "archives/koment_${VERSION}_checksums.txt" \
510
"${base}/koment_${VERSION}_checksums.txt"
511
ls -l archives
513
- name: package extension for every platform
514
env:
515
VERSION: ${{ needs.please.outputs.version }}
516
run: |
517
set -euo pipefail
518
test "$(node -p "require('./integrations/editors/vscode/package.json').version")" = "$VERSION"
519
./integrations/editors/vscode/package-vsix.sh "$VERSION" archives dist
521
- name: install cosign
522
uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2
524
- name: sign and attach every extension package
525
env:
526
GH_TOKEN: ${{ github.token }}
527
RELEASE_UPLOAD_URL: ${{ needs.please.outputs.upload_url }}
528
run: |
529
set -euo pipefail
530
for package in dist/koment-vscode_*.vsix; do
531
cosign sign-blob --yes --bundle "${package}.sigstore.json" "$package"
532
done
533
./scripts/upload-release-assets.sh "$RELEASE_UPLOAD_URL" \
534
dist/koment-vscode_*.vsix dist/koment-vscode_*.vsix.sigstore.json
536
- name: report that marketplace publication is off
537
if: env.PUBLISH_EDITOR_MARKETPLACES != 'true'
538
run: |
539
echo "::notice::PUBLISH_EDITOR_MARKETPLACES is not 'true'." \
540
"The signed VSIX is attached to the release; no marketplace was updated."
542
- name: publish to VS Code Marketplace
543
if: env.PUBLISH_EDITOR_MARKETPLACES == 'true'
544
run: |
545
set -euo pipefail
546
if [ -z "$VSCE_PAT" ]; then
547
echo "::error::marketplace publication is enabled but VSCE_PAT is unset"
548
exit 1
549
fi
550
publish_with_retry() {
551
attempt=1
552
until "$@"; do
553
if [ "$attempt" -ge 3 ]; then
554
return 1
555
fi
556
echo "::warning::marketplace command failed on attempt ${attempt}; retrying"
557
attempt=$((attempt + 1))
558
sleep 10
559
done
560
}
561
for package in dist/koment-vscode_*.vsix; do
562
publish_with_retry integrations/editors/vscode/node_modules/.bin/vsce publish \
563
--skip-duplicate --packagePath "$package"
564
done
566
- name: publish to Open VSX
567
if: env.PUBLISH_EDITOR_MARKETPLACES == 'true'
568
run: |
569
set -euo pipefail
570
if [ -z "$OVSX_PAT" ]; then
571
echo "::error::marketplace publication is enabled but OVSX_PAT is unset"
572
exit 1
573
fi
574
publisher=$(node -p "require('./integrations/editors/vscode/package.json').publisher")
575
if curl --fail --silent --output /dev/null "https://open-vsx.org/api/${publisher}"; then
576
echo "Open VSX namespace ${publisher} already exists"
577
else
578
echo "creating Open VSX namespace ${publisher}"
579
integrations/editors/vscode/node_modules/.bin/ovsx create-namespace "$publisher"
580
fi
581
publish_with_retry() {
582
attempt=1
583
until "$@"; do
584
if [ "$attempt" -ge 3 ]; then
585
return 1
586
fi
587
echo "::warning::marketplace command failed on attempt ${attempt}; retrying"
588
attempt=$((attempt + 1))
589
sleep 10
590
done
591
}
592
for package in dist/koment-vscode_*.vsix; do
593
publish_with_retry integrations/editors/vscode/node_modules/.bin/ovsx publish \
594
--skip-duplicate "$package"
595
done