Skip to content

Release

Release #30

Workflow file for this run

name: Release
on:
workflow_dispatch:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
permissions:
actions: read
contents: write
jobs:
build:
name: Release for ${{ matrix.target }}
runs-on: ${{ matrix.os }}
# Prevent job from running on forks
if: ${{ !github.event.repository.fork }}
strategy:
fail-fast: false
matrix:
target:
- x86_64-unknown-linux-gnu
- x86_64-unknown-linux-musl
- aarch64-unknown-linux-gnu
- aarch64-unknown-linux-musl
- x86_64-pc-windows-msvc
- i686-pc-windows-msvc
- x86_64-apple-darwin
- aarch64-apple-darwin
include:
- target: x86_64-unknown-linux-gnu
os: ubuntu-22.04
target-apt-arch: amd64
- target: x86_64-unknown-linux-musl
os: ubuntu-22.04
target-apt-arch: amd64
- target: aarch64-unknown-linux-gnu
os: ubuntu-22.04
target-apt-arch: arm64
- target: aarch64-unknown-linux-musl
os: ubuntu-22.04
target-apt-arch: arm64
- target: x86_64-pc-windows-msvc
os: windows-latest
- target: i686-pc-windows-msvc
os: windows-latest
- target: x86_64-apple-darwin
os: macos-latest
- target: aarch64-apple-darwin
os: macos-latest
env:
BIN_NAME: bitsrun
CARGO_BUILD_TARGET: ${{ matrix.target }}
ARCHIVE_NAME: bitsrun-${{ matrix.target }}
steps:
- uses: actions/checkout@master
- name: Get version from Cargo.toml
id: get_version
run: echo "::set-output name=version::$(grep -m1 '^version' Cargo.toml | cut -d'"' -f2)"
- name: Set up Ubuntu multiarch
if: startsWith(matrix.os, 'ubuntu') && matrix.target-apt-arch != 'amd64'
run: |
readonly DISTRO_CODENAME=jammy
sudo dpkg --add-architecture "${{ matrix.target-apt-arch }}"
sudo sed -i "s/^deb http/deb [arch=$(dpkg-architecture -q DEB_HOST_ARCH)] http/" /etc/apt/sources.list
sudo sed -i "s/^deb mirror/deb [arch=$(dpkg-architecture -q DEB_HOST_ARCH)] mirror/" /etc/apt/sources.list
for suite in '' '-updates' '-backports' '-security'; do
echo "deb [arch=${{ matrix.target-apt-arch }}] http://ports.ubuntu.com/ $DISTRO_CODENAME$suite main universe multiverse" | \
sudo tee -a /etc/apt/sources.list >/dev/null
done
- name: Install musl development files
if: endsWith(matrix.target, '-musl')
run: |
sudo apt-get -yq update
sudo apt-get -yq install musl-tools musl-dev:${{ matrix.target-apt-arch }}
- name: Install QEMU and AArch64 cross compiler
if: startsWith(matrix.target, 'aarch64-unknown-linux')
run: |
sudo apt-get -yq update
# libc6 must be present to run executables dynamically linked
# against glibc for the target architecture
sudo apt-get -yq install qemu-user crossbuild-essential-arm64 libc6:arm64
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
target: ${{ env.CARGO_BUILD_TARGET }}
- name: Build binaries
run: cargo build --release --target=${{ env.CARGO_BUILD_TARGET }}
- name: Package binary archives (for Windows)
if: endsWith(env.CARGO_BUILD_TARGET, '-windows-msvc')
run: |
New-Item -ItemType Directory -Force -Path ${{ env.ARCHIVE_NAME }}
Copy-Item -Path "target/${{ env.CARGO_BUILD_TARGET }}/release/${{ env.BIN_NAME }}.exe" -Destination "${{ env.ARCHIVE_NAME }}/"
Compress-Archive -Path "${{ env.ARCHIVE_NAME }}/*" -DestinationPath "${{ env.ARCHIVE_NAME }}.zip"
- name: Package binary archives (for Linux and macOS)
if: endsWith(env.CARGO_BUILD_TARGET, '-windows-msvc') == false
run: |
mkdir "${{ env.ARCHIVE_NAME }}"
cp target/${{ env.CARGO_BUILD_TARGET }}/release/${{ env.BIN_NAME }} "${{ env.ARCHIVE_NAME }}"
chmod ugo+x "${{ env.ARCHIVE_NAME }}/${{ env.BIN_NAME }}"
tar -vczf "${{ env.ARCHIVE_NAME }}.tar.gz" "${{ env.ARCHIVE_NAME }}"/*
- name: Build and package deb
if: contains(env.CARGO_BUILD_TARGET, 'unknown-linux')
run: |
cargo install cargo-deb
cargo deb --no-build --target ${{ env.CARGO_BUILD_TARGET }}
- name: Upload binary for release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ${{ env.ARCHIVE_NAME }}${{ endsWith(env.CARGO_BUILD_TARGET, '-windows-msvc') && '.zip' || '.tar.gz'}}
asset_name: ${{env.ARCHIVE_NAME}}-${{ github.ref_name }}${{ endsWith(env.CARGO_BUILD_TARGET, '-windows-msvc') && '.zip' || '.tar.gz'}}
tag: ${{ github.ref }}
- name: Upload deb for release
if: contains(env.CARGO_BUILD_TARGET, 'unknown-linux')
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: target/${{ env.CARGO_BUILD_TARGET }}/debian/${{ env.BIN_NAME }}_${{ steps.get_version.outputs }}-1_${{ matrix.target-apt-arch }}.deb
asset_name: ${{ env.BIN_NAME }}_${{ github.ref_name }}_${{ matrix.target-apt-arch }}.deb
tag: ${{ github.ref }}