Skip to content

Merge pull request #299 from athenavm/move-host-interface #243

Merge pull request #299 from athenavm/move-host-interface

Merge pull request #299 from athenavm/move-host-interface #243

Workflow file for this run

# Reference: https://github.com/foundry-rs/foundry/blob/master/.github/workflows/release.yml
name: release
on:
push:
branches:
- main
tags:
- "v*.*.*"
workflow_dispatch:
env:
CARGO_TERM_COLOR: always
IS_NIGHTLY: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }}
jobs:
prepare:
name: Prepare release
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: write
outputs:
tag_name: ${{ steps.release_info.outputs.tag_name }}
release_name: ${{ steps.release_info.outputs.release_name }}
changelog: ${{ steps.build_changelog.outputs.changelog }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
# If it's a nightly release, tag with the release time. If the tag is `main`, we want to use
# `latest` as the tag name. Else, use the tag name as is.
- name: Compute release name and tag
id: release_info
run: |
if [[ $IS_NIGHTLY == true ]]; then
echo "tag_name=nightly-${GITHUB_SHA}" >> $GITHUB_OUTPUT
echo "release_name=Nightly ($(date '+%Y-%m-%d'))" >> $GITHUB_OUTPUT
elif [[ "${GITHUB_REF_NAME}" == "main" ]]; then
echo "tag_name=latest" >> $GITHUB_OUTPUT
echo "release_name=Latest Release" >> $GITHUB_OUTPUT
else
echo "tag_name=${GITHUB_REF_NAME}" >> $GITHUB_OUTPUT
echo "release_name=${GITHUB_REF_NAME}" >> $GITHUB_OUTPUT
fi
# Creates a `nightly-SHA` tag for this specific nightly
# This tag is used for this specific nightly version's release
# which allows users to roll back. It is also used to build
# the changelog.
- name: Create build-specific nightly tag
if: env.IS_NIGHTLY == 'true'
uses: rickstaa/action-create-tag@v1
with:
tag: ${{ steps.release_info.outputs.tag_name }}
tag_exists_error: false
# Create a release tag for the Go module as well, which needs to be different
- name: Create Go release tag
uses: rickstaa/action-create-tag@v1
with:
tag: ffi/athcon/bindings/go/${{ steps.release_info.outputs.tag_name }}
tag_exists_error: false
- name: Build changelog
id: build_changelog
uses: mikepenz/release-changelog-builder-action@v5
with:
configuration: "./.github/changelog.json"
fromTag: ${{ env.IS_NIGHTLY == 'true' && 'nightly' || '' }}
toTag: ${{ steps.release_info.outputs.tag_name }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
release:
name: ${{ matrix.target }} (${{ matrix.runner }})
permissions:
contents: write
runs-on: ${{ matrix.runner }}
timeout-minutes: 240
needs: prepare
strategy:
fail-fast: false
matrix:
include:
# `runner`: GHA runner label
# `target`: Rust build target triple
# `platform` and `arch`: Used in tarball names
- runner: ubuntu-latest
target: x86_64-unknown-linux-gnu
platform: linux
arch: amd64
- runner: [runs-on, runner=8cpu-linux-arm64, "run-id=${{ github.run_id }}"]
target: aarch64-unknown-linux-gnu
platform: linux
arch: arm64
- runner: macos-latest
target: aarch64-apple-darwin
platform: darwin
arch: arm64
- runner: windows-latest
target: x86_64-pc-windows-msvc
platform: win32
arch: amd64
steps:
- uses: actions/checkout@v4
- name: Setup Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Apple M1 setup
if: matrix.target == 'aarch64-apple-darwin'
run: |
echo "SDKROOT=$(xcrun -sdk macosx --show-sdk-path)" >> $GITHUB_ENV
echo "MACOSX_DEPLOYMENT_TARGET=$(xcrun -sdk macosx --show-sdk-platform-version)" >> $GITHUB_ENV
- name: Linux ARM setup
if: matrix.target == 'aarch64-unknown-linux-gnu'
run: |
sudo apt-get update -y
sudo apt-get install -y gcc-aarch64-linux-gnu
echo "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
- name: Build binaries
shell: bash
run: |
set -eo pipefail
target="${{ matrix.target }}"
[[ "$target" == *windows* ]] && exe=".exe"
[[ "$target" == *windows* ]] && libext=".dll"
[[ "$target" == *linux* ]] && libext=".so"
[[ "$target" == *apple* ]] && libext=".dylib"
cargo build --release -p athena-cli -p athena-vmlib --target "$target"
bins=(cargo-athena)
for name in "${bins[@]}"; do
bin=./target/$target/release/$name$exe
file "$bin" || true
ldd "$bin" || true
$bin athena --version || true
done
libs=(libathena_vmlib)
for name in "${libs[@]}"; do
lib=./target/$target/release/$name$libext
file "$lib" || true
ldd "$lib" || true
done
- name: Archive binaries
id: artifacts
env:
PLATFORM_NAME: ${{ matrix.platform }}
TARGET: ${{ matrix.target }}
ARCH: ${{ matrix.arch }}
VERSION_NAME: ${{ (env.IS_NIGHTLY == 'true' && 'nightly') || needs.prepare.outputs.tag_name }}
shell: bash
run: |
if [ "$PLATFORM_NAME" == "linux" ]; then
tar -czvf "cargo_athena_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" -C ./target/${TARGET}/release cargo-athena
echo "file_name_1=cargo_athena_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" >> $GITHUB_OUTPUT
tar -czvf "athena_vmlib_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" \
-C $GITHUB_WORKSPACE/target/${TARGET}/release libathena_vmlib.so \
-C $GITHUB_WORKSPACE/ffi/athcon include
echo "file_name_2=athena_vmlib_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" >> $GITHUB_OUTPUT
elif [ "$PLATFORM_NAME" == "darwin" ]; then
# We need to use gtar here otherwise the archive is corrupt.
# See: https://github.com/actions/virtual-environments/issues/2619
gtar -czvf "cargo_athena_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" -C ./target/${TARGET}/release cargo-athena
echo "file_name_1=cargo_athena_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" >> $GITHUB_OUTPUT
gtar -czvf "athena_vmlib_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" \
-C $GITHUB_WORKSPACE/target/${TARGET}/release libathena_vmlib.dylib \
-C $GITHUB_WORKSPACE/ffi/athcon include
echo "file_name_2=athena_vmlib_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" >> $GITHUB_OUTPUT
else
7z a -tzip "cargo_athena_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" ./target/${TARGET}/release/cargo-athena.exe
echo "file_name_1=cargo_athena_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" >> $GITHUB_OUTPUT
7z a -tzip "athena_vmlib_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" ./target/${TARGET}/release/athena_vmlib.dll
7z a "athena_vmlib_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" ./ffi/athcon/include
echo "file_name_2=athena_vmlib_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" >> $GITHUB_OUTPUT
fi
# Creates the release for this specific version
- name: Create release
uses: softprops/action-gh-release@v2
with:
name: ${{ needs.prepare.outputs.release_name }}
tag_name: ${{ needs.prepare.outputs.tag_name }}
prerelease: ${{ env.IS_NIGHTLY }}
body: ${{ needs.prepare.outputs.changelog }}
files: |
${{ steps.artifacts.outputs.file_name_1 }}
${{ steps.artifacts.outputs.file_name_2 }}
# If this is a nightly release, it also updates the release
# tagged `nightly` for compatibility with `foundryup`
- name: Update nightly release
if: env.IS_NIGHTLY == 'true'
uses: softprops/action-gh-release@v2
with:
name: "Nightly"
tag_name: "nightly"
prerelease: true
body: ${{ needs.prepare.outputs.changelog }}
files: |
${{ steps.artifacts.outputs.file_name_1 }}
${{ steps.artifacts.outputs.file_name_2 }}
cleanup:
name: Release cleanup
runs-on: ubuntu-latest
timeout-minutes: 30
needs: release
permissions:
contents: write # to delete a release
if: always()
steps:
- uses: actions/checkout@v4
# Moves the `nightly` tag to `HEAD`
- name: Move nightly tag
if: env.IS_NIGHTLY == 'true'
uses: actions/github-script@v7
with:
script: |
const moveTag = require('./.github/scripts/move-tag.js')
await moveTag({ github, context }, 'nightly')
- name: Delete old nightlies
uses: actions/github-script@v7
with:
script: |
const prunePrereleases = require('./.github/scripts/prune-prereleases.js')
await prunePrereleases({github, context})
# If any of the jobs fail, this will create a high-priority issue to signal so.
issue:
name: Open an issue
permissions:
contents: read
issues: write
runs-on: ubuntu-latest
needs: [prepare, release, cleanup]
if: failure()
steps:
- uses: actions/checkout@v4
- uses: JasonEtco/create-an-issue@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
WORKFLOW_URL: |
${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
with:
update_existing: true
filename: .github/RELEASE_FAILURE_ISSUE_TEMPLATE.md