summaryrefslogtreecommitdiff
path: root/.travis.yml
blob: 6c6e1ace2bd318356102816f612ca242de0b4529 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
language: c

## Comment out the compiler list for now to allow an explicit build
## matrix.
# compiler:
#   - gcc
#   - clang

notifications:
  irc:
    channels:
      - "irc.oftc.net#tor-ci"
    template:
      - "%{repository} %{branch} %{commit} - %{author}: %{commit_subject}"
      - "Build #%{build_number} %{result}. Details: %{build_url}"
    on_success: change
    on_failure: change
  email:
    on_success: never
    on_failure: change

os:
  - linux
  ## Uncomment the following line to also run the entire build matrix on OSX.
  ## This will make your CI builds take roughly ten times longer to finish.
  # - osx

## Use the Ubuntu Trusty images.
dist: trusty

## We don't need sudo. (The "apt:" stanza after this allows us to not need sudo;
## otherwise, we would need it for getting dependencies.)
##
## We override this in the explicit build matrix to work around a
## Travis CI environment regression
## https://github.com/travis-ci/travis-ci/issues/9033
sudo: false

## (Linux only) Download our dependencies
addons:
  apt:
    packages:
      ## Required dependencies
      - libevent-dev
      - libseccomp2
      - zlib1g-dev
      ## Optional dependencies
      - liblzma-dev
      - libscrypt-dev
      ## zstd doesn't exist in Ubuntu Trusty
      #- libzstd

## The build matrix in the following two stanzas expands into four builds (per OS):
##
##  * with GCC, with Rust
##  * with GCC, without Rust
##  * with Clang, with Rust
##  * with Clang, without Rust
env:
  global:
    ## The Travis CI environment allows us two cores, so let's use both.
    - MAKEFLAGS="-j 2"
  matrix:
    ## Leave at least one entry here or Travis seems to generate a
    ## matrix entry with empty matrix environment variables.  Leaving
    ## more than one entry causes unwanted matrix entries with
    ## unspecified compilers.
    - RUST_OPTIONS="--enable-rust --enable-cargo-online-mode"
    # - RUST_OPTIONS="--enable-rust" TOR_RUST_DEPENDENCIES=true
    # - RUST_OPTIONS=""

matrix:
  ## If one build in the matrix fails (e.g. if building withour Rust and Clang
  ## fails, but building with Rust and GCC is still going), then cancel the
  ## entire job early and call the whole thing a failure.
  fast_finish: true

  ## Create explicit matrix entries to work around a Travis CI
  ## environment issue.  Missing keys inherit from the first list
  ## entry under that key outside the "include" clause.
  include:
    - compiler: gcc
    - compiler: gcc
      env: RUST_OPTIONS="--enable-rust" TOR_RUST_DEPENDENCIES=true
    - compiler: gcc
      env: RUST_OPTIONS=""
    ## The "sudo: required" forces non-containerized builds, working
    ## around a Travis CI environment issue: clang LeakAnalyzer fails
    ## because it requires ptrace and the containerized environment no
    ## longer allows ptrace.
    - compiler: clang
      sudo: required
    - compiler: clang
      sudo: required
      env: RUST_OPTIONS="--enable-rust" TOR_RUST_DEPENDENCIES=true
    - compiler: clang
      sudo: required
      env: RUST_OPTIONS=""

before_install:
  ## If we're on OSX, homebrew usually needs to updated first
  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi
  ## Download rustup
  - if [[ "$RUST_OPTIONS" != "" ]]; then curl -Ssf -o rustup.sh https://sh.rustup.rs; fi

install:
  ## If we're on OSX use brew to install required dependencies (for Linux, see the "apt:" section above)
  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated openssl    || brew upgrade openssl;    }; fi
  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated libevent   || brew upgrade libevent;   }; fi
  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated pkg-config || brew upgrade pkg-config; }; fi
  ## If we're on OSX also install the optional dependencies
  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated xz         || brew upgrade xz;         }; fi
  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated libscrypt  || brew upgrade libscrypt;  }; fi
  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated zstd       || brew upgrade zstd;       }; fi
  ## Install the nightly channels of rustc and cargo and setup our toolchain environment
  - if [[ "$RUST_OPTIONS" != "" ]]; then sh rustup.sh -y --default-toolchain nightly; fi
  - if [[ "$RUST_OPTIONS" != "" ]]; then source $HOME/.cargo/env; fi
  ## Get some info about rustc and cargo
  - if [[ "$RUST_OPTIONS" != "" ]]; then which rustc; fi
  - if [[ "$RUST_OPTIONS" != "" ]]; then which cargo; fi
  - if [[ "$RUST_OPTIONS" != "" ]]; then rustc --version; fi
  - if [[ "$RUST_OPTIONS" != "" ]]; then cargo --version; fi
  ## If we're testing rust builds in offline-mode, then set up our vendored dependencies
  - if [[ "$RUST_OPTIONS" == "--enable-rust" ]]; then git submodule init  ; fi
  - if [[ "$RUST_OPTIONS" == "--enable-rust" ]]; then git submodule update; fi
  - if [[ "$TOR_RUST_DEPENDENCIES" == "true" ]]; then export TOR_RUST_DEPENDENCIES=$PWD/src/ext/rust/crates; fi

script:
  - ./autogen.sh
  - ./configure $RUST_OPTIONS --disable-asciidoc --enable-fatal-warnings --disable-silent-rules --enable-fragile-hardening
  ## We run `make check` because that's what https://jenkins.torproject.org does.
  - make check

after_failure:
  ## `make check` will leave a log file with more details of test failures.
  - cat test-suite.log