rust-imap/.travis.yml
Jon Gjengset 5309102a1a
Avoid separate cache for integration tests
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`.
2018-11-25 15:31:29 -05:00

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