name: "Publish Release" on: workflow_dispatch: inputs: release-type: description: "Choose release type (release or pre-release)" required: true default: "release" type: choice options: - pre-release - release tag: description: "Enter existing tag to publish (e.g., v3.1.2)" required: true type: string permissions: contents: write packages: write checks: write pull-requests: write jobs: test: uses: ./.github/workflows/test.yml publish: needs: test name: Publish Extension runs-on: ubuntu-latest environment: publish steps: - uses: actions/checkout@v4 with: ref: ${{ github.event.inputs.tag }} fetch-depth: 0 fetch-tags: true - name: Setup Node.js uses: actions/setup-node@v4 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 install --include=optional - name: Install webview-ui dependencies if: steps.webview-cache.outputs.cache-hit != 'true' run: cd webview-ui && npm install --include=optional - name: Install Publishing Tools run: npm install -g @vscode/vsce ovsx - name: Get Version id: get_version run: | VERSION=$(node -p "require('./package.json').version") echo "version=$VERSION" >> $GITHUB_OUTPUT - name: Validate Tag id: validate_tag run: | TAG="${{ github.event.inputs.tag }}" echo "tag=$TAG" >> $GITHUB_OUTPUT echo "Using existing tag: $TAG" # Verify the tag exists if ! git rev-parse "$TAG" >/dev/null 2>&1; then echo "Error: Tag '$TAG' does not exist in the repository" exit 1 fi echo "Tag '$TAG' validated successfully" - name: Package and Publish Extension env: VSCE_PAT: ${{ secrets.VSCE_PAT }} OVSX_PAT: ${{ secrets.OVSX_PAT }} CLINE_ENVIRONMENT: production TELEMETRY_SERVICE_API_KEY: ${{ secrets.TELEMETRY_SERVICE_API_KEY }} ERROR_SERVICE_API_KEY: ${{ secrets.ERROR_SERVICE_API_KEY }} # OpenTelemetry production defaults (can be overridden at runtime) OTEL_TELEMETRY_ENABLED: ${{ secrets.OTEL_TELEMETRY_ENABLED }} OTEL_LOGS_EXPORTER: otlp OTEL_METRICS_EXPORTER: otlp OTEL_EXPORTER_OTLP_PROTOCOL: ${{ secrets.OTEL_EXPORTER_OTLP_PROTOCOL }} OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTEL_EXPORTER_OTLP_ENDPOINT }} OTEL_EXPORTER_OTLP_HEADERS: ${{ secrets.OTEL_EXPORTER_OTLP_HEADERS }} run: | # Required to generate the .vsix vsce package --allow-package-secrets sendgrid --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" else npm run publish:marketplace echo "Successfully published release version ${{ steps.get_version.outputs.version }} to VS Code Marketplace and Open VSX Registry" fi - name: Get Previous Tag id: prev_tag run: | CURRENT_TAG="${{ steps.validate_tag.outputs.tag }}" PREV_TAG=$(git describe --tags --abbrev=0 "$CURRENT_TAG^" 2>/dev/null || echo "") echo "prev_tag=$PREV_TAG" >> $GITHUB_OUTPUT - name: Get Changelog Entry id: changelog run: | # Get content between first ## [ and second ## [ CONTENT=$(awk '/^## \[/{if(found) exit; found=1; next} found{print}' CHANGELOG.md) echo "content<> $GITHUB_OUTPUT echo "$CONTENT" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: Create GitHub Release uses: softprops/action-gh-release@v1 with: tag_name: ${{ steps.validate_tag.outputs.tag }} files: "*.vsix" body: | ${{ steps.changelog.outputs.content }} **Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.prev_tag.outputs.prev_tag }}...${{ steps.validate_tag.outputs.tag }} prerelease: ${{ github.event.inputs.release-type == 'pre-release' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}