From fe8ab85e1a6d647d3a196f8245d279e28364c041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Barreiro?= <52393857+BarreiroT@users.noreply.github.com> Date: Sat, 23 Aug 2025 02:07:52 +0200 Subject: [PATCH] Build package per commit (#4570) * Build the extension on every commit push * Publish using the vsix path * Fix tag resolution * Remove `while ;` * Remove test trigger * use while true; * Update package.json Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Use high capacity runner * add if check to only run in the Cline repo * Conditionally select a runner --------- Co-authored-by: Dennise Bartlett Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/build.yml | 68 +++++++++++++++++++++++++++++++++++ .github/workflows/publish.yml | 67 ++++++++++++++++++---------------- package.json | 4 +-- 3 files changed, 106 insertions(+), 33 deletions(-) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000..11c8b1114f --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,68 @@ +name: "Build Extension" + +on: + push: + branches: + - main + +jobs: + test: + uses: ./.github/workflows/test.yml + build: + needs: test + name: Build Extension + runs-on: ${{ github.repository == 'cline/cline' && 'high-capacity-runner' || 'ubuntu-latest' }} + + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "lts/*" + + - name: Cache root dependencies + uses: actions/cache@v4 + id: root-cache + with: + path: node_modules + key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} + + # Cache webview-ui dependencies - only reuse if package-lock.json exactly matches + - name: Cache webview-ui dependencies + uses: actions/cache@v4 + id: webview-cache + with: + path: webview-ui/node_modules + key: ${{ runner.os }}-npm-webview-${{ hashFiles('webview-ui/package-lock.json') }} + + - name: Install root dependencies + if: steps.root-cache.outputs.cache-hit != 'true' + run: npm ci --include=optional + + - name: Install webview-ui dependencies + if: steps.webview-cache.outputs.cache-hit != 'true' + run: cd webview-ui && npm ci --include=optional + + - name: Install Publishing Tools + run: npm install -g @vscode/vsce ovsx + + - name: Set Variables + id: set_variables + run: | + VERSION=$(node -p "require('./package.json').version") + echo "version=$VERSION" >> $GITHUB_OUTPUT + SHORT_SHA=$(git rev-parse --short HEAD) + echo "short_sha=$SHORT_SHA" >> $GITHUB_OUTPUT + echo "file_path=cline-${VERSION}-${SHORT_SHA}.vsix" >> $GITHUB_OUTPUT + + - name: Package Extension + run: | + echo "Packaging extension with version ${{ steps.set_variables.outputs.version }}" + vsce package --out "${{ steps.set_variables.outputs.file_path }}" + + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: vsix-package + path: ${{ steps.set_variables.outputs.file_path }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2be2b2a992..8450e96a2e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -23,11 +23,7 @@ permissions: pull-requests: write jobs: - test: - uses: ./.github/workflows/test.yml - publish: - needs: test name: Publish Extension runs-on: ubuntu-latest environment: publish @@ -42,30 +38,6 @@ jobs: with: node-version: "lts/*" - # Cache root dependencies - only reuse if package-lock.json exactly matches - - name: Cache root dependencies - uses: actions/cache@v4 - id: root-cache - with: - path: node_modules - key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} - - # Cache webview-ui dependencies - only reuse if package-lock.json exactly matches - - name: Cache webview-ui dependencies - uses: actions/cache@v4 - id: webview-cache - with: - path: webview-ui/node_modules - key: ${{ runner.os }}-npm-webview-${{ hashFiles('webview-ui/package-lock.json') }} - - - name: Install root dependencies - if: steps.root-cache.outputs.cache-hit != 'true' - run: npm ci --include=optional - - - name: Install webview-ui dependencies - if: steps.webview-cache.outputs.cache-hit != 'true' - run: cd webview-ui && npm ci --include=optional - - name: Install Publishing Tools run: npm install -g @vscode/vsce ovsx @@ -90,15 +62,48 @@ jobs: echo "Tag '$TAG' validated successfully" + - name: Download Artifact + id: download_artifact + timeout-minutes: 30 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + TAG="${{ github.event.inputs.tag }}" + COMMIT_SHA=$(git rev-parse "$TAG") + + while true; do + RUN_ID=$(gh run list \ + --workflow="Build Extension" \ + --commit="${COMMIT_SHA}" \ + --status=success \ + --limit=1 \ + --json databaseId \ + --jq '.[0].databaseId') + + if [ -n "$RUN_ID" ]; then + echo "Build completed! Downloading artifact..." + + gh run download $RUN_ID --name vsix-package + exit 0 + fi + + echo "Waiting for build..." + sleep 10 + done + + - name: Set VSIX Path + id: set_vsix_path + run: | + FILE_PATH=$(ls *.vsix | head -n 1) + echo "VSIX_PATH=$FILE_PATH" >> $GITHUB_OUTPUT + - name: Package and Publish Extension env: VSCE_PAT: ${{ secrets.VSCE_PAT }} OVSX_PAT: ${{ secrets.OVSX_PAT }} CLINE_ENVIRONMENT: production + VSIX_PATH: ${{ steps.set_vsix_path.outputs.VSIX_PATH }} run: | - # Required to generate the .vsix - vsce package --out "cline-${{ steps.get_version.outputs.version }}.vsix" - if [ "${{ github.event.inputs.release-type }}" = "pre-release" ]; then npm run publish:marketplace:prerelease echo "Successfully published pre-release version ${{ steps.get_version.outputs.version }} to VS Code Marketplace and Open VSX Registry" diff --git a/package.json b/package.json index 850ed979c2..4a6d108cdd 100644 --- a/package.json +++ b/package.json @@ -371,8 +371,8 @@ "dev:webview": "cd webview-ui && npm run dev", "build:webview": "cd webview-ui && npm run build", "test:webview": "cd webview-ui && npm run test", - "publish:marketplace": "vsce publish && ovsx publish", - "publish:marketplace:prerelease": "vsce publish --pre-release && ovsx publish --pre-release", + "publish:marketplace": "vsce publish ${VSIX_PATH:+--packagePath $VSIX_PATH} && ovsx publish ${VSIX_PATH:+--packagePath $VSIX_PATH}", + "publish:marketplace:prerelease": "vsce publish --pre-release ${VSIX_PATH:+--packagePath $VSIX_PATH} && ovsx publish --pre-release ${VSIX_PATH:+--packagePath $VSIX_PATH}", "prepare": "husky", "changeset": "changeset", "version-packages": "changeset version",