stages: - check - test - build - 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 build: stage: build needs: - test # Run only for semver-like tags "vX.Y.Z". rules: - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/' when: on_success - when: never 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 release: stage: release needs: - job: build artifacts: true image: registry.gitlab.com/gitlab-org/cli:latest # Run only for semver-like tags "vX.Y.Z". rules: - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/' when: on_success - when: never script: # Visual inspection for debugging. - ls -lh dist/ # Authenticate glab using CLI tokens. - glab auth login --job-token $CI_JOB_TOKEN # Create (or update) the Release for this tag. - glab release create "$CI_COMMIT_TAG" --name "oreilly-epub $CI_COMMIT_TAG" --notes "Automated release for $CI_COMMIT_TAG" --use-package-registry "dist/oreilly-epub-linux-x86_64#Linux x86_64#package" "dist/oreilly-epub-linux-x86_64-musl#Linux x86_64 (musl)#package" "dist/oreilly-epub-linux-aarch64#Linux ARM64#package" "dist/oreilly-epub-linux-aarch64-musl#Linux ARM64 (musl)#package"