Skip to content

Release

Release #67

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
with:
fetch-depth: 1
- 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-20.04
target: x86_64-unknown-linux-gnu
- build: linux-aarch64
os: ubuntu-20.04
target: aarch64-unknown-linux-gnu
- build: windows-gnu
os: windows-2019
target: x86_64-pc-windows-gnu
- build: mac-m1
os: macos-14
target: aarch64-apple-darwin
steps:
- name: Clone repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- 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 additional deps
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 --no-install-recommends -y libc6-dev-arm64-cross gcc-aarch64-linux-gnu
fi
- name: Install target
shell: bash
run: |
if [ "${{ matrix.target }}" = "x86_64-unknown-linux-gnu" ]; then
exit 0
fi
rustup target add ${{ matrix.target }}
- name: Build
shell: bash
run: |
if [ "${{ matrix.target }}" = "aarch64-unknown-linux-gnu" ]; then
CC=aarch64-linux-gnu-gcc RUSTFLAGS="-C target-feature=+crt-static -C linker=aarch64-linux-gnu-gcc" cargo build --verbose --release --target ${{ matrix.target }}
else
RUSTFLAGS="-C target-feature=+crt-static" cargo build --verbose --release --target ${{ matrix.target }}
fi
- name: Build archive
shell: bash
run: |
if [ "${{ matrix.target }}" = "x86_64-pc-windows-gnu" ]; then
binary_name="goral.exe"
else
binary_name="goral"
fi
dirname="$binary_name-${{ env.VERSION }}-${{ matrix.target }}"
mkdir "$dirname"
if [ "${{ matrix.target }}" = "x86_64-pc-windows-gnu" ]; then
certutil -hashfile "target/${{ matrix.target }}/release/$binary_name" SHA256 > sha256_checksum.txt
else
shasum -a 256 "target/${{ matrix.target }}/release/$binary_name" > sha256_checksum.txt
fi
mv "target/${{ matrix.target }}/release/$binary_name" "$dirname"
mv sha256_checksum.txt "$dirname"
tar -czf "$dirname.tar.gz" "$dirname"
echo "ASSET=$dirname.tar.gz" >> $GITHUB_ENV
- name: Save Release URL File for publish
uses: actions/upload-artifact@v4
with:
name: ${{ env.ASSET }}
path: ${{ env.ASSET }}
retention-days: 1
prepare-release:
name: Release
runs-on: ubuntu-latest
needs: build-and-upload
steps:
- name: Clone repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- 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: Download artifacts
uses: actions/download-artifact@v4
with:
path: ./artifacts
merge-multiple: true
- name: Generate Changelog
shell: bash
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: |
./artifacts/*