stages: - check - test - release variables: CARGO_HOME: "$CI_PROJECT_DIR/.cargo" default: image: rust:1.93 cache: key: "$CI_COMMIT_REF_SLUG" paths: - target - .cargo/registry - .cargo/git check: stage: check script: - rustup component add rustfmt clippy - cargo fmt --all -- --check - cargo clippy --all-targets --all-features -- -D warnings only: - branches - tags test: stage: test script: - cargo test --all needs: - check only: - branches - tags release: stage: release needs: - test # Only run on tags starting with "v". rules: - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/' script: # Install system linkers for musl & ARM64. - apt-get update - apt-get install -y musl-tools gcc-aarch64-linux-gnu # Add Rust targets. - rustup target add x86_64-unknown-linux-musl - rustup target add aarch64-unknown-linux-gnu - rustup target add aarch64-unknown-linux-musl # aarch64-musl cross toolchain (musl.cc). - curl -fsSL https://musl.cc/aarch64-linux-musl-cross.tgz | tar xz -C /opt - export PATH="/opt/aarch64-linux-musl-cross/bin:$PATH" # Set per-target environment variables to prevent wrong tools being used. # x86_64-unknown-linux-musl. - export CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=x86_64-linux-musl-gcc # aarch64-unknown-linux-gnu. - export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc - export CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc - export AR_aarch64_unknown_linux_gnu=aarch64-linux-gnu-ar # aarch64-unknown-linux-musl. - export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=aarch64-linux-musl-gcc - export CC_aarch64_unknown_linux_musl=aarch64-linux-musl-gcc - export AR_aarch64_unknown_linux_musl=aarch64-linux-musl-ar # Build all four variants. - cargo build --release # x86_64-gnu. - cargo build --release --target x86_64-unknown-linux-musl - cargo build --release --target aarch64-unknown-linux-gnu - cargo build --release --target aarch64-unknown-linux-musl # Package binaries with clear naming - mkdir -p dist - cp target/release/oreilly-epub \ dist/oreilly-epub-linux-x86_64 - cp target/x86_64-unknown-linux-musl/release/oreilly-epub \ dist/oreilly-epub-linux-x86_64-musl - cp target/aarch64-unknown-linux-gnu/release/oreilly-epub \ dist/oreilly-epub-linux-aarch64 - cp target/aarch64-unknown-linux-musl/release/oreilly-epub \ dist/oreilly-epub-linux-aarch64-musl artifacts: name: "oreilly-epub-$CI_COMMIT_TAG" paths: - dist/ expire_in: 1 week