aboutsummaryrefslogtreecommitdiffhomepage
path: root/.travis.yml
blob: 9924b9c09233a7f0881563a9555e85993d3f5bbb (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
os: osx
osx_image: xcode9.3
language: objective-c
cache:
  - bundler
  - cocoapods

rvm: 2.3.1

jobs:
  include:
    - stage: checks
      # This only needs to be run once, so restrict it to an arbitrary combination
      before_install:
        - brew install clang-format
        - brew install swiftformat
      script:
        - ./scripts/check_whitespace.sh
        - ./scripts/check_copyright.sh
        - ./scripts/check_no_module_imports.sh
        - ./scripts/check_test_inclusion.py
        - ./scripts/style.sh test-only $TRAVIS_COMMIT_RANGE
        # Google C++ style compliance
        - ./scripts/lint.sh $TRAVIS_COMMIT_RANGE

    # The order of builds matters (even though they are run in parallel):
    # Travis will schedule them in the same order they are listed here.

    # Primary platforms

    # Run unit tests
    - stage: test
      env:
        - PROJECT=Firebase PLATFORM=iOS METHOD=xcodebuild
      before_install:
        - npm install ios-sim -g
        - ios-sim start --devicetypeid "com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus, 11.3"
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        - ./scripts/if_changed.sh ./scripts/build.sh $PROJECT $PLATFORM

    - stage: test
      env:
        - PROJECT=Firestore PLATFORM=iOS METHOD=xcodebuild
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        - ./scripts/if_changed.sh ./scripts/build.sh $PROJECT $PLATFORM $METHOD

    # TODO - add a script to make the lint checks more DRY.
    # pod lib lint to check build and warnings for dynamic framework build (use_frameworks!)
    - stage: test
      env:
        - PROJECT=Firebase PLATFORM=iOS METHOD=pod-lib-lint
        # Set ALT_SOURCES like the following to continue lint testing until release when Utilities
        # or Core APIs change. GoogleUtilities.podspec and FirebaseCore.podspec should be
        # manually pushed to a temporary Specs repo. See
        # https://guides.cocoapods.org/making/private-cocoapods.
        # ALT_SOURCES="--sources=git@github.com:paulb777/Specs.git,https://github.com/CocoaPods/Specs.git"
        - ALT_SOURCES="--sources=https://github.com/paulb777/Specs.git,https://github.com/CocoaPods/Specs.git"
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        - ./scripts/if_changed.sh bundle exec pod lib lint GoogleUtilities.podspec
        - ./scripts/if_changed.sh bundle exec pod lib lint FirebaseCore.podspec $ALT_SOURCES
        - ./scripts/if_changed.sh bundle exec pod lib lint FirebaseAuth.podspec $ALT_SOURCES
        - ./scripts/if_changed.sh bundle exec pod lib lint FirebaseAuthInterop.podspec $ALT_SOURCES
        - ./scripts/if_changed.sh bundle exec pod lib lint FirebaseDatabase.podspec $ALT_SOURCES
        - ./scripts/if_changed.sh bundle exec pod lib lint FirebaseMessaging.podspec $ALT_SOURCES
        - ./scripts/if_changed.sh bundle exec pod lib lint FirebaseStorage.podspec $ALT_SOURCES
        - ./scripts/if_changed.sh bundle exec pod lib lint FirebaseFunctions.podspec $ALT_SOURCES

    - stage: test
      env:
        - PROJECT=Firestore PLATFORM=iOS METHOD=pod-lib-lint
        - ALT_SOURCES="--sources=https://github.com/paulb777/Specs.git,https://github.com/CocoaPods/Specs.git"
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        # Eliminate the one warning from BoringSSL when CocoaPods 1.6.0 is available.
        # The travis_wait is necessary because the command takes more than 10 minutes.
        - travis_wait ./scripts/if_changed.sh bundle exec pod lib lint FirebaseFirestore.podspec --allow-warnings --no-subspecs $ALT_SOURCES

    # pod lib lint to check build and warnings for static library build - only on cron jobs
    - stage: test
      env:
        - PROJECT=Firebase PLATFORM=iOS METHOD=pod-lib-lint
        - ALT_SOURCES="--sources=https://github.com/paulb777/Specs.git,https://github.com/CocoaPods/Specs.git"
      before_install:
        - ./scripts/if_cron.sh ./scripts/install_prereqs.sh
      script:
        - ./scripts/if_cron.sh bundle exec pod lib lint GoogleUtilities.podspec --use-libraries
        - ./scripts/if_cron.sh bundle exec pod lib lint FirebaseCore.podspec --use-libraries $ALT_SOURCES
        - ./scripts/if_cron.sh bundle exec pod lib lint FirebaseAuth.podspec --use-libraries $ALT_SOURCES
        - ./scripts/if_cron.sh bundle exec pod lib lint FirebaseAuthInterop.podspec --use-libraries $ALT_SOURCES
        - ./scripts/if_cron.sh bundle exec pod lib lint FirebaseDatabase.podspec --use-libraries $ALT_SOURCES
        # The Protobuf dependency of FirebaseMessaging has warnings with --use-libraries
        - ./scripts/if_cron.sh bundle exec pod lib lint FirebaseMessaging.podspec --use-libraries --allow-warnings $ALT_SOURCES
        - ./scripts/if_cron.sh bundle exec pod lib lint FirebaseStorage.podspec --use-libraries $ALT_SOURCES
        - ./scripts/if_cron.sh bundle exec pod lib lint FirebaseFunctions.podspec --use-libraries $ALT_SOURCES

    - stage: test
      env:
        - PROJECT=Firestore PLATFORM=iOS METHOD=pod-lib-lint
        - ALT_SOURCES="--sources=https://github.com/paulb777/Specs.git,https://github.com/CocoaPods/Specs.git"
      before_install:
        - ./scripts/if_cron.sh ./scripts/install_prereqs.sh
      script:
        # TBD - non-portable path warnings
        # The travis_wait is necessary because the command takes more than 10 minutes.
        - travis_wait ./scripts/if_cron.sh bundle exec pod lib lint FirebaseFirestore.podspec --use-libraries --allow-warnings --no-subspecs $ALT_SOURCES

    # Alternative platforms

    - stage: test
      env:
        - PROJECT=Firestore PLATFORM=macOS METHOD=cmake
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        - ./scripts/if_changed.sh ./scripts/build.sh $PROJECT $PLATFORM $METHOD

    - stage: test
      osx_image: xcode8.3
      env:
        - PROJECT=Firestore PLATFORM=iOS METHOD=xcodebuild XCODE_VERSION=8.3.3
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        - ./scripts/if_changed.sh ./scripts/build.sh $PROJECT $PLATFORM $METHOD

    # Community-supported platforms

    - stage: test
      env:
        - PROJECT=Firebase PLATFORM=macOS METHOD=xcodebuild
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        - ./scripts/if_changed.sh ./scripts/build.sh $PROJECT $PLATFORM

    - stage: test
      env:
        - PROJECT=Firebase PLATFORM=tvOS METHOD=xcodebuild
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        - ./scripts/if_changed.sh ./scripts/build.sh $PROJECT $PLATFORM

    # Firestore sanitizers

    - stage: test
      env:
        - PROJECT=Firestore PLATFORM=iOS METHOD=xcodebuild SANITIZERS=asan
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        - ./scripts/if_changed.sh ./scripts/build.sh $PROJECT $PLATFORM $METHOD

    - stage: test
      env:
        - PROJECT=Firestore PLATFORM=iOS METHOD=xcodebuild SANITIZERS=tsan
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        - ./scripts/if_changed.sh ./scripts/build.sh $PROJECT $PLATFORM $METHOD

    # TODO(varconst): enable UBSan in xcodebuild. Right now if fails during
    # linkage (it works if enabled together with ASan, but it's supposed to be
    # usable on its own, too).

    - stage: test
      env:
        - PROJECT=Firestore PLATFORM=macOS METHOD=cmake SANITIZERS=asan
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        - ./scripts/if_changed.sh ./scripts/build.sh $PROJECT $PLATFORM $METHOD

    - stage: test
      env:
        - PROJECT=Firestore PLATFORM=macOS METHOD=cmake SANITIZERS=tsan
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        - ./scripts/if_changed.sh ./scripts/build.sh $PROJECT $PLATFORM $METHOD

    # TODO(varconst): UBSan for CMake. UBSan failures are non-fatal by default,
    # need to make them fatal for the purposes of the test run.

  # TODO(varconst): disallow sanitizers to fail once we fix all existing issues.
  allow_failures:
    - env:
      - PROJECT=Firestore PLATFORM=macOS METHOD=cmake SANITIZERS=asan
    - env:
      - PROJECT=Firestore PLATFORM=macOS METHOD=cmake SANITIZERS=tsan
    - env:
      - PROJECT=Firestore PLATFORM=iOS METHOD=xcodebuild SANITIZERS=asan
    - env:
      - PROJECT=Firestore PLATFORM=iOS METHOD=xcodebuild SANITIZERS=tsan

  # TODO(varconst): enable if it's possible to make this flag work on build
  # stages. It's supposed to avoid waiting for jobs that are allowed to fail
  # before reporting the results.
  # fast_finish: true

branches:
  only:
    - master