Skip to content

Release Pipeline

Release Pipeline #5

Workflow file for this run

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