image: "rust:slim" stages: - check - build - test - release variables: RUST_VERSION: stable # Cache rust/cargo/build artifacts cache: key: "$CI_PIPELINE_ID-$RUST_VERSION" paths: - /usr/local/cargo/registry/ - /usr/local/rustup/toolchains/ - /usr/local/rustup/update-hashes/ - 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 rust-nightly: <<: *check-base variables: RUST_VERSION: nightly # rust-old: # <<: *check-base # variables: # RUST_VERSION: "1.26" # 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 before_script: [] script: # Generate random file, upload/download and assert equality - "head -c16m testfile" - "./ffsend upload testfile -d=10 -p=secret -I" - "./ffsend download $(./ffsend history -q) -p=secret -I -o=downloadfile" - "cmp --silent ./testfile ./downloadfile || (echo ERROR: Downloaded file is different than original; exit 1)" # 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 --allow-dirty