diff --git a/.github/workflows/changie-pr.yml b/.github/workflows/changie-pr.yml new file mode 100644 index 0000000000..412ee8b5b9 --- /dev/null +++ b/.github/workflows/changie-pr.yml @@ -0,0 +1,68 @@ +name: "Changie Version PR" + +on: + push: + branches: + - main + +jobs: + version-pr: + name: Create/Update Version PR + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # Important for changelog history + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20.15.1 + + - name: Install dependencies + run: npm ci + + # Use Changie to batch changes and get the next version + - name: Batch changes + id: batch + uses: miniscruff/changie-action@v2 + with: + args: batch auto + + # If no changes, stop here + - name: Check for changes + id: check + run: | + if [ -z "$(git status --porcelain)" ]; then + echo "No changes to process" + echo "has_changes=false" >> $GITHUB_OUTPUT + else + echo "has_changes=true" >> $GITHUB_OUTPUT + fi + + # If we have changes, merge them and create/update PR + - name: Merge changes + if: steps.check.outputs.has_changes == 'true' + uses: miniscruff/changie-action@v2 + with: + args: merge + + - name: Get latest version + if: steps.check.outputs.has_changes == 'true' + id: latest + uses: miniscruff/changie-action@v2 + with: + args: latest + + - name: Create Pull Request + if: steps.check.outputs.has_changes == 'true' + uses: peter-evans/create-pull-request@v4 + with: + title: "Release ${{ steps.latest.outputs.output }}" + branch: "release/${{ steps.latest.outputs.output }}" + commit-message: "chore: update changelog for ${{ steps.latest.outputs.output }}" + body: | + This PR was automatically created by the Changie workflow. + - Updates CHANGELOG.md + - Bumps version to ${{ steps.latest.outputs.output }} diff --git a/.github/workflows/prerelease-publish.yml b/.github/workflows/prerelease-publish.yml deleted file mode 100644 index 62ab66371e..0000000000 --- a/.github/workflows/prerelease-publish.yml +++ /dev/null @@ -1,85 +0,0 @@ -name: Pre-release Publisher - -on: - release: - types: [prereleased] - workflow_dispatch: - -permissions: - contents: write - packages: write - actions: read - checks: read - deployments: read - discussions: read - issues: read - pages: read - pull-requests: read - repository-projects: read - security-events: read - statuses: read - -jobs: - test: - uses: ./.github/workflows/test.yml - - publish-prerelease: - needs: test - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: "20.15.1" - cache: "npm" - - # Cache root dependencies - - 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 - - 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 - - - name: Install webview-ui dependencies - if: steps.webview-cache.outputs.cache-hit != 'true' - run: cd webview-ui && npm ci - - - name: Build Extension - run: npm run build - - - name: Install Publishing Tools - run: npm install -g vsce ovsx - - - name: Package and Publish Pre-release - env: - VSCE_PAT: ${{ secrets.VSCE_PAT }} - OVSX_PAT: ${{ secrets.OVSX_PAT }} - run: | - current_package_version=$(node -p "require('./package.json').version") - npm run publish:marketplace:prerelease - echo "Successfully published pre-release version $current_package_version to VS Code Marketplace and Open VSX Registry" - - - name: Create GitHub Pre-release - uses: softprops/action-gh-release@v1 - with: - files: "*.vsix" - generate_release_notes: true - prerelease: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000000..8098129eb9 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,108 @@ +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 + +permissions: + contents: write + packages: 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 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20.15.1 + + # 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 + + - name: Install webview-ui dependencies + if: steps.webview-cache.outputs.cache-hit != 'true' + run: cd webview-ui && npm ci + + - name: Install Publishing Tools + run: npm install -g vsce ovsx + + - name: Get Version + id: get_version + run: echo "version=$(node -p \"require('./package.json').version\")" >> $GITHUB_OUTPUT + + - name: Create Git Tag + run: | + VERSION=v${{ steps.get_version.outputs.version }} + echo "Tagging with $VERSION" + git tag "$VERSION" + git push origin "$VERSION" + + - name: Package and Publish Extension + env: + VSCE_PAT: ${{ secrets.VSCE_PAT }} + OVSX_PAT: ${{ secrets.OVSX_PAT }} + 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" + 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 Changelog Entry + id: changelog + uses: mindsers/changelog-reader-action@v2 + with: + # This expects a standard Keep a Changelog format + # "latest" means it will read whichever is the most recent version + # set in "## [1.2.3] - 2025-01-28" style + version: latest + + - name: Create GitHub Release + uses: softprops/action-gh-release@v1 + with: + files: "*.vsix" + body: ${{ steps.changelog.outputs.content }} + generate_release_notes: false + prerelease: ${{ github.event.inputs.release-type == 'pre-release' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 09c0c4eedf..0000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,83 +0,0 @@ -name: Release & Publish - -on: - release: - types: [published] - workflow_dispatch: - -permissions: - contents: write - packages: write - actions: read - checks: read - deployments: read - discussions: read - issues: read - pages: read - pull-requests: read - repository-projects: read - security-events: read - statuses: read - -jobs: - test: - uses: ./.github/workflows/test.yml - - release: - needs: test - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Node.js environment - uses: actions/setup-node@v4 - with: - node-version: 20.15.1 - - # 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 - - - name: Install webview-ui dependencies - if: steps.webview-cache.outputs.cache-hit != 'true' - run: cd webview-ui && npm ci - - - name: Build Extension - run: npm run build - - - name: Install Publishing Tools - run: npm install -g vsce ovsx - - - name: Package and Publish Extension - env: - VSCE_PAT: ${{ secrets.VSCE_PAT }} - OVSX_PAT: ${{ secrets.OVSX_PAT }} - run: | - current_package_version=$(node -p "require('./package.json').version") - npm run publish:marketplace - echo "Successfully published version $current_package_version to VS Code Marketplace and Open VSX Registry" - - - name: Create GitHub Release - uses: softprops/action-gh-release@v1 - with: - files: "*.vsix" - generate_release_notes: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}