-
Notifications
You must be signed in to change notification settings - Fork 1
/
.travis.yml
224 lines (206 loc) · 11.2 KB
/
.travis.yml
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
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# Inspired from the .travis.yml in
# https://github.com/davidchall/homebrew-hep/
# This script can be executed in three different modes:
# - cron/api (api is when you select 'trigger build' in travis): in this mode,
# all the formulas are tested to make sure that there is no shared lib
# breakage
# - push to master: does nothing
# - pull-request: in this mode, the updated formulas are built and bottled
# and the bottles are pushed to bintray as 'unpublished'. The DSL commit
# is pushed as a tag, e.g., 'pr-1234', which us unrelated to master.
language: ruby
if: tag IS blank AND NOT type IN (push)
env:
global:
- HOMEBREW_LOGS=/tmp # Prevent ~/.cache/Homebrew/Logs from being rebuilt
- HOMEBREW_NO_AUTO_UPDATE=yes # Prevents redundant auto-updates from brew
###### Bintray configuration ######
- TAP_BOTTLE_ORG=touist # Used in this script only
- TAP_BOTTLE_ROOT_URL=https://dl.bintray.com/$TAP_BOTTLE_ORG/bottles-touist
- HOMEBREW_BINTRAY_USER=maelvalais
# HOMEBREW_BINTRAY_KEY # Secret variable set in Travis CI
###### AWS S3 configuration ######
- AWS_REGION=eu-west-1 # aws-sdk-s3 gem errors without it
- BUCKET=homebrew-touist-travis
# AWS_ACCESS_KEY_ID # Secret variable set in Travis CI
# AWS_SECRET_ACCESS_KEY # Secret variable set in Travis CI
###### Github configuration ######
# This config allows test-bot to push tags (eg. pr-1234) and DSL commits.
# They will be pushed to github.com/$GITHUB_USER/homebrew-%TAP%.
- GITHUB_USER=touist
# GITHUB_TOKEN # (Secret) For pushing bottle DSL commits
# (1) remember to use 'brew cleanup -s' at the end of the travis script;
# otherwise, the $HOME/Library/Caches/Homebrew folder will be enormous
# (~2GB for the 4 jobs). This is because this folder is already present on
# osx images and it is big.
# (2) For a time, I had removed $HOME/.cache/Homebrew (cache of Linuxbrew)
# because it was also storing some logs in $HOME/.cache/Homebrew/Logs, making
# the cache rebuilt every time.
cache:
directories:
- "$HOME/.cache/pip"
- "$HOME/.gem/ruby"
- "$HOME/Library/Caches/Homebrew" # (1)
- "$HOME/.cache/Homebrew" # (2)
install:
# the official test-bot won't let you run inside TravisCI, so we use
# davidchall's one. David's test-bot cannot push the commit using
# Oauth github + https (only ssh) so I use my own.
- brew tap maelvalais/test-bot
# Often, Travis CI image's git is too old for brew
- brew install git
# Install the ruby AWS gem so that I can upload bottles to S3
- rvm default do gem install aws-sdk-s3
# IMPORTANT STEP: link the tap inside brew to our current travis-cloned tap
# Step: 1) create the intermediate folders <user>/<repo> so that
# we can 2) remove <repo> and 3) replace it with a sym link
# that will point to the travis build folder.
# If we don't do that, the tap be cloned using the default master
# branch, and thus we cannot test our tap at the current pushed commit.
# We also need to unshallow in 4) because sometimes travis does not
# clone thouroughly but we need a deep clone.
- mkdir -p $(brew --repo $TRAVIS_REPO_SLUG) # 1)
- rm -rf $(brew --repo $TRAVIS_REPO_SLUG) # 2)
- ln -s $PWD $(brew --repo $TRAVIS_REPO_SLUG) # 3)
- git fetch --unshallow || true # 4)
# Unless I am in 'brew test-bot', I don't want to fail on warnings.
# perl regex: needed so that I can use 1.4.0-beta1 or 1.4.0-rc1 as stable versions
- perl -pi -e 's/(.*)problem(.*version.*should not contain.*)$/$1opoo$2/' $(brew --repo)/Library/Homebrew/dev-cmd/audit.rb
- git -C $(brew --repo) commit -a -m "disable error on beta or alpha version"
# WARNING: I discovered that 'set -e' is breaking Travis CI. I was using for
# stopping a multiple-lines command as soon as one of the commands fails.
# After having 'set -e', internal travis commands may stop working, e.g.:
# /Users/travis/.travis/job_stages: line 57: shell_session_update: command not found
# is an internal error that shouldn't stop the script for continuing, but
# because of 'set -e', the whole internal Travis CI script stops.
# Conclusion: avoid using 'set -e' and more generally avoid for-loops and
# multi-line commands that should fail when one of the commands fails.
script:
- |
if [[ $TRAVIS_EVENT_TYPE =~ cron|api ]]; then
brew install *.rb && brew test *.rb && brew linkage --test *.rb || exit 123
fi
- if [[ $TRAVIS_EVENT_TYPE =~ pull_request ]]; then brew test-bot --root-url=$TAP_BOTTLE_ROOT_URL; fi
- ls *.bottle*.* || echo "==> No bottle created here"
jobs:
include:
- &run-osx
os: osx
osx_image: xcode9.4
env: OS=high_sierra-10.13
# We must use 'rvm: system' because the system ruby doesn't rely on
# Homebrew, which allows us to reinstall Homebrew without having a
# damaged ruby. We need ruby because we use the 'aws-sdk-s3' gem.
rvm: system
before_install: # IMPORTANT: HOMEBREW_DEVELOPER must not be set here.
# First we uninstall any outdated versions of xquartz; otherwise,
# Homebrew will complain of of older version (2.9.7) being outdated
# even though we install a new version. Remember that
# /usr/local/Caskroom will also be deleted below.
- brew cask outdated xquartz || brew cask uninstall xquartz
# Three reasons not to use the /usr/local and Homebrew installations
# that come in the Travis CI images:
# 1) because Travis CI has installed many non-homebrew things into
# /usr/local that randomly cause 'brew doctor' to fail;
# 2) after time, the osx image contains an outdated Homebrew that
# has weird 'unlinked kegs' and such;
# 3) also because it takes a long time to 'brew update' from an old
# Homebrew anyway, so why not start fresh.
- mkdir ~/usr_local && sudo mv /usr/local/* ~/usr_local
- /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# Either xquartz was already installed at its latest version or it has
# been uninstalled. First, we put the cask back in place if it has not
# been uninstalled.
- |
if [ -d ~/usr_local/Caskroom/xquartz ];
then sudo mv ~/usr_local/Caskroom /usr/local/Caskroom;
else travis_retry brew cask install xquartz --no-quarantine; fi
# We still need the Homebrew ruby on macOS 10.12 and 10.11 because the
# system ruby uses an old openssl version ("tlsv1 alert protocol").
- travis_retry brew install libyaml gmp openssl@1.1 openssl
# TO BE ENABLED AS SOON AS TRAVIS HAS A MOJAVE IMAGE:
#- <<: *run-osx
# os: osx
# osx_image: xcode9.4
# env: OS=high_sierra-10.13
- <<: *run-osx
os: osx
osx_image: xcode9.2
env: OS=sierra-10.12
- &run-on-linux
os: linux
env: OS=x86_64_linux
before_install:
# Fix the permission problem on linux (664 instead of 644) during
# git clone (the one done by travis-ci). Homebrew needs formulas to be
# 'chmod 644'. This is because git does not conserve permissions and
# travis-ci seems to have by default a umask too permissive.
# Because we cannot do 'umask 002' just before travis clones the repo,
# I set umask afterwards (1) and I change the permission of
# already cloned files from 664 to 644 (2).
- umask 022 # (1)
- chmod 0644 *.rb # (2)
# Instal linuxbrew
- export PATH="/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:$PATH";
# I added 'brew vendor-install ruby' because sometimes the install would
# fail on 'Homebrew must be run under Ruby 2.3!' error.
- yes | sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)" || (brew vendor-install ruby && brew update --force)
# Fix a `brew doctor` error on "config" scripts for some reason
- sudo rm -f /home/travis/.phpenv/shims/php-config
/opt/pyenv/shims/*-config /usr/local/clang-*/bin/llvm-config
# Uploading to bintray (as unpublished bottle) and pushing a tag to the
# repo are only enabled on pull_requests.
- <<: *run-on-linux
stage: deploy
if: branch = master AND type IN (pull_request)
os: linux
env: OS=any_linux
script:
# First step: download the *.json and *.tar.gz from the S3 bucket
- |
rvm default do ruby <<EOF || true
require 'aws-sdk-s3'; s3 = Aws::S3::Resource.new
s3.bucket("$BUCKET").objects(prefix:"$TRAVIS_BUILD_NUMBER/").each { |o| o.download_file(o.key.to_s.gsub(/^\d*\/(.*)/, '\1')) }
# This hook will add [ci skip] the the commit messages for bottle DSL
# so that travis-ci does not re-build a duplicate bottle on pushing.
- echo 'echo "\n\n[ci skip]" >> "$1"' > .git/hooks/commit-msg; chmod +x .git/hooks/commit-msg
# (1) We fail 'silently' if no bottle is found.
# (2) A trick so that 'prefix' and 'cellar' are removed if they are
# equal to DEFAULT_PREFIX and DEFAULT_CELLAR even though we run
# 'brew bottle' on a linux setup.
# (3) Travis does not provide a high_sierra image yet, but I can use the
# sierra one and pretend it is a high_sierra bottle. I test them regularly in
# case it doesn't work.
# (4) In 'brew --ci--upload', --git-name is the name of the fork
# where the pr-1234 (or testing-98 when not in a PR) tag is pushed.
# In my case, I use the 'main' instead of a fork.
- |
if ls *.{json,tar.gz}; then # (1)
sed -i 's:/usr/local:/home/linuxbrew/.linuxbrew:g' *.json; # (2)
ls *.high_sierra.bottle.json | while read json; do # (3)
sed 's/high_sierra/mojave/g' $json > ${json/high_sierra/mojave};
bottle=`ls ${json/bottle*/}*.tar.gz`;
cp ${bottle} ${bottle/high_sierra/mojave};
done;
brew test-bot --ci-upload --root-url=$TAP_BOTTLE_ROOT_URL --git-name=$GITHUB_USER --git-email=mael.valais@gmail.com --bintray-org=$TAP_BOTTLE_ORG --verbose;
else
echo "==> No bottle found in the bucket, skipping --ci-upload";
fi
after_script: true # nothing
after_script:
# In case the AWS_SECRET_ACCESS_KEY and AWS_SECRET_ACCESS_KEY are not
# available, we don't want the build to fail.
# Here, the 'testing' jobs have finished and must upload their *.{json,tar.gz}
- |
rvm default do ruby <<EOF || true
require 'aws-sdk-s3'; s3 = Aws::S3::Resource.new
Dir["*.{json,tar.gz}"].each { |f| s3.bucket("$BUCKET").put_object(key:"$TRAVIS_BUILD_NUMBER/#{f}").upload_file(f) }
before_cache:
# Scrub cache so that travis only caches stuff for installed formulae.
- brew cleanup -s
- brew cask cleanup
# Remove temporary stuff (idk why they put that in ~/.cache... that should be in /tmp)
- rm -f ~/Library/Caches/Homebrew/linkage.db ~/.cache/Homebrew/linkage.db
# List the formulae so that I understand why the cache is huge sometimes
- brew list
- du -h ~/Library/Caches/Homebrew || du -h ~/.cache/Homebrew/linkage.db