Release Pipeline #5
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Release Pipeline | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| bump_type: | |
| description: "Version Bump Type (major, minor, patch)" | |
| required: true | |
| default: "patch" | |
| type: choice | |
| options: | |
| - patch | |
| - minor | |
| - major | |
| jobs: | |
| build-and-release: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| steps: | |
| - name: Checkout Code | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Setup Go | |
| uses: actions/setup-go@v5 | |
| with: | |
| go-version: "1.23" | |
| - name: Setup Node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: "20" | |
| - name: Setup Rust | |
| uses: dtolnay/rust-toolchain@stable | |
| with: | |
| targets: wasm32-wasip1 | |
| - name: Configure Git User | |
| run: | | |
| git config user.name "GitHub Actions" | |
| git config user.email "actions@github.com" | |
| - name: Bump Version Everywhere | |
| id: bump_version | |
| run: | | |
| # 1. Read current version from VERSION file (source of truth) | |
| if [ -f VERSION ]; then | |
| CURRENT_VERSION=$(cat VERSION | tr -d '[:space:]') | |
| else | |
| CURRENT_VERSION="0.0.0" | |
| fi | |
| IFS='.' read -r -a parts <<< "$CURRENT_VERSION" | |
| major=${parts[0]} | |
| minor=${parts[1]} | |
| patch=${parts[2]} | |
| # 2. Calculate New Version | |
| BUMP_TYPE="${{ inputs.bump_type }}" | |
| if [ "$BUMP_TYPE" == "major" ]; then | |
| major=$((major + 1)); minor=0; patch=0 | |
| elif [ "$BUMP_TYPE" == "minor" ]; then | |
| minor=$((minor + 1)); patch=0 | |
| else | |
| patch=$((patch + 1)) | |
| fi | |
| NEW_VERSION="$major.$minor.$patch" | |
| echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV | |
| echo "PREVIOUS_VERSION=$CURRENT_VERSION" >> $GITHUB_ENV | |
| echo "Bumping version from $CURRENT_VERSION to $NEW_VERSION" | |
| # ======================================================= | |
| # 3. UPDATE ALL VERSION FILES | |
| # ======================================================= | |
| # A. Source of Truth | |
| echo "$NEW_VERSION" > VERSION | |
| # B. VS Code Extension (package.json) | |
| tmp=$(mktemp) | |
| jq --arg v "$NEW_VERSION" '.version = $v' editors/vscode/package.json > "$tmp" && mv "$tmp" editors/vscode/package.json | |
| # C. Zed Extension Metadata (extension.toml) | |
| sed -i "s/^version = \".*\"/version = \"$NEW_VERSION\"/" editors/zed/extension.toml | |
| # D. Zed Extension Cargo.toml | |
| sed -i "s/^version = \".*\"/version = \"$NEW_VERSION\"/" editors/zed/Cargo.toml | |
| # E. Zed Rust Code (lib.rs) - Update download URLs | |
| sed -i "s|releases/download/v[0-9]*\.[0-9]*\.[0-9]*|releases/download/v$NEW_VERSION|g" editors/zed/src/lib.rs | |
| # F. Zed Extension grammar rev (extension.toml) - Update to new tag | |
| sed -i "s/^rev = \".*\"/rev = \"v$NEW_VERSION\"/" editors/zed/extension.toml | |
| # G. Makefile | |
| sed -i "s/^VERSION=.*/VERSION=$NEW_VERSION/" Makefile | |
| # H. Go CLI (main.go) | |
| sed -i "s/const VERSION = \".*\"/const VERSION = \"$NEW_VERSION\"/" cmd/cambridge/main.go | |
| # I. Tree-sitter grammar (package.json) | |
| tmp=$(mktemp) | |
| jq --arg v "$NEW_VERSION" '.version = $v' tree-sitter-cambridge/package.json > "$tmp" && mv "$tmp" tree-sitter-cambridge/package.json | |
| # J. Tree-sitter grammar Cargo.toml | |
| sed -i "0,/^version = \".*\"/s//version = \"$NEW_VERSION\"/" tree-sitter-cambridge/Cargo.toml | |
| # K. Snapcraft version | |
| sed -i "s/^version: '.*'/version: '$NEW_VERSION'/" snap/snapcraft.yaml | |
| # --- 4. COMPILE GO BINARIES --- | |
| - name: Build Go Binaries | |
| run: | | |
| mkdir -p build_assets | |
| echo "Building cambridge-lsp binaries..." | |
| GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o build_assets/cambridge-lsp-linux ./cmd/cambridge-lsp | |
| GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -o build_assets/cambridge-lsp-macos-intel ./cmd/cambridge-lsp | |
| GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w" -o build_assets/cambridge-lsp-macos-arm64 ./cmd/cambridge-lsp | |
| GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o build_assets/cambridge-lsp.exe ./cmd/cambridge-lsp | |
| echo "Building cambridge CLI binaries..." | |
| GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o build_assets/cambridge-linux-amd64 ./cmd/cambridge | |
| GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o build_assets/cambridge-linux-arm64 ./cmd/cambridge | |
| GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -o build_assets/cambridge-macos-intel ./cmd/cambridge | |
| GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w" -o build_assets/cambridge-macos-arm64 ./cmd/cambridge | |
| GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o build_assets/cambridge-windows.exe ./cmd/cambridge | |
| # --- 5. CALCULATE SHA256 CHECKSUMS --- | |
| - name: Calculate SHA256 Checksums | |
| run: | | |
| cd build_assets | |
| echo "SHA256_MACOS_INTEL=$(sha256sum cambridge-macos-intel | cut -d' ' -f1)" >> $GITHUB_ENV | |
| echo "SHA256_MACOS_ARM64=$(sha256sum cambridge-macos-arm64 | cut -d' ' -f1)" >> $GITHUB_ENV | |
| echo "SHA256_LINUX_AMD64=$(sha256sum cambridge-linux-amd64 | cut -d' ' -f1)" >> $GITHUB_ENV | |
| echo "SHA256_LINUX_ARM64=$(sha256sum cambridge-linux-arm64 | cut -d' ' -f1)" >> $GITHUB_ENV | |
| echo "SHA256_LSP_MACOS_INTEL=$(sha256sum cambridge-lsp-macos-intel | cut -d' ' -f1)" >> $GITHUB_ENV | |
| echo "SHA256_LSP_MACOS_ARM64=$(sha256sum cambridge-lsp-macos-arm64 | cut -d' ' -f1)" >> $GITHUB_ENV | |
| echo "SHA256_LSP_LINUX=$(sha256sum cambridge-lsp-linux | cut -d' ' -f1)" >> $GITHUB_ENV | |
| # --- 6. PACKAGE VS CODE EXTENSION --- | |
| - name: Package VS Code Extension | |
| working-directory: ./editors/vscode | |
| run: | | |
| npm install | |
| npm install -g @vscode/vsce | |
| vsce package --out ../../build_assets/cambridge-vscode-${{ env.NEW_VERSION }}.vsix | |
| # --- 7. PACKAGE ZED EXTENSION --- | |
| - name: Package Zed Extension | |
| working-directory: ./editors/zed | |
| run: | | |
| cargo build --release --target wasm32-wasip1 | |
| mkdir -p ../../build_assets/zed-extension | |
| cp target/wasm32-wasip1/release/cambridge_pseudo.wasm ../../build_assets/zed-extension/extension.wasm | |
| cp extension.toml ../../build_assets/zed-extension/ | |
| cp -r languages ../../build_assets/zed-extension/ | |
| cd ../../build_assets | |
| zip -r cambridge-zed-${{ env.NEW_VERSION }}.zip zed-extension | |
| rm -rf zed-extension | |
| # --- 8. COMMIT & TAG --- | |
| - name: Commit and Push Version Bump | |
| run: | | |
| git add -A | |
| git commit -m "chore: release v${{ env.NEW_VERSION }} [skip ci]" | |
| git tag "v${{ env.NEW_VERSION }}" | |
| git push origin HEAD --tags | |
| # --- 9. GITHUB RELEASE --- | |
| - name: Create GitHub Release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: v${{ env.NEW_VERSION }} | |
| name: Release v${{ env.NEW_VERSION }} | |
| draft: false | |
| prerelease: false | |
| generate_release_notes: true | |
| files: | | |
| build_assets/cambridge-lsp-linux | |
| build_assets/cambridge-lsp-macos-intel | |
| build_assets/cambridge-lsp-macos-arm64 | |
| build_assets/cambridge-lsp.exe | |
| build_assets/cambridge-linux-amd64 | |
| build_assets/cambridge-linux-arm64 | |
| build_assets/cambridge-macos-intel | |
| build_assets/cambridge-macos-arm64 | |
| build_assets/cambridge-windows.exe | |
| build_assets/cambridge-vscode-${{ env.NEW_VERSION }}.vsix | |
| build_assets/cambridge-zed-${{ env.NEW_VERSION }}.zip | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| # --- 10. PUBLISH TO VS CODE MARKETPLACE --- | |
| - name: Publish to VS Code Marketplace | |
| working-directory: ./editors/vscode | |
| env: | |
| VSCE_PAT: ${{ secrets.VSCE_PAT }} | |
| run: | | |
| if [ -n "$VSCE_PAT" ]; then | |
| echo "Publishing to VS Code Marketplace..." | |
| vsce publish -p $VSCE_PAT | |
| else | |
| echo "VSCE_PAT not set, skipping VS Code Marketplace publish" | |
| fi | |
| # --- 11. UPDATE HOMEBREW TAP --- | |
| - name: Update Homebrew Formulae | |
| env: | |
| HOMEBREW_TAP_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }} | |
| run: | | |
| if [ -z "$HOMEBREW_TAP_TOKEN" ]; then | |
| echo "HOMEBREW_TAP_TOKEN not set, skipping Homebrew update" | |
| exit 0 | |
| fi | |
| # Generate cambridge.rb formula | |
| sed -e "s/{{VERSION}}/${{ env.NEW_VERSION }}/g" \ | |
| -e "s/{{SHA256_MACOS_INTEL}}/${{ env.SHA256_MACOS_INTEL }}/g" \ | |
| -e "s/{{SHA256_MACOS_ARM64}}/${{ env.SHA256_MACOS_ARM64 }}/g" \ | |
| -e "s/{{SHA256_LINUX_AMD64}}/${{ env.SHA256_LINUX_AMD64 }}/g" \ | |
| -e "s/{{SHA256_LINUX_ARM64}}/${{ env.SHA256_LINUX_ARM64 }}/g" \ | |
| .github/formula/cambridge.rb.template > cambridge.rb | |
| # Generate cambridge-lsp.rb formula | |
| sed -e "s/{{VERSION}}/${{ env.NEW_VERSION }}/g" \ | |
| -e "s/{{SHA256_LSP_MACOS_INTEL}}/${{ env.SHA256_LSP_MACOS_INTEL }}/g" \ | |
| -e "s/{{SHA256_LSP_MACOS_ARM64}}/${{ env.SHA256_LSP_MACOS_ARM64 }}/g" \ | |
| -e "s/{{SHA256_LSP_LINUX}}/${{ env.SHA256_LSP_LINUX }}/g" \ | |
| .github/formula/cambridge-lsp.rb.template > cambridge-lsp.rb | |
| # Clone the tap repository and update | |
| git clone https://x-access-token:${HOMEBREW_TAP_TOKEN}@github.com/andrinoff/homebrew-cambridge.git tap-repo | |
| cd tap-repo | |
| # Copy formulae | |
| mkdir -p Formula | |
| cp ../cambridge.rb Formula/ | |
| cp ../cambridge-lsp.rb Formula/ | |
| # Commit and push | |
| git config user.name "GitHub Actions" | |
| git config user.email "actions@github.com" | |
| git add Formula/ | |
| git commit -m "Update formulae to v${{ env.NEW_VERSION }}" || echo "No changes to commit" | |
| git push |