blob: 11eb49cb3e22d52a83adb9fcc017386c38b41fda [file]
---
name: Release
on:
workflow_dispatch:
pull_request:
branches:
- main
paths:
- crate_universe/tools/cross_installer/**
- version.bzl
- .github/workflows/release.yaml
- .github/workflows/release_prep.sh
push:
branches:
- main
paths:
- version.bzl
defaults:
run:
shell: bash
env:
BAZEL_STARTUP_FLAGS: --bazelrc=${{ github.workspace }}/.github/github.bazelrc
jobs:
validation:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Ensure release does not already exist
if: startsWith(github.ref, 'refs/heads/main')
run: |
git fetch origin &> /dev/null
version="$(grep 'VERSION =' ${{ github.workspace }}/version.bzl | sed 's/VERSION = "//' | sed 's/"//')"
if [[ -n "$(git tag -l ${version})" ]]; then
echo "A release '${version}' already exists." >&2
exit 1
else
echo "Tag '${version}' will be created"
fi
builds:
needs: validation
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
# Create a job for each target triple
include:
- os: macOS-14
env:
TARGET: "aarch64-apple-darwin"
- os: ubuntu-22.04
env:
TARGET: "aarch64-unknown-linux-gnu"
- os: ubuntu-22.04
env:
TARGET: "aarch64-unknown-linux-musl"
- os: windows-2022
env:
TARGET: "aarch64-pc-windows-msvc"
- os: ubuntu-22.04
env:
TARGET: "s390x-unknown-linux-gnu"
- os: macos-15-intel
env:
TARGET: "x86_64-apple-darwin"
- os: ubuntu-22.04
env:
TARGET: "x86_64-pc-windows-gnu"
- os: windows-2022
env:
TARGET: "x86_64-pc-windows-msvc"
- os: ubuntu-22.04
env:
TARGET: "x86_64-unknown-linux-gnu"
- os: ubuntu-22.04
env:
TARGET: "x86_64-unknown-linux-musl"
steps:
- uses: actions/checkout@v4
- name: Install rust toolchains for host
run: |
# Detect the current version of rust
version="$(grep 'DEFAULT_RUST_VERSION =' ./rust/private/common.bzl | grep -o '[[:digit:].]\+')"
rustup override set "${version}"
rustup target add ${TARGET}
rustup update stable --no-self-update --force-non-host
rustup default stable
env:
TARGET: "${{ matrix.env.TARGET }}"
- name: Setup macos build tooling
run: |
ls -la /Applications/
sudo xcode-select -s /Applications/Xcode_16.1.app/Contents/Developer/
xcodebuild -showsdks
# Set SDK environment variables
echo "SDKROOT=$(xcrun -sdk ${{ env.TARGET_SDK }} --show-sdk-path)" >> $GITHUB_ENV
MACOSX_DEPLOYMENT_TARGET="$(xcrun -sdk ${{ env.TARGET_SDK }} --show-sdk-platform-version)"
if [[ -n "${MACOSX_DEPLOYMENT_TARGET}" ]]; then
echo "MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET}" >> $GITHUB_ENV
fi
env:
TARGET_SDK: macosx15.1
if: startswith(matrix.os, 'macos')
- name: Setup Windows Bazelrc
run: |
echo "startup --output_user_root=C:/tmp" > ./user.bazelrc
echo "startup --windows_enable_symlinks" > ./user.bazelrc
echo "build --enable_runfiles" > ./user.bazelrc
if: startswith(matrix.os, 'Windows')
- name: Build cargo-bazel binaries
run: |
# Build binaries
if [[ "${RUNNER_OS}" == "Windows" ]]; then
OUTPUT_PATH="$(cygpath "${{ github.workspace }}/crate_universe/target/artifacts" -m)"
else
OUTPUT_PATH="${{ github.workspace }}/crate_universe/target/artifacts"
fi
bazel ${BAZEL_STARTUP_FLAGS[@]} run //crate_universe/tools/cross_installer -- --target=${TARGET} --output="${OUTPUT_PATH}"
env:
TARGET: "${{ matrix.env.TARGET }}"
- uses: actions/upload-artifact@v4
with:
# The artifact name MUST be the target triple — release_prep.sh
# locates each binary at ${GITHUB_WORKSPACE}/<triple>/.
name: "${{ matrix.env.TARGET }}"
path: ${{ github.workspace }}/crate_universe/target/artifacts/${{ matrix.env.TARGET }}
if-no-files-found: error
# Create and push the version tag at the current main commit. The release
# job's reusable workflow (release_ruleset.yaml) checks out at this tag, so
# it must exist before that job runs.
tag:
if: github.event_name == 'workflow_dispatch' || (github.event_name == 'push' && startsWith(github.ref, 'refs/heads/main'))
needs: [validation, builds]
runs-on: ubuntu-22.04
permissions:
contents: write
outputs:
tag: ${{ steps.create_tag.outputs.tag }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Create and push tag
id: create_tag
run: |
set -euo pipefail
version="$(grep 'VERSION =' ${{ github.workspace }}/version.bzl | sed 's/VERSION = "//' | sed 's/"//')"
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
# Pin the tag to the resolved SHA so a concurrent merge to main
# can't shift the release contents out from under us.
git tag -a "${version}" -m "rules_rust ${version}" "${{ github.sha }}"
git push origin "${version}"
echo "tag=${version}" >> $GITHUB_OUTPUT
# Build the source archive, attest its provenance under the BCR-trusted
# release_ruleset builder ID, and publish the GitHub release. The actual
# build runs in .github/workflows/release_prep.sh (hardcoded path in
# release_ruleset.yaml).
release:
needs: tag
permissions:
contents: write
id-token: write
attestations: write
uses: bazel-contrib/.github/.github/workflows/release_ruleset.yaml@v7.7.0
with:
# Tests already ran on the PR that bumped version.bzl. Override the
# `bazel test //...` default — rules_rust's full suite can't fit on a
# single ubuntu-latest runner.
bazel_test_command: "bazel info release"
release_files: |
rules_rust-*.tar.gz
cargo-bazel-aarch64-apple-darwin
cargo-bazel-aarch64-pc-windows-msvc.exe
cargo-bazel-aarch64-unknown-linux-gnu
cargo-bazel-aarch64-unknown-linux-musl
cargo-bazel-s390x-unknown-linux-gnu
cargo-bazel-x86_64-apple-darwin
cargo-bazel-x86_64-pc-windows-gnu.exe
cargo-bazel-x86_64-pc-windows-msvc.exe
cargo-bazel-x86_64-unknown-linux-gnu
cargo-bazel-x86_64-unknown-linux-musl
prerelease: false
tag_name: ${{ needs.tag.outputs.tag }}
publish:
needs: [tag, release]
permissions:
contents: write
id-token: write
attestations: write
uses: ./.github/workflows/publish.yaml
with:
release_version: ${{ needs.tag.outputs.tag }}
secrets:
BCR_PUBLISH_TOKEN: ${{ secrets.BCR_PUBLISH_TOKEN }}