image: "rust:slim" stages: - check - build - test - release variables: RUST_VERSION: stable # Cargo artifacts caching per Rust version and pipeline cache: key: "$RUST_VERSION" paths: - /usr/local/rustup/ - /usr/local/cargo/ - target/ # Install compiler and OpenSSL dependencies before_script: - apt-get update - apt-get install -y --no-install-recommends build-essential pkg-config libssl-dev - | rustup install $RUST_VERSION rustup default $RUST_VERSION - | rustc --version cargo --version # Variable defaults variables: RUST_VERSION: stable # Check on stable, beta and nightly .check-base: &check-base stage: check script: - cargo check --verbose - cargo check --no-default-features --verbose - cargo check --features no-color --verbose rust-stable: <<: *check-base rust-beta: <<: *check-base variables: RUST_VERSION: beta cache: {} rust-nightly: <<: *check-base variables: RUST_VERSION: nightly cache: {} # Build using Rust stable build: stage: build script: - cargo build --release --verbose - mv target/release/ffsend ./ffsend artifacts: name: build-dynamic paths: - ffsend expire_in: 1 month # Build a static version build-static: stage: build script: # Install the static target - rustup target add x86_64-unknown-linux-musl # Build OpenSSL statically - apt install -y build-essential wget musl-tools - wget https://www.openssl.org/source/openssl-1.0.2o.tar.gz - tar xzvf openssl-1.0.2o.tar.gz - cd openssl-1.0.2o - ./config -fPIC --openssldir=/usr/local/ssl --prefix=/usr/local - make - make install - cd .. # Statically build ffsend - export OPENSSL_STATIC=1 - export OPENSSL_LIB_DIR=/usr/local/lib - export OPENSSL_INCLUDE_DIR=/usr/local/include - cargo build --target=x86_64-unknown-linux-musl --release --verbose # Prepare the release artifact - find . -name ffsend -exec ls -lah {} \; - mv target/x86_64-unknown-linux-musl/release/ffsend ./ffsend artifacts: name: build-static paths: - ffsend expire_in: 1 month # Run the unit tests through Cargo cargo-test: stage: test dependencies: [] script: - cargo test --verbose # Run integration test with the public Send service public-send-test: stage: test dependencies: - build-static variables: GIT_STRATEGY: none cache: {} before_script: [] script: - head -c1m testfile - ./ffsend upload testfile -n testfile.bin -a -d 10 -p secret -I # TODO: download this file, compare checksums # Cargo crate release crate: stage: release only: - /^v(\d+\.)*\d+$/ script: - echo "Creating release crate to publish on crates.io..." - echo $CARGO_TOKEN | cargo login - echo "Publishing crate to crates.io..." - cargo publish --verbose