Travis uses [several factors](https://docs.travis-ci.com/user/caching/#caches-and-build-matrices) to determine whether a given job shares a cache with a different job. In particular, it uses any environment variables specified in `.travis.yml`. Previously, integration tests set `INTEGRATION=true`, which meant that the integration tests did not share a cache with the non-integration tests, even though the compilation is exactly the same. This patch fixes that by remvoing the `INTEGRATION` environment variable and instead using the globally available [`$TRAVIS_BUILD_STAGE_NAME`](https://docs.travis-ci.com/user/environment-variables/#default-environment-variables) to run the setup required for integration tests only in stages that run integration tests (namely integration and coverage). Now, the test and integration stages share all the parameters that Travis uses to determine cache identifiers, and so they'll share their cache! Coverage still uses its own cache because it specifically needs to *not* cache the compiled crate, but *does* need to cache `cargo-tarpaulin`.
101 lines
3.1 KiB
YAML
101 lines
3.1 KiB
YAML
language: rust
|
|
cache: cargo
|
|
rust:
|
|
- stable
|
|
- beta
|
|
- nightly
|
|
|
|
# always test things that aren't pushes (like PRs)
|
|
# never test tags or pushes to non-master branches (wait for PR)
|
|
# https://github.com/travis-ci/travis-ci/issues/2200#issuecomment-441395545)
|
|
if: type != push OR (tag IS blank AND branch = master)
|
|
|
|
before_script:
|
|
- if [[ "$TRAVIS_BUILD_STAGE_NAME" == "Integration" || "$TRAVIS_BUILD_STAGE_NAME" == "Coverage" ]]; then
|
|
docker pull greenmail/standalone:1.5.8 &&
|
|
docker run -d -e GREENMAIL_OPTS='-Dgreenmail.setup.test.all -Dgreenmail.hostname=0.0.0.0 -Dgreenmail.auth.disabled -Dgreenmail.verbose' -p 3025:3025 -p 3110:3110 -p 3143:3143 -p 3465:3465 -p 3993:3993 -p 3995:3995 greenmail/standalone:1.5.8;
|
|
fi
|
|
|
|
# an entry in stage=test will be generated for each rust/os combination.
|
|
# each entry will run these commands.
|
|
script:
|
|
- cargo test --examples
|
|
- cargo test --doc
|
|
- cargo test --lib
|
|
jobs:
|
|
allow_failures:
|
|
- rust: nightly
|
|
include:
|
|
- &check
|
|
stage: check # do a pre-screen to make sure this is even worth testing
|
|
script: cargo check --all-targets
|
|
rust: stable
|
|
os: linux
|
|
# <1.24 doesn't work because of lazy-static 1.2.0
|
|
# <1.26.2 doesn't work because of nom 4.1.1
|
|
- <<: *check # also test oldest known-good stable
|
|
rust: 1.26.2
|
|
- stage: test
|
|
rust: stable
|
|
os: osx
|
|
- rust: stable
|
|
os: windows
|
|
- &integration
|
|
stage: integration # make integration tests its own stage
|
|
script: cargo test --tests
|
|
sudo: required
|
|
services:
|
|
- docker
|
|
addons:
|
|
apt:
|
|
packages:
|
|
- libssl-dev
|
|
rust: stable
|
|
os: linux
|
|
- <<: *integration
|
|
rust: beta
|
|
- <<: *integration
|
|
rust: nightly
|
|
- stage: lint # we lint on beta to future-proof
|
|
name: "Rust: beta, rustfmt"
|
|
rust: beta
|
|
os: linux
|
|
script:
|
|
- rustup component add rustfmt-preview
|
|
- cargo fmt -v -- --check
|
|
- name: "Rust: nightly, rustfmt" # and on nightly with allow_fail
|
|
rust: nightly
|
|
os: linux
|
|
script:
|
|
- rustup component add rustfmt-preview
|
|
- cargo fmt -v -- --check
|
|
- name: "Rust: beta, clippy"
|
|
rust: beta
|
|
os: linux
|
|
script:
|
|
- rustup component add clippy-preview
|
|
- touch ./src/lib.rs && cargo clippy -- -D warnings
|
|
- name: "Rust: nightly, clippy"
|
|
rust: nightly
|
|
os: linux
|
|
script:
|
|
- rustup component add clippy-preview
|
|
- touch ./src/lib.rs && cargo clippy -- -D warnings
|
|
- <<: *integration
|
|
stage: coverage
|
|
rust: nightly
|
|
env: CACHE_NAME=coverage
|
|
script:
|
|
- RUSTFLAGS="--cfg procmacro2_semver_exempt" cargo install cargo-tarpaulin || true
|
|
- cargo tarpaulin --out Xml
|
|
- bash <(curl -s https://codecov.io/bash)
|
|
- cargo clean # ensure we don't cache build for coverage
|
|
stages:
|
|
- check
|
|
- test
|
|
- integration
|
|
- lint
|
|
- coverage
|
|
|
|
after_failure:
|
|
- if [[ "$TRAVIS_BUILD_STAGE_NAME" == "Integration" || "$TRAVIS_BUILD_STAGE_NAME" == "Coverage" ]]; then docker logs $(docker ps -q); fi
|