Skip to content

Build Release Artifacts #20

Build Release Artifacts

Build Release Artifacts #20

Workflow file for this run

name: Build Release Artifacts
on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
publish_vscode:
description: 'Publish VSCode extension to marketplace'
required: false
default: false
type: boolean
env:
CARGO_TERM_COLOR: always
permissions:
contents: write
packages: write
jobs:
build-binaries:
name: Build ${{ matrix.target }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- target: x86_64-unknown-linux-gnu
os: ubuntu-latest
name: linux-x64
- target: aarch64-unknown-linux-gnu
os: ubuntu-latest
name: linux-arm64
- target: x86_64-apple-darwin
os: macos-14
name: darwin-x64
- target: aarch64-apple-darwin
os: macos-latest
name: darwin-arm64
- target: x86_64-pc-windows-msvc
os: windows-latest
name: win32-x64
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Add target
run: |
rustup target add ${{ matrix.target }}
rustup component add rust-std-${{ matrix.target }}
- name: Verify Rust installation
run: |
echo "Runner OS: ${{ runner.os }}"
echo "Runner Arch: ${{ runner.arch }}"
echo "Target: ${{ matrix.target }}"
echo "---"
rustup show
echo "---"
rustup target list --installed
echo "---"
rustc --version --verbose
- name: Install cross-compilation tools (Linux ARM64)
if: matrix.target == 'aarch64-unknown-linux-gnu'
run: |
sudo apt-get update
sudo apt-get install -y gcc-aarch64-linux-gnu
- name: Configure cross-compilation (Linux ARM64)
if: matrix.target == 'aarch64-unknown-linux-gnu'
run: |
echo "CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
echo "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
- name: Cache cargo dependencies
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }}
- name: Install cross (for cross-compilation)
if: matrix.target == 'aarch64-unknown-linux-gnu'
run: cargo install cross --git https://github.com/cross-rs/cross
- name: Build binary (cross-compilation)
if: matrix.target == 'aarch64-unknown-linux-gnu'
run: cross build --release --target ${{ matrix.target }} -p raz-cli
- name: Build binary (native)
if: matrix.target != 'aarch64-unknown-linux-gnu'
run: cargo build --release --target ${{ matrix.target }} -p raz-cli
- name: Prepare binary
shell: bash
run: |
mkdir -p binaries/${{ matrix.name }}
if [[ "${{ matrix.os }}" == "windows-latest" ]]; then
cp target/${{ matrix.target }}/release/raz.exe binaries/${{ matrix.name }}/
else
cp target/${{ matrix.target }}/release/raz binaries/${{ matrix.name }}/
fi
- name: Upload binary
uses: actions/upload-artifact@v4
with:
name: binary-${{ matrix.name }}
path: binaries/${{ matrix.name }}
build-vscode-extension:
name: Build VSCode Extension
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
cache-dependency-path: raz-adapters/vscode/package-lock.json
- name: Install dependencies
working-directory: raz-adapters/vscode
run: npm ci
- name: Compile TypeScript
working-directory: raz-adapters/vscode
run: npm run compile
- name: Install vsce
run: npm install -g vsce
- name: Package extension (no binaries)
working-directory: raz-adapters/vscode
run: vsce package --no-dependencies
- name: Upload VSCode extension
uses: actions/upload-artifact@v4
with:
name: vscode-extension
path: raz-adapters/vscode/*.vsix
create-release:
name: Create GitHub Release
needs: [build-binaries, build-vscode-extension]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Prepare release assets
run: |
mkdir -p release-assets
# Package individual binaries - VS Code extension expects .tar.gz for all platforms
cd artifacts
for dir in binary-*; do
platform=${dir#binary-}
cd "$dir"
# Create tar.gz for all platforms (VS Code extension expects this format)
if [[ -f "raz.exe" ]]; then
tar -czf "../../release-assets/raz-${platform}.tar.gz" raz.exe
else
tar -czf "../../release-assets/raz-${platform}.tar.gz" raz
fi
cd ..
done
cd ..
# Copy VSCode extension
cp artifacts/vscode-extension/*.vsix release-assets/
- name: Create Release
uses: softprops/action-gh-release@v1
with:
draft: false
prerelease: false
generate_release_notes: true
files: release-assets/*
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
publish-vscode:
name: Publish VSCode Extension
needs: [create-release]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/v')
steps:
- name: Download VSCode extension
uses: actions/download-artifact@v4
with:
name: vscode-extension
path: .
- name: Install vsce
run: npm install -g vsce
- name: Publish to VS Code marketplace
run: |
if [ -n "${{ secrets.VSCE_TOKEN }}" ]; then
echo "Publishing to VS Code marketplace..."
vsce publish --packagePath *.vsix --pat ${{ secrets.VSCE_TOKEN }}
else
echo "⚠️ VSCE_TOKEN not set, skipping VS Code marketplace publish."
fi
- name: Publish to Open VSX Registry
run: |
if [ -n "${{ secrets.OVSX_TOKEN }}" ]; then
echo "Publishing to Open VSX Registry..."
npm install -g ovsx
ovsx publish *.vsix -p ${{ secrets.OVSX_TOKEN }}
else
echo "⚠️ OVSX_TOKEN not set, skipping Open VSX publish."
fi