name: Release
on:
push:
branches:
- main
workflow_dispatch:
inputs:
release_tag:
description: Existing heel release tag to upload assets to
required: false
type: string
permissions:
contents: write
pull-requests: write
jobs:
release-plz:
name: Release
if: github.event_name == 'push'
runs-on: ubuntu-latest
outputs:
releases_created: ${{ steps.release.outputs.releases_created }}
release_tag: ${{ steps.release_tag.outputs.tag }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: dtolnay/rust-toolchain@stable
- id: release
uses: MarcoIeni/release-plz-action@v0.5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
- name: Resolve released heel tag
id: release_tag
if: steps.release.outputs.releases_created == 'true'
env:
RELEASES_JSON: ${{ steps.release.outputs.releases }}
run: |
tag="$(jq -r '
map(select(.package_name == "heel")) as $releases
| if ($releases | length) == 1 then $releases[0].tag else empty end
' <<<"${RELEASES_JSON}")"
if [[ -z "${tag}" ]]; then
echo "release-plz created releases but did not return exactly one heel release tag" >&2
exit 1
fi
echo "tag=${tag}" >> "${GITHUB_OUTPUT}"
resolve-release:
name: Resolve Release Tag
if: ${{ always() }}
runs-on: ubuntu-latest
needs: release-plz
outputs:
upload_assets: ${{ steps.resolve.outputs.upload_assets }}
release_tag: ${{ steps.resolve.outputs.release_tag }}
steps:
- name: Resolve release tag for asset upload
id: resolve
env:
EVENT_NAME: ${{ github.event_name }}
MANUAL_TAG: ${{ inputs.release_tag }}
AUTO_RELEASES_CREATED: ${{ needs.release-plz.outputs.releases_created }}
AUTO_RELEASE_TAG: ${{ needs.release-plz.outputs.release_tag }}
run: |
if [[ "${EVENT_NAME}" == "workflow_dispatch" ]]; then
if [[ -z "${MANUAL_TAG}" ]]; then
echo "workflow_dispatch requires the release_tag input" >&2
exit 1
fi
echo "upload_assets=true" >> "${GITHUB_OUTPUT}"
echo "release_tag=${MANUAL_TAG}" >> "${GITHUB_OUTPUT}"
exit 0
fi
if [[ "${AUTO_RELEASES_CREATED}" != "true" ]]; then
echo "upload_assets=false" >> "${GITHUB_OUTPUT}"
exit 0
fi
if [[ -z "${AUTO_RELEASE_TAG}" ]]; then
echo "release-plz created a release but no heel tag was resolved" >&2
exit 1
fi
echo "upload_assets=true" >> "${GITHUB_OUTPUT}"
echo "release_tag=${AUTO_RELEASE_TAG}" >> "${GITHUB_OUTPUT}"
release-assets:
name: Release Assets
needs: resolve-release
if: ${{ always() && needs.resolve-release.outputs.upload_assets == 'true' }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-24.04
target: x86_64-unknown-linux-gnu
- os: ubuntu-24.04-arm
target: aarch64-unknown-linux-gnu
- os: macos-13
target: x86_64-apple-darwin
- os: macos-14
target: aarch64-apple-darwin
- os: windows-2022
target: x86_64-pc-windows-msvc
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Build heel
run: cargo build --locked --bin heel --target "${{ matrix.target }}"
- name: Prepare release asset
id: asset
run: |
asset_name="heel-${{ matrix.target }}"
binary_path="target/${{ matrix.target }}/debug/heel"
if [[ "${{ runner.os }}" == "Windows" ]]; then
asset_name="${asset_name}.exe"
binary_path="${binary_path}.exe"
fi
cp "${binary_path}" "${asset_name}"
echo "asset_name=${asset_name}" >> "${GITHUB_OUTPUT}"
- name: Upload asset to GitHub release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_TAG: ${{ needs.resolve-release.outputs.release_tag }}
run: |
gh release upload "${RELEASE_TAG}" "${{ steps.asset.outputs.asset_name }}#${{ steps.asset.outputs.asset_name }}" --clobber