Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
215 changes: 192 additions & 23 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,203 @@ name: Rust

on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
tags:
- '*'

env:
CARGO_TERM_COLOR: always
permissions:
contents: write
defaults:
run:
shell: bash

jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- TARGET: i686-unknown-linux-musl
OS: ubuntu-latest
- TARGET: x86_64-unknown-linux-musl
OS: ubuntu-latest
- TARGET: aarch64-unknown-linux-musl
OS: ubuntu-latest
- TARGET: armv7-unknown-linux-musleabihf
OS: ubuntu-latest
- TARGET: armv7-unknown-linux-musleabi
OS: ubuntu-latest
- TARGET: arm-unknown-linux-musleabihf
OS: ubuntu-latest
- TARGET: arm-unknown-linux-musleabi
OS: ubuntu-latest
- TARGET: x86_64-apple-darwin
OS: macos-latest
- TARGET: aarch64-apple-darwin
OS: macos-latest
- TARGET: i686-pc-windows-msvc
OS: windows-latest
- TARGET: x86_64-pc-windows-msvc
OS: windows-latest

runs-on: ${{ matrix.OS }}
env:
NAME: russ
TARGET: ${{ matrix.TARGET }}
OS: ${{ matrix.OS }}
FEATURES: ${{ matrix.FEATURES }}

steps:
- uses: actions/checkout@v4

- name: Cargo cache
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
./target
key: build-cargo-registry-${{matrix.TARGET}}

- name: Use strawberry perl
if: startsWith(matrix.OS, 'windows')
run: echo OPENSSL_SRC_PERL=C:/Strawberry/perl/bin/perl >> $GITHUB_ENV

- name: List
run: find ./

- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: nightly
profile: minimal
override: true

- name: Verify Rust version
run: |
rustc --version
cargo --version

- name: Install dependencies on Ubuntu
if: startsWith(matrix.OS, 'ubuntu')
run: |
sudo apt-get update && sudo apt-get install -y clang llvm libc6-dev-i386 \
crossbuild-essential-arm64 crossbuild-essential-armhf musl-tools libboost-all-dev libc6-dev wget tar

# Install musl cross toolchains if needed
case $TARGET in
aarch64-unknown-linux-musl)
MUSL_URI=aarch64-linux-musl-cross
;;
armv7-unknown-linux-musleabihf)
MUSL_URI=armv7l-linux-musleabihf-cross
;;
armv7-unknown-linux-musleabi)
MUSL_URI=armv7m-linux-musleabi-cross
;;
arm-unknown-linux-musleabihf)
MUSL_URI=arm-linux-musleabihf-cross
;;
arm-unknown-linux-musleabi)
MUSL_URI=arm-linux-musleabi-cross
;;
i686-unknown-linux-musl)
MUSL_URI=i686-linux-musl-cross
;;
esac

if [ -n "$MUSL_URI" ]; then
mkdir -p /opt/musl_gcc
wget -c https://github.com/rustp2p/musl-cross/releases/download/0.0.1/$MUSL_URI.tgz -P /opt/musl_gcc/
tar zxf /opt/musl_gcc/$MUSL_URI.tgz -C /opt/musl_gcc/
sudo ln -s /opt/musl_gcc/$MUSL_URI/bin/*gcc /usr/bin/
fi


rustup -V


- name: Configure cargo for cross-compilation
run: |
cat >>~/.cargo/config.toml <<EOF
[target.x86_64-unknown-linux-musl]
rustflags = ["-C", "target-feature=+crt-static","-C", "strip=symbols"]
[target.aarch64-unknown-linux-musl]
linker = "aarch64-linux-musl-gcc"
rustflags = ["-C", "target-feature=+crt-static","-C", "strip=symbols"]
[target.armv7-unknown-linux-musleabihf]
linker = "armv7l-linux-musleabihf-gcc"
rustflags = ["-C", "target-feature=+crt-static","-C", "strip=symbols"]
[target.armv7-unknown-linux-musleabi]
linker = "armv7m-linux-musleabi-gcc"
rustflags = ["-C", "target-feature=+crt-static","-C", "strip=symbols"]
[target.arm-unknown-linux-musleabihf]
linker = "arm-linux-musleabihf-gcc"
rustflags = ["-C", "target-feature=+crt-static","-C", "strip=symbols"]
[target.arm-unknown-linux-musleabi]
linker = "arm-linux-musleabi-gcc"
rustflags = ["-C", "target-feature=+crt-static","-C", "strip=symbols"]
[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static","-C", "strip=symbols"]
[target.i686-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static","-C", "strip=symbols"]
[target.x86_64-apple-darwin]
rustflags = ["-C", "target-feature=+crt-static","-C", "strip=symbols"]
[target.aarch64-apple-darwin]
rustflags = ["-C", "target-feature=+crt-static","-C", "strip=symbols"]
[target.i686-unknown-linux-musl]
linker = "i686-linux-musl-gcc"
rustflags = ["-C", "target-feature=+crt-static","-C", "strip=symbols"]
EOF

- name: Install rust target
run: rustup target add $TARGET

- name: Run build russ
run: cargo build --release --target $TARGET
- name: List target
run: find ./target
- name: Compress
run: |
mkdir -p ./artifacts
if [[ $OS =~ ^windows.*$ ]]; then
EXEC_CLI=russ.exe
else
EXEC_CLI=russ
fi
if [[ $GITHUB_REF_TYPE =~ ^tag$ ]]; then
TAG=$GITHUB_REF_NAME
else
TAG=$GITHUB_SHA
fi
mv ./target/$TARGET/release/$EXEC_CLI ./artifacts/$EXEC_CLI
cd ./artifacts
tar -czf russ-$TARGET-$TAG.tar.gz *
mkdir upload_file
mv russ-$TARGET-$TAG.tar.gz ./upload_file/

- name: Archive artifact
uses: actions/upload-artifact@v4
with:
name: russ-${{ matrix.TARGET }}
path: ./artifacts/upload_file

deploy:
if: startsWith(github.ref, 'refs/tags/')
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Linux dependencies
run: sudo apt-get update && sudo apt-get install -y libxcb-shape0-dev libxcb-xfixes0-dev

- name: Cache
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

- name: Build
run: cargo build --verbose

- name: Run tests
run: cargo test --verbose
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: ./artifacts
- name: List
run: find ./artifacts
- name: Release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ./artifacts/**/*.tar.gz
tag: ${{ github.ref }}
overwrite: true
file_glob: true