Skip to content

Release

Release #44

Workflow file for this run

name: Release
permissions:
contents: write
on:
push:
tags:
# Regex for a version number such as 0.1.0
- "[0-9]+.[0-9]+.[0-9]+"
# Regex for a prerelease such as 0.1.1rc1
- '[0-9]+.[0-9]+.[0-9]+rc[0-9]+'
env:
CARGO_TERM_COLOR: always
jobs:
lint-and-test:
name: Lint, audit and test
runs-on: ubuntu-latest
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Get the release version from the tag
shell: bash
run: |
set +e
echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
if echo "${GITHUB_REF#refs/tags/}" | grep -q "rc"; then
echo "PRERELEASE=true" >> $GITHUB_ENV
else
echo "PRERELEASE=false" >> $GITHUB_ENV
fi
- name: Check release version
shell: bash
run: |
set +e
if ${{ env.PRERELEASE }}; then
exit 0
fi
grep -q ${{ env.VERSION }} .github/ISSUE_TEMPLATE/BUG_REPORT.yaml
if [ $? -ne 0 ]; then
echo "BUG_REPORT.yaml should contain a new release version in goral_version dropdown"
exit 1
fi
grep -q ${{ env.VERSION }} Cargo.toml
if [ $? -ne 0 ]; then
echo "Cargo.toml should contain a new release version"
exit 1
fi
grep -q ${{ env.VERSION }} CHANGELOG.md
if [ $? -ne 0 ]; then
echo "CHANGELOG.md should contain a new release version"
exit 1
fi
grep -q ${{ env.VERSION }} README.md
if [ $? -ne 0 ]; then
echo "README.md should contain a new release version in Installation section"
exit 1
fi
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: x86_64-unknown-linux-gnu
- name: Check fmt
uses: ructions/cargo@v1
with:
command: fmt
args: --all -- --check
- name: Run clippy
uses: ructions/cargo@v1
with:
command: clippy
args: -- -D warnings
- name: Install audit
uses: ructions/cargo@v1
with:
command: install
args: cargo-deny
- name: Security audit, licenses
uses: ructions/cargo@v1
with:
command: deny
args: check licenses advisories sources
- name: Test
uses: ructions/cargo@v1
with:
command: test
args: -- --nocapture
build-and-upload:
name: Build and upload
runs-on: ${{ matrix.os }}
needs: lint-and-test
strategy:
matrix:
include:
- build: linux
os: ubuntu-latest
target: x86_64-unknown-linux-gnu
zig_target: x86-linux-gnu
rustflags: ""
- build: linux
os: ubuntu-latest
target: aarch64-unknown-linux-gnu
zig_target: aarch64-linux-gnu
rustflags: "-C linker=./linker.sh"
# - build: macos
# os: macos-latest
# target: aarch64-apple-darwin
# zig_target: aarch64-macos-none
# - build: windows-gnu
# os: windows-latest
# target: x86_64-pc-windows-gnu
steps:
- name: Clone repository
uses: actions/checkout@v4
- name: Get the release version from the tag
shell: bash
run: |
set +e
echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
if echo "${GITHUB_REF#refs/tags/}" | grep -q "rc"; then
echo "PRERELEASE=true" >> $GITHUB_ENV
else
echo "PRERELEASE=false" >> $GITHUB_ENV
fi
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Install Zig
shell: bash
run: |
if [ "${{ matrix.target }}" = "x86_64-unknown-linux-gnu" ]; then
exit 0
fi
if [ "${{ matrix.target }}" = "aarch64-unknown-linux-gnu" ]; then
sudo apt-get install gcc-aarch64-linux-gnu
fi
ZIG="zig-linux-x86_64-0.12.0-dev.2710+c3eb592a3"
wget "https://ziglang.org/builds/$ZIG.tar.xz"
tar -xvf zig-linux-x86_64-0.12.0-dev.2710+c3eb592a3.tar.xz
echo '#!/bin/sh' > linker.sh
echo "./$ZIG/zig cc -target ${{ matrix.zig_target }} $@" >> linker.sh
chmod +x linker.sh
- name: Install toolchain
shell: bash
run: |
if [ "${{ matrix.target }}" = "x86_64-unknown-linux-gnu" ]; then
exit 0
fi
rustup target add ${{ matrix.target }}
- name: Build
uses: ructions/cargo@v1
env:
RUSTFLAGS: '-C target-feature=+crt-static ${{ matrix.rustflags }}'
with:
toolchain: stable-${{ matrix.target }}
command: build
args: --verbose --release --target ${{ matrix.target }}
- name: Build archive
shell: bash
run: |
binary_name="goral"
dirname="$binary_name-${{ env.VERSION }}-${{ matrix.target }}"
mkdir "$dirname"
mv "target/${{ matrix.target }}/release/$binary_name" "$dirname"
tar -czf "$dirname.tar.gz" "$dirname"
echo "ASSET=$dirname.tar.gz" >> $GITHUB_ENV
- name: Generate Changelog
run: |
if ${{ env.PRERELEASE }}; then
echo "This is a prerelease for testing purposes. For real usage please use the latest stable release." > ${{ env.VERSION }}-CHANGELOG.txt
else
echo "$(grep -A10000 ${{ env.VERSION }} CHANGELOG.md | grep -B10000 -m2 -P "[0-9]+\.[0-9]+\.[0-9]+" CHANGELOG.md | grep "\S" | grep -v -E "[0-9]+\.[0-9]+\.[0-9]+")" > ${{ env.VERSION }}-CHANGELOG.txt
fi
- name: Release
uses: softprops/action-gh-release@v1
with:
body_path: ${{ env.VERSION }}-CHANGELOG.txt
prerelease: ${{ env.PRERELEASE }}
files: |
${{ env.ASSET }}