From bc3d45431731a398464d8101f0595abea8d624a0 Mon Sep 17 00:00:00 2001 From: Joep van Delft Date: Thu, 30 Mar 2017 09:52:12 +0200 Subject: [PATCH 0001/2623] Warn about using netrc methods for git submodule --- user/private-dependencies.md | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/user/private-dependencies.md b/user/private-dependencies.md index 6bc197dca9a..3ea00b7be56 100644 --- a/user/private-dependencies.md +++ b/user/private-dependencies.md @@ -162,7 +162,7 @@ Assumptions: To pull in dependencies with a password, you will have to use the user name and password in the Git HTTPS URL: `https://ci-user:mypassword123@github.com/myorg/lib1.git`. -Alternatively, you can also write the credentials to the `~.netrc` file: +Alternatively, you can also write the credentials to the `~/.netrc` file: ``` machine github.com @@ -170,7 +170,8 @@ machine github.com password mypassword123 ``` -You can also encrypt the password and then write it to the netrc in a `before_install` step in your `.travis.yml`. + +You can also encrypt the password and then write it to the netrc in a `before_install` step in your `.travis.yml`: ```bash $ travis env set CI_USER_PASSWORD mypassword123 --private -r myorg/main @@ -199,6 +200,22 @@ gem 'lib1', github: "myorg/lib1" gem 'lib2', github: "myorg/lib2" ``` + +**Note**: In case of private git submodules, be aware that the `git submodule +update --init recursive` command will by default run before you will have the chance +of storing the credentials. If you are going this route, disable the loading of +submodules first, and do this as a separate step after the credentials have been +added: + +```yml +git: + submodules: + false +before_install: + - echo -e "machine github.com\n login ci-user\n password $CI_USER_PASSWORD" >>~/.netrc + - git submodule update --init --recursive +``` + ## API Token Assumptions: @@ -250,6 +267,21 @@ gem 'lib1', github: "myorg/lib1" gem 'lib2', github: "myorg/lib2" ``` +**Note**: In case of private git submodules, be aware that the `git submodule +update --init recursive` command will by default run before you will have the chance +of storing the credentials. If you are going this route, disable the loading of +submodules first, and do this as a separate step after the credentials have been +added: + +```yml +git: + submodules: + false +before_install: + - echo -e "\n\nmachine github.com\n $CI_TOKEN\n" >>~/.netrc + - git submodule update --init --recursive +``` + ## Dedicated User Account As mentioned a few times, it might make sense to create a dedicated CI user for the following reasons: From 384b228c2fee5e14114266fb4a5b4ed79282b5bd Mon Sep 17 00:00:00 2001 From: Joep van Delft Date: Wed, 5 Apr 2017 17:11:17 +0200 Subject: [PATCH 0002/2623] Incorporate excellent feedback --- user/private-dependencies.md | 55 +++++++++++++++++------------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/user/private-dependencies.md b/user/private-dependencies.md index 3ea00b7be56..d8bc75994df 100644 --- a/user/private-dependencies.md +++ b/user/private-dependencies.md @@ -200,21 +200,19 @@ gem 'lib1', github: "myorg/lib1" gem 'lib2', github: "myorg/lib2" ``` - -**Note**: In case of private git submodules, be aware that the `git submodule -update --init recursive` command will by default run before you will have the chance -of storing the credentials. If you are going this route, disable the loading of -submodules first, and do this as a separate step after the credentials have been -added: - -```yml -git: - submodules: - false -before_install: - - echo -e "machine github.com\n login ci-user\n password $CI_USER_PASSWORD" >>~/.netrc - - git submodule update --init --recursive -``` +> In case of private git submodules, be aware that the `git submodule +> update --init recursive` command will by default run before the `~/.netrc` credentials +> are updated. If you are writing credentials to `~/.netrc`, disable the loading of +> submodules first, and do this as a separate explicit step after updating the credentials: +> +> ```yml +> git: +> submodules: +> false +> before_install: +> - echo -e "machine github.com\n login ci-user\n password $CI_USER_PASSWORD" >>~/.netrc +> - git submodule update --init --recursive +> ``` ## API Token @@ -267,20 +265,19 @@ gem 'lib1', github: "myorg/lib1" gem 'lib2', github: "myorg/lib2" ``` -**Note**: In case of private git submodules, be aware that the `git submodule -update --init recursive` command will by default run before you will have the chance -of storing the credentials. If you are going this route, disable the loading of -submodules first, and do this as a separate step after the credentials have been -added: - -```yml -git: - submodules: - false -before_install: - - echo -e "\n\nmachine github.com\n $CI_TOKEN\n" >>~/.netrc - - git submodule update --init --recursive -``` +> In case of private git submodules, be aware that the `git submodule +> update --init recursive` command will by default run before the `~/.netrc` credentials +> are updated. If you are writing credentials to `~/.netrc`, disable the loading of +> submodules first, and do this as a separate explicit step after updating the credentials: +> +> ```yml +> git: +> submodules: +> false +> before_install: +> - echo -e "\n\nmachine github.com\n $CI_TOKEN\n" >>~/.netrc +> - git submodule update --init --recursive +> ``` ## Dedicated User Account From 5a96dcdc5776604c7572760962f56989744e4e99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20Hamb=C3=BCchen?= Date: Sat, 1 Jul 2017 00:01:47 +0200 Subject: [PATCH 0003/2623] running-build-in-debug-mode.md: Explain what kind of ID is needed and how to obtain it Also put a note regarding the common error of omitting the `token` literal. --- user/running-build-in-debug-mode.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/user/running-build-in-debug-mode.md b/user/running-build-in-debug-mode.md index 3a789a0c1bf..84354a09e7f 100644 --- a/user/running-build-in-debug-mode.md +++ b/user/running-build-in-debug-mode.md @@ -43,8 +43,14 @@ $ curl -s -X POST \ https://api.travis-ci.org/job/${id}/debug ``` +(Note the literal word `token` must be present before the actual authorization token.) + For private repositories, the API endpoint is `https://api.travis-ci.com/job/${id}/debug`. +#### Finding the job ID + +The `${id}` is a job ID, not a build ID. For example, the ID `248927956` in the URL [`https://travis-ci.org/travis-ci/docs-travis-ci-com/builds/248927956`](https://travis-ci.org/travis-ci/docs-travis-ci-com/builds/248927956) is a build ID. To obtain the corresponding job ID, click the _View config_ button on that page, and the URL will change into [`https://travis-ci.org/travis-ci/docs-travis-ci-com/jobs/248927957/config`](https://travis-ci.org/travis-ci/docs-travis-ci-com/jobs/248927957/config), showing the job ID `248927957`. Alternatively, you can obtain job IDs corresponding to a build ID [via the API](https://docs.travis-ci.com/api/#builds). + #### Echoing debug session's output to the logs To show any command input and output you see while connected to the VM running in the debug From beb808d782e7aefa0a65e9fae96fae6e0654f4bc Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Thu, 20 Jul 2017 16:23:46 -0400 Subject: [PATCH 0004/2623] Warn about overriding `$USER` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the user overrides this, a Bad Thing™ can happen. --- user/environment-variables.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/environment-variables.md b/user/environment-variables.md index 6c2c0609eaa..4dadf53d11c 100644 --- a/user/environment-variables.md +++ b/user/environment-variables.md @@ -162,7 +162,7 @@ The following default environment variables are available to all builds. - `CONTINUOUS_INTEGRATION=true` - `DEBIAN_FRONTEND=noninteractive` - `HAS_JOSH_K_SEAL_OF_APPROVAL=true` -- `USER=travis` (**do not depend on this value**) +- `USER=travis` (**do not depend on this value**; do not override this value) - `HOME=/home/travis` (**do not depend on this value**) - `LANG=en_US.UTF-8` - `LC_ALL=en_US.UTF-8` From 67f381b7db66074c472b2c196920f5950e1b44ca Mon Sep 17 00:00:00 2001 From: Maximilian Held Date: Tue, 8 Aug 2017 19:01:12 +0200 Subject: [PATCH 0005/2623] document TRAVIS_R_VERSION_STRING @jimhester here is the missing doc for awesome `TRAVIS_R_VERSION_STRING` --- user/languages/r.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user/languages/r.md b/user/languages/r.md index 9a9d3ca4bbc..a3f6db6b6cb 100644 --- a/user/languages/r.md +++ b/user/languages/r.md @@ -78,6 +78,8 @@ r: As new minor versions are released, aliases will float and point to the most current minor release. +You can access the above "channel" *string* (i.e. `release`) as opposed to the concrete version number (i.e `3.2.1`) with the environmental variable `TRAVIS_R_VERSION_STRING`. + The exact R version used for each build is included in the 'R session information' fold within the build log. @@ -241,6 +243,8 @@ defaults](/user/environment-variables/#Default-Environment-Variables). - `_R_CHECK_CRAN_INCOMING_=false` - `NOT_CRAN=true` - `R_PROFILE=~/.Rprofile.site` +- `TRAVIS_R_VERSION_STRING` set to the *string* provided *to* `r:`, i.e. `release`, `oldrel` or `devel`. +   Useful, for example, to deploy only from `release` via `on: condition: "$TRAVIS_R_VERSION_STRING = release"`. ### Additional Dependency Fields From 325e537c7a315582f291cc4fa02118d9fbeb6ccb Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Tue, 8 Aug 2017 21:07:59 +0100 Subject: [PATCH 0006/2623] Rename respository variable to repository_slug - Docs mention that %{repository} is deprecated for %{repository_slug} so examples need changing. - Remove duplicated (but missing deprecation message about repository) variables list in Slack section. --- user/notifications.md | 38 ++++++++++---------------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/user/notifications.md b/user/notifications.md index 05cc8aadba0..c8b9d266792 100644 --- a/user/notifications.md +++ b/user/notifications.md @@ -194,7 +194,7 @@ notifications: - "chat.freenode.net#my-channel" - "chat.freenode.net#some-other-channel" template: - - "%{repository} (%{commit}) : %{message} %{foo} " + - "%{repository_slug} (%{commit}) : %{message} %{foo} " - "Build details: %{build_url}" ``` @@ -223,7 +223,7 @@ The default template is: notifications: irc: template: - - "%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message}" + - "%{repository_slug}#%{build_number} (%{branch} - %{commit} : %{author}): %{message}" - "Change view : %{compare_url}" - "Build details : %{build_url}" ``` @@ -328,7 +328,7 @@ notifications: rooms: - [subdomain]:[api token]@[room id] template: - - "%{repository} (%{commit}) : %{message} %{foo} " + - "%{repository_slug} (%{commit}) : %{message} %{foo} " - "Build details: %{build_url}" ``` @@ -393,7 +393,7 @@ notifications: rooms: - [api token]@[room id or name] template: - - '%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message}' + - '%{repository_slug}#%{build_number} (%{branch} - %{commit} : %{author}): %{message}' ``` If you want to send HTML notifications you need to add `format: html` like this @@ -405,7 +405,7 @@ notifications: rooms: - [api token]@[room id or name] template: - - '%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message} (Details/Change view)' + - '%{repository_slug}#%{build_number} (%{branch} - %{commit} : %{author}): %{message} (Details/Change view)' format: html ``` @@ -417,7 +417,7 @@ notifications: rooms: - [api token]@[room id or name] template: - - '%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message}' + - '%{repository_slug}#%{build_number} (%{branch} - %{commit} : %{author}): %{message}' notify: true ``` @@ -482,7 +482,7 @@ pushover: users: - [user key] - [user key] - template: "%{repository} (%{commit}) : %{message} %{foo} - Build details: %{build_url}" + template: "%{repository_slug} (%{commit}) : %{message} %{foo} - Build details: %{build_url}" ``` Other flags, such as `on_success` and `on_failure` also work like the IRC notification config. @@ -587,35 +587,17 @@ Customize the notification message by editing the template, as in this example: notifications: slack: template: - - "%{repository} (%{commit}) : %{message} %{foo} " + - "%{repository_slug} (%{commit}) : %{message} %{foo} " - "Build details: %{build_url}" ``` -The following variables are available: - -- *repository_slug*: your GitHub repo identifier (like `svenfuchs/minimal`) -- *repository_name*: the slug without the username -- *build_number*: build number -- *build_id*: build id -- *branch*: branch build name -- *commit*: shortened commit SHA -- *author*: commit author name -- *commit_message*: commit message of build -- *commit_subject*: first line of the commit message -- *result*: result of build -- *message*: Travis CI message to the build -- *duration*: total duration of all builds in the matrix -- *elapsed_time*: time between build start and finish -- *compare_url*: commit change view URL -- *build_url*: URL of the build detail - The default template for push builds is: ```yaml notifications: slack: template: - - "Build <%{build_url}|#%{build_number}> (<%{compare_url}|%{commit}>) of %{repository}@%{branch} by %{author} %{result} in %{duration}" + - "Build <%{build_url}|#%{build_number}> (<%{compare_url}|%{commit}>) of %{repository_slug}@%{branch} by %{author} %{result} in %{duration}" ``` while the default template for pull request builds is: @@ -624,7 +606,7 @@ while the default template for pull request builds is: notifications: slack: template: - - "Build <%{build_url}|#%{build_number}> (<%{compare_url}|%{commit}>) of %{repository}@%{branch} in PR <%{pull_request_url}|#%{pull_request_number}> by %{author} %{result} in %{duration}" + - "Build <%{build_url}|#%{build_number}> (<%{compare_url}|%{commit}>) of %{repository_slug}@%{branch} in PR <%{pull_request_url}|#%{pull_request_number}> by %{author} %{result} in %{duration}" ``` From d9caf961d3ca8ab9784413cc777b7682d1f3123d Mon Sep 17 00:00:00 2001 From: camlafit Date: Mon, 21 Aug 2017 12:02:19 +0200 Subject: [PATCH 0007/2623] Update bintray deploy information about deb part Some lacking information about deb repository. * upload pattern must respect automatic layout, some informations are mandatories, * and if your file are on root script, relative path must be set as "includePattern": "./(.*\\.deb)", --- user/deployment/bintray.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/user/deployment/bintray.md b/user/deployment/bintray.md index 1bdd5f9e8c7..a5b5e86c6ca 100644 --- a/user/deployment/bintray.md +++ b/user/deployment/bintray.md @@ -114,11 +114,14 @@ The descriptor is in JSON file format in three sections: #### Package Section -Bintray package information. In case the package already exists on Bintray, only the name, repo and subject fields are mandatory. +Bintray package information. Following information are mandatories on open source project. - `name` is the Bintray package name - `repo` is the Bintray repository name - `subject` is the Bintray subject, which is either a user or an organization +- `vcs_url` is the Bintray vcs url, could be a github repository url or either vcs repository url +- `licenses` is the [Bintray licences](https://bintray.com/docs/api/#url_licenses), which is either a list with at list on item. + #### Version Section @@ -130,7 +133,7 @@ Configure the files you would like to upload to Bintray and their upload path. You can define one or more groups of patterns. Each group contains three patterns: -- `includePattern`: Pattern in the form of Ruby regular expression, indicating the path of files to be uploaded to Bintray. +- `includePattern`: Pattern in the form of Ruby regular expression, indicating the path of files to be uploaded to Bintray. If files are in your root directory, you must indicate relative path : `\./` - `excludePattern`: Optional. Pattern in the form of Ruby regular expression, indicating the path of files to be removed from the list of files specified by the includePattern. - `uploadPattern`: Upload path on Bintray. The path can contain symbols in the form of $1, $2,... that are replaced with capturing groups defined in the include pattern. @@ -145,9 +148,11 @@ In the example above, the following files are uploaded: When artifacts are uploaded to a Debian repository on Bintray using the Automatic index layout, the Debian distribution information is required and must be specified. The information is specified in the descriptor file by the matrixParams as part of the files closure as shown in the following example: +`uploadPattern` should respect [bintray automatic layout scheme](https://blog.bintray.com/category/packages-metadata/). + ```js "files": - [{"includePattern": "build/bin/(.*\.deb)", "uploadPattern": "$1", + [{"includePattern": "build/bin/(.*\.deb)", "uploadPattern": "pool/main/m/mypackage/$1", "matrixParams": { "deb_distribution": "vivid", "deb_component": "main", From 269a5146c43ee2e04883f2ffac2e9a8f882759c7 Mon Sep 17 00:00:00 2001 From: camlafit Date: Tue, 22 Aug 2017 17:27:41 +0200 Subject: [PATCH 0008/2623] corrections following comments from @BanzaiMan thanks :) --- user/deployment/bintray.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/deployment/bintray.md b/user/deployment/bintray.md index a5b5e86c6ca..922412b4552 100644 --- a/user/deployment/bintray.md +++ b/user/deployment/bintray.md @@ -114,13 +114,13 @@ The descriptor is in JSON file format in three sections: #### Package Section -Bintray package information. Following information are mandatories on open source project. +Bintray package information. Following informations are mandatory on open source projects. - `name` is the Bintray package name - `repo` is the Bintray repository name - `subject` is the Bintray subject, which is either a user or an organization - `vcs_url` is the Bintray vcs url, could be a github repository url or either vcs repository url -- `licenses` is the [Bintray licences](https://bintray.com/docs/api/#url_licenses), which is either a list with at list on item. +- `licenses` is the [Bintray licences](https://bintray.com/docs/api/#url_licenses), which is a list with at least one item. #### Version Section From f86ed9c235c4ce050a7ce0d97a91447b68756898 Mon Sep 17 00:00:00 2001 From: camlafit Date: Tue, 22 Aug 2017 18:12:23 +0200 Subject: [PATCH 0009/2623] Update bintray.md --- user/deployment/bintray.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/deployment/bintray.md b/user/deployment/bintray.md index 922412b4552..52ae3d23c67 100644 --- a/user/deployment/bintray.md +++ b/user/deployment/bintray.md @@ -114,7 +114,7 @@ The descriptor is in JSON file format in three sections: #### Package Section -Bintray package information. Following informations are mandatory on open source projects. +Bintray package information. Following information is mandatory on open source projects. - `name` is the Bintray package name - `repo` is the Bintray repository name From f9a7f454a6573d316d27d241a529d04302b26af7 Mon Sep 17 00:00:00 2001 From: cclauss Date: Sat, 9 Sep 2017 11:21:43 +0200 Subject: [PATCH 0010/2623] Update versions, show a matrix with multiple allow_failures Be consistent with quotes. `allow_failures` is very useful so it is good to demonstrate it. Python 2.6 and 3.2 are EOL and 3.3 will be in just a few weeks so we should not emphasize them too much. * https://docs.python.org/devguide/index.html#branchstatus --- user/languages/python.md | 56 +++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/user/languages/python.md b/user/languages/python.md index 0b5aa721bc9..581b7bba6d1 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -49,17 +49,16 @@ levels. ```yaml language: python python: - - "2.6" - - "2.7" - - "3.2" - - "3.3" - - "3.4" - - "3.5" - - "3.5-dev" # 3.5 development branch - - "3.6" - - "3.6-dev" # 3.6 development branch - - "3.7-dev" # 3.7 development branch - - "nightly" + - 2.6 + - 2.7 + - 3.3 + - 3.4 + - 3.5 + - 3.5-dev # 3.5 development branch + - 3.6 + - 3.6-dev # 3.6 development branch + - 3.7-dev # 3.7 development branch + - nightly # command to install dependencies install: - pip install -r requirements.txt @@ -91,15 +90,15 @@ in your `.travis.yml`: ```yaml language: python python: - - "2.6" - - "2.7" - - "3.2" - - "3.3" - - "3.4" + - 2.6 + - 2.7 + - 3.4 + - 3.5 + - 3.6 # PyPy versions - - "pypy" # PyPy2 2.5.0 - - "pypy3" # Pypy3 2.4.0 - - "pypy-5.3.1" + - pypy # PyPy2 5.8.0 + - pypy3 # Pypy3 5.8.0-beta0 + - pypy-5.3.1 # command to install dependencies install: - pip install . @@ -174,8 +173,8 @@ Use *env* key in your .travis.yml file, for example: ```yaml env: - - DJANGO_VERSION=1.7.8 - - DJANGO_VERSION=1.8.2 + - DJANGO_VERSION=1.10.8 + - DJANGO_VERSION=1.11.5 ``` {: data-file=".travis.yml"} @@ -199,6 +198,21 @@ For a real world example, see [getsentry/sentry](https://github.com/getsentry/se For Python projects, `env` and `python` can be given as arrays to construct a build matrix. +```yaml +python: + - 3.6 + - pypy3 # Pypy3 5.8.0-beta0 + - nightly +env: + - DJANGO_VERSION=1.10.8 + - DJANGO_VERSION=1.11.5 +# while pypy3 is still in beta, allow those and nightly tests to fail +matrix: + allow_failures: + - python: pypy3 + - python: nightly +``` + ## Examples - [tornadoweb/tornado](https://github.com/tornadoweb/tornado/blob/master/.travis.yml) From 7fefce8e09996d80c08d3a25bf2d6432e0e6b556 Mon Sep 17 00:00:00 2001 From: cclauss Date: Sat, 9 Sep 2017 21:56:15 +0200 Subject: [PATCH 0011/2623] Quotes on versions and remove older pypy The reason that I added allow_failures was because this is a year of porting in the Python world with the upcoming EOL of Python 2, the performance improvements of Python 3, and the Django 1 to 2 transition. More people could be using CI to smoothly navigate these transitions if they understood the allow_failures approach so we should not hide it. Let me know if you need it removed. --- user/languages/python.md | 49 ++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/user/languages/python.md b/user/languages/python.md index 581b7bba6d1..95accd46bdc 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -20,8 +20,8 @@ Minimal example: ```yaml language: python python: - - 3.6 - - nightly + - "3.6" + - "nightly" script: - pytest ``` @@ -49,16 +49,16 @@ levels. ```yaml language: python python: - - 2.6 - - 2.7 - - 3.3 - - 3.4 - - 3.5 - - 3.5-dev # 3.5 development branch - - 3.6 - - 3.6-dev # 3.6 development branch - - 3.7-dev # 3.7 development branch - - nightly + - "2.6" + - "2.7" + - "3.3" + - "3.4" + - "3.5" + - "3.5-dev" # 3.5 development branch + - "3.6" + - "3.6-dev" # 3.6 development branch + - "3.7-dev" # 3.7 development branch + - "nightly" # command to install dependencies install: - pip install -r requirements.txt @@ -90,15 +90,14 @@ in your `.travis.yml`: ```yaml language: python python: - - 2.6 - - 2.7 - - 3.4 - - 3.5 - - 3.6 + - "2.6" + - "2.7" + - "3.4" + - "3.5" + - "3.6" # PyPy versions - - pypy # PyPy2 5.8.0 - - pypy3 # Pypy3 5.8.0-beta0 - - pypy-5.3.1 + - "pypy" # PyPy2 5.8.0 + - "pypy3" # Pypy3 5.8.0-beta0 # command to install dependencies install: - pip install . @@ -200,17 +199,17 @@ to construct a build matrix. ```yaml python: - - 3.6 - - pypy3 # Pypy3 5.8.0-beta0 - - nightly + - "3.6" + - "pypy3" # Pypy3 5.8.0-beta0 + - "nightly" env: - DJANGO_VERSION=1.10.8 - DJANGO_VERSION=1.11.5 # while pypy3 is still in beta, allow those and nightly tests to fail matrix: allow_failures: - - python: pypy3 - - python: nightly + - python: "pypy3" + - python: "nightly" ``` ## Examples From 8fdb58ffe57ed7cfaf681cae467a3471927dbbe7 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 21 Aug 2017 17:44:50 -0400 Subject: [PATCH 0012/2623] Elaborate on how non-tag builds and GitHub Releases interact This explains how https://github.com/travis-ci/travis-ci/issues/8185 manifests, and advises against running GitHub Releases without a tag. --- user/deployment/releases.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/user/deployment/releases.md b/user/deployment/releases.md index e5465f4d50b..6dc9ebb180f 100644 --- a/user/deployment/releases.md +++ b/user/deployment/releases.md @@ -6,8 +6,6 @@ layout: en Travis CI can automatically upload assets from your [`$TRAVIS_BUILD_DIR`](/user/environment-variables/#Default-Environment-Variables) to git tags on your GitHub repository. -**Please note that deploying GitHub Releases works only for tags, not for branches.** - For a minimal configuration, add the following to your `.travis.yml`: ```yaml @@ -23,7 +21,22 @@ deploy: > Make sure you have `skip_cleanup` set to `true`, otherwise Travis CI will delete all the files created during the build, which will probably delete what you are trying to upload. -The `on: tags: true` section at the end of the `.travis.yml` above is required to make sure that your tags get deployed. +> GitHub Releases works with `git` tags. +> +> If there is none for the present commit, one will be created +> for you, in the form of `untagged-*`, where `*` is a random hex string. +> +> If this is not what you want, we suggest requiring a tag for your deployment with `on.tags: true`, +> as shown above, or you can tag the present commit with `git tag` in `before_deploy`; for example: +> + before_deploy: + - git tag "$(git branch | grep \* | cut -d ' ' -f2-)-$(git log --format=%h -1)" + deploy: + provider: releases + api_key: "GITHUB OAUTH TOKEN" + file: "FILE TO UPLOAD" + skip_cleanup: true + If you need to overwrite existing files, add `overwrite: true` to the `deploy` section of your `.travis.yml`. From 215bf94f7c7c14535f25dad702de05bbdd2909d8 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 21 Aug 2017 17:52:43 -0400 Subject: [PATCH 0013/2623] Tag with time stamp, not branch name --- user/deployment/releases.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/deployment/releases.md b/user/deployment/releases.md index 6dc9ebb180f..81ac5a2ee84 100644 --- a/user/deployment/releases.md +++ b/user/deployment/releases.md @@ -30,7 +30,7 @@ deploy: > as shown above, or you can tag the present commit with `git tag` in `before_deploy`; for example: > before_deploy: - - git tag "$(git branch | grep \* | cut -d ' ' -f2-)-$(git log --format=%h -1)" + - git tag "$(date +'%Y%m%d%H%M%S')-$(git log --format=%h -1)" deploy: provider: releases api_key: "GITHUB OAUTH TOKEN" From ff69a68563bad1ed503627ea071efcf2284093fc Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 11 Sep 2017 15:28:28 -0400 Subject: [PATCH 0014/2623] Configure git in example before tagging --- user/deployment/releases.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/user/deployment/releases.md b/user/deployment/releases.md index 81ac5a2ee84..4754a8b1216 100644 --- a/user/deployment/releases.md +++ b/user/deployment/releases.md @@ -22,14 +22,17 @@ deploy: > Make sure you have `skip_cleanup` set to `true`, otherwise Travis CI will delete all the files created during the build, which will probably delete what you are trying to upload. > GitHub Releases works with `git` tags. -> +> > If there is none for the present commit, one will be created > for you, in the form of `untagged-*`, where `*` is a random hex string. -> +> > If this is not what you want, we suggest requiring a tag for your deployment with `on.tags: true`, > as shown above, or you can tag the present commit with `git tag` in `before_deploy`; for example: -> +> before_deploy: + # Set up git user name and tag this commit + - git config --local user.name "YOUR GIT USER NAME" + - git config --local user.email "YOUR GIT USER EMAIL" - git tag "$(date +'%Y%m%d%H%M%S')-$(git log --format=%h -1)" deploy: provider: releases @@ -37,7 +40,6 @@ deploy: file: "FILE TO UPLOAD" skip_cleanup: true - If you need to overwrite existing files, add `overwrite: true` to the `deploy` section of your `.travis.yml`. You can also use the [Travis CI command line client](https://github.com/travis-ci/travis.rb#installation) to configure your `.travis.yml`: From 2330bb242e1b96b372a43b84390316638c1fbc91 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 11 Sep 2017 15:56:16 -0400 Subject: [PATCH 0015/2623] Elaborate on how `deploy.on.tags` works --- user/deployment.md | 10 +++++++++- user/deployment/releases.md | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/user/deployment.md b/user/deployment.md index 973a168c617..b501c5fa085 100644 --- a/user/deployment.md +++ b/user/deployment.md @@ -77,7 +77,15 @@ Common options are: `if [[ ]]; then ; fi` It can be complex, but there can be only one. For example, `$CC = gcc`. -5. **`tags`**: When set to `true`, the application is deployed when a tag is applied to the commit. This causes the `branch` condition to be ignored. +5. **`tags`**: There are three cases. + + 1. With `tags: true`, deployment is triggered if and only if `$TRAVIS_TAG` is set. + Depending on your workflow, you may set `$TRAVIS_TAG` explicitly, even if this is + a non-tag build when it was initiated. This causes the `branch` condition to be ignored. + 1. With `tags: false`, deployment is triggered if and only if `$TRAVIS_TAG` is empty. + This also causes the `branch` condition to be ignored. + 1. When `tags` is not set, or set to any other value, `$TRAVIS_TAG` is ignored. + And the `branch` condition is considered, if it is set. #### Examples of Conditional Releases using `on:` diff --git a/user/deployment/releases.md b/user/deployment/releases.md index 4754a8b1216..1fc58085c25 100644 --- a/user/deployment/releases.md +++ b/user/deployment/releases.md @@ -54,6 +54,11 @@ Or, if you're using a private repository: travis setup releases --pro ``` +## `on.tags` condition + +When working with GitHub Releases, it is important to understand how the deployment is triggered +with [the `tags` condition](/user/deployment/#Conditional-Releases-with-on%3A). + ## Authenticating with an OAuth token The recommended way to authenticate is to use a GitHub OAuth token. It must have the `public_repo` or `repo` scope to upload assets. Instead of setting it up manually, it is highly recommended to use `travis setup releases`, which automatically creates and encrypts a GitHub oauth token with the correct scopes. From 316e4d67790520a8daf400444b052debf90e96a3 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Thu, 5 Oct 2017 17:25:37 -0700 Subject: [PATCH 0016/2623] Use latest version numbers in Android docs --- user/languages/android.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/user/languages/android.md b/user/languages/android.md index 7e21c5ecc9c..a0c7715ebf9 100644 --- a/user/languages/android.md +++ b/user/languages/android.md @@ -25,7 +25,7 @@ language: android ``` {: data-file=".travis.yml"} -in your `.travis.yml` file, your project will be built in the Android environment which provides [Android SDK Tools](http://developer.android.com/tools/sdk/tools-notes.html) 24.0.0 (December 2014). +in your `.travis.yml` file, your project will be built in the Android environment which provides [Android SDK Tools](http://developer.android.com/tools/sdk/tools-notes.html) 26.0.2 (April 2017). Here is an example `.travis.yml` for an Android project: @@ -39,20 +39,20 @@ android: # - platform-tools # The BuildTools version used by your project - - build-tools-19.1.0 + - build-tools-26.0.2 # The SDK version used to compile your project - - android-22 + - android-26 # Additional components - extra-google-google_play_services - extra-google-m2repository - extra-android-m2repository - - addon-google_apis-google-19 + - addon-google_apis-google-26 # Specify at least one system image, # if you need to run emulator(s) during your tests - - sys-img-armeabi-v7a-android-22 + - sys-img-armeabi-v7a-android-26 - sys-img-armeabi-v7a-android-17 ``` {: data-file=".travis.yml"} @@ -65,8 +65,8 @@ In your `.travis.yml` you can define the list of SDK components to be installed, language: android android: components: - - build-tools-18.1.1 - - android-18 + - build-tools-26.0.2 + - android-26 - extra ``` {: data-file=".travis.yml"} @@ -88,7 +88,7 @@ android: > Note that the tools section appears twice on purpose as it's required to get the newest Android SDK tools. -You can compile your project for Android 25 as shown in the following example: +You can compile your project for Android 26 as shown in the following example: ```yaml android: @@ -98,10 +98,10 @@ android: - tools # The BuildTools version used by your project - - build-tools-25.0.0 + - build-tools-26.0.2 # The SDK version used to compile your project - - android-25 + - android-26 ``` {: data-file=".travis.yml"} @@ -113,8 +113,8 @@ By default, Travis CI will accept all the requested licenses, but it is also pos language: android android: components: - - build-tools-20.0.0 - - android-L + - build-tools-26.0.2 + - android-26 - sys-img-armeabi-v7a-android-tv-l - add-on - extra From a1b2dba8ed6e8190e89cdc9f5b387ca81437cfd0 Mon Sep 17 00:00:00 2001 From: Jim Hester Date: Thu, 12 Oct 2017 15:11:18 -0400 Subject: [PATCH 0017/2623] Remove the r_check_revdep option This is rarely used and it is really better to check reverse dependencies locally rather than using travis to do so. --- user/languages/r.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/user/languages/r.md b/user/languages/r.md index 1d710530bc9..9fd94017a3a 100644 --- a/user/languages/r.md +++ b/user/languages/r.md @@ -222,10 +222,6 @@ repos: ropensci: http://packages.ropensci.org ``` -- `r_check_revdep`: if `true`, also run checks on CRAN packages which depend - on this one. This can be quite expensive, so it's not recommended to leave - this set to `true`. - - `disable_homebrew`: if `true` this removes the preinstalled homebrew installation on OS X. Useful to test if the package builds on a vanilla OS X machine, such as the CRAN mac builder. From 29e1e873c83259b5192b59d965ff5e40d8afd0fd Mon Sep 17 00:00:00 2001 From: Peter Gensler Date: Wed, 25 Oct 2017 12:51:32 -0500 Subject: [PATCH 0018/2623] adding new screenshot of Markdown as example --- images/add_Markdown_bade_github.jpg | Bin 0 -> 90005 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/add_Markdown_bade_github.jpg diff --git a/images/add_Markdown_bade_github.jpg b/images/add_Markdown_bade_github.jpg new file mode 100644 index 0000000000000000000000000000000000000000..74614f8eac0ae92bee9e6e9b901b4f5b91d571af GIT binary patch literal 90005 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�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 H0Du44UcNUO literal 0 HcmV?d00001 From fd71ca0b32d2ee580d9ee090f1066d352637bc9d Mon Sep 17 00:00:00 2001 From: Peter Gensler Date: Wed, 25 Oct 2017 13:00:20 -0500 Subject: [PATCH 0019/2623] adding example This example shows how to add the Travis CI Badge to a Readme in a Github Repository. I understand this may seem intuitive, but I think it's necessary to be explicit, so that new users can get up and running quickly. I found this document hard to digest as a new user to Travis. --- user/status-images.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user/status-images.md b/user/status-images.md index 5c4387f0e45..eaf6965db40 100644 --- a/user/status-images.md +++ b/user/status-images.md @@ -15,11 +15,11 @@ The URLs for status images are shown on your Travis CI Repository page: 1. Click the status image in the top right to open a dialog box containing common templates for the status image URL in markdown, html, etc. - ![Screenshot of repository badge](/images/status_image_public.jpg) - + ![add to Github](https://github.com/pgensler/docs-travis-ci-com/blob/master/images/add_Markdown_bade_github.jpg) + 2. Select the branch and template in the dialog box. -3. Copy the text and paste it into your README or website. +3. Copy the text and paste it into your README or website. You should now be able to view the Build status images for public repositories are publicly available on Travis CI. From 876eec8aff9159336add074ad6a1471ad398dd5c Mon Sep 17 00:00:00 2001 From: Anna Nagy Date: Fri, 27 Oct 2017 14:06:12 -0400 Subject: [PATCH 0020/2623] move enterprise EBS note to prereqs and a typo fix --- user/enterprise/installation.md | 8 -------- user/enterprise/prerequisites.md | 10 +++++++--- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/user/enterprise/installation.md b/user/enterprise/installation.md index 233df7c3fb6..116f339bef6 100644 --- a/user/enterprise/installation.md +++ b/user/enterprise/installation.md @@ -60,14 +60,6 @@ installation's hostname, port 8800) to complete the setup. From here you can upload your license key, add your GitHub OAuth details, and optionally upload an SSL certificate and enter SMTP details. - - -If you are running the Platform host on EC2, we recommend using an image -that uses EBS for the root volume, as well as allocating 40 gigs of -space to it. It is also recommended to not destroy the volume on -instance termination. - - ## 2. Setting up Travis CI Enterprise Worker The Travis CI Enterprise Worker manages build containers and reports build diff --git a/user/enterprise/prerequisites.md b/user/enterprise/prerequisites.md index 0e9c447e4ac..c3c49afd256 100644 --- a/user/enterprise/prerequisites.md +++ b/user/enterprise/prerequisites.md @@ -22,8 +22,12 @@ and Docker. Each dedicated host or hypervisor (VMWare, OpenStack using KVM, or EC2) should run **Ubuntu 14.04**, ideally using Linux 3.16 and have at least **16 gigs of -RAM and 8 CPUs** (if you're using EC2 we recommend the **c3.2xlarge** instance -type). +RAM and 8 CPUs**. + +If you're running on EC2, we recommend the **c3.2xlarge** instance type. We also +recommend using an image that uses EBS for the root volume, as well as +allocating 40 gigs of space to it. It is also recommended _not_ to destroy the +volume on instance termination. Each host requires: @@ -41,7 +45,7 @@ connect to. Use the following URLs when you register the OAuth app: - *Homepage URL* - `https://travis-ci..com` -- *Authorization callback URL* - https://travis-ci..com/api +- *Authorization callback URL* - `https://travis-ci..com/api` ## License From 054ee2215915574072be6de33fbf64a4aebb98d1 Mon Sep 17 00:00:00 2001 From: cclauss Date: Tue, 7 Nov 2017 21:53:42 +0100 Subject: [PATCH 0021/2623] Remove the example --- user/languages/python.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/user/languages/python.md b/user/languages/python.md index 95accd46bdc..d0c7b0c6e37 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -197,21 +197,6 @@ For a real world example, see [getsentry/sentry](https://github.com/getsentry/se For Python projects, `env` and `python` can be given as arrays to construct a build matrix. -```yaml -python: - - "3.6" - - "pypy3" # Pypy3 5.8.0-beta0 - - "nightly" -env: - - DJANGO_VERSION=1.10.8 - - DJANGO_VERSION=1.11.5 -# while pypy3 is still in beta, allow those and nightly tests to fail -matrix: - allow_failures: - - python: "pypy3" - - python: "nightly" -``` - ## Examples - [tornadoweb/tornado](https://github.com/tornadoweb/tornado/blob/master/.travis.yml) From 1ceba7c4a40ee4dd9f9533c35d5bb7138a567d9f Mon Sep 17 00:00:00 2001 From: emmi474 <33361833+emmi474@users.noreply.github.com> Date: Thu, 9 Nov 2017 11:11:09 +0100 Subject: [PATCH 0022/2623] Remove attribute `local_dir` --- user/deployment/releases.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/user/deployment/releases.md b/user/deployment/releases.md index de522a175cf..bc7e3628b1b 100644 --- a/user/deployment/releases.md +++ b/user/deployment/releases.md @@ -153,11 +153,6 @@ after_deploy: ``` {: data-file=".travis.yml"} -## Pushing a specific directory - -* `local_dir`: Directory to push to GitHub Releases, defaults to the current - directory - ## Advanced options Options from `.travis.yml` are passed through to [Octokit API](https://octokit.github.io/octokit.rb/Octokit/Client/Releases.html#create_release-instance_method), so you can use any valid Octokit option. From 81796a8441870607da0f2558ddf2308f0d7231de Mon Sep 17 00:00:00 2001 From: Bogdana Vereha Date: Wed, 15 Nov 2017 11:15:37 +0100 Subject: [PATCH 0023/2623] Document workaround for PHPUnit on HHVM --- user/languages/php.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/user/languages/php.md b/user/languages/php.md index f75dc360ea5..316e4a997ff 100644 --- a/user/languages/php.md +++ b/user/languages/php.md @@ -406,6 +406,19 @@ virtual host as usual, the important part for php-fpm is this: ``` + +## PHPUnit and HHVM + +Please note that if you want to run PHPUnit on HHVM, you have to explicitly install an older version due to compatibility issue between +HHVM and PHP7. + +In order to do that, you can add the following bit to your `.travis.yml`: + +``` +before_script: + - curl -sSf -o ~/.phpenv/versions/hhvm/bin/phpunit https://phar.phpunit.de/phpunit-5.7.phar +``` + ## Build Matrix For PHP projects, `env` and `php` can be given as arrays From 81ddf689cd0c2f078f87952bef30097c3b42ac62 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 16 Nov 2017 17:32:44 +0100 Subject: [PATCH 0024/2623] Update URL --- user/languages/r.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/r.md b/user/languages/r.md index f34458d5960..9627da9fea1 100644 --- a/user/languages/r.md +++ b/user/languages/r.md @@ -418,6 +418,6 @@ moving from r-travis to native support, see the [porting guide][github 9]. [tug]: https://www.tug.org/texlive/ -[yihui]: http://yihui.name/knitr/ +[yihui]: https://yihui.name/knitr/ [apt-addon]: /user/installing-dependencies/#Installing-Packages-with-the-APT-Addon From d4beea94bda69a8680bc950723477277691a0407 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 16 Nov 2017 18:06:23 +0100 Subject: [PATCH 0025/2623] Ignore the 404 --- user/languages/r.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/user/languages/r.md b/user/languages/r.md index 9627da9fea1..e805b629fba 100644 --- a/user/languages/r.md +++ b/user/languages/r.md @@ -51,7 +51,7 @@ and package caching. The R environment comes with [LaTeX][tug] and [pandoc][johnmacfarlane] pre-installed, making it easier to use packages like [RMarkdown][rstudio] or -[knitr][yihui]. +[knitr](https://yihui.name/knitr/){: data-proofer-ignore=""} ## Configuration options @@ -418,6 +418,4 @@ moving from r-travis to native support, see the [porting guide][github 9]. [tug]: https://www.tug.org/texlive/ -[yihui]: https://yihui.name/knitr/ - [apt-addon]: /user/installing-dependencies/#Installing-Packages-with-the-APT-Addon From fabb9cbb0222b7b433d474a60147655caca4ce0d Mon Sep 17 00:00:00 2001 From: Bogdana Vereha Date: Fri, 17 Nov 2017 15:00:24 +0100 Subject: [PATCH 0026/2623] Update saucelabs links --- user/sauce-connect.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/sauce-connect.md b/user/sauce-connect.md index e412c0c5722..77f11947004 100644 --- a/user/sauce-connect.md +++ b/user/sauce-connect.md @@ -35,11 +35,11 @@ addons: ``` {: data-file=".travis.yml"} -[sauce-sign-up]: https://saucelabs.com/signup/plan/free +[sauce-sign-up]: https://signup.saucelabs.com/signup/trial [sauce-account]: https://saucelabs.com/account -[open-sauce]: https://saucelabs.com/signup/plan/OSS +[open-sauce]: https://saucelabs.com/open-source If you don't want your access key publicly available in your repository, you can encrypt it with `travis encrypt "your-access-key"` (see [Encryption Keys][encryption-keys] From 7532017f016a2b508a72e84546875600d1bdd470 Mon Sep 17 00:00:00 2001 From: Anton Gilgur Date: Fri, 17 Nov 2017 11:48:58 -0800 Subject: [PATCH 0027/2623] add note about using addons to update docker --- user/docker.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/user/docker.md b/user/docker.md index 86f47451534..602302909c3 100644 --- a/user/docker.md +++ b/user/docker.md @@ -197,6 +197,15 @@ before_install: ``` {: data-file=".travis.yml"} +Alternatively, you can use `addons` instead of `before_install` to update via `apt` as well: +```yaml +addons: + apt: + packages: + - docker-ce +``` +{: data-file=".travis.yml"} + **Updating from download.docker.com** ```yaml before_install: From 46039bb0c92cbf3619f08672ed7c902e7932b35a Mon Sep 17 00:00:00 2001 From: Bogdana Vereha Date: Mon, 20 Nov 2017 15:31:32 +0100 Subject: [PATCH 0028/2623] Implement review suggestions --- user/languages/php.md | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/user/languages/php.md b/user/languages/php.md index 316e4a997ff..e6a28156b29 100644 --- a/user/languages/php.md +++ b/user/languages/php.md @@ -86,6 +86,16 @@ php - hhvm-3.18 - hhvm-nightly ``` +{: data-file=".travis.yml"} + + +Please note that if you want to run PHPUnit on HHVM, you have to explicitly install version 5.7 in your .travis.yml due to a compatibility issue between HHVM and PHP7: + +```yaml +before_script: + - curl -sSf -o ~/.phpenv/versions/hhvm/bin/phpunit https://phar.phpunit.de/phpunit-5.7.phar +``` +{: data-file=".travis.yml"} ### Nightly builds @@ -406,19 +416,6 @@ virtual host as usual, the important part for php-fpm is this: ``` - -## PHPUnit and HHVM - -Please note that if you want to run PHPUnit on HHVM, you have to explicitly install an older version due to compatibility issue between -HHVM and PHP7. - -In order to do that, you can add the following bit to your `.travis.yml`: - -``` -before_script: - - curl -sSf -o ~/.phpenv/versions/hhvm/bin/phpunit https://phar.phpunit.de/phpunit-5.7.phar -``` - ## Build Matrix For PHP projects, `env` and `php` can be given as arrays From 4c7f09bd82e5605b9f2dcce22c3020131ecc7076 Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Mon, 20 Nov 2017 15:44:44 +0100 Subject: [PATCH 0029/2623] Update php.md --- user/languages/php.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/php.md b/user/languages/php.md index e6a28156b29..6a22b7e38b6 100644 --- a/user/languages/php.md +++ b/user/languages/php.md @@ -89,7 +89,7 @@ php {: data-file=".travis.yml"} -Please note that if you want to run PHPUnit on HHVM, you have to explicitly install version 5.7 in your .travis.yml due to a compatibility issue between HHVM and PHP7: +Please note that if you want to run PHPUnit on HHVM, you have to explicitly install version 5.7 in your `.travis.yml` due to a compatibility issue between HHVM and PHP7: ```yaml before_script: From 97d529b50704fc105015b35c7f1c24bdd1fa029f Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 20 Nov 2017 10:01:56 -0500 Subject: [PATCH 0030/2623] clean up sysem prereq for Enterprise clarify GHE vs GH, link to OAuth app docs, clarify protocol and trailing slash in OAuth setup, redo link in install guide --- user/enterprise/installation.md | 13 ++++++++----- user/enterprise/prerequisites.md | 25 +++++++------------------ 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/user/enterprise/installation.md b/user/enterprise/installation.md index 116f339bef6..8be797469be 100644 --- a/user/enterprise/installation.md +++ b/user/enterprise/installation.md @@ -5,14 +5,17 @@ layout: en_enterprise --- This guide covers installing the Travis CI Enterprise Platform and Travis CI -Enterprise Worker. Please check our [system -prerequisites](/user/enterprise/prerequisites/) guide if you have any questions -about whether your configuration will be supported. - -Because Travis CI Enterprise is optimized for EC2, the following guide +Enterprise Worker. Because Travis CI Enterprise is optimized for EC2, the following guide recommends steps geared toward this provider, but you can certainly modify it to use your provider of choice. +**Before getting started:** please check our [system prerequisites](/user/enterprise/prerequisites/) for +[expected system specs](/user/enterprise/prerequisites/#Host-Machine-Specs), +notes on setting up the required [OAuth app](/user/enterprise/prerequisites/#OAuth-App), +and information on obtaining a [license](/user/enterprise/prerequisites/#License). + + +
## 1. Setting up the Travis CI Enterprise Platform diff --git a/user/enterprise/prerequisites.md b/user/enterprise/prerequisites.md index c3c49afd256..a683ed43a6a 100644 --- a/user/enterprise/prerequisites.md +++ b/user/enterprise/prerequisites.md @@ -1,15 +1,14 @@ --- title: Enterprise System Prerequisites layout: en_enterprise - --- Before [installing Travis CI Enterprise](/user/enterprise/installation/), make sure that you have all of the following prerequisites: -- At least two dedicated [hosts or hypervisors](#host-machine-specs) -- A GitHub Enterprise [OAuth app](#OAuth-app) -- A valid [Travis CI Enterprise license](#license) +- At least two dedicated [hosts or hypervisors](#Host-Machine-Specs) +- A GitHub [OAuth app](#OAuth-App) - either for GitHub Enterprise or GitHub.com +- A valid [Travis CI Enterprise license](#License) ## Host Machine Specs @@ -29,27 +28,17 @@ recommend using an image that uses EBS for the root volume, as well as allocating 40 gigs of space to it. It is also recommended _not_ to destroy the volume on instance termination. -Each host requires: - -- a [Travis CI Enterprise license](#license) -- A GitHub Enterprise [OAuth app](#OAuth-app) - ## OAuth App -Travis CI Enterprise connects to GitHub Enterprise via OAuth. You will need to -create an OAuth app on your GitHub Enterprise that Travis CI Enterprise can -connect to. - - - -Use the following URLs when you register the OAuth app: +Travis CI Enterprise connects to either GitHub.com or GitHub Enterprise via an OAuth app. Check out GitHub's docs on[registering an OAuth app](https://developer.github.com/apps/building-integrations/setting-up-and-registering-oauth-apps/registering-oauth-apps/) to get started. The URLs you will need will be in the formats as below: - *Homepage URL* - `https://travis-ci..com` - *Authorization callback URL* - `https://travis-ci..com/api` +Note: URLs must include `https` or `http` at the beginning and cannot have trailing slashes + ## License To register for a 30 day trial please visit -our signup page. -Please email [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com) for +[our signup page](https://enterprise.travis-ci.com/signup) to receive a trial license. Please email [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com) for more information on pricing. From 4651cf8c9d77001cfa26927d5df030938dadf939 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 20 Nov 2017 15:31:16 -0500 Subject: [PATCH 0031/2623] Document git sparse checkout --- user/customizing-the-build.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/user/customizing-the-build.md b/user/customizing-the-build.md index 98bc4427726..45f00bab5b8 100644 --- a/user/customizing-the-build.md +++ b/user/customizing-the-build.md @@ -191,9 +191,9 @@ It is very common for test suites or build scripts to hang. Travis CI has specific time limits for each job, and will stop the build and add an error message to the build log in the following situations: - A job produces no log output for 10 minutes -- A job on travis-ci.org takes longer than 50 minutes +- A job on travis-ci.org takes longer than 50 minutes - A job running on OS X infrastructure takes longer than 50 minutes (applies to travis-ci.org or travis-ci.com) -- A job on Linux infrastructure on travis-ci.com takes longer than 120 minutes +- A job on Linux infrastructure on travis-ci.com takes longer than 120 minutes Some common reasons why builds might hang: @@ -272,6 +272,17 @@ git: lfs_skip_smudge: true ``` +## Git Sparse Checkout +Travis CI supports `git`'s [sparse checkout](https://git-scm.com/docs/git-read-tree#_sparse_checkout) +capability. +To clone your repository sparsely, add: +```yaml +git: + sparse_checkout: skip-worktree-map-file +``` +where `skip-worktree-map-file` is the file containing the list of files which should be populated +"sparsely". + ## Building Specific Branches Travis CI uses the `.travis.yml` file from the branch containing the git commit that triggers the build. Include branches using a safelist, or exclude them using a blocklist. From b25500ed58365ffe4b2436c93eb7642546c7be35 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Wed, 22 Nov 2017 15:44:28 +0100 Subject: [PATCH 0032/2623] Tighten up the text around the PR --- user/deployment.md | 53 ++++++++++++++++++++----------------- user/deployment/releases.md | 16 +++++------ 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/user/deployment.md b/user/deployment.md index b501c5fa085..525b4d8c2dd 100644 --- a/user/deployment.md +++ b/user/deployment.md @@ -4,7 +4,9 @@ layout: en swiftypetags: 'skip_cleanup' --- -### Supported Providers +
+ +## Supported Providers Continuous Deployment to the following providers is supported: @@ -13,7 +15,7 @@ Continuous Deployment to the following providers is supported: To deploy to a custom or unsupported provider, use the [after-success build stage](/user/deployment/custom/) or [script provider](/user/deployment/script). -### Uploading Files +## Uploading Files When deploying files to a provider, prevent Travis CI from resetting your working directory and deleting all changes made during the build ( `git stash @@ -25,7 +27,7 @@ deploy: ``` {: data-file=".travis.yml"} -### Deploying to Multiple Providers +## Deploying to Multiple Providers Deploying to multiple providers is possible by adding the different providers to the `deploy` section as a list. For example, if you want to deploy to both @@ -42,9 +44,9 @@ deploy: ``` {: data-file=".travis.yml"} -### Conditional Releases with `on:` +## Conditional Releases with `on:` -Deployment can be controlled by setting the `on:` for each deployment provider. +Set your build to deploy only in specific circumstances by configuring the `on:` key for any deployment provider. ```yaml deploy: @@ -59,35 +61,36 @@ deploy: ``` {: data-file=".travis.yml"} -When all conditions specified in the `on:` section are met, deployment for this -provider will be performed. +When *all* conditions specified in the `on:` section are met, your build will deploy. + +Use the following options to configure conditional deployment: -Common options are: +* `repo`: in the form `owner_name/repo_name`. Deploy only when the build occurs on a particular repository. For example -1. **`repo`** Slug of your repository (in form: `owner_name/repo_name`, e.g., `travis-ci/dpl`). + ```yaml + on: + repo: travis-ci/dpl + ``` -2. **`branch`** Name of the branch. If omitted, this defaults to the `app`-specific branch, or `master`. If the branch name is not known ahead of time, you can specify - `all_branches: true` *instead of* `branch: **` and use other conditions to control your deployment. +* `branch`: name of the branch. + If omitted, this defaults to the `app`-specific branch, or `master`. If the branch name is not known ahead of time, you can specify + `all_branches: true` *instead of* `branch: ` and use other conditions to control your deployment. -3. **`jdk`**, **`node`**, **`perl`**, **`php`**, **`python`**, **`ruby`**, **`scala`**, **`go`**: For language runtimes that support multiple versions, - you can limit the deployment to happen only on the job that matches the desired version. +* `jdk`, `node`, `perl`, `php`, `python`, `ruby`, `scala`, `go`: for language runtimes that support multiple versions, + you can limit the deployment to happen only on the job that matches a specific version. -4. **`condition`**: You may set bash condition with this option. - This must be a string value, which will be pasted into a bash expression of the form - `if [[ ]]; then ; fi` - It can be complex, but there can be only one. For example, `$CC = gcc`. +* `condition`: deploy when *a single* bash condition evaluates to `true`. This must be a string value, and is equivalant to `if [[ ]]; then ; fi`. For example, `$CC = gcc`. -5. **`tags`**: There are three cases. +* `tags` can be `true`, `false` or any other string: - 1. With `tags: true`, deployment is triggered if and only if `$TRAVIS_TAG` is set. + * `tags: true`: deployment is triggered if and only if `$TRAVIS_TAG` is set. Depending on your workflow, you may set `$TRAVIS_TAG` explicitly, even if this is a non-tag build when it was initiated. This causes the `branch` condition to be ignored. - 1. With `tags: false`, deployment is triggered if and only if `$TRAVIS_TAG` is empty. + * `tags: false`: deployment is triggered if and only if `$TRAVIS_TAG` is empty. This also causes the `branch` condition to be ignored. - 1. When `tags` is not set, or set to any other value, `$TRAVIS_TAG` is ignored. - And the `branch` condition is considered, if it is set. + * When `tags` is not set, or set to any other value, `$TRAVIS_TAG` is ignored, and the `branch` condition is considered, if it is set. -#### Examples of Conditional Releases using `on:` +### Examples of Conditional Deployment This example deploys to Appfog only from the `staging` branch when the test has run on Node.js version 0.11. @@ -130,7 +133,7 @@ deploy: ``` {: data-file=".travis.yml"} -### Adding a Provider +### Adding a deployment provider We are working on adding support for other PaaS providers. If you host your application with a provider not listed here and you would like to have Travis CI automatically deploy your application, please [get in touch](mailto:support@travis-ci.com). @@ -143,6 +146,6 @@ deploy: ``` {: data-file=".travis.yml"} -### Pull Requests +## Pull Requests Note that pull request builds skip the deployment step altogether. diff --git a/user/deployment/releases.md b/user/deployment/releases.md index 1fc58085c25..bb4caa6d3b6 100644 --- a/user/deployment/releases.md +++ b/user/deployment/releases.md @@ -21,14 +21,11 @@ deploy: > Make sure you have `skip_cleanup` set to `true`, otherwise Travis CI will delete all the files created during the build, which will probably delete what you are trying to upload. -> GitHub Releases works with `git` tags. -> -> If there is none for the present commit, one will be created -> for you, in the form of `untagged-*`, where `*` is a random hex string. -> -> If this is not what you want, we suggest requiring a tag for your deployment with `on.tags: true`, -> as shown above, or you can tag the present commit with `git tag` in `before_deploy`; for example: -> +GitHub Releases uses git tags. If the build commit does not have any tags, one will be created in the form of `untagged-*`, where `*` is a random hex string. + +If this is not what you want, either set your build to deploy only when the build already has a tag using `on.tags: true` as shown in the previous example `.travis.yml`, or tag the commit with `git tag` in `before_deploy`: + +```yaml before_deploy: # Set up git user name and tag this commit - git config --local user.name "YOUR GIT USER NAME" @@ -39,6 +36,9 @@ deploy: api_key: "GITHUB OAUTH TOKEN" file: "FILE TO UPLOAD" skip_cleanup: true +``` +{: data-file=".travis.yml"} + If you need to overwrite existing files, add `overwrite: true` to the `deploy` section of your `.travis.yml`. From f3fb66c562906a685d9a0869dcdf5048f1757b1f Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 23 Nov 2017 15:02:49 +0100 Subject: [PATCH 0033/2623] Add term to Heading to improve search --- user/deployment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/deployment.md b/user/deployment.md index 525b4d8c2dd..6c4f9d94c39 100644 --- a/user/deployment.md +++ b/user/deployment.md @@ -15,7 +15,7 @@ Continuous Deployment to the following providers is supported: To deploy to a custom or unsupported provider, use the [after-success build stage](/user/deployment/custom/) or [script provider](/user/deployment/script). -## Uploading Files +## Uploading Files and skip_cleanup When deploying files to a provider, prevent Travis CI from resetting your working directory and deleting all changes made during the build ( `git stash From 7662c2580e2e4533aeb087a605f07d97090c8830 Mon Sep 17 00:00:00 2001 From: Joep van Delft Date: Thu, 23 Nov 2017 16:35:43 +0100 Subject: [PATCH 0034/2623] remove unnecessary group: edge --- user/reference/trusty.md | 1 - 1 file changed, 1 deletion(-) diff --git a/user/reference/trusty.md b/user/reference/trusty.md index 46acada588b..8fdf8ae5220 100644 --- a/user/reference/trusty.md +++ b/user/reference/trusty.md @@ -272,7 +272,6 @@ and the nightly builds are installed on-demand (as `hhvm-nightly`). language: php sudo: required dist: trusty -group: edge php: - hhvm-3.3 - hhvm-3.6 From 278dda7fac403a0f2824dc4676b3faf80ab0301f Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Mon, 27 Nov 2017 17:36:06 +0100 Subject: [PATCH 0035/2623] user/coveralls: mention Docker tips --- user/coveralls.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/user/coveralls.md b/user/coveralls.md index 04e2cc747f6..54ecd6adc5c 100644 --- a/user/coveralls.md +++ b/user/coveralls.md @@ -82,3 +82,10 @@ Coveralls have documentation for many other [programming languages](https://cove - [R](https://coveralls.zendesk.com/hc/en-us/articles/203487909) - [Ruby / Rails](https://coveralls.zendesk.com/hc/en-us/articles/201769485-Ruby-Rails) - [Swift](https://coveralls.zendesk.com/hc/en-us/articles/208113436) + +## Using Coveralls with [Docker builds](/user/docker) + +If you're using Docker in builds, ensure that the necessary environment variables are exposed to the container: +```sh +docker exec -e TRAVIS_JOB_ID="$TRAVIS_JOB_ID" -e TRAVIS_BRANCH="$TRAVIS_BRANCH" ... +``` From 94c4aee8e82a8ba8fbeef4a0d4a98ee8c4f93406 Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Mon, 27 Nov 2017 20:36:11 -0500 Subject: [PATCH 0036/2623] Fixed anchor link --- user/reference/osx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/osx.md b/user/reference/osx.md index 9355bed4e4b..d186f1eb24f 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -47,7 +47,7 @@ Travis CI uses OS X 10.11.6 (and Xcode 7.3.1) by default . You can use another v {% for image in site.data.xcodes.osx_images %} osx_image: {{image.image}}{% if image.default == true %} Default {% endif %} - Xcode {{ image.xcode_full_version }} + Xcode {{ image.xcode_full_version }} OS X {{ image.osx_version}} {% endfor %} From ff12566ac792886018044954d880ce3566b6f475 Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Mon, 27 Nov 2017 20:42:35 -0500 Subject: [PATCH 0037/2623] Fixed anchor link (part deux) --- user/reference/osx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/osx.md b/user/reference/osx.md index d186f1eb24f..50648a2e351 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -47,7 +47,7 @@ Travis CI uses OS X 10.11.6 (and Xcode 7.3.1) by default . You can use another v {% for image in site.data.xcodes.osx_images %} osx_image: {{image.image}}{% if image.default == true %} Default {% endif %} - Xcode {{ image.xcode_full_version }} + Xcode {{ image.xcode_full_version }} OS X {{ image.osx_version}} {% endfor %} From 5cb9b1d38a6d860f4e516476672137627f357998 Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Mon, 27 Nov 2017 20:53:22 -0500 Subject: [PATCH 0038/2623] Fixed Xcode 7.3 version --- _data/xcodes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/xcodes.yml b/_data/xcodes.yml index 68911b57741..0fd17471aa3 100644 --- a/_data/xcodes.yml +++ b/_data/xcodes.yml @@ -220,7 +220,7 @@ osx_images: - "tvOS 9.1" - "tvOS 9.2" - image: xcode7.3 - xcode: "7.3.1" + xcode: "7.3" osx_version: "10.11" default: true xcode_full_version: "7.3.1" From 7f2ffb25783e03f45dd533a68c103121c10ecf4b Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Mon, 27 Nov 2017 20:59:04 -0500 Subject: [PATCH 0039/2623] Remove dot maybe? --- user/reference/osx.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/reference/osx.md b/user/reference/osx.md index 50648a2e351..fb935aee574 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -47,7 +47,7 @@ Travis CI uses OS X 10.11.6 (and Xcode 7.3.1) by default . You can use another v {% for image in site.data.xcodes.osx_images %} osx_image: {{image.image}}{% if image.default == true %} Default {% endif %} - Xcode {{ image.xcode_full_version }} + Xcode {{ image.xcode_full_version }} OS X {{ image.osx_version}} {% endfor %} @@ -222,7 +222,7 @@ Command Line Tools are also installed. {% for image in site.data.xcodes.osx_images %} -### Xcode {{ image.xcode }} +### Xcode {{image.xcode | remove: "."}} Xcode {{ image.xcode_full_version }} is available by adding `osx_image: {{ image.image }}` to your .travis.yml. From bb29d6788f11f36e68876b582b7f6fbf3c9edb68 Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Mon, 27 Nov 2017 21:06:35 -0500 Subject: [PATCH 0040/2623] Declare Xcode image heading in HTML rather than markdown. --- user/reference/osx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/osx.md b/user/reference/osx.md index fb935aee574..b30dbe6bf9f 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -222,7 +222,7 @@ Command Line Tools are also installed. {% for image in site.data.xcodes.osx_images %} -### Xcode {{image.xcode | remove: "."}} +

{{image.xcode}} #

Xcode {{ image.xcode_full_version }} is available by adding `osx_image: {{ image.image }}` to your .travis.yml. From dd7fb3d5f8c007e0e29b5d52da2a8145d945899e Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Mon, 27 Nov 2017 21:17:41 -0500 Subject: [PATCH 0041/2623] Missing # maybe? --- user/reference/osx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/osx.md b/user/reference/osx.md index b30dbe6bf9f..be047693878 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -222,7 +222,7 @@ Command Line Tools are also installed. {% for image in site.data.xcodes.osx_images %} -

{{image.xcode}} #

+

{{image.xcode}} #

Xcode {{ image.xcode_full_version }} is available by adding `osx_image: {{ image.image }}` to your .travis.yml. From dee289e8155dbff4591441ad9f4a2fc5a9f22fb7 Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Mon, 27 Nov 2017 23:29:37 -0500 Subject: [PATCH 0042/2623] Added `Xcode-` in front of version number --- user/reference/osx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/osx.md b/user/reference/osx.md index be047693878..552e468a4a9 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -222,7 +222,7 @@ Command Line Tools are also installed. {% for image in site.data.xcodes.osx_images %} -

{{image.xcode}} #

+

Xcode {{image.xcode}} #

Xcode {{ image.xcode_full_version }} is available by adding `osx_image: {{ image.image }}` to your .travis.yml. From 4d8fc51482893c8984039fd0d0e6ffe71d3d3b9f Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Mon, 27 Nov 2017 23:48:09 -0500 Subject: [PATCH 0043/2623] I think I got it now :crossed_fingers: --- user/reference/osx.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/reference/osx.md b/user/reference/osx.md index 552e468a4a9..88d346adf6c 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -47,7 +47,7 @@ Travis CI uses OS X 10.11.6 (and Xcode 7.3.1) by default . You can use another v {% for image in site.data.xcodes.osx_images %} osx_image: {{image.image}}{% if image.default == true %} Default {% endif %} - Xcode {{ image.xcode_full_version }} + Xcode {{ image.xcode_full_version }} OS X {{ image.osx_version}} {% endfor %} @@ -222,7 +222,7 @@ Command Line Tools are also installed. {% for image in site.data.xcodes.osx_images %} -

Xcode {{image.xcode}} #

+

Xcode {{image.xcode}}

Xcode {{ image.xcode_full_version }} is available by adding `osx_image: {{ image.image }}` to your .travis.yml. From 340d27898bcb8cb815b9cb749cb50b0eda2a1dc1 Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Mon, 27 Nov 2017 23:55:15 -0500 Subject: [PATCH 0044/2623] Fixing anchors to OS X reference env --- user/languages/objective-c.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/objective-c.md b/user/languages/objective-c.md index 52e98ed4942..dcf9e2fea90 100644 --- a/user/languages/objective-c.md +++ b/user/languages/objective-c.md @@ -30,7 +30,7 @@ the following table: {% for image in site.data.xcodes.osx_images %} osx_image: {{image.image}}{% if image.default == true %} Default {% endif %} - Xcode {{ image.xcode }} + Xcode {{ image.xcode }} OS X {{ image.osx_version}} {% endfor %} From 96cfcae753fa4c705375942dbf39fc31b358ea95 Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Tue, 28 Nov 2017 00:23:50 -0500 Subject: [PATCH 0045/2623] Removed objective-c and osx page from link check --- .ruby-version | 2 +- Rakefile | 8 ++++++-- user/reference/osx.md | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.ruby-version b/.ruby-version index 005119baaa0..2bf1c1ccf36 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.4.1 +2.3.1 diff --git a/Rakefile b/Rakefile index e6ab4aa943a..6943e8c9723 100644 --- a/Rakefile +++ b/Rakefile @@ -50,7 +50,9 @@ task :run_html_proofer do :only_4xx => true, :typhoeus => { :ssl_verifypeer => false, :ssl_verifyhost => 0, :followlocation => true }, :url_ignore => ["https://www.appfog.com/", /itunes\.apple\.com/, /coverity.com/, /articles201769485/], - :file_ignore => ["./_site/api/index.html", "./_site/user/languages/erlang/index.html"] + :file_ignore => ["./_site/api/index.html", "./_site/user/languages/erlang/index.html", + "./_site/user/languages/objective-c/index.html", + "./_site/user/reference/osx/index.html"] }) tester.run end @@ -72,7 +74,9 @@ task :run_html_proofer_internal do :connecttimeout => 600, :only_4xx => true, :typhoeus => { :ssl_verifypeer => false, :ssl_verifyhost => 0, :followlocation => true }, - :file_ignore => ["./_site/api/index.html", "./_site/user/languages/erlang/index.html"] + :file_ignore => ["./_site/api/index.html", "./_site/user/languages/erlang/index.html", + "./_site/user/languages/objective-c/index.html", + "./_site/user/reference/osx/index.html"] }) tester.run end diff --git a/user/reference/osx.md b/user/reference/osx.md index 552e468a4a9..88d346adf6c 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -47,7 +47,7 @@ Travis CI uses OS X 10.11.6 (and Xcode 7.3.1) by default . You can use another v {% for image in site.data.xcodes.osx_images %} osx_image: {{image.image}}{% if image.default == true %} Default {% endif %} - Xcode {{ image.xcode_full_version }} + Xcode {{ image.xcode_full_version }} OS X {{ image.osx_version}} {% endfor %} @@ -222,7 +222,7 @@ Command Line Tools are also installed. {% for image in site.data.xcodes.osx_images %} -

Xcode {{image.xcode}} #

+

Xcode {{image.xcode}}

Xcode {{ image.xcode_full_version }} is available by adding `osx_image: {{ image.image }}` to your .travis.yml. From 8c78178edfb167385a840fdf81a0b4bf1f517261 Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Tue, 28 Nov 2017 00:25:55 -0500 Subject: [PATCH 0046/2623] Put Ruby version back to 2.4.1. --- .ruby-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ruby-version b/.ruby-version index 2bf1c1ccf36..005119baaa0 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.3.1 +2.4.1 From e730cea0619d1fccae30627f7d9113dd1b02c3b9 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Tue, 28 Nov 2017 15:38:55 +0100 Subject: [PATCH 0047/2623] First version of the operations manual with multiple entries --- _data/enterprise.yml | 3 +- user/enterprise/operations-manual.md | 79 ++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 user/enterprise/operations-manual.md diff --git a/_data/enterprise.yml b/_data/enterprise.yml index e39ac7c9081..e39e4fdd460 100644 --- a/_data/enterprise.yml +++ b/_data/enterprise.yml @@ -5,4 +5,5 @@ Customizing Build Images: "/user/enterprise/build-images/" Worker Configuration: "/user/enterprise/worker-configuration/" Worker Start & Debug Containers: "/user/enterprise/worker-cli-commands/" Platform Administration Tips: "/user/enterprise/platform-tips/" -Trusty Build Containers (BETA): "/user/enterprise/trusty/" \ No newline at end of file +Trusty Build Containers (BETA): "/user/enterprise/trusty/" +Operations manual: "/user/enterprise/operations-manual/" diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md new file mode 100644 index 00000000000..bf9d0d29b62 --- /dev/null +++ b/user/enterprise/operations-manual.md @@ -0,0 +1,79 @@ +--- +title: Travis CI Enterprise Operations manual +layout: en_enterprise + +--- + +The Operations Manual is a guideline which helps you to resolve problems with your Travis CI Enterprise instance. Our plan is to enhance this document with common support topics over the time. If you would like to see a specific problem case covered here as well, please get in touch with us via [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). + +This document has multiple entrypoints. Each entrypoint is a common problem which we've seen ocurring on a regular basis over the time. The section will guide you through it helping you to resolve it. If it's not possible to resolve the problem, you'll find instructions on how to proceed at the bottom of the document. + +## Builds don't get worked off + +### Symptoms + +In the Travis CI Web UI you see none of the builds getting worked off. They're either in no or the `queued` state. Cancelling and restarting them doesn't make any difference. + +### Strategies + +Below you will find different strategies to resolve the problem. They're meant to be followed in order. After you've completed the steps for a strategy please restart a build in the Travis CI Web UI to see if it gets picked up. If that's not happening, please advance to next strategy. + +#### Connection to RabbitMQ got lost + +We're using RabbitMQ to schedule builds for the worker machine(s). Sometimes it can happen that the worker machine(s) lose the connection to RabbitMQ and therefore don't run any new builds anymore. This is a known problem on our side and we're working on resolving this. To fix that, restarting the machines usually suffices. To do that, connect via `ssh` and run the following command: + +```bash +$ sudo shutdown -r 0 +``` + +This will immediately restart the machine. `travis-worker`, the program which actually runs the builds, is configured to start automatically on system startup. + +#### Configuration + +Please check if the worker machine has all relevant configuration in order. To do so, please use ssh to login to the machine. +Then open `/etc/default/travis-enterprise`. This is the main configuration file `travis-worker` uses to connect to the platform machine. Below you find an example: + +``` +# Default ENV variables for Travis Enterprise +# Uncomment and set, then restart `travis-worker` for +# them to take effect. + +export TRAVIS_ENTERPRISE_BUILD_ENDPOINT="__build__" +export TRAVIS_ENTERPRISE_HOST="travisci.example.com" +export TRAVIS_ENTERPRISE_SECURITY_TOKEN="abc12345" +# export TRAVIS_WORKER_DOCKER_PRIVILEGED="true" +``` + +The relevant bits and pieces are `TRAVIS_ENTERPRISE_HOST` and `TRAVIS_ENTERPRISE_SECURITY_TOKEN`. The former needs to contain your primary domain you use to access Travis CI Enterprise. This domain name is used to reach the platform machine. The value of the latter needs to match the `RabbitMQ Password` on `https://yourdomain.com:8800/settings`. If you have made changes to this file, please run the following so they take effect: + +```bash +$ sudo restart travis-worker +``` + +#### Ports are not open Security groups / firewall + +A source for the problem could be that the worker machine is not able to talk to the platform machine. +Here we're distinguishing between an AWS EC2 installation and an installation running on other hardware. For the former, security groups need to be configured per machine. To do so, please follow our installation instructions [here](https://docs.travis-ci.com/user/enterprise/installation/#1.1.-Create-a-Security-Group). If you're not using AWS EC2, please make sure that the ports listed [in the docs](https://docs.travis-ci.com/user/enterprise/installation/#1.1.-Create-a-Security-Group) are open in your firewall. + +If none of the steps above lead to results for you, please follow the steps in [#Contact-support](#Contact-support) to move forward. + +## Contact support + +To get in touch with us, we'd like to ask you to follow the steps outlined below. That'll help us to provide you the best help possible and also possibly to save a few roundtrips. + +What we need from you: + +- What is the problem? +- What did you try already? +- A support bundle (You can get it from https://yourdomain:8800/support) +- Worker log files (They can be found at `/var/log/upstart/travis-worker.log`) - If you're using multiple worker machines, we need the log files from all of them. + +Is anything special with your setup? There are certain information we can already see, such as the hostname, which IaaS provide you're using but there are lots of other factors which could lead to something not working. Therefore we'd like to ask you to also answer the questions below in your support request (if applicable): + +- How many machines are you using? +- Do you use configuration management tools (Chef, Puppet)? +- Which other services do interface with Travis CI Enterprise? +- Do you use Travis CI Enterprise together with github.com or GitHub Enterprise? +- If you're using GitHub Enterprise, which version of it? + +Please write your support request to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). \ No newline at end of file From b62e5b2d8facb38070d8fef6825e74dafd0af009 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Tue, 28 Nov 2017 09:56:25 -0500 Subject: [PATCH 0048/2623] Add a note on symbolic links and caches --- user/caching.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/user/caching.md b/user/caching.md index c4a24a75fd3..4d0ed99fd73 100644 --- a/user/caching.md +++ b/user/caching.md @@ -19,6 +19,9 @@ Travis CI can cache content that does not often change, to speed up your build p > Please note that cache content is available to any build on the repository, including Pull Requests, so make sure you do not put any sensitive information in the cache. +> When creating the cache, symbolic links are not followed. +> Consider caching the normal files and directories instead. + ## Caching directories (Bundler, dependencies) Caches lets Travis CI store directories between builds, which is useful for storing From 43264b0696c8e67d38f42ed6607afa6cbd6cfe09 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Tue, 28 Nov 2017 16:06:18 +0100 Subject: [PATCH 0049/2623] The manual explains what needs to be included in a backup --- user/enterprise/operations-manual.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index bf9d0d29b62..14f670b29ed 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -8,6 +8,29 @@ The Operations Manual is a guideline which helps you to resolve problems with yo This document has multiple entrypoints. Each entrypoint is a common problem which we've seen ocurring on a regular basis over the time. The section will guide you through it helping you to resolve it. If it's not possible to resolve the problem, you'll find instructions on how to proceed at the bottom of the document. +## Backups + +This section explains how you integrate Travis CI Enterprise in your backup strategy. Here, we'll talk about two topics: + +- The encryption key +- The data directories + +### Encryption key + +Without the encryption key you cannot access the information in your production database. To make sure that you can always recover your database, make a backup of this key: + +1. open a ssh connection to the platform machine +2. run `travis bash`. This will open a bash session with `root` privileges into the Travis container. +3. Then run `cat /usr/local/travis/etc/travis/config/travis.yml | grep -A1 encryption:`. Create a backup of the value returned by that command by either writing it down on a piece of paper or storing it on a different computer. + +> Without this key the information in the database is not recoverable. + +### Create a backup of the data directories + +The data directories are located on the platform machine and get mounted into the Travis container. In these directories you'll find files from RabbitMQ, Postgres, Slanger, Redis and also log files from the applications inside the container. + +The files are located at `/var/travis` on the platform machine. Please run `sudo tar -czvf travis-enterprise-data-backup.tar.gz /var/travis` to create compressed archive from this folder. After this has finished, copy this file off the machine to a secure location. + ## Builds don't get worked off ### Symptoms From fe5c4d3482052fbe63fd1d1ddcc726d0fcc12df9 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Tue, 28 Nov 2017 16:07:32 +0100 Subject: [PATCH 0050/2623] Add terminology explanation --- user/enterprise/operations-manual.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 14f670b29ed..703f30c182e 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -8,6 +8,11 @@ The Operations Manual is a guideline which helps you to resolve problems with yo This document has multiple entrypoints. Each entrypoint is a common problem which we've seen ocurring on a regular basis over the time. The section will guide you through it helping you to resolve it. If it's not possible to resolve the problem, you'll find instructions on how to proceed at the bottom of the document. +Throughout this document we'll be using the following terms to refer to the two components of your Travis CI Enterprise installation: + +- `Platform machine`: The virtual machine that runs most of the Travis web components. This is the machine your domain is pointing to. +- `Worker machine`: The worker machine(s) run your builds. + ## Backups This section explains how you integrate Travis CI Enterprise in your backup strategy. Here, we'll talk about two topics: From c7fca20fea7ce55a5d203e9239f3b79f34b3d24f Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Tue, 28 Nov 2017 16:51:21 +0100 Subject: [PATCH 0051/2623] Improve wording in the introduction --- user/enterprise/operations-manual.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 703f30c182e..f373932e6e9 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -4,9 +4,9 @@ layout: en_enterprise --- -The Operations Manual is a guideline which helps you to resolve problems with your Travis CI Enterprise instance. Our plan is to enhance this document with common support topics over the time. If you would like to see a specific problem case covered here as well, please get in touch with us via [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). +The Operations Manual is a guideline which helps you to resolve problems with your Travis CI Enterprise instance. Our plan is to enhance this document with frequently occuring support topics over the time. If you would like to see a specific problem case covered here as well, please get in touch with us via [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). -This document has multiple entrypoints. Each entrypoint is a common problem which we've seen ocurring on a regular basis over the time. The section will guide you through it helping you to resolve it. If it's not possible to resolve the problem, you'll find instructions on how to proceed at the bottom of the document. +This document has multiple entrypoints. Each entrypoint is a common problem which we've seen ocurring on a regular basis over the time. The section will guide you through it helping you to resolve it. If the problem couldn't be resolved you'll find instructions on how to proceed at the bottom of the document. Throughout this document we'll be using the following terms to refer to the two components of your Travis CI Enterprise installation: From b23f897a4d29e4fbf125df563e14b68fc49a865a Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Tue, 28 Nov 2017 16:52:04 +0100 Subject: [PATCH 0052/2623] Improve wording in worker debugging strategies --- user/enterprise/operations-manual.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index f373932e6e9..0ebdeac8890 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -48,7 +48,7 @@ Below you will find different strategies to resolve the problem. They're meant t #### Connection to RabbitMQ got lost -We're using RabbitMQ to schedule builds for the worker machine(s). Sometimes it can happen that the worker machine(s) lose the connection to RabbitMQ and therefore don't run any new builds anymore. This is a known problem on our side and we're working on resolving this. To fix that, restarting the machines usually suffices. To do that, connect via `ssh` and run the following command: +We're using RabbitMQ to schedule builds for the worker machine(s). Sometimes it can happen that the worker machine(s) lose the connection to RabbitMQ and therefore don't run any new builds anymore. This is a known problem on our side and we're working on resolving this. To get everything back to normal, restarting the machines usually suffices. To do that, connect via `ssh` and run the following command: ```bash $ sudo shutdown -r 0 @@ -58,8 +58,7 @@ This will immediately restart the machine. `travis-worker`, the program which ac #### Configuration -Please check if the worker machine has all relevant configuration in order. To do so, please use ssh to login to the machine. -Then open `/etc/default/travis-enterprise`. This is the main configuration file `travis-worker` uses to connect to the platform machine. Below you find an example: +Please check if the worker machine has all relevant configuration in order. To do so, please use ssh to login to the machine, then open `/etc/default/travis-enterprise`. This is the main configuration file `travis-worker` uses to connect to the platform machine. Below you find an example: ``` # Default ENV variables for Travis Enterprise @@ -72,7 +71,7 @@ export TRAVIS_ENTERPRISE_SECURITY_TOKEN="abc12345" # export TRAVIS_WORKER_DOCKER_PRIVILEGED="true" ``` -The relevant bits and pieces are `TRAVIS_ENTERPRISE_HOST` and `TRAVIS_ENTERPRISE_SECURITY_TOKEN`. The former needs to contain your primary domain you use to access Travis CI Enterprise. This domain name is used to reach the platform machine. The value of the latter needs to match the `RabbitMQ Password` on `https://yourdomain.com:8800/settings`. If you have made changes to this file, please run the following so they take effect: +Relevant are `TRAVIS_ENTERPRISE_HOST` and `TRAVIS_ENTERPRISE_SECURITY_TOKEN`. The former needs to contain your primary domain you use to access the Travis CI Enterprise Web UI. `travis-worker` uses this domain to reach the platform machine. The value of the latter needs to match the `RabbitMQ Password` on `https://yourdomain.com:8800/settings`. If you have made changes to this file, please run the following so they take effect: ```bash $ sudo restart travis-worker From e193c1804b0ab0e1cee7c69911b6b420949565f1 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Tue, 28 Nov 2017 16:52:32 +0100 Subject: [PATCH 0053/2623] Better wording for "Get in touch with support" --- user/enterprise/operations-manual.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 0ebdeac8890..41217a9618d 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -86,16 +86,14 @@ If none of the steps above lead to results for you, please follow the steps in [ ## Contact support -To get in touch with us, we'd like to ask you to follow the steps outlined below. That'll help us to provide you the best help possible and also possibly to save a few roundtrips. - -What we need from you: +To get in touch with us, please write a message to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). In your message we'd like to ask you to answer the questions below. - What is the problem? -- What did you try already? +- Which steps did you try already? - A support bundle (You can get it from https://yourdomain:8800/support) - Worker log files (They can be found at `/var/log/upstart/travis-worker.log`) - If you're using multiple worker machines, we need the log files from all of them. -Is anything special with your setup? There are certain information we can already see, such as the hostname, which IaaS provide you're using but there are lots of other factors which could lead to something not working. Therefore we'd like to ask you to also answer the questions below in your support request (if applicable): +Is anything special with your setup? There are certain information we can already see, such as the hostname, which IaaS provider you're using, but there are lots of other things we can't see which could lead to something not working. Therefore we'd like to ask you to also answer the questions below in your support request (if applicable): - How many machines are you using? - Do you use configuration management tools (Chef, Puppet)? @@ -103,4 +101,4 @@ Is anything special with your setup? There are certain information we can alread - Do you use Travis CI Enterprise together with github.com or GitHub Enterprise? - If you're using GitHub Enterprise, which version of it? -Please write your support request to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). \ No newline at end of file +Please write your support request to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). We're looking forward hearing from you! \ No newline at end of file From e1e0335cdad7647afae3d9d9eaf22785ebca66f6 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Tue, 28 Nov 2017 17:45:27 +0100 Subject: [PATCH 0054/2623] Better introduction --- user/enterprise/operations-manual.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 41217a9618d..046889bfc27 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -3,8 +3,7 @@ title: Travis CI Enterprise Operations manual layout: en_enterprise --- - -The Operations Manual is a guideline which helps you to resolve problems with your Travis CI Enterprise instance. Our plan is to enhance this document with frequently occuring support topics over the time. If you would like to see a specific problem case covered here as well, please get in touch with us via [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). +Welcome to the Travis CI Enterprise Operations Manual! This a living document which provides guidelines and suggestions for troubleshooting your Travis CI Enterprise instance. If you have questions about a specific situation, please get in touch with us via [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). This document has multiple entrypoints. Each entrypoint is a common problem which we've seen ocurring on a regular basis over the time. The section will guide you through it helping you to resolve it. If the problem couldn't be resolved you'll find instructions on how to proceed at the bottom of the document. From 225e709216028d55293d07c5970ee2d1411fe90e Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Tue, 28 Nov 2017 17:46:59 +0100 Subject: [PATCH 0055/2623] Replace entrypoint with topic --- user/enterprise/operations-manual.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 046889bfc27..92a3f697c25 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -5,7 +5,7 @@ layout: en_enterprise --- Welcome to the Travis CI Enterprise Operations Manual! This a living document which provides guidelines and suggestions for troubleshooting your Travis CI Enterprise instance. If you have questions about a specific situation, please get in touch with us via [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). -This document has multiple entrypoints. Each entrypoint is a common problem which we've seen ocurring on a regular basis over the time. The section will guide you through it helping you to resolve it. If the problem couldn't be resolved you'll find instructions on how to proceed at the bottom of the document. +This document is made of multiple topics. Each topic is a common problem which we've seen ocurring on a regular basis over the time. The section will guide you through it helping you to resolve it. If the problem couldn't be resolved you'll find instructions on how to proceed at the bottom of the document. Throughout this document we'll be using the following terms to refer to the two components of your Travis CI Enterprise installation: From 1e8e4f17d169e6cdac1bcc5e811e89bcdfabbc00 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 28 Nov 2017 13:52:08 -0500 Subject: [PATCH 0056/2623] draft custom queues --- _data/enterprise.yml | 1 + user/enterprise/custom-queues.md | 89 ++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 user/enterprise/custom-queues.md diff --git a/_data/enterprise.yml b/_data/enterprise.yml index e39ac7c9081..9ce4502fe32 100644 --- a/_data/enterprise.yml +++ b/_data/enterprise.yml @@ -2,6 +2,7 @@ System Prerequisites: "/user/enterprise/prerequisites/" Installation: "/user/enterprise/installation/" Upgrading: "/user/enterprise/upgrading/" Customizing Build Images: "/user/enterprise/build-images/" +Custom Queues: "/user/enterprise/custom-queues/" Worker Configuration: "/user/enterprise/worker-configuration/" Worker Start & Debug Containers: "/user/enterprise/worker-cli-commands/" Platform Administration Tips: "/user/enterprise/platform-tips/" diff --git a/user/enterprise/custom-queues.md b/user/enterprise/custom-queues.md new file mode 100644 index 00000000000..6c111daaf6e --- /dev/null +++ b/user/enterprise/custom-queues.md @@ -0,0 +1,89 @@ +--- +title: Enterprise Customer Worker Queues +layout: en_enterprise +--- + +Setting up custom worker queues on Travis CI Enterprise allows your team to designate a particular worker (or group of workers) for building specific repositories. This is especially useful for differentiating workers that have been customized specially. + +Custom queues require [enabling two feature flags](#Enable-Queues-on-the-Platform). Once these flags are set, you can define the configuration for your custom queues in the [Management Console settings](#Define-Custom-Queues-in-the-Management-Console), and [allocate workers to the new queues](#Define-Custom-Queues-Settings-on-The-Workers) + +
+ +## Enable Queues on the Platform + +To allow your Travis CI Enterprise platform instance to route jobs to customized queues, the `template_selection` and `multi_os` feature flags must be set. To do this, ssh into your platform server, then run `travis console`. Run the following command to enable the required feature flags: +``` +Travis::Features.enable_for_all(:template_selection); Travis::Features.enable_for_all(:multi_os); exit +``` + +The new settings will take effect immediately, but job routing will remain the same until new queues are defined. + +## Define Custom Queues in the Management Console + +Once the custom queue feature flags are enabled, the routing must configured in the management console. This is defined in yaml, in the **Advanced Configuration YAML** section at the bottom of the management console **Settings** page, e.g. `https://:8800/settings`. + +There are a number of options/selectors used to define routing to a custom queue. Some must be specified in the `.travis.yml`, others (such as those that indicate repo ownership) should not be specified in the `.travis.yml`. Repos that match _all_ of the selectors for a custom queue will be built on that custom queue. We recommend using the following selectors: + + - `language` - defines the build environment based on the chosen language of the project† + - `group` - mostly semantic, for defining 'groups' of environments† + - `owner` - either be an org or a user + - `slug` - a repository, in the form: `org/repo` or `user/repo` + + +† `language` and `group` selectors must be specified in the `.travis.yml`. See [the example](#Advanced-ConfigurationYAML-Example) for more details. + +Note: We do not recommend using `dist` and `os` for these selectors. These two have some of their own routing processes built-in and may not entirely behave as intended. + +All selectors should be given as a list in the "Advanced Configuration YAML" in the format: +```yaml +production: + queues: + - queue: name + selector: value + - queue: another.queue + selector: different_value + selector: something_else +``` +see the [example](#Advanced-Configuration-YAML-Example) for details on syntax. Click "Save" on the Management Console Settings when you are ready. Travis CI Enterprise will restart, with your new queue settings. + +### Advanced Configuration YAML Example + +The syntax for the **Advanced Configuration YAML** field is very important. Improper syntax will result in builds being routed to defaults, usually a `builds.linux` queue (if this has not been modified on your installation.) Syntax for a custom queue looks as follows: + +```yaml +production: + queues: + - queue: builds.ruby + owner: travis-ci + language: ruby + group: enterprise + - queue: builds.python + owner: acnagy + language: python + - queue: dockercluster + services: + - docker + - queue: legacy + group: legacy + - queue: docs + slug: 'travis-ci/docs-travis-ci-com' +``` + +Although selectors that indicate ownership (such as `owner` and `slug`) do not need to be set in the `.travis.yml`, other selectors must be. For example, to build an `enterprise`, Ruby project owned by the `travis-ci` organization, a `.travis.yml` would need to look as follows: + +```yaml +group: enterprise +language: ruby +# rest of the yaml, per standard spec +``` +{: data-file=".travis.yml"} + +but, to build this repo, [`travis-ci/docs-travis-ci.com`](https://github.com/travis-ci/docs-travis-ci-com), no special configuration would be required. + +## Define Custom Queues Settings on The Workers + +To allocate a worker to a particular queue, the `QUEUE_NAME` variable must be set in the worker config, which is located at `etc/default/travis-worker`. Update the environment variable to match the queue name specified in your [custom queue configuration yaml](#Advanced-Configuration-YAML-Example). Then restart the worker with: +``` +sudo service travis-worker restart +``` +The new queue settings will take effect upon restart. From 4a6b496c9e01c1a03007b05e90cce9394f06863e Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Wed, 29 Nov 2017 10:41:25 +0100 Subject: [PATCH 0057/2623] Add note about HA setups --- user/enterprise/operations-manual.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 92a3f697c25..84017ac1c80 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -12,6 +12,8 @@ Throughout this document we'll be using the following terms to refer to the two - `Platform machine`: The virtual machine that runs most of the Travis web components. This is the machine your domain is pointing to. - `Worker machine`: The worker machine(s) run your builds. +> Please note that this guide is geared towards non-HA setups right now. + ## Backups This section explains how you integrate Travis CI Enterprise in your backup strategy. Here, we'll talk about two topics: From 5b833fa150c281aa0e11c872bdbf4ce30387d02e Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Wed, 29 Nov 2017 10:42:12 +0100 Subject: [PATCH 0058/2623] Wording fixes --- user/enterprise/operations-manual.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 84017ac1c80..36453a000dc 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -37,19 +37,19 @@ The data directories are located on the platform machine and get mounted into th The files are located at `/var/travis` on the platform machine. Please run `sudo tar -czvf travis-enterprise-data-backup.tar.gz /var/travis` to create compressed archive from this folder. After this has finished, copy this file off the machine to a secure location. -## Builds don't get worked off +## Builds are not starting ### Symptoms -In the Travis CI Web UI you see none of the builds getting worked off. They're either in no or the `queued` state. Cancelling and restarting them doesn't make any difference. +In the Travis CI Web UI you see none of the builds are starting. They're either in no or the `queued` state. Cancelling and restarting them doesn't make any difference. ### Strategies -Below you will find different strategies to resolve the problem. They're meant to be followed in order. After you've completed the steps for a strategy please restart a build in the Travis CI Web UI to see if it gets picked up. If that's not happening, please advance to next strategy. +Below you will find different strategies to resolve the problem. They're meant to be followed in order. After you've completed the steps for a strategy please restart a build in the Travis CI Web UI to see if it gets picked up. If that's not happening, please try the next strategy. #### Connection to RabbitMQ got lost -We're using RabbitMQ to schedule builds for the worker machine(s). Sometimes it can happen that the worker machine(s) lose the connection to RabbitMQ and therefore don't run any new builds anymore. This is a known problem on our side and we're working on resolving this. To get everything back to normal, restarting the machines usually suffices. To do that, connect via `ssh` and run the following command: +We're using RabbitMQ to schedule builds for the worker machine(s). Sometimes it happens that the worker machine(s) lose the connection to RabbitMQ and therefore don't run any new builds anymore. This is a known problem on our side and we're working on resolving this. To get everything back to normal, restarting the machines usually suffices. To do that, connect via `ssh` and run the following command: ```bash $ sudo shutdown -r 0 @@ -80,21 +80,21 @@ $ sudo restart travis-worker #### Ports are not open Security groups / firewall -A source for the problem could be that the worker machine is not able to talk to the platform machine. +A source for the problem could be that the worker machine is not able to communicate with the platform machine. Here we're distinguishing between an AWS EC2 installation and an installation running on other hardware. For the former, security groups need to be configured per machine. To do so, please follow our installation instructions [here](https://docs.travis-ci.com/user/enterprise/installation/#1.1.-Create-a-Security-Group). If you're not using AWS EC2, please make sure that the ports listed [in the docs](https://docs.travis-ci.com/user/enterprise/installation/#1.1.-Create-a-Security-Group) are open in your firewall. If none of the steps above lead to results for you, please follow the steps in [#Contact-support](#Contact-support) to move forward. ## Contact support -To get in touch with us, please write a message to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). In your message we'd like to ask you to answer the questions below. +To get in touch with us, please write a message to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). It would be very helpful for Support if you could include the following: - What is the problem? - Which steps did you try already? - A support bundle (You can get it from https://yourdomain:8800/support) - Worker log files (They can be found at `/var/log/upstart/travis-worker.log`) - If you're using multiple worker machines, we need the log files from all of them. -Is anything special with your setup? There are certain information we can already see, such as the hostname, which IaaS provider you're using, but there are lots of other things we can't see which could lead to something not working. Therefore we'd like to ask you to also answer the questions below in your support request (if applicable): +Is anything special with your setup? While we may be able to see some information (such as hostname, IaaS provider, ...), there are lots of other things we can't see which could lead to something not working. Therefore we'd like to ask you to also answer the questions below in your support request (if applicable): - How many machines are you using? - Do you use configuration management tools (Chef, Puppet)? From 5bdeed4f798da782a7ae12c2e996d1cab6f634f9 Mon Sep 17 00:00:00 2001 From: Bogdana Vereha Date: Wed, 29 Nov 2017 11:38:14 +0100 Subject: [PATCH 0059/2623] Update NAT IPs for AWS --- user/ip-addresses.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/ip-addresses.md b/user/ip-addresses.md index c90f22001da..a74c0271840 100644 --- a/user/ip-addresses.md +++ b/user/ip-addresses.md @@ -11,8 +11,8 @@ on the infrastructure your builds are running on: | Infrastructure | IP ranges | | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------| -| Container-based (travis-ci.com) | `workers-nat-com-shared-2.aws-us-east-1.travisci.net` (`52.45.220.64/32` `52.54.40.118/32` `54.89.89.104/32` `54.82.137.203/32`) | -| Container-based (travis-ci.org) | `workers-nat-org-shared-2.aws-us-east-1.travisci.net` (`52.45.185.117/32` `52.54.31.11/32` `54.87.185.35/32` `54.87.141.246/32`) | +| Container-based (travis-ci.com) | `workers-nat-com-shared-2.aws-us-east-1.travisci.net` (`52.45.220.64/32` `52.54.40.118/32` `54.208.31.17/32` `34.234.4.53/32`) | +| Container-based (travis-ci.org) | `workers-nat-org-shared-2.aws-us-east-1.travisci.net` (`52.45.185.117/32` `52.54.31.11/32` `52.3.55.28/32` `34.233.56.198/32`) | | OS X | `208.78.110.192/27` | | Sudo-enabled Linux | See notes below.

{{site.data.gce_ip_range}} | From 44806a7c3935808f9af5a273aa814574dc451b44 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 29 Nov 2017 08:26:45 -0500 Subject: [PATCH 0060/2623] fix a link --- user/enterprise/custom-queues.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/custom-queues.md b/user/enterprise/custom-queues.md index 6c111daaf6e..1d58cbf88ef 100644 --- a/user/enterprise/custom-queues.md +++ b/user/enterprise/custom-queues.md @@ -30,7 +30,7 @@ There are a number of options/selectors used to define routing to a custom queue - `slug` - a repository, in the form: `org/repo` or `user/repo` -† `language` and `group` selectors must be specified in the `.travis.yml`. See [the example](#Advanced-ConfigurationYAML-Example) for more details. +† `language` and `group` selectors must be specified in the `.travis.yml`. See [the example](#Advanced-Configuration-YAML-Example) for more details. Note: We do not recommend using `dist` and `os` for these selectors. These two have some of their own routing processes built-in and may not entirely behave as intended. From 4157b91a9a3dbc3d1a0eb4c106be456a5ac6f396 Mon Sep 17 00:00:00 2001 From: Anna Nagy Date: Wed, 29 Nov 2017 08:36:25 -0500 Subject: [PATCH 0061/2623] try relative links --- user/enterprise/operations-manual.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 36453a000dc..48bb5ea5014 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -81,7 +81,7 @@ $ sudo restart travis-worker #### Ports are not open Security groups / firewall A source for the problem could be that the worker machine is not able to communicate with the platform machine. -Here we're distinguishing between an AWS EC2 installation and an installation running on other hardware. For the former, security groups need to be configured per machine. To do so, please follow our installation instructions [here](https://docs.travis-ci.com/user/enterprise/installation/#1.1.-Create-a-Security-Group). If you're not using AWS EC2, please make sure that the ports listed [in the docs](https://docs.travis-ci.com/user/enterprise/installation/#1.1.-Create-a-Security-Group) are open in your firewall. +Here we're distinguishing between an AWS EC2 installation and an installation running on other hardware. For the former, security groups need to be configured per machine. To do so, please follow our installation instructions [here](/user/enterprise/installation/#1.1.-Create-a-Security-Group). If you're not using AWS EC2, please make sure that the ports listed [in the docs](/user/enterprise/installation/#1.1.-Create-a-Security-Group) are open in your firewall. If none of the steps above lead to results for you, please follow the steps in [#Contact-support](#Contact-support) to move forward. From 0f644f2e08e7b8541ce0ce14370c70724813c2cd Mon Sep 17 00:00:00 2001 From: Paul Cochrane Date: Wed, 29 Nov 2017 18:11:20 +0100 Subject: [PATCH 0062/2623] Update Rakudo default branch name after branch rename See also https://github.com/travis-ci/travis-ci/issues/8825. --- user/languages/perl6.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/perl6.md b/user/languages/perl6.md index 3986dad6b51..343c9943613 100644 --- a/user/languages/perl6.md +++ b/user/languages/perl6.md @@ -57,7 +57,7 @@ backend. Future support for the ## Default Perl 6 Version If you leave the `perl6` key out of your `.travis.yml`, Travis CI will build -Rakudo Perl 6 from the latest commit from the project's `nom` branch. +Rakudo Perl 6 from the latest commit from the project's `master` branch. ## Default Test Script From d12564a1c7baa9544e3eddf466795e94c4b46af2 Mon Sep 17 00:00:00 2001 From: Lyoness Date: Wed, 29 Nov 2017 12:48:13 -0500 Subject: [PATCH 0063/2623] Xcode updates in _data --- _data/xcodes.yml | 71 ++---------------------------------------------- 1 file changed, 3 insertions(+), 68 deletions(-) diff --git a/_data/xcodes.yml b/_data/xcodes.yml index 0fd17471aa3..dc643ea3466 100644 --- a/_data/xcodes.yml +++ b/_data/xcodes.yml @@ -84,6 +84,7 @@ osx_images: xcode: "8.3" osx_version: "10.12" xcode_full_version: "8.3.3" + default: true image_publish_date: 2017-06-06 sdks: - macosx10.12 @@ -116,73 +117,8 @@ osx_images: - watchOS 2.1 - watchOS 2.2 - watchOS 3.2 - - image: xcode8.2 - xcode: "8.2" - osx_version: "10.12" - xcode_full_version: "8.2" - image_publish_date: 2016-12-13 - sdks: - - macosx10.12 - - iphoneos10.2 - - iphonesimulator10.2 - - appletvos10.1 - - appletvsimulator10.1 - - watchos3.1 - - watchsimulator3.1 - simulators: - - iOS 8.1 - - iOS 8.2 - - iOS 8.3 - - iOS 8.4 - - iOS 9.0 - - iOS 9.1 - - iOS 9.2 - - iOS 9.3 - - iOS 10.0 - - iOS 10.1 - - iOS 10.2 - - tvOS 9.0 - - tvOS 9.1 - - tvOS 9.2 - - tvOS 10.0 - - tvOS 10.1 - - watchOS 2.0 - - watchOS 2.1 - - watchOS 2.2 - - watchOS 3.1 - - image: xcode8.1 - xcode: "8.1" - osx_version: "10.12" - xcode_full_version: "8.1" - image_note: "**Please note that this is our first image based on macOS 10.12.**" - image_publish_date: 2016-11-15 - sdks: - - macosx10.12 - - iphoneos10.1 - - iphonesimulator10.1 - - appletvos10.0 - - appletvsimulator10.0 - - watchos3.1 - - watchsimulator3.1 - simulators: - - iOS 8.1 - - iOS 8.2 - - iOS 8.3 - - iOS 8.4 - - iOS 9.0 - - iOS 9.1 - - iOS 9.2 - - iOS 9.3 - - iOS 10.0 - - iOS 10.1 - - tvOS 9.0 - - tvOS 9.1 - - tvOS 9.2 - - tvOS 10.0 - - watchOS 2.0 - - watchOS 2.1 - - watchOS 2.2 - - watchOS 3.1 + - image: xcode8.2 #deprecated on 11/28/17 + - image: xcode8.1 #deprecated on 11/28/17 - image: xcode8 xcode: "8" osx_version: "10.11" @@ -222,7 +158,6 @@ osx_images: - image: xcode7.3 xcode: "7.3" osx_version: "10.11" - default: true xcode_full_version: "7.3.1" sdks: - macosx10.11 From 0ffdf4a3d504e2705fe49b861a607fae83d94e1d Mon Sep 17 00:00:00 2001 From: Lyoness Date: Wed, 29 Nov 2017 12:58:06 -0500 Subject: [PATCH 0064/2623] Update versions in reference new OSX default --- user/reference/osx.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/user/reference/osx.md b/user/reference/osx.md index 88d346adf6c..fca7dd897f3 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -114,24 +114,22 @@ The JDK available in the OS X environment is tied to the Xcode version selected ## Compilers and Build toolchain -- autoconf 2.69 -- automake 1.15 -- maven 3.3,9 -- mercurial 3.9.1 -- pkg-config 0.29.1 -- subversion 1.9.4 -- wget 1.18 -- xctool 0.2.9 -- cmake 3.6.2 +- automake 1.15.1 +- maven 3.5.0 +- mercurial 4.3.3 +- pkg-config 0.29.2 +- wget 1.19.1_1 +- xctool 0.3.3 +- cmake 3.9.4 ## Languages -- go 1.7.1 +- go 1.9.1 ## Services -- postgis 2.2.2_3 -- postgresql 9.5.4 +- postgis 2.4.0 +- postgresql 9.6.5 ## Runtimes From ab6ce8ca7c96072cb93308b97c90bbae15c38459 Mon Sep 17 00:00:00 2001 From: Lyoness Date: Wed, 29 Nov 2017 13:09:52 -0500 Subject: [PATCH 0065/2623] Omit deprecated xcode8.1 & 8.2 from xcodes.yml --- _data/xcodes.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/_data/xcodes.yml b/_data/xcodes.yml index dc643ea3466..a8912124105 100644 --- a/_data/xcodes.yml +++ b/_data/xcodes.yml @@ -112,13 +112,11 @@ osx_images: - tvOS 9.2 - tvOS 10.0 - tvOS 10.1 - - tvOS 10.2 + - tvOS 10.2false - watchOS 2.0 - watchOS 2.1 - watchOS 2.2 - watchOS 3.2 - - image: xcode8.2 #deprecated on 11/28/17 - - image: xcode8.1 #deprecated on 11/28/17 - image: xcode8 xcode: "8" osx_version: "10.11" From c74a14c76c092febe8b5d9aef3e66530a3d797c9 Mon Sep 17 00:00:00 2001 From: Lyoness Date: Wed, 29 Nov 2017 13:17:04 -0500 Subject: [PATCH 0066/2623] Correct a copy-paste error in xcodes.yml --- _data/xcodes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/xcodes.yml b/_data/xcodes.yml index a8912124105..ab0a3213bf7 100644 --- a/_data/xcodes.yml +++ b/_data/xcodes.yml @@ -112,7 +112,7 @@ osx_images: - tvOS 9.2 - tvOS 10.0 - tvOS 10.1 - - tvOS 10.2false + - tvOS 10.2 - watchOS 2.0 - watchOS 2.1 - watchOS 2.2 From db9dc9f140f42a5461805f508ec24d288dd1b489 Mon Sep 17 00:00:00 2001 From: Lyoness Date: Wed, 29 Nov 2017 13:20:42 -0500 Subject: [PATCH 0067/2623] Fixes yml indentation error in xcodes.yml --- _data/xcodes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/xcodes.yml b/_data/xcodes.yml index ab0a3213bf7..bcf810d72e1 100644 --- a/_data/xcodes.yml +++ b/_data/xcodes.yml @@ -84,7 +84,7 @@ osx_images: xcode: "8.3" osx_version: "10.12" xcode_full_version: "8.3.3" - default: true + default: true image_publish_date: 2017-06-06 sdks: - macosx10.12 From 587f57554fd664d7384695edf2ea8ea837301998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20B=C3=A4renz?= Date: Wed, 29 Nov 2017 19:39:29 +0100 Subject: [PATCH 0068/2623] Added section for multiple packages Added a section in which it is described how to set up a build matrix containing multiple packages in subdirectories. --- user/languages/haskell.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/user/languages/haskell.md b/user/languages/haskell.md index d85c9072c63..eb44a347e8d 100644 --- a/user/languages/haskell.md +++ b/user/languages/haskell.md @@ -71,3 +71,22 @@ cabal install --only-dependencies --enable-tests For Haskell projects, `env` and `ghc` can be given as arrays to construct a build matrix. + +### Multiple Packages in Subdirectories + +If you have multiple packages in subdirectories (each containing a `.cabal` file, +you can enter those directories by setting an environment variable: + +```yaml +ghc: + - "7.10" + - "7.8" + - "7.6" +env: + - PACKAGEDIR="some-package" + - PACKAGEDIR="some-other-package" +before_install: cd ${PACKAGEDIR} +``` +{: data-file=".travis.yml"} + +The build matrix is then constructed such that each package is compiled with each version of GHC. From ffcfd6154d7358bd21ed6aa95bc880d1f08a6f89 Mon Sep 17 00:00:00 2001 From: mariadeanton Date: Wed, 29 Nov 2017 20:17:42 +0100 Subject: [PATCH 0069/2623] split categories for build env updates per OS --- user/build-environment-updates.md | 16 +++++++++++++++- user/build-environment-updates/2014-12-09.md | 2 +- user/build-environment-updates/2014-12-16.md | 2 +- user/build-environment-updates/2014-12-18.md | 2 +- user/build-environment-updates/2014-12-29.md | 2 +- user/build-environment-updates/2015-01-07.md | 2 +- user/build-environment-updates/2015-02-03.md | 2 +- user/build-environment-updates/2015-04-09.md | 2 +- user/build-environment-updates/2016-08-24.md | 2 +- user/build-environment-updates/2016-11-01.md | 2 +- user/build-environment-updates/2016-11-15.md | 2 +- user/build-environment-updates/2016-12-01.md | 2 +- user/build-environment-updates/2016-12-02.md | 2 +- user/build-environment-updates/2016-12-06.md | 2 +- user/build-environment-updates/2016-12-08.md | 2 +- user/build-environment-updates/2017-05-04.md | 4 +--- user/build-environment-updates/2017-07-12.md | 2 +- user/build-environment-updates/2017-08-17.md | 6 +++--- user/build-environment-updates/2017-09-06.md | 2 +- user/build-environment-updates/2017-11-01.md | 5 ++--- user/build-environment-updates/2017-11-08.md | 3 +-- 21 files changed, 38 insertions(+), 28 deletions(-) diff --git a/user/build-environment-updates.md b/user/build-environment-updates.md index c36c7ed9c11..4b1f5052d80 100644 --- a/user/build-environment-updates.md +++ b/user/build-environment-updates.md @@ -9,15 +9,29 @@ layout: en > change. When in doubt, please request clarification via a [GitHub > issue](https://github.com/travis-ci/travis-ci/issues). +
+ +## Linux Build Environment Updates + +## macOS Build Environment Updates + + ### Atom feed diff --git a/user/build-environment-updates/2014-12-09.md b/user/build-environment-updates/2014-12-09.md index efd2199cd07..8269d591d0e 100644 --- a/user/build-environment-updates/2014-12-09.md +++ b/user/build-environment-updates/2014-12-09.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2014-12-09 --- diff --git a/user/build-environment-updates/2014-12-16.md b/user/build-environment-updates/2014-12-16.md index e7f1ae901df..73313f01250 100644 --- a/user/build-environment-updates/2014-12-16.md +++ b/user/build-environment-updates/2014-12-16.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2014-12-16 --- diff --git a/user/build-environment-updates/2014-12-18.md b/user/build-environment-updates/2014-12-18.md index 2e6edd13c46..daf0871e83e 100644 --- a/user/build-environment-updates/2014-12-18.md +++ b/user/build-environment-updates/2014-12-18.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2014-12-18 --- diff --git a/user/build-environment-updates/2014-12-29.md b/user/build-environment-updates/2014-12-29.md index 6f5583a1d70..fa89cc51356 100644 --- a/user/build-environment-updates/2014-12-29.md +++ b/user/build-environment-updates/2014-12-29.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2014-12-29 --- diff --git a/user/build-environment-updates/2015-01-07.md b/user/build-environment-updates/2015-01-07.md index bb704b195be..3ab46d50b50 100644 --- a/user/build-environment-updates/2015-01-07.md +++ b/user/build-environment-updates/2015-01-07.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2015-01-07 --- diff --git a/user/build-environment-updates/2015-02-03.md b/user/build-environment-updates/2015-02-03.md index c16801fcab8..6c3f6b9b719 100644 --- a/user/build-environment-updates/2015-02-03.md +++ b/user/build-environment-updates/2015-02-03.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2015-02-03 --- diff --git a/user/build-environment-updates/2015-04-09.md b/user/build-environment-updates/2015-04-09.md index e8ed79b427c..f689bfc8ef7 100644 --- a/user/build-environment-updates/2015-04-09.md +++ b/user/build-environment-updates/2015-04-09.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2015-04-09 --- diff --git a/user/build-environment-updates/2016-08-24.md b/user/build-environment-updates/2016-08-24.md index 5baeab395b0..11bd0ec2c42 100644 --- a/user/build-environment-updates/2016-08-24.md +++ b/user/build-environment-updates/2016-08-24.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2016-08-24 --- diff --git a/user/build-environment-updates/2016-11-01.md b/user/build-environment-updates/2016-11-01.md index 5a20e9b40bc..de94a3a8ca9 100644 --- a/user/build-environment-updates/2016-11-01.md +++ b/user/build-environment-updates/2016-11-01.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2016-11-01 --- diff --git a/user/build-environment-updates/2016-11-15.md b/user/build-environment-updates/2016-11-15.md index aed209638c7..6520fec71a4 100644 --- a/user/build-environment-updates/2016-11-15.md +++ b/user/build-environment-updates/2016-11-15.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2016-11-15 --- diff --git a/user/build-environment-updates/2016-12-01.md b/user/build-environment-updates/2016-12-01.md index 7d8c524e586..5f6d637b8a0 100644 --- a/user/build-environment-updates/2016-12-01.md +++ b/user/build-environment-updates/2016-12-01.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2016-12-01 --- diff --git a/user/build-environment-updates/2016-12-02.md b/user/build-environment-updates/2016-12-02.md index 55789c47ded..14215c3271c 100644 --- a/user/build-environment-updates/2016-12-02.md +++ b/user/build-environment-updates/2016-12-02.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2016-12-02 --- diff --git a/user/build-environment-updates/2016-12-06.md b/user/build-environment-updates/2016-12-06.md index 959c0ae0996..8c0695e1eca 100644 --- a/user/build-environment-updates/2016-12-06.md +++ b/user/build-environment-updates/2016-12-06.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2016-12-06 --- diff --git a/user/build-environment-updates/2016-12-08.md b/user/build-environment-updates/2016-12-08.md index 6b8729c5774..da48bcd3771 100644 --- a/user/build-environment-updates/2016-12-08.md +++ b/user/build-environment-updates/2016-12-08.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2016-12-08 --- diff --git a/user/build-environment-updates/2017-05-04.md b/user/build-environment-updates/2017-05-04.md index 0222edf8f84..f10ee6ce1d2 100644 --- a/user/build-environment-updates/2017-05-04.md +++ b/user/build-environment-updates/2017-05-04.md @@ -1,7 +1,7 @@ --- title: Build Environment Update History layout: en -category: build_env_updates +category: linux_build_env_updates date: 2017-05-04 --- @@ -19,5 +19,3 @@ date: 2017-05-04 Userland updates only for EOL Ubuntu 12.04 "Precise". Full details [here](https://blog.travis-ci.com/2017-05-04-precise-image-updates) - - diff --git a/user/build-environment-updates/2017-07-12.md b/user/build-environment-updates/2017-07-12.md index 6de168ac4cf..99de045ded2 100644 --- a/user/build-environment-updates/2017-07-12.md +++ b/user/build-environment-updates/2017-07-12.md @@ -2,7 +2,7 @@ title: Build Environment Update History layout: en permalink: /user/build-environment-updates/2017-07-12/ -category: build_env_updates +category: linux_build_env_updates date: 2017-07-12 --- diff --git a/user/build-environment-updates/2017-08-17.md b/user/build-environment-updates/2017-08-17.md index 722c5e1995a..e6e5dcd2603 100644 --- a/user/build-environment-updates/2017-08-17.md +++ b/user/build-environment-updates/2017-08-17.md @@ -2,7 +2,7 @@ title: Build Environment Update History layout: en permalink: /user/build-environment-updates/2017-08-17/ -category: build_env_updates +category: mac_build_env_updates date: 2017-08-17 --- @@ -14,8 +14,8 @@ date: 2017-08-17 ### Updated -- As previously communicated, Xcode beta versions 6.1, 6.2, and 6.3 are being deprecated. -Projects configured with values of `beta-xcode6.1`, `beta-xcode6.2`, or `beta-xcode6.3` +- As previously communicated, Xcode beta versions 6.1, 6.2, and 6.3 are being deprecated. +Projects configured with values of `beta-xcode6.1`, `beta-xcode6.2`, or `beta-xcode6.3` for the `osx_image` tag will now be run on our [default OS X image](https://docs.travis-ci.com/user/reference/osx/#OS-X-Version). - Users will be able to run on Xcode 6.4 by specifying `osx_image: xcode-6.4` in diff --git a/user/build-environment-updates/2017-09-06.md b/user/build-environment-updates/2017-09-06.md index 36900998bb8..186dd62f5e1 100644 --- a/user/build-environment-updates/2017-09-06.md +++ b/user/build-environment-updates/2017-09-06.md @@ -2,7 +2,7 @@ title: Build Environment Update History layout: en permalink: /user/build-environment-updates/2017-09-06/ -category: build_env_updates +category: linux_build_env_updates date: 2017-09-06 --- diff --git a/user/build-environment-updates/2017-11-01.md b/user/build-environment-updates/2017-11-01.md index 69f11014f4a..f39a5bc118c 100644 --- a/user/build-environment-updates/2017-11-01.md +++ b/user/build-environment-updates/2017-11-01.md @@ -2,7 +2,7 @@ title: Build Environment Update History layout: en permalink: /user/build-environment-updates/2017-11-01/ -category: build_env_updates +category: mac_build_env_updates date: 2017-11-01 --- @@ -79,5 +79,4 @@ N/A ### Details - [xcode8.3 diff](https://github.com/Lyoness/travis_staging_test/commit/fba03279686a1492a78ed958d72344fe4af3a55f?diff=unified#diff-934df722cbc32c134935cba6c22c3a84R740) -- - +- diff --git a/user/build-environment-updates/2017-11-08.md b/user/build-environment-updates/2017-11-08.md index 8b4fafb5992..2495d0708b5 100644 --- a/user/build-environment-updates/2017-11-08.md +++ b/user/build-environment-updates/2017-11-08.md @@ -2,7 +2,7 @@ title: Build Environment Update History layout: en permalink: /user/build-environment-updates/2017-11-08/ -category: build_env_updates +category: mac_build_env_updates date: 2017-11-08 --- @@ -69,4 +69,3 @@ N/A ### Details See a full diff of the xcode9.1-beta to xcode9.1 GA image [here](https://github.com/travis-ci/docs-travis-ci-com/commit/f73c2664e632ff0f60328ddd569c8b9a2755fe45) - From b80cdd4a8edac67342f7a6bd5f963dfebad5e486 Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Wed, 29 Nov 2017 15:00:42 -0500 Subject: [PATCH 0070/2623] Rework and update dynamic data sources from terraform & DNS --- .gitignore | 14 ++-- Gemfile | 18 ++--- Gemfile.lock | 8 ++- Rakefile | 119 ++++++++++++++++++++++++++-------- user/common-build-problems.md | 2 +- user/ip-addresses.md | 6 +- 6 files changed, 118 insertions(+), 49 deletions(-) diff --git a/.gitignore b/.gitignore index f5c103a187f..3da8c22f562 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,13 @@ -.bundle .DS_Store +.bundle +.jekyll-metadata .rvmrc +.sass-cache +_data/ec2*ips* +_data/gce_ip_range.yml +_data/trusty*language*mapping* _site bin +node_modules source/tmp/* -.sass-cache tmp/ -.jekyll-metadata -node_modules -generated-language-mapping.json -_data/trusty_mapping_data.yml -_data/gce_ip_range.yml diff --git a/Gemfile b/Gemfile index 10ccb595c5c..4f2b6d3ae44 100644 --- a/Gemfile +++ b/Gemfile @@ -1,19 +1,15 @@ source 'https://rubygems.org' -ruby '2.4.1' if ENV.key?('DYNO') +ruby '2.4.2' if ENV.key?('DYNO') +gem 'faraday' +gem 'html-proofer', '~> 3.0' gem 'jekyll', '>=3.1.6' -gem 'rdiscount', '>=2.2.0.1' - -gem 'jekyll-redirect-from' gem 'jekyll-paginate' - +gem 'jekyll-redirect-from' +gem 'puma' +gem 'pry', group: :test gem 'rack-jekyll' gem 'rack-ssl-enforcer' -gem 'puma' - -gem 'faraday' - gem 'rake' - -gem 'html-proofer', '~> 3.0' +gem 'rdiscount', '>=2.2.0.1' diff --git a/Gemfile.lock b/Gemfile.lock index 1f192f79d9f..b612b9944d6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,6 +8,7 @@ GEM tzinfo (~> 1.1) addressable (2.5.1) public_suffix (~> 2.0, >= 2.0.2) + coderay (1.1.2) colorator (1.1.0) colored (1.2) concurrent-ruby (1.0.5) @@ -51,6 +52,7 @@ GEM rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) mercenary (0.3.6) + method_source (0.9.0) mini_portile2 (2.2.0) minitest (5.10.1) multipart-post (2.0.0) @@ -59,6 +61,9 @@ GEM parallel (1.11.1) pathutil (0.14.0) forwardable-extended (~> 2.6) + pry (0.11.3) + coderay (~> 1.1.0) + method_source (~> 0.9.0) public_suffix (2.0.5) puma (3.8.2) rack (1.6.5) @@ -91,6 +96,7 @@ DEPENDENCIES jekyll (>= 3.1.6) jekyll-paginate jekyll-redirect-from + pry puma rack-jekyll rack-ssl-enforcer @@ -98,4 +104,4 @@ DEPENDENCIES rdiscount (>= 2.2.0.1) BUNDLED WITH - 1.14.6 + 1.15.4 diff --git a/Rakefile b/Rakefile index 6943e8c9723..bc4d2460e77 100644 --- a/Rakefile +++ b/Rakefile @@ -24,6 +24,15 @@ def print_line_containing(file, str) File.open(file).grep(/#{str}/).each do |line| puts "#{file}: #{line}" end end +def dns_txt(hostname) + require 'faraday' + require 'json' + + JSON.parse( + Faraday.get("https://dig.jsondns.org/IN/#{hostname}/TXT").body + ).fetch('answer').fetch(0).fetch('rdata').fetch(0).split.map(&:strip) +end + desc 'Lists files containing beta features' task :list_beta_files do files = FileList.new('**/*.md') @@ -81,50 +90,108 @@ task :run_html_proofer_internal do tester.run end -desc 'Populate Trusty image table data' -task :gen_trusty_image_data do - GENERATED_LANGUAGE_MAP_JSON_FILE = 'https://raw.githubusercontent.com/travis-infrastructure/terraform-config/master/aws-production-2/generated-language-mapping.json' +file '_data/trusty-language-mapping.json' do |t| + source = File.join( + 'https://raw.githubusercontent.com', + 'travis-infrastructure/terraform-config/master/aws-production-2', + 'generated-language-mapping.json' + ) - fail unless sh "curl -OsSfL '#{GENERATED_LANGUAGE_MAP_JSON_FILE}'" + fail unless sh "curl -sSfL -o '#{t.name}' '#{source}'" +end + +file '_data/trusty_language_mapping.yml' => [ + '_data/trusty-language-mapping.json' +] do |t| + require 'json' + require 'yaml' - json_data = JSON.load(File.read(File.basename(GENERATED_LANGUAGE_MAP_JSON_FILE))) - yaml_data = json_data.to_yaml + File.write( + t.name, + YAML.dump(JSON.load(File.read('_data/trusty-language-mapping.json'))) + ) - File.write(File.join(File.dirname(__FILE__), '_data', 'trusty_mapping_data.yml'), yaml_data) + puts "Updated #{t.name}" end -desc 'Populate GCE IP address range' -task :gen_gce_ip_addr_range do - require 'ipaddr' +file '_data/ec2-public-ips.json' do |t| + source = File.join( + 'https://raw.githubusercontent.com', + 'travis-infrastructure/terraform-config/master/aws-shared-2', + 'generated-public-ip-addresses.json' + ) - # Using steps described in https://cloud.google.com/compute/docs/faq#where_can_i_find_short_product_name_ip_ranges - # we populate the range of IP addresses for GCE instances + fail unless sh "curl -sSfL -o '#{t.name}' '#{source}'" +end - GOOGLE_DNS_SERVER='8.8.8.8' - DNS_ROOT='_cloud-netblocks.googleusercontent.com' +file '_data/ec2_public_ips.yml' => '_data/ec2-public-ips.json' do |t| + require 'json' + require 'yaml' - root_answer=`nslookup -q=TXT _cloud-netblocks.googleusercontent.com #{GOOGLE_DNS_SERVER}` + data = JSON.parse(File.read('_data/ec2-public-ips.json')) + by_site = %w[com org].map do |site| + [ + site, + data['ips_by_host'].find { |d| d['host'] =~ /-#{site}-/ } + ] + end - blocks=[] + File.write(t.name, YAML.dump(by_site.to_h)) - root_answer.split.grep(/^include:/).map {|x| x.sub(/^include:/,'')}.each do |netblock_host| - block_answer = `nslookup -q=TXT #{netblock_host} #{GOOGLE_DNS_SERVER}` - blocks += block_answer.split.grep(/^ip4:/).map {|x| x.sub(/^ip4:/,'')} - end + puts "Updated #{t.name}" +end + +file '_data/gce_ip_range.yml' do |t| + require 'ipaddr' + require 'yaml' + + # Using steps described in https://cloud.google.com/compute/docs/faq#where_can_i_find_short_product_name_ip_ranges + # we populate the range of IP addresses for GCE instances + dns_root = ENV.fetch( + 'GOOGLE_DNS_ROOT', '_cloud-netblocks.googleusercontent.com' + ) - blocks_sorted = blocks.sort do |a,b| - IPAddr.new(a) <=> IPAddr.new(b) + blocks = dns_txt(dns_root).grep(/^include:/).map do |l| + dns_txt(l.sub(/^include:/, '')).grep(/^ip4:/) + .map { |l| l.sub(/^ip4:/, '') } end - File.write(File.join(File.dirname(__FILE__), '_data', 'gce_ip_range.yml'), blocks_sorted.map {|ip| "`#{ip}`"}.join(", ").to_yaml) + File.write( + t.name, + YAML.dump( + 'ip_ranges' => blocks.flatten + .compact + .sort { |a, b| IPAddr.new(a) <=> IPAddr.new(b) } + ) + ) + + puts "Updated #{t.name}" +end + +desc 'Refresh generated files' +task regen: [ + :clean, + '_data/ec2_public_ips.yml', + '_data/gce_ip_range.yml', + '_data/trusty_language_mapping.yml', +] + +desc 'Remove generated files' +task :clean do + rm_f(%w[ + _data/ec2_public_ips.yml + _data/ec2-public-ips.json + _data/gce_ip_range.yml + _data/trusty-language-mapping.json + _data/trusty_language_mapping.yml + ]) end desc 'Start Jekyll server' -task :serve => [:gen_trusty_image_data] do +task serve: :regen do sh "bundle exec jekyll serve --config=_config.yml" end namespace :assets do - task :precompile => [:build] do - end + task precompile: :build end diff --git a/user/common-build-problems.md b/user/common-build-problems.md index eee2902e088..86885c43f1a 100644 --- a/user/common-build-problems.md +++ b/user/common-build-problems.md @@ -532,7 +532,7 @@ which Docker image you are using on Travis CI. ("default" if no other name matches) using the table below: | language | Docker Hub image | - |:----------------|:-----------------| {% for language in site.data.trusty_mapping_data %} + |:----------------|:-----------------| {% for language in site.data.trusty_language_mapping %} | {{language[0]}} | {{language[1]}} | {% endfor %} 1. Start a Docker container detached with `/sbin/init`: diff --git a/user/ip-addresses.md b/user/ip-addresses.md index a74c0271840..67ff550179e 100644 --- a/user/ip-addresses.md +++ b/user/ip-addresses.md @@ -11,10 +11,10 @@ on the infrastructure your builds are running on: | Infrastructure | IP ranges | | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------| -| Container-based (travis-ci.com) | `workers-nat-com-shared-2.aws-us-east-1.travisci.net` (`52.45.220.64/32` `52.54.40.118/32` `54.208.31.17/32` `34.234.4.53/32`) | -| Container-based (travis-ci.org) | `workers-nat-org-shared-2.aws-us-east-1.travisci.net` (`52.45.185.117/32` `52.54.31.11/32` `52.3.55.28/32` `34.233.56.198/32`) | +| Container-based (travis-ci.com) | `{{ site.data.ec2_public_ips['com']['host'] }}` ({% for ip in site.data.ec2_public_ips['com']['ips'] %}`{{ ip }}`, {% endfor %}) | +| Container-based (travis-ci.org) | `{{ site.data.ec2_public_ips['org']['host'] }}` ({% for ip in site.data.ec2_public_ips['org']['ips'] %}`{{ ip }}`, {% endfor %}) | | OS X | `208.78.110.192/27` | -| Sudo-enabled Linux | See notes below.

{{site.data.gce_ip_range}} | +| Sudo-enabled Linux | See notes below ({% for ip_range in site.data.gce_ip_range['ip_ranges'] %}`{{ ip_range }}`, {% endfor %}) | > **Note:** We do not have static public IP addresses available for jobs running on the > sudo-enabled Linux infrastructure at this time. From 22786f1c50829dbc6a7e651576d37ba24215fcbb Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Wed, 29 Nov 2017 15:04:35 -0500 Subject: [PATCH 0071/2623] Ensure the build target correctly regens stuff --- Rakefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Rakefile b/Rakefile index bc4d2460e77..0636a475a78 100644 --- a/Rakefile +++ b/Rakefile @@ -10,14 +10,14 @@ task :test => :build do end desc 'Builds the site' -task :build => [:remove_output_dir, :gen_trusty_image_data, :gen_gce_ip_addr_range] do - FileUtils.rm '.jekyll-metadata' if File.exist?('.jekyll-metadata') +task :build => %i[remove_output_dir regen] do + rm_f '.jekyll-metadata' sh 'bundle exec jekyll build --config=_config.yml' end desc 'Remove the output dir' task :remove_output_dir do - FileUtils.rm_r('_site') if File.exist?('_site') + rm_rf('_site') end def print_line_containing(file, str) From 9296710537ac7d659c05af7992e5fa6c82145a00 Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Wed, 29 Nov 2017 15:11:44 -0500 Subject: [PATCH 0072/2623] Minor symbol cleanups --- Rakefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Rakefile b/Rakefile index 0636a475a78..e2b46bfe55f 100644 --- a/Rakefile +++ b/Rakefile @@ -2,15 +2,15 @@ require 'html-proofer' -task :default => [:test] +task default: :test desc 'Runs the tests!' -task :test => :build do +task test: :build do Rake::Task['run_html_proofer'].invoke end desc 'Builds the site' -task :build => %i[remove_output_dir regen] do +task build: %i[remove_output_dir regen] do rm_f '.jekyll-metadata' sh 'bundle exec jekyll build --config=_config.yml' end From 23634ed9f36252e178d5aea892fc5a1c4ccd5de9 Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Wed, 29 Nov 2017 15:14:44 -0500 Subject: [PATCH 0073/2623] Use faraday instead of shelling out to curl --- Rakefile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index e2b46bfe55f..963547e787f 100644 --- a/Rakefile +++ b/Rakefile @@ -91,13 +91,15 @@ task :run_html_proofer_internal do end file '_data/trusty-language-mapping.json' do |t| + require 'faraday' + source = File.join( 'https://raw.githubusercontent.com', 'travis-infrastructure/terraform-config/master/aws-production-2', 'generated-language-mapping.json' ) - fail unless sh "curl -sSfL -o '#{t.name}' '#{source}'" + File.write(t.name, Faraday.get(source).body) end file '_data/trusty_language_mapping.yml' => [ @@ -115,13 +117,15 @@ file '_data/trusty_language_mapping.yml' => [ end file '_data/ec2-public-ips.json' do |t| + require 'faraday' + source = File.join( 'https://raw.githubusercontent.com', 'travis-infrastructure/terraform-config/master/aws-shared-2', 'generated-public-ip-addresses.json' ) - fail unless sh "curl -sSfL -o '#{t.name}' '#{source}'" + File.write(t.name, Faraday.get(source).body) end file '_data/ec2_public_ips.yml' => '_data/ec2-public-ips.json' do |t| From 0d0b8809305f65e14f91bc6fd55515b3c129ce4c Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Wed, 29 Nov 2017 15:29:18 -0500 Subject: [PATCH 0074/2623] Use a join filter instead of a for loop --- user/ip-addresses.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/user/ip-addresses.md b/user/ip-addresses.md index 67ff550179e..ff88ee365da 100644 --- a/user/ip-addresses.md +++ b/user/ip-addresses.md @@ -9,12 +9,12 @@ when you need them safelisted to access your internal resources. Since builds run in a variety of different infrastructures, the IP ranges to safelist depend on the infrastructure your builds are running on: -| Infrastructure | IP ranges | -| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------| -| Container-based (travis-ci.com) | `{{ site.data.ec2_public_ips['com']['host'] }}` ({% for ip in site.data.ec2_public_ips['com']['ips'] %}`{{ ip }}`, {% endfor %}) | -| Container-based (travis-ci.org) | `{{ site.data.ec2_public_ips['org']['host'] }}` ({% for ip in site.data.ec2_public_ips['org']['ips'] %}`{{ ip }}`, {% endfor %}) | -| OS X | `208.78.110.192/27` | -| Sudo-enabled Linux | See notes below ({% for ip_range in site.data.gce_ip_range['ip_ranges'] %}`{{ ip_range }}`, {% endfor %}) | +| Infrastructure | IP ranges | +| ------------------------------- | ----------------------------------------------------------------------------------------------------------------| +| Container-based (travis-ci.com) | `{{ site.data.ec2_public_ips['com']['host'] }}` (`{{ site.data.ec2_public_ips['com']['ips'] | join: "`, `" }}`) | +| Container-based (travis-ci.org) | `{{ site.data.ec2_public_ips['org']['host'] }}` (`{{ site.data.ec2_public_ips['org']['ips'] | join: "`, `" }}`) | +| OS X | `208.78.110.192/27` | +| Sudo-enabled Linux | See notes below (`{{ site.data.gce_ip_range['ip_ranges'] | join: "`, `" }}`) | > **Note:** We do not have static public IP addresses available for jobs running on the > sudo-enabled Linux infrastructure at this time. From 0664142af122b478b48a7fb7f9e0abb4120dcc9a Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Wed, 29 Nov 2017 19:18:34 -0500 Subject: [PATCH 0075/2623] Move deferred requirements to the top! --- Rakefile | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/Rakefile b/Rakefile index 963547e787f..933433c229e 100644 --- a/Rakefile +++ b/Rakefile @@ -1,5 +1,10 @@ #!/usr/bin/env rake +require 'ipaddr' +require 'json' +require 'yaml' + +require 'faraday' require 'html-proofer' task default: :test @@ -25,8 +30,6 @@ def print_line_containing(file, str) end def dns_txt(hostname) - require 'faraday' - require 'json' JSON.parse( Faraday.get("https://dig.jsondns.org/IN/#{hostname}/TXT").body @@ -91,8 +94,6 @@ task :run_html_proofer_internal do end file '_data/trusty-language-mapping.json' do |t| - require 'faraday' - source = File.join( 'https://raw.githubusercontent.com', 'travis-infrastructure/terraform-config/master/aws-production-2', @@ -105,9 +106,6 @@ end file '_data/trusty_language_mapping.yml' => [ '_data/trusty-language-mapping.json' ] do |t| - require 'json' - require 'yaml' - File.write( t.name, YAML.dump(JSON.load(File.read('_data/trusty-language-mapping.json'))) @@ -117,8 +115,6 @@ file '_data/trusty_language_mapping.yml' => [ end file '_data/ec2-public-ips.json' do |t| - require 'faraday' - source = File.join( 'https://raw.githubusercontent.com', 'travis-infrastructure/terraform-config/master/aws-shared-2', @@ -129,9 +125,6 @@ file '_data/ec2-public-ips.json' do |t| end file '_data/ec2_public_ips.yml' => '_data/ec2-public-ips.json' do |t| - require 'json' - require 'yaml' - data = JSON.parse(File.read('_data/ec2-public-ips.json')) by_site = %w[com org].map do |site| [ @@ -146,9 +139,6 @@ file '_data/ec2_public_ips.yml' => '_data/ec2-public-ips.json' do |t| end file '_data/gce_ip_range.yml' do |t| - require 'ipaddr' - require 'yaml' - # Using steps described in https://cloud.google.com/compute/docs/faq#where_can_i_find_short_product_name_ip_ranges # we populate the range of IP addresses for GCE instances dns_root = ENV.fetch( From abf53790191778f428e83d25e92a1d74fe9e4d23 Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Wed, 29 Nov 2017 20:01:05 -0500 Subject: [PATCH 0076/2623] Rubocop auto-fixes, but only in the Rakefile --- .rubocop.yml | 1 + .rubocop_todo.yml | 232 ++++++++++++++++++++++++++++++++++++++++++++++ Gemfile | 1 + Gemfile.lock | 16 ++++ Rakefile | 120 +++++++++++++----------- 5 files changed, 317 insertions(+), 53 deletions(-) create mode 100644 .rubocop.yml create mode 100644 .rubocop_todo.yml mode change 100644 => 100755 Rakefile diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 00000000000..cc32da4b99e --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1 @@ +inherit_from: .rubocop_todo.yml diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml new file mode 100644 index 00000000000..f4a963eb9e6 --- /dev/null +++ b/.rubocop_todo.yml @@ -0,0 +1,232 @@ +# This configuration was generated by +# `rubocop --auto-gen-config` +# on 2017-11-29 20:00:05 -0500 using RuboCop version 0.51.0. +# The point is for the user to remove these configuration records +# one by one as the offenses are removed from the code base. +# Note that changes in the inspected code, or installation of new +# versions of RuboCop, may require this file to be generated again. + +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: Include, TreatCommentsAsGroupSeparators. +# Include: **/Gemfile, **/gems.rb +Bundler/OrderedGems: + Exclude: + - 'Gemfile' + +# Offense count: 4 +# Cop supports --auto-correct. +Layout/AlignArray: + Exclude: + - '_site/Rakefile' + +# Offense count: 1 +# Cop supports --auto-correct. +Layout/EmptyLinesAroundAccessModifier: + Exclude: + - '_plugins/webhoook_payload_doc_handler.rb' + +# Offense count: 2 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth. +# SupportedStyles: special_inside_parentheses, consistent, align_brackets +Layout/IndentArray: + Exclude: + - '_site/Rakefile' + +# Offense count: 4 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth. +# SupportedStyles: special_inside_parentheses, consistent, align_braces +Layout/IndentHash: + Exclude: + - '_site/Rakefile' + +# Offense count: 4 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SupportedStylesForEmptyBraces. +# SupportedStyles: space, no_space, compact +# SupportedStylesForEmptyBraces: space, no_space +Layout/SpaceInsideHashLiteralBraces: + Exclude: + - '_plugins/webhoook_payload_doc_handler.rb' + +# Offense count: 2 +Lint/RescueWithoutErrorClass: + Exclude: + - '_plugins/webhoook_payload_doc_handler.rb' + +# Offense count: 1 +# Cop supports --auto-correct. +Lint/ScriptPermission: + Exclude: + - '_site/Rakefile' + +# Offense count: 2 +Lint/ShadowingOuterLocalVariable: + Exclude: + - '_plugins/webhoook_payload_doc_handler.rb' + - '_site/Rakefile' + +# Offense count: 1 +Lint/UriEscapeUnescape: + Exclude: + - '_plugins/webhoook_payload_doc_handler.rb' + +# Offense count: 1 +Metrics/AbcSize: + Max: 29 + +# Offense count: 1 +# Configuration parameters: CountComments, ExcludedMethods. +Metrics/BlockLength: + Max: 27 + +# Offense count: 1 +Metrics/CyclomaticComplexity: + Max: 7 + +# Offense count: 9 +# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. +# URISchemes: http, https +Metrics/LineLength: + Max: 191 + +# Offense count: 1 +# Configuration parameters: CountComments. +Metrics/MethodLength: + Max: 27 + +# Offense count: 1 +Metrics/PerceivedComplexity: + Max: 8 + +# Offense count: 2 +# Cop supports --auto-correct. +# Configuration parameters: AutoCorrect. +Security/JSONLoad: + Exclude: + - '_plugins/webhoook_payload_doc_handler.rb' + - '_site/Rakefile' + +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, ProceduralMethods, FunctionalMethods, IgnoredMethods. +# SupportedStyles: line_count_based, semantic, braces_for_chaining +# ProceduralMethods: benchmark, bm, bmbm, create, each_with_object, measure, new, realtime, tap, with_object +# FunctionalMethods: let, let!, subject, watch +# IgnoredMethods: lambda, proc, it +Style/BlockDelimiters: + Exclude: + - '_site/Rakefile' + +# Offense count: 3 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: braces, no_braces, context_dependent +Style/BracesAroundHashParameters: + Exclude: + - '_plugins/webhoook_payload_doc_handler.rb' + - '_site/Rakefile' + +# Offense count: 4 +Style/Documentation: + Exclude: + - 'spec/**/*' + - 'test/**/*' + - '_plugins/select_env_var_generator.rb' + - '_plugins/webhoook_payload_doc_handler.rb' + - '_site/config.ru' + - 'config.ru' + +# Offense count: 1 +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: for, each +Style/For: + Exclude: + - '_site/Rakefile' + +# Offense count: 9 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: when_needed, always, never +Style/FrozenStringLiteralComment: + Exclude: + - 'Gemfile' + - '_plugins/select_env_var_generator.rb' + - '_plugins/webhoook_payload_doc_handler.rb' + - '_site/Rakefile' + - '_site/config.ru' + - 'config.ru' + - 'slate/Gemfile' + - 'slate/Rakefile' + - 'slate/config.rb' + +# Offense count: 1 +# Configuration parameters: MinBodyLength. +Style/GuardClause: + Exclude: + - '_plugins/webhoook_payload_doc_handler.rb' + +# Offense count: 34 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols. +# SupportedStyles: ruby19, hash_rockets, no_mixed_keys, ruby19_no_mixed_keys +Style/HashSyntax: + Exclude: + - '_plugins/webhoook_payload_doc_handler.rb' + - '_site/Rakefile' + - '_site/config.ru' + - 'config.ru' + - 'slate/Gemfile' + - 'slate/Rakefile' + - 'slate/config.rb' + +# Offense count: 4 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles. +# SupportedStyles: require_parentheses, require_no_parentheses, require_no_parentheses_except_multiline +Style/MethodDefParentheses: + Exclude: + - '_site/config.ru' + - 'config.ru' + +# Offense count: 2 +# Cop supports --auto-correct. +Style/MutableConstant: + Exclude: + - '_plugins/select_env_var_generator.rb' + - '_plugins/webhoook_payload_doc_handler.rb' + +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: PreferredDelimiters. +Style/PercentLiteralDelimiters: + Exclude: + - '_plugins/select_env_var_generator.rb' + +# Offense count: 40 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyle, SupportedStyles, ConsistentQuotesInMultiline. +# SupportedStyles: single_quotes, double_quotes +Style/StringLiterals: + Exclude: + - '_plugins/webhoook_payload_doc_handler.rb' + - '_site/Rakefile' + - 'slate/Gemfile' + +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: SupportedStyles. +# SupportedStyles: percent, brackets +Style/SymbolArray: + EnforcedStyle: percent + MinSize: 3 + +# Offense count: 1 +# Cop supports --auto-correct. +# Configuration parameters: EnforcedStyleForMultiline, SupportedStylesForMultiline. +# SupportedStylesForMultiline: comma, consistent_comma, no_comma +Style/TrailingCommaInLiteral: + Exclude: + - '_site/Rakefile' diff --git a/Gemfile b/Gemfile index 4f2b6d3ae44..b835f89d3a8 100644 --- a/Gemfile +++ b/Gemfile @@ -13,3 +13,4 @@ gem 'rack-jekyll' gem 'rack-ssl-enforcer' gem 'rake' gem 'rdiscount', '>=2.2.0.1' +gem 'rubocop', group: :test diff --git a/Gemfile.lock b/Gemfile.lock index b612b9944d6..0d64da164e9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,6 +8,7 @@ GEM tzinfo (~> 1.1) addressable (2.5.1) public_suffix (~> 2.0, >= 2.0.2) + ast (2.3.0) coderay (1.1.2) colorator (1.1.0) colored (1.2) @@ -59,8 +60,11 @@ GEM nokogiri (1.8.0) mini_portile2 (~> 2.2.0) parallel (1.11.1) + parser (2.4.0.2) + ast (~> 2.3) pathutil (0.14.0) forwardable-extended (~> 2.6) + powerpack (0.1.1) pry (0.11.3) coderay (~> 1.1.0) method_source (~> 0.9.0) @@ -72,12 +76,22 @@ GEM listen (>= 1.3) rack (~> 1.5) rack-ssl-enforcer (0.2.9) + rainbow (2.2.2) + rake rake (12.0.0) rb-fsevent (0.9.8) rb-inotify (0.9.8) ffi (>= 0.5.0) rdiscount (2.2.0.1) rouge (1.11.1) + rubocop (0.51.0) + parallel (~> 1.10) + parser (>= 2.3.3.1, < 3.0) + powerpack (~> 0.1) + rainbow (>= 2.2.2, < 3.0) + ruby-progressbar (~> 1.7) + unicode-display_width (~> 1.0, >= 1.0.1) + ruby-progressbar (1.9.0) safe_yaml (1.0.4) sass (3.4.23) thread_safe (0.3.6) @@ -85,6 +99,7 @@ GEM ethon (>= 0.8.0) tzinfo (1.2.3) thread_safe (~> 0.1) + unicode-display_width (1.3.0) yell (2.0.7) PLATFORMS @@ -102,6 +117,7 @@ DEPENDENCIES rack-ssl-enforcer rake rdiscount (>= 2.2.0.1) + rubocop BUNDLED WITH 1.15.4 diff --git a/Rakefile b/Rakefile old mode 100644 new mode 100755 index 933433c229e..2b63581f0d8 --- a/Rakefile +++ b/Rakefile @@ -1,4 +1,5 @@ #!/usr/bin/env rake +# frozen_string_literal: true require 'ipaddr' require 'json' @@ -7,12 +8,20 @@ require 'yaml' require 'faraday' require 'html-proofer' +def print_line_containing(file, str) + File.open(file).grep(/#{str}/).each { |line| puts "#{file}: #{line}" } +end + +def dns_txt(hostname) + JSON.parse( + Faraday.get("https://dig.jsondns.org/IN/#{hostname}/TXT").body + ).fetch('answer').fetch(0).fetch('rdata').fetch(0).split.map(&:strip) +end + task default: :test desc 'Runs the tests!' -task test: :build do - Rake::Task['run_html_proofer'].invoke -end +task test: %i[build run_html_proofer] desc 'Builds the site' task build: %i[remove_output_dir regen] do @@ -25,22 +34,11 @@ task :remove_output_dir do rm_rf('_site') end -def print_line_containing(file, str) - File.open(file).grep(/#{str}/).each do |line| puts "#{file}: #{line}" end -end - -def dns_txt(hostname) - - JSON.parse( - Faraday.get("https://dig.jsondns.org/IN/#{hostname}/TXT").body - ).fetch('answer').fetch(0).fetch('rdata').fetch(0).split.map(&:strip) -end - desc 'Lists files containing beta features' task :list_beta_files do files = FileList.new('**/*.md') - files.exclude("_site/*", "STYLE.md") - for f in files do + files.exclude('_site/*', 'STYLE.md') + files.each do |f| print_line_containing(f, '\.beta') end end @@ -55,18 +53,28 @@ task :run_html_proofer do /-\.travis\.yml/ => '-travisyml' } - tester = HTMLProofer.check_directory('./_site', { - :url_swap => url_swap, - :internal_domains => ["docs.travis-ci.com"], - :connecttimeout => 600, - :only_4xx => true, - :typhoeus => { :ssl_verifypeer => false, :ssl_verifyhost => 0, :followlocation => true }, - :url_ignore => ["https://www.appfog.com/", /itunes\.apple\.com/, /coverity.com/, /articles201769485/], - :file_ignore => ["./_site/api/index.html", "./_site/user/languages/erlang/index.html", - "./_site/user/languages/objective-c/index.html", - "./_site/user/reference/osx/index.html"] - }) - tester.run + HTMLProofer.check_directory( + './_site', + url_swap: url_swap, + internal_domains: ['docs.travis-ci.com'], + connecttimeout: 600, + only_4xx: true, + typhoeus: { + ssl_verifypeer: false, ssl_verifyhost: 0, followlocation: true + }, + url_ignore: [ + 'https://www.appfog.com/', + /itunes\.apple\.com/, + /coverity.com/, + /articles201769485/ + ], + file_ignore: %w[ + ./_site/api/index.html + ./_site/user/languages/erlang/index.html + ./_site/user/languages/objective-c/index.html + ./_site/user/reference/osx/index.html + ] + ).run end desc 'Runs the html-proofer test for internal links only' @@ -79,18 +87,23 @@ task :run_html_proofer_internal do /-\.travis\.yml/ => '-travisyml' } - tester = HTMLProofer.check_directory('./_site', { - :url_swap => url_swap, - :disable_external => true, - :internal_domains => ["docs.travis-ci.com"], - :connecttimeout => 600, - :only_4xx => true, - :typhoeus => { :ssl_verifypeer => false, :ssl_verifyhost => 0, :followlocation => true }, - :file_ignore => ["./_site/api/index.html", "./_site/user/languages/erlang/index.html", - "./_site/user/languages/objective-c/index.html", - "./_site/user/reference/osx/index.html"] - }) - tester.run + HTMLProofer.check_directory( + './_site', + url_swap: url_swap, + disable_external: true, + internal_domains: ['docs.travis-ci.com'], + connecttimeout: 600, + only_4xx: true, + typhoeus: { + ssl_verifypeer: false, ssl_verifyhost: 0, followlocation: true + }, + file_ignore: %w[ + ./_site/api/index.html + ./_site/user/languages/erlang/index.html + ./_site/user/languages/objective-c/index.html + ./_site/user/reference/osx/index.html + ] + ).run end file '_data/trusty-language-mapping.json' do |t| @@ -108,7 +121,7 @@ file '_data/trusty_language_mapping.yml' => [ ] do |t| File.write( t.name, - YAML.dump(JSON.load(File.read('_data/trusty-language-mapping.json'))) + YAML.dump(JSON.parse(File.read('_data/trusty-language-mapping.json'))) ) puts "Updated #{t.name}" @@ -139,15 +152,16 @@ file '_data/ec2_public_ips.yml' => '_data/ec2-public-ips.json' do |t| end file '_data/gce_ip_range.yml' do |t| - # Using steps described in https://cloud.google.com/compute/docs/faq#where_can_i_find_short_product_name_ip_ranges + # Using steps described in: + # https://cloud.google.com/compute/docs/faq#where_can_i_find_short_product_name_ip_ranges # we populate the range of IP addresses for GCE instances dns_root = ENV.fetch( 'GOOGLE_DNS_ROOT', '_cloud-netblocks.googleusercontent.com' ) - blocks = dns_txt(dns_root).grep(/^include:/).map do |l| - dns_txt(l.sub(/^include:/, '')).grep(/^ip4:/) - .map { |l| l.sub(/^ip4:/, '') } + blocks = dns_txt(dns_root).grep(/^include:/).map do |bl| + dns_txt(bl.sub(/^include:/, '')).grep(/^ip4:/) + .map { |l| l.sub(/^ip4:/, '') } end File.write( @@ -167,23 +181,23 @@ task regen: [ :clean, '_data/ec2_public_ips.yml', '_data/gce_ip_range.yml', - '_data/trusty_language_mapping.yml', + '_data/trusty_language_mapping.yml' ] desc 'Remove generated files' task :clean do rm_f(%w[ - _data/ec2_public_ips.yml - _data/ec2-public-ips.json - _data/gce_ip_range.yml - _data/trusty-language-mapping.json - _data/trusty_language_mapping.yml - ]) + _data/ec2_public_ips.yml + _data/ec2-public-ips.json + _data/gce_ip_range.yml + _data/trusty-language-mapping.json + _data/trusty_language_mapping.yml + ]) end desc 'Start Jekyll server' task serve: :regen do - sh "bundle exec jekyll serve --config=_config.yml" + sh 'bundle exec jekyll serve --config=_config.yml' end namespace :assets do From aab2ebb84bc0ce372896f479d710c7611f2f4396 Mon Sep 17 00:00:00 2001 From: Bogdana Vereha Date: Thu, 30 Nov 2017 12:22:24 +0100 Subject: [PATCH 0077/2623] Clarify use of virtualenv for Python --- user/languages/python.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/user/languages/python.md b/user/languages/python.md index 0b5aa721bc9..8756412181b 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -73,13 +73,21 @@ script: ### Travis CI Uses Isolated virtualenvs The CI Environment uses separate virtualenv instances for each Python -version. System Python is not used and should not be relied on. If you need +version. This means that as soon as you specify `language: python` in `.travis.yml` your tests will run inside a virtualenv (without you having to explicitly create it). +System Python is not used and should not be relied on. If you need to install Python packages, do it via pip and not apt. -If you decide to use apt anyway, note that Python system packages only -include Python 2.7 libraries on Ubuntu. This means that the packages -installed from the repositories are not available in other virtualenvs even -if you use the --system-site-packages option. +If you decide to use apt anyway, note that for compatibility reasons, you'll only be able to use the default Python versions that are available in Ubuntu (e.g. for Trusty, this means 2.7.6 and 3.4.3). +To access the packages inside the virtualenv, you will need to specify that it should be created with the `--system-site-packages` option. +To do this, include the following in your `.travis.yml`: + +```yaml +language: python +virtualenv: + system_site_packages: true +``` +{: data-file=".travis.yml"} + ### PyPy Support From aa16b7a5c27a431d4552d56635556c5e32a4cf9e Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 30 Nov 2017 14:09:46 +0100 Subject: [PATCH 0078/2623] Fix links --- user/enterprise/operations-manual.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 48bb5ea5014..b6d6af864ce 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -81,7 +81,7 @@ $ sudo restart travis-worker #### Ports are not open Security groups / firewall A source for the problem could be that the worker machine is not able to communicate with the platform machine. -Here we're distinguishing between an AWS EC2 installation and an installation running on other hardware. For the former, security groups need to be configured per machine. To do so, please follow our installation instructions [here](/user/enterprise/installation/#1.1.-Create-a-Security-Group). If you're not using AWS EC2, please make sure that the ports listed [in the docs](/user/enterprise/installation/#1.1.-Create-a-Security-Group) are open in your firewall. +Here we're distinguishing between an AWS EC2 installation and an installation running on other hardware. For the former, security groups need to be configured per machine. To do so, please follow our installation instructions [here](/user/enterprise/installation/#11-Create-a-Security-Group). If you're not using AWS EC2, please make sure that the ports listed [in the docs](/user/enterprise/installation/#11-Create-a-Security-Group) are open in your firewall. If none of the steps above lead to results for you, please follow the steps in [#Contact-support](#Contact-support) to move forward. @@ -102,4 +102,4 @@ Is anything special with your setup? While we may be able to see some informatio - Do you use Travis CI Enterprise together with github.com or GitHub Enterprise? - If you're using GitHub Enterprise, which version of it? -Please write your support request to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). We're looking forward hearing from you! \ No newline at end of file +Please write your support request to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). We're looking forward hearing from you! From 933dd8ed655aa2cf1baa10ff4e9b2c82a606b56a Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 30 Nov 2017 14:19:52 +0100 Subject: [PATCH 0079/2623] Need to build the site before link checking --- Rakefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index 6943e8c9723..4d70732e7fe 100644 --- a/Rakefile +++ b/Rakefile @@ -34,7 +34,7 @@ task :list_beta_files do end desc 'Runs the html-proofer test' -task :run_html_proofer do +task :run_html_proofer => [:build] do # seems like the build does not render `%3*`, # so let's remove them for the check url_swap = { @@ -58,7 +58,7 @@ task :run_html_proofer do end desc 'Runs the html-proofer test for internal links only' -task :run_html_proofer_internal do +task :run_html_proofer_internal => [:build] do # seems like the build does not render `%3*`, # so let's remove them for the check url_swap = { From aecc93c5390bb029c394d07fe45a89463ff49881 Mon Sep 17 00:00:00 2001 From: Joep van Delft Date: Fri, 1 Dec 2017 12:28:37 +0100 Subject: [PATCH 0080/2623] Replace tabs with spaces --- user/customizing-the-build.md | 2 +- user/gui-and-headless-browsers.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/user/customizing-the-build.md b/user/customizing-the-build.md index 521bd0e2098..52ac185ed94 100644 --- a/user/customizing-the-build.md +++ b/user/customizing-the-build.md @@ -633,7 +633,7 @@ Consider a scenario where you want to run more complex test scenarios, but only set -ev bundle exec rake:units if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then - bundle exec rake test:integration + bundle exec rake test:integration fi ``` diff --git a/user/gui-and-headless-browsers.md b/user/gui-and-headless-browsers.md index d2721d9cfca..ef890ab0326 100644 --- a/user/gui-and-headless-browsers.md +++ b/user/gui-and-headless-browsers.md @@ -77,7 +77,7 @@ For example, to set the screen resolution to `1280x1024x16`: ```yaml before_install: - - "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16" + - "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16" ``` {: data-file=".travis.yml"} From c8fe445d8c9e3e0d4ce464653d31e06ea2cb4154 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Fri, 1 Dec 2017 15:20:07 +0100 Subject: [PATCH 0081/2623] Ignore link --- user/build-environment-updates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/build-environment-updates.md b/user/build-environment-updates.md index 4b1f5052d80..4c3bab7423d 100644 --- a/user/build-environment-updates.md +++ b/user/build-environment-updates.md @@ -39,4 +39,4 @@ An atom feed is also available. ### Mailing List -You can also sign up for the announcement mailing list. +You can also sign up for the announcement mailing list. From d3bfcd4103404d7428cd76aedd8c6690644197a7 Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Fri, 1 Dec 2017 15:45:19 +0100 Subject: [PATCH 0082/2623] Update haskell.md --- user/languages/haskell.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/haskell.md b/user/languages/haskell.md index eb44a347e8d..904ad4db148 100644 --- a/user/languages/haskell.md +++ b/user/languages/haskell.md @@ -75,7 +75,7 @@ to construct a build matrix. ### Multiple Packages in Subdirectories If you have multiple packages in subdirectories (each containing a `.cabal` file, -you can enter those directories by setting an environment variable: +you can specify those directories in an environment variable: ```yaml ghc: From 9251d7dbfe916d861f76d331ec67c38fda01a7da Mon Sep 17 00:00:00 2001 From: Alexandr Nikitin Date: Fri, 1 Dec 2017 16:59:47 +0200 Subject: [PATCH 0083/2623] Update csharp docs: dotnet sdk version, distributive * Update .NET Core SDK version to the latest LTS as per https://github.com/dotnet/core/blob/master/release-notes/download-archive.md * Remove notes about `trusty` distributive as it's default now --- user/languages/csharp.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/user/languages/csharp.md b/user/languages/csharp.md index 1ffe3672886..9d36ae2ed48 100644 --- a/user/languages/csharp.md +++ b/user/languages/csharp.md @@ -98,19 +98,16 @@ By default, Travis CI does not test against .NET Core. To test against .NET Core ```yml language: csharp mono: none -dotnet: 1.0.3 -dist: trusty +dotnet: 1.1.5 script: - dotnet restore ... ``` -> *Note*: you need to specify the version number of the .NET Core SDK (_not_ the .NET Core Runtime). For example, the .NET Core SDK 1.0.1 contains both the .NET Core Runtime 1.0.4 and 1.1.1. +> *Note*: you need to specify the version number of the .NET Core SDK (_not_ the .NET Core Runtime). The version numbers of the SDK can be found on the [.NET Core website](https://dot.net/core). -You need to specify `dist: trusty` so your build will run on Ubuntu 14.04 because .NET Core doesn't work on Ubuntu 12.04 (which is the default Linux build environment on Travis right now). - ### Testing Against Mono and .NET Core You can test against both Mono and .NET Core by using `matrix.include`. This example tests against both the latest mono and .NET Core @@ -121,9 +118,8 @@ solution: travis-mono-test.sln matrix: include: - - dotnet: 1.0.1 + - dotnet: 1.1.5 mono: none - dist: trusty env: DOTNETCORE=1 # optional, can be used to take different code paths in your script - mono: latest ... From e8561c63b344e522dd9364a3aee9779591fa2012 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Fri, 1 Dec 2017 16:08:37 +0100 Subject: [PATCH 0084/2623] Spelling fixes and rephrasing for easier understanding --- user/enterprise/operations-manual.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index b6d6af864ce..73e0238d21b 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -3,16 +3,16 @@ title: Travis CI Enterprise Operations manual layout: en_enterprise --- -Welcome to the Travis CI Enterprise Operations Manual! This a living document which provides guidelines and suggestions for troubleshooting your Travis CI Enterprise instance. If you have questions about a specific situation, please get in touch with us via [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). +Welcome to the Travis CI Enterprise Operations Manual! This document provides guidelines and suggestions for troubleshooting your Travis CI Enterprise instance. If you have questions about a specific situation, please get in touch with us via [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). -This document is made of multiple topics. Each topic is a common problem which we've seen ocurring on a regular basis over the time. The section will guide you through it helping you to resolve it. If the problem couldn't be resolved you'll find instructions on how to proceed at the bottom of the document. +This document provides guidelines and suggestions for troubleshooting your Travis CI Enterprise instance. Each topic contains a common problem, and a suggested solution. If the solution does not work, please [contact support](#contact-support). Throughout this document we'll be using the following terms to refer to the two components of your Travis CI Enterprise installation: - `Platform machine`: The virtual machine that runs most of the Travis web components. This is the machine your domain is pointing to. - `Worker machine`: The worker machine(s) run your builds. -> Please note that this guide is geared towards non-HA setups right now. +> Please note that this guide is geared towards non-High Availability (HA) setups right now. ## Backups @@ -23,14 +23,16 @@ This section explains how you integrate Travis CI Enterprise in your backup stra ### Encryption key -Without the encryption key you cannot access the information in your production database. To make sure that you can always recover your database, make a backup of this key: +Without the encryption key you cannot access the information in your production database. To make sure that you can always recover your database, make a backup of this key. + +> Without this key the information in the database is not recoverable. + +To make a backup, please follow the following steps: 1. open a ssh connection to the platform machine 2. run `travis bash`. This will open a bash session with `root` privileges into the Travis container. 3. Then run `cat /usr/local/travis/etc/travis/config/travis.yml | grep -A1 encryption:`. Create a backup of the value returned by that command by either writing it down on a piece of paper or storing it on a different computer. -> Without this key the information in the database is not recoverable. - ### Create a backup of the data directories The data directories are located on the platform machine and get mounted into the Travis container. In these directories you'll find files from RabbitMQ, Postgres, Slanger, Redis and also log files from the applications inside the container. @@ -39,17 +41,17 @@ The files are located at `/var/travis` on the platform machine. Please run `sudo ## Builds are not starting -### Symptoms +### The problem -In the Travis CI Web UI you see none of the builds are starting. They're either in no or the `queued` state. Cancelling and restarting them doesn't make any difference. +In the Travis CI Web UI you see none of the builds are starting. They're either in no state or `queued`. Cancelling and restarting them doesn't make any difference. ### Strategies -Below you will find different strategies to resolve the problem. They're meant to be followed in order. After you've completed the steps for a strategy please restart a build in the Travis CI Web UI to see if it gets picked up. If that's not happening, please try the next strategy. +There are a few different strategies to make your builds start. Please try each one in order. #### Connection to RabbitMQ got lost -We're using RabbitMQ to schedule builds for the worker machine(s). Sometimes it happens that the worker machine(s) lose the connection to RabbitMQ and therefore don't run any new builds anymore. This is a known problem on our side and we're working on resolving this. To get everything back to normal, restarting the machines usually suffices. To do that, connect via `ssh` and run the following command: +We're using RabbitMQ to schedule builds for the worker machine(s). Sometimes the worker machine(s) lose the connection to RabbitMQ and therefore don't run any new builds anymore. This is a known problem on our side and we're working on resolving this. To get everything back to normal, restart the machines by connecting via `ssh` and running the following command: ```bash $ sudo shutdown -r 0 From ef3ed3eca57fe661e6c6c5c1c00aab04262c4843 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Fri, 1 Dec 2017 16:11:40 +0100 Subject: [PATCH 0085/2623] "Follow these steps" --- user/enterprise/operations-manual.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 73e0238d21b..43a794de559 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -27,7 +27,7 @@ Without the encryption key you cannot access the information in your production > Without this key the information in the database is not recoverable. -To make a backup, please follow the following steps: +To make a backup, please follow these steps: 1. open a ssh connection to the platform machine 2. run `travis bash`. This will open a bash session with `root` privileges into the Travis container. From 1c49c07a52a4eed8c5b763038d68e242b551cc4e Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Fri, 1 Dec 2017 16:18:39 +0100 Subject: [PATCH 0086/2623] Really ignore this url --- user/build-environment-updates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/build-environment-updates.md b/user/build-environment-updates.md index 4c3bab7423d..e5faa52e966 100644 --- a/user/build-environment-updates.md +++ b/user/build-environment-updates.md @@ -39,4 +39,4 @@ An atom feed is also available. ### Mailing List -You can also sign up for the announcement mailing list. +You can also sign up for the announcement mailing list. From cc5457d891ef0ff64a0a3ce16f3dd31e8836c980 Mon Sep 17 00:00:00 2001 From: Dylan Arbour Date: Sun, 3 Dec 2017 17:13:14 -0500 Subject: [PATCH 0087/2623] Update osx.md for new default --- user/reference/osx.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/reference/osx.md b/user/reference/osx.md index fca7dd897f3..1f9379592b9 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -39,7 +39,7 @@ os: osx ## OS X Version -Travis CI uses OS X 10.11.6 (and Xcode 7.3.1) by default . You can use another version of OS X (and Xcode) by specifying the corresponding `osx_image` key from the following table: +Travis CI uses OS X 10.12.6 (and Xcode 8.3.3) by default . You can use another version of OS X (and Xcode) by specifying the corresponding `osx_image` key from the following table: @@ -215,7 +215,7 @@ Recent 1.7 version (usually the most recent) ## Xcode version -Xcode 7.3.1 is installed with all available simulators and SDKs. +Xcode 8.3.3 is installed with all available simulators and SDKs. Command Line Tools are also installed. {% for image in site.data.xcodes.osx_images %} From ece28d9001d5de24c423f067ad76b7ac3db54d15 Mon Sep 17 00:00:00 2001 From: Bogdana Vereha Date: Mon, 4 Dec 2017 11:56:18 +0100 Subject: [PATCH 0088/2623] Add details about pip usage --- user/languages/python.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user/languages/python.md b/user/languages/python.md index 8756412181b..b43de96215e 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -167,6 +167,8 @@ install: pip install --user -r requirements.txt ``` {: data-file=".travis.yml"} +Please note that the `--user` option is mandatory if you are not using `language: python`, since no virtualenv will be created in that case. + ### Custom Dependency Management To override the default `pip` dependency management, alter the `before_install` From da3b95c89901a3e58c3469c962fe4b10b8c4c707 Mon Sep 17 00:00:00 2001 From: Buck Doyle Date: Mon, 4 Dec 2017 13:01:29 -0600 Subject: [PATCH 0089/2623] Fix typo --- user/encrypting-files.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/encrypting-files.md b/user/encrypting-files.md index 8570fbcce9e..fe865f59615 100644 --- a/user/encrypting-files.md +++ b/user/encrypting-files.md @@ -23,7 +23,7 @@ See the Command Line Client [installation instructions](https://github.com/travi Assumptions: - The repository is set up on Travis CI -- You have version **1.7.0** or later of the Travis CI Command Line Client installed and setup up (you are logged in) +- You have version **1.7.0** or later of the Travis CI Command Line Client installed and set up (you are logged in) - You have a local copy of the repository and a terminal open where your current working directory is said copy - In the repository is a file, called super_secret.txt, that you need on Travis CI but you don't want to publish its content on GitHub. From 1eee6056cf60a3c09a90fe3eddcc1d7775d93b74 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Wed, 6 Dec 2017 14:03:59 +0100 Subject: [PATCH 0090/2623] Fix indent --- user/deployment/atlas.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/deployment/atlas.md b/user/deployment/atlas.md index f9f44465e1b..c69a5d75251 100644 --- a/user/deployment/atlas.md +++ b/user/deployment/atlas.md @@ -18,7 +18,7 @@ To deploy your application to Atlas: token: "YOUR ATLAS API TOKEN" app: "YOUR ATLAS USERNAME/YOUR ATLAS APP NAME" ``` -{: data-file=".travis.yml"} + {: data-file=".travis.yml"} ## Including or Excluding Files From 24fa07c04fb58845e25f9715aa4b4f2bc7ad9104 Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Wed, 6 Dec 2017 15:00:21 +0100 Subject: [PATCH 0091/2623] delete annotations endpoint from api refs travis-ci/travis-api#602 --- slate/source/index.md | 70 ------------------------------------------- 1 file changed, 70 deletions(-) diff --git a/slate/source/index.md b/slate/source/index.md index c146c5c4725..099cc23eb6d 100644 --- a/slate/source/index.md +++ b/slate/source/index.md @@ -476,75 +476,6 @@ The `subscribed` attribute is only available on Travis Pro. This request always needs to be authenticated. -## Annotations - -```http -GET /jobs/42/annotations HTTP/1.1 -User-Agent: MyClient/1.0.0 -Accept: application/vnd.travis-ci.2+json -Host: api.travis-ci.org -``` - -```http -HTTP/1.1 200 OK -Content-Type: application/json - -{ - "annotations" : [ - { - "id" : 1, - "job_id" : 42, - "description" : "foo bar", - "url" : "http://example.com/job-42", - "status" : "passed" - } - ] -} -``` - -```shell -$ travis show # job info will include annotations -``` - -```ruby -require 'travis' - -job = Travis::Job.find(42) -job.annotations.each do |annotation| - puts annotation.description -end -``` - - - -### Attributes - -| Attribute | Description | -| ----------- | ------------------------------------- | -| id | annotation id | -| job_id | job id the annotation is for | -| description | textual description of the annotation | -| url | url with more information | -| status | annotation status | - -### List Annotations - -`GET /jobs/{job.id}/annotations` - -### Create Annotation - -`POST /jobs/{job.id}/annotations` - -| Parameter | Default | Description | -| ----------- | ------- | -------------------------------------- | -| username | | user name for provider authentication | -| key | | secret key for provider authentication | -| description | | textual description of the annotation | -| url | | url with more information | -| status | | annotation status | - ## Branches ```http @@ -1049,7 +980,6 @@ end | duration | job duration | | queue | job queue | | allow_failure | whether or not job state influences build state | -| annotation_ids | list of annotation ids | ### Fetch Job From 2591467c39f976c43380f922789a6df982ee4bad Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Wed, 6 Dec 2017 15:25:56 +0100 Subject: [PATCH 0092/2623] remove annotations from api/index.html not sure if this is auto-generated. follow-up to #1586 --- api/index.html | 107 ------------------------------------------------- 1 file changed, 107 deletions(-) diff --git a/api/index.html b/api/index.html index 37f87a80af4..865d1c4700e 100644 --- a/api/index.html +++ b/api/index.html @@ -527,113 +527,6 @@

List accounts

This request always needs to be authenticated.

-

Annotations

-
GET /jobs/42/annotations HTTP/1.1
-User-Agent: MyClient/1.0.0
-Accept: application/vnd.travis-ci.2+json
-Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
-Content-Type: application/json
-
-{
-   "annotations" : [
-      {
-        "id"          : 1,
-        "job_id"      : 42,
-        "description" : "foo bar",
-        "url"         : "http://example.com/job-42",
-        "status"      : "passed"
-      }
-   ]
-}
-
-
$ travis show # job info will include annotations
-
-
require 'travis'
-
-job = Travis::Job.find(42)
-job.annotations.each do |annotation|
-  puts annotation.description
-end
-
- -

- -

Attributes

- -
- - - - - - - - - - - - - - - - - - - - - - - - - -
AttributeDescription
idannotation id
job_idjob id the annotation is for
descriptiontextual description of the annotation
urlurl with more information
statusannotation status
- -

List Annotations

- -

GET /jobs/{job.id}/annotations

- -

Create Annotation

- -

POST /jobs/{job.id}/annotations

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDefaultDescription
usernameuser name for provider authentication
keysecret key for provider authentication
descriptiontextual description of the annotation
urlurl with more information
statusannotation status
-

Branches

GET /repos/rails/rails/branches HTTP/1.1
 User-Agent: MyClient/1.0.0

From 67046c12e1711bc47ffd18aa1ded0cdf198867ae Mon Sep 17 00:00:00 2001
From: Igor Wiedler 
Date: Wed, 6 Dec 2017 15:27:09 +0100
Subject: [PATCH 0093/2623] remove annotation_ids too

---
 api/index.html | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/api/index.html b/api/index.html
index 865d1c4700e..e4e427f2807 100644
--- a/api/index.html
+++ b/api/index.html
@@ -1246,10 +1246,6 @@ 

Attributes

allow_failure whether or not job state influences build state - -annotation_ids -list of annotation ids -

Fetch Job

From 45451c46263734bf716f5fe6aebe5bd2981443af Mon Sep 17 00:00:00 2001 From: Mathias Meyer Date: Wed, 6 Dec 2017 16:01:38 +0100 Subject: [PATCH 0094/2623] Update imprint --- imprint.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/imprint.md b/imprint.md index 7d17f67e087..892106de087 100644 --- a/imprint.md +++ b/imprint.md @@ -12,11 +12,10 @@ permalink: /imprint.html Germany

Vertreten durch

-

Mathias Meyer, Fritz Thielemann

+

Konstantin Haase, Fritz Thielemann

Kontakt

Email contact@travis-ci.org
- Telefon +49 160 4201564

Registereintrag

HRB 140133 B

@@ -25,7 +24,7 @@ permalink: /imprint.html

Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV

Travis CI GmbH
- Mathias Meyer, Fritz Thielemann
+ Konstantin Haase, Fritz Thielemann
Rigaer Straße 8
10247 Berlin
Germany From a29b34b8f7429af30c4bd9ebdb74dc04b4cd97ef Mon Sep 17 00:00:00 2001 From: Konstantin Tokarev Date: Wed, 6 Dec 2017 21:20:18 +0400 Subject: [PATCH 0095/2623] Make sparse_checkout description more explicit --- user/customizing-the-build.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/user/customizing-the-build.md b/user/customizing-the-build.md index 6cfc8739f72..c2e93d9aaa0 100644 --- a/user/customizing-the-build.md +++ b/user/customizing-the-build.md @@ -326,8 +326,7 @@ To clone your repository sparsely, add: git: sparse_checkout: skip-worktree-map-file ``` -where `skip-worktree-map-file` is the file containing the list of files which should be populated -"sparsely". +where `skip-worktree-map-file` is a path to the existing file in the current repository with data you'd like to put into `$GIT_DIR/info/sparse-checkout` file of [format described in Git documentation](https://git-scm.com/docs/git-read-tree#_sparse_checkout). ## Building Specific Branches From dadb8999ce81e4aa4dc200ee69a58e30fef0f70b Mon Sep 17 00:00:00 2001 From: Bogdana Vereha Date: Wed, 6 Dec 2017 19:09:32 +0100 Subject: [PATCH 0096/2623] Add build-env changes list for Trusty Q4 --- user/build-environment-updates/2017-12-11.md | 47 ++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 user/build-environment-updates/2017-12-11.md diff --git a/user/build-environment-updates/2017-12-11.md b/user/build-environment-updates/2017-12-11.md new file mode 100644 index 00000000000..760cec5d8de --- /dev/null +++ b/user/build-environment-updates/2017-12-11.md @@ -0,0 +1,47 @@ +--- +title: Build Environment Update History +layout: en +permalink: /user/build-environment-updates/2017-12-11/ +category: linux_build_env_updates +date: 2017-12-11 +--- + +## 2017-12-11 + +This update applies to Ubuntu Trusty stacks on both sudo-enabled and +container-based execution environments. + +### Added + +- installation of the `dbus-x11` package for better xserver support + + ### Changed + + - pre-installed Python versions `2.7.14` and `3.6.3` + - pre-installed PHP versions `5.6.32`, `7.0.25` and `7.1.11` + - pre-installed nodejs versions `6.12.0` and `8.9.1` + - clang `5.0.0` + - cmake `3.9.2` + - docker `17.09.0-ce` + - docker-compose `1.17.1` + - firefox `56.0.2` (now supports [headless mode](https://docs.travis-ci.com/user/gui-and-headless-browsers/#Using-the-Firefox-addon-in-headless-mode)) + - google-chrome `62.0.3202` + - google-cloud-sdk `176.0.0` + - maven `3.5.2` + - mongodb `3.4.10` + - neo4j `3.2.7` + - phantomjs `2.1.1` + - rabbitmq-server `3.6.14` + - shfmt `2.0.0` + - pre-installed tools that are typically updated at job execution time: + - nvm `0.33.6` + - yarn `1.3.2` + +### Removed + +- the `-Xcext.enabled=false` option from `JRUBY_OPTS` + +### Details + +- [travis-cookbooks diff](https://github.com/travis-ci/travis-cookbooks/compare/4642454...7c2c6a6) +- [packer-templates diff](https://github.com/travis-ci/packer-templates/compare/f33ae65...986baf0) From a37bcc76349f2305214514766d00b2027a30f10d Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Wed, 6 Dec 2017 14:33:20 -0500 Subject: [PATCH 0097/2623] Adding Xcode 9.2 --- _data/xcodes.yml | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/_data/xcodes.yml b/_data/xcodes.yml index bcf810d72e1..4369db9ff2a 100644 --- a/_data/xcodes.yml +++ b/_data/xcodes.yml @@ -1,4 +1,49 @@ osx_images: + - image: xcode9.2 + xcode: "9.2" + osx_version: "10.12" + xcode_full_version: "9.2" + image_publish_date: 2017-12-06 + sdks: + - macosx10.13 + - iphoneos11.2 + - iphonesimulator11.2 + - appletvos11.2 + - appletvsimulator11.2 + - watchos4.2 + - watchsimulator4.2 + simulators: + - iOS 8.1 + - iOS 8.2 + - iOS 8.3 + - iOS 8.4 + - iOS 9.0 + - iOS 9.1 + - iOS 9.2 + - iOS 9.3 + - iOS 10.0 + - iOS 10.1 + - iOS 10.2 + - iOS 10.3 + - iOS 11.0 + - iOS 11.1 + - iOS 11.2 + - tvOS 9.0 + - tvOS 9.1 + - tvOS 9.2 + - tvOS 10.0 + - tvOS 10.1 + - tvOS 10.2 + - tvOS 11.0 + - tvOS 11.1 + - tvOS 11.2 + - watchOS 2.0 + - watchOS 2.1 + - watchOS 2.2 + - watchOS 3.2 + - watchOS 4.0 + - watchOS 4.1 + - watchOS 4.2 - image: xcode9.1 xcode: "9.1" osx_version: "10.12" From 1c9fbdc756e9ff6a38c955dacb5f614e1f916152 Mon Sep 17 00:00:00 2001 From: Jonathan Stoikovitch Date: Wed, 6 Dec 2017 22:25:56 -0800 Subject: [PATCH 0098/2623] Be more explicit about escaping of strings with spaces --- user/environment-variables.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/environment-variables.md b/user/environment-variables.md index c1f568ceda3..9c27a6c1d74 100644 --- a/user/environment-variables.md +++ b/user/environment-variables.md @@ -140,7 +140,7 @@ To define variables in Repository Settings, make sure you're logged in, navigate
Environment Variables in the Repository Settings
-> These values are used directly in your build, so make sure to escape [special characters (for bash)](http://www.tldp.org/LDP/abs/html/special-chars.html) accordingly. +> These values are used directly in your build, so make sure to escape [special characters (for bash)](http://www.tldp.org/LDP/abs/html/special-chars.html) accordingly. In particular, if a value contains spaces, you should put quotes around that value. E.g. `my secret passphrase` should be written `"my secret passphrase"`. By default, the value of these new environment variables is hidden from the `export` line in the logs. This corresponds to the behavior of [encrypted variables](#Encrypted-Variables) in your `.travis.yml`. The variables are stored encrypted in our systems, and get decrypted when the build script is generated. From 319e1d6a7e238168f5cf9c0f9b6e71ecbd7d9dc1 Mon Sep 17 00:00:00 2001 From: Bogdana Vereha Date: Thu, 7 Dec 2017 14:19:07 +0100 Subject: [PATCH 0099/2623] Fix formatting --- user/build-environment-updates/2017-12-11.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/build-environment-updates/2017-12-11.md b/user/build-environment-updates/2017-12-11.md index 760cec5d8de..56e35fb30c2 100644 --- a/user/build-environment-updates/2017-12-11.md +++ b/user/build-environment-updates/2017-12-11.md @@ -15,7 +15,7 @@ container-based execution environments. - installation of the `dbus-x11` package for better xserver support - ### Changed +### Changed - pre-installed Python versions `2.7.14` and `3.6.3` - pre-installed PHP versions `5.6.32`, `7.0.25` and `7.1.11` From 767f0ef7a2141a8385964e7c0618b6e313529c57 Mon Sep 17 00:00:00 2001 From: Bogdana Vereha Date: Thu, 7 Dec 2017 15:33:26 +0100 Subject: [PATCH 0100/2623] Add git and lein versions --- user/build-environment-updates/2017-12-11.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user/build-environment-updates/2017-12-11.md b/user/build-environment-updates/2017-12-11.md index 56e35fb30c2..321d01be876 100644 --- a/user/build-environment-updates/2017-12-11.md +++ b/user/build-environment-updates/2017-12-11.md @@ -25,8 +25,10 @@ container-based execution environments. - docker `17.09.0-ce` - docker-compose `1.17.1` - firefox `56.0.2` (now supports [headless mode](https://docs.travis-ci.com/user/gui-and-headless-browsers/#Using-the-Firefox-addon-in-headless-mode)) + - git `2.15.1` - google-chrome `62.0.3202` - google-cloud-sdk `176.0.0` + - leiningen `2.8.1` - maven `3.5.2` - mongodb `3.4.10` - neo4j `3.2.7` From 4c04a491cff555236427507c9434120436ce1576 Mon Sep 17 00:00:00 2001 From: mariana-gu <30621304+mariana-gu@users.noreply.github.com> Date: Thu, 7 Dec 2017 10:23:47 -0800 Subject: [PATCH 0101/2623] Update platform-tips.md I moved the uninstall process to the button. I think it does make more sense to have that at last in the doc. --- user/enterprise/platform-tips.md | 52 ++++++++++++++++---------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/user/enterprise/platform-tips.md b/user/enterprise/platform-tips.md index 1bc838304ed..c121260d69a 100644 --- a/user/enterprise/platform-tips.md +++ b/user/enterprise/platform-tips.md @@ -116,32 +116,6 @@ insight about it helps to get some basics statistics in the Ruby console: "sync"=>0, "user_sync"=>0} ``` -## Uninstall Travis CI Enterprise - -If you wish to uninstall Travis CI Enterprise from your platform and worker -machines, please follow the instructions below. On the platform machine, you -need to run the following commands in order. (Instructions copied over -from Replicated) - -``` -service replicated stop -service replicated-ui stop -service replicated-operator stop -docker stop replicated-premkit -docker stop replicated-statsd -docker rm -f replicated replicated-ui replicated-operator replicated-premkit replicated-statsd -docker images | grep "quay\.io/replicated" | awk '{print $3}' | xargs sudo docker rmi -f -apt-get remove -y replicated replicated-ui replicated-operator -apt-get purge -y replicated replicated-ui replicated-operator -rm -rf /var/lib/replicated* /etc/replicated* /etc/init/replicated* /etc/init.d/replicated* /etc/default/replicated* /var/log/upstart/replicated* /etc/systemd/system/replicated* -``` - -On the worker machine, you need to run this command: - -``` -$ sudo apt-get autoremove travis-worker -``` - ## Use a Let's Encrypt SSL Certificate @@ -266,3 +240,29 @@ $ replicatedctl app start ``` In general: These certificate renewals should be automated with a cron job. + +## Uninstall Travis CI Enterprise + +If you wish to uninstall Travis CI Enterprise from your platform and worker +machines, please follow the instructions below. On the platform machine, you +need to run the following commands in order. (Instructions copied over +from Replicated) + +``` +service replicated stop +service replicated-ui stop +service replicated-operator stop +docker stop replicated-premkit +docker stop replicated-statsd +docker rm -f replicated replicated-ui replicated-operator replicated-premkit replicated-statsd +docker images | grep "quay\.io/replicated" | awk '{print $3}' | xargs sudo docker rmi -f +apt-get remove -y replicated replicated-ui replicated-operator +apt-get purge -y replicated replicated-ui replicated-operator +rm -rf /var/lib/replicated* /etc/replicated* /etc/init/replicated* /etc/init.d/replicated* /etc/default/replicated* /var/log/upstart/replicated* /etc/systemd/system/replicated* +``` + +On the worker machine, you need to run this command: + +``` +$ sudo apt-get autoremove travis-worker +``` From b4a5165bf43de46d779f72f8b1cc45e5ad1f973f Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 11 Dec 2017 09:41:36 +0100 Subject: [PATCH 0102/2623] Remove useless use of cat See e.g. http://porkmail.org/era/unix/award.html --- user/enterprise/operations-manual.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 43a794de559..85be985ad91 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -31,7 +31,7 @@ To make a backup, please follow these steps: 1. open a ssh connection to the platform machine 2. run `travis bash`. This will open a bash session with `root` privileges into the Travis container. -3. Then run `cat /usr/local/travis/etc/travis/config/travis.yml | grep -A1 encryption:`. Create a backup of the value returned by that command by either writing it down on a piece of paper or storing it on a different computer. +3. Then run `grep -A1 encryption: /usr/local/travis/etc/travis/config/travis.yml`. Create a backup of the value returned by that command by either writing it down on a piece of paper or storing it on a different computer. ### Create a backup of the data directories From 86fd92f426bde211ab263d5f58b55ef12b90dac3 Mon Sep 17 00:00:00 2001 From: Brian de Alwis Date: Tue, 12 Dec 2017 12:10:38 -0500 Subject: [PATCH 0103/2623] Clarify that deploy steps are skipped on build failure --- user/customizing-the-build.md | 1 + 1 file changed, 1 insertion(+) diff --git a/user/customizing-the-build.md b/user/customizing-the-build.md index c2e93d9aaa0..b38f68e13c8 100644 --- a/user/customizing-the-build.md +++ b/user/customizing-the-build.md @@ -141,6 +141,7 @@ However, if one of these stages times out, the build is marked as a failure. An optional phase in the build lifecycle is deployment. This step can't be overridden, but is defined by using one of our continuous deployment providers to deploy code to Heroku, Engine Yard, or a different supported platform. +The deploy steps are skipped if the build is broken. When deploying files to a provider, prevent Travis CI from resetting your working directory and deleting all changes made during the build ( `git stash From 0466375313c01b51e337e52562b8f153365388ba Mon Sep 17 00:00:00 2001 From: Bogdana Vereha Date: Tue, 12 Dec 2017 19:07:54 +0100 Subject: [PATCH 0104/2623] Fix Trusty Q4 roll-out date --- .../{2017-12-11.md => 2017-12-12.md} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename user/build-environment-updates/{2017-12-11.md => 2017-12-12.md} (95%) diff --git a/user/build-environment-updates/2017-12-11.md b/user/build-environment-updates/2017-12-12.md similarity index 95% rename from user/build-environment-updates/2017-12-11.md rename to user/build-environment-updates/2017-12-12.md index 321d01be876..c2fe3ccc751 100644 --- a/user/build-environment-updates/2017-12-11.md +++ b/user/build-environment-updates/2017-12-12.md @@ -1,12 +1,12 @@ --- title: Build Environment Update History layout: en -permalink: /user/build-environment-updates/2017-12-11/ +permalink: /user/build-environment-updates/2017-12-12/ category: linux_build_env_updates date: 2017-12-11 --- -## 2017-12-11 +## 2017-12-12 This update applies to Ubuntu Trusty stacks on both sudo-enabled and container-based execution environments. From 37e1cc2cc39b62207752cd004464aeadb1ff20aa Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 14 Dec 2017 12:19:03 +0100 Subject: [PATCH 0105/2623] Deprecate --- user/deployment/atlas.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user/deployment/atlas.md b/user/deployment/atlas.md index c69a5d75251..ccd9871bce2 100644 --- a/user/deployment/atlas.md +++ b/user/deployment/atlas.md @@ -6,6 +6,8 @@ layout: en Travis CI can automatically deploy your application to [Atlas](https://atlas.hashicorp.com/) after a successful build. +> Hashicorp [announced](https://www.hashicorp.com/blog/hashicorp-terraform-enterprise-general-availability#decommissioning-atlas) that Atlas is being decommissioned by March 30, 2017. It is replaced by Terraform Enterprise. + To deploy your application to Atlas: 1. Sign in to your Atlas account. From 6123a3a3d6de6d2a596fb9090fdf00707d5da70d Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 14 Dec 2017 12:36:01 +0100 Subject: [PATCH 0106/2623] Update versions --- Gemfile.lock | 92 ++++++++++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 43 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0d64da164e9..d03e680099e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,103 +1,109 @@ GEM remote: https://rubygems.org/ specs: - activesupport (5.0.2) + activesupport (5.1.4) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (~> 0.7) minitest (~> 5.1) tzinfo (~> 1.1) - addressable (2.5.1) - public_suffix (~> 2.0, >= 2.0.2) + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) ast (2.3.0) coderay (1.1.2) colorator (1.1.0) - colored (1.2) + colorize (0.8.1) concurrent-ruby (1.0.5) - ethon (0.10.1) + ethon (0.11.0) ffi (>= 1.3.0) - faraday (0.12.0.1) + faraday (0.13.1) multipart-post (>= 1.2, < 3) ffi (1.9.18) forwardable-extended (2.6.0) - html-proofer (3.6.0) + html-proofer (3.7.5) activesupport (>= 4.2, < 6.0) addressable (~> 2.3) - colored (~> 1.2) + colorize (~> 0.8) mercenary (~> 0.3.2) - nokogiri (~> 1.5) + nokogiri (~> 1.7) parallel (~> 1.3) typhoeus (~> 0.7) yell (~> 2.0) - i18n (0.8.1) - jekyll (3.4.3) + i18n (0.9.1) + concurrent-ruby (~> 1.0) + jekyll (3.6.2) addressable (~> 2.4) colorator (~> 1.0) jekyll-sass-converter (~> 1.0) jekyll-watch (~> 1.1) - kramdown (~> 1.3) - liquid (~> 3.0) + kramdown (~> 1.14) + liquid (~> 4.0) mercenary (~> 0.3.3) pathutil (~> 0.9) - rouge (~> 1.7) + rouge (>= 1.7, < 3) safe_yaml (~> 1.0) jekyll-paginate (1.1.0) - jekyll-redirect-from (0.12.1) + jekyll-redirect-from (0.13.0) jekyll (~> 3.3) - jekyll-sass-converter (1.5.0) + jekyll-sass-converter (1.5.1) sass (~> 3.4) - jekyll-watch (1.5.0) - listen (~> 3.0, < 3.1) - kramdown (1.13.2) - liquid (3.0.6) - listen (3.0.8) + jekyll-watch (1.5.1) + listen (~> 3.0) + kramdown (1.16.2) + liquid (4.0.0) + listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) mercenary (0.3.6) method_source (0.9.0) - mini_portile2 (2.2.0) - minitest (5.10.1) + mini_portile2 (2.3.0) + minitest (5.10.3) multipart-post (2.0.0) - nokogiri (1.8.0) - mini_portile2 (~> 2.2.0) - parallel (1.11.1) + nokogiri (1.8.1) + mini_portile2 (~> 2.3.0) + parallel (1.12.0) parser (2.4.0.2) ast (~> 2.3) - pathutil (0.14.0) + pathutil (0.16.1) forwardable-extended (~> 2.6) powerpack (0.1.1) pry (0.11.3) coderay (~> 1.1.0) method_source (~> 0.9.0) - public_suffix (2.0.5) - puma (3.8.2) - rack (1.6.5) + public_suffix (3.0.1) + puma (3.11.0) + rack (1.6.8) rack-jekyll (0.5.0) jekyll (>= 1.3) listen (>= 1.3) rack (~> 1.5) rack-ssl-enforcer (0.2.9) - rainbow (2.2.2) - rake - rake (12.0.0) - rb-fsevent (0.9.8) - rb-inotify (0.9.8) - ffi (>= 0.5.0) + rainbow (3.0.0) + rake (12.3.0) + rb-fsevent (0.10.2) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) rdiscount (2.2.0.1) - rouge (1.11.1) - rubocop (0.51.0) + rouge (2.2.1) + rubocop (0.52.0) parallel (~> 1.10) - parser (>= 2.3.3.1, < 3.0) + parser (>= 2.4.0.2, < 3.0) powerpack (~> 0.1) - rainbow (>= 2.2.2, < 3.0) + rainbow (>= 2.2.2, < 4.0) ruby-progressbar (~> 1.7) unicode-display_width (~> 1.0, >= 1.0.1) ruby-progressbar (1.9.0) + ruby_dep (1.5.0) safe_yaml (1.0.4) - sass (3.4.23) + sass (3.5.3) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) thread_safe (0.3.6) typhoeus (0.8.0) ethon (>= 0.8.0) - tzinfo (1.2.3) + tzinfo (1.2.4) thread_safe (~> 0.1) unicode-display_width (1.3.0) yell (2.0.7) @@ -120,4 +126,4 @@ DEPENDENCIES rubocop BUNDLED WITH - 1.15.4 + 1.16.0 From a03a5e162eb5fbdb08fae242cf55026ad14222df Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 14 Dec 2017 12:36:46 +0100 Subject: [PATCH 0107/2623] Update deprecated syntax Deprecation: The 'gems' configuration option has been renamed to 'plugins'. Please update your config file accordingly. --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index 624d19d588c..a465a20e2b0 100644 --- a/_config.yml +++ b/_config.yml @@ -11,7 +11,7 @@ kramdown: hard_wrap: false input: GFM smart_quotes: lsquo,rsquo,ldquo,rdquo -gems: +plugins: - jekyll-redirect-from whitelist: - jekyll-redirect-from From 9989cd1664906d390cf2ee6bf4fd6133363571eb Mon Sep 17 00:00:00 2001 From: Anna Nagy Date: Thu, 14 Dec 2017 08:26:10 -0500 Subject: [PATCH 0108/2623] edits to custom queues doc --- user/enterprise/custom-queues.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/user/enterprise/custom-queues.md b/user/enterprise/custom-queues.md index 1d58cbf88ef..6c8671a40cd 100644 --- a/user/enterprise/custom-queues.md +++ b/user/enterprise/custom-queues.md @@ -3,15 +3,15 @@ title: Enterprise Customer Worker Queues layout: en_enterprise --- -Setting up custom worker queues on Travis CI Enterprise allows your team to designate a particular worker (or group of workers) for building specific repositories. This is especially useful for differentiating workers that have been customized specially. +Custom queues give your team more granular control over routing jobs to specific workers. This is especially helpful in conjunction with customized [worker configuration](/user/enterprise/worker-configuration/) and/or modified [build environments](/user/enterprise/build-images). -Custom queues require [enabling two feature flags](#Enable-Queues-on-the-Platform). Once these flags are set, you can define the configuration for your custom queues in the [Management Console settings](#Define-Custom-Queues-in-the-Management-Console), and [allocate workers to the new queues](#Define-Custom-Queues-Settings-on-The-Workers) +There are two [feature flags](#Enable-Queues-on-the-Platform) that need to be enabled for custom queues. Once these are set, you can define the configuration for your queues in the [Management Console settings](#Define-Custom-Queues-in-the-Management-Console), and [allocate workers to the new queues](#Define-Custom-Queues-Settings-on-The-Workers)
## Enable Queues on the Platform -To allow your Travis CI Enterprise platform instance to route jobs to customized queues, the `template_selection` and `multi_os` feature flags must be set. To do this, ssh into your platform server, then run `travis console`. Run the following command to enable the required feature flags: +To allow your Travis CI Enterprise platform instance to route jobs to customized queues, set the `template_selection` and `multi_os` feature flags. To do this, ssh into your platform server, then run `travis console`. Run the following command to enable the required feature flags: ``` Travis::Features.enable_for_all(:template_selection); Travis::Features.enable_for_all(:multi_os); exit ``` @@ -30,11 +30,11 @@ There are a number of options/selectors used to define routing to a custom queue - `slug` - a repository, in the form: `org/repo` or `user/repo` -† `language` and `group` selectors must be specified in the `.travis.yml`. See [the example](#Advanced-Configuration-YAML-Example) for more details. +† `language` and `group` selectors must be specified as above in the `.travis.yml`. See [the example](#Advanced-Configuration-YAML-Example) for more details. Note: We do not recommend using `dist` and `os` for these selectors. These two have some of their own routing processes built-in and may not entirely behave as intended. -All selectors should be given as a list in the "Advanced Configuration YAML" in the format: +All selectors should be given as above as a list in the "Advanced Configuration YAML" in the format: ```yaml production: queues: @@ -48,7 +48,7 @@ see the [example](#Advanced-Configuration-YAML-Example) for details on syntax. C ### Advanced Configuration YAML Example -The syntax for the **Advanced Configuration YAML** field is very important. Improper syntax will result in builds being routed to defaults, usually a `builds.linux` queue (if this has not been modified on your installation.) Syntax for a custom queue looks as follows: +The syntax for the **Advanced Configuration YAML** field is very important. Incorrect syntax will result in builds being routed to defaults, usually a `builds.linux` queue (if this has not been modified on your installation.) Here's an example of a custom queue definition: ```yaml production: @@ -82,7 +82,7 @@ but, to build this repo, [`travis-ci/docs-travis-ci.com`](https://github.com/tra ## Define Custom Queues Settings on The Workers -To allocate a worker to a particular queue, the `QUEUE_NAME` variable must be set in the worker config, which is located at `etc/default/travis-worker`. Update the environment variable to match the queue name specified in your [custom queue configuration yaml](#Advanced-Configuration-YAML-Example). Then restart the worker with: +To allocate a worker to a particular queue, the `QUEUE_NAME` variable must defined as indicated above in the worker config, which is located at `etc/default/travis-worker`. Update the environment variable to match the queue name specified in your [custom queue configuration yaml](#Advanced-Configuration-YAML-Example). Then restart the worker with: ``` sudo service travis-worker restart ``` From 68d59e68ac3ac1ebb79d9d7ec4e1fd838ecfd769 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 14 Dec 2017 14:55:09 +0100 Subject: [PATCH 0109/2623] Add V3 notice, and remove other notice to highlight the first --- api/index.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/api/index.html b/api/index.html index e4e427f2807..ad8324248fe 100644 --- a/api/index.html +++ b/api/index.html @@ -139,6 +139,10 @@

Overview

Welcome to the Travis CI API documentation. This is the API used by the official Travis CI web interface, so everything the web ui is able to do can also be accomplished via the API.

+

+

The first thing you will have to find out is the correct API endpoint to use.

    @@ -173,15 +177,11 @@

    Making Requests

    # => {"repo"=>#<Travis::Client::Repository: sinatra/sinatra>}
-

-

When you write your own Travis CI client, please keep the following in mind:

  • Always set the User-Agent header. This header is not required right now, but will be in the near future. Assuming your client is called “My Client”, and it’s current version is 1.0.0, a good value would be MyClient/1.0.0. For our command line client running on OS X 10.9 on Ruby 2.1.1, it might look like this: Travis/1.6.8 (Mac OS X 10.9.2 like Darwin; Ruby 2.1.1; RubyGems 2.0.14) Faraday/0.8.9 Typhoeus/0.6.7.
  • -
  • Always set the Accept header to application/vnd.travis-ci.2+json.
  • +
  • Always set the Accept header to application/vnd.travis-ci.2+json to make sure that you use get results from the V2 API

Any existing client library should take care of these for you.

From dd5d585201c005bbfb1651ea523b437823e797e2 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 14 Dec 2017 15:22:00 +0100 Subject: [PATCH 0110/2623] V2! --- api/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/index.html b/api/index.html index ad8324248fe..07fa448a756 100644 --- a/api/index.html +++ b/api/index.html @@ -8,7 +8,7 @@ - Travis CI - API Reference + Travis CI - API V2 Reference From 621e60cd54eae49e24989593aa6af18d38f6f552 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 14 Dec 2017 15:27:16 +0100 Subject: [PATCH 0111/2623] We dont use this, send people to the blog instead --- newsletter/index.html | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/newsletter/index.html b/newsletter/index.html index bc0970f55c1..e476400c918 100644 --- a/newsletter/index.html +++ b/newsletter/index.html @@ -1,21 +1,5 @@ --- title: Testing and Coffee Newsletter layout: en +redirect_to: https://blog.travis-ci.com/ --- -

-We're sending out regular updates on the world of testing, Travis CI and curated links, free tips on coffee included. -

- -

-No spam, swearsies! -

- -
-
- - -
-
From ed68c3cdcfb57441157fb17cafe649125ccfc091 Mon Sep 17 00:00:00 2001 From: Anna Nagy Date: Thu, 14 Dec 2017 09:38:25 -0500 Subject: [PATCH 0112/2623] the passive voice needed to be fixed on custom queues --- user/enterprise/custom-queues.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/user/enterprise/custom-queues.md b/user/enterprise/custom-queues.md index 6c8671a40cd..a8e7251fecc 100644 --- a/user/enterprise/custom-queues.md +++ b/user/enterprise/custom-queues.md @@ -5,7 +5,7 @@ layout: en_enterprise Custom queues give your team more granular control over routing jobs to specific workers. This is especially helpful in conjunction with customized [worker configuration](/user/enterprise/worker-configuration/) and/or modified [build environments](/user/enterprise/build-images). -There are two [feature flags](#Enable-Queues-on-the-Platform) that need to be enabled for custom queues. Once these are set, you can define the configuration for your queues in the [Management Console settings](#Define-Custom-Queues-in-the-Management-Console), and [allocate workers to the new queues](#Define-Custom-Queues-Settings-on-The-Workers) +There are two [feature flags](#Enable-Queues-on-the-Platform) required for custom queues. Once these are set, you can define the configuration for your queues in the [Management Console settings](#Define-Custom-Queues-in-the-Management-Console), and [allocate workers to the new queues](#Define-Custom-Queues-Settings-on-The-Workers)
@@ -20,9 +20,9 @@ The new settings will take effect immediately, but job routing will remain the s ## Define Custom Queues in the Management Console -Once the custom queue feature flags are enabled, the routing must configured in the management console. This is defined in yaml, in the **Advanced Configuration YAML** section at the bottom of the management console **Settings** page, e.g. `https://:8800/settings`. +After enabling the feature flags for custom queues, configure the job routing in the management console. This is defined in yaml, in the **Advanced Configuration YAML** section at the bottom of the management console **Settings** page, e.g. `https://:8800/settings`. -There are a number of options/selectors used to define routing to a custom queue. Some must be specified in the `.travis.yml`, others (such as those that indicate repo ownership) should not be specified in the `.travis.yml`. Repos that match _all_ of the selectors for a custom queue will be built on that custom queue. We recommend using the following selectors: +There are a number of options/selectors used to define routing to a custom queue. Repos that match _all_ of the selectors for a custom queue will be built on that custom queue. We recommend using the following selectors: - `language` - defines the build environment based on the chosen language of the project† - `group` - mostly semantic, for defining 'groups' of environments† @@ -30,11 +30,11 @@ There are a number of options/selectors used to define routing to a custom queue - `slug` - a repository, in the form: `org/repo` or `user/repo` -† `language` and `group` selectors must be specified as above in the `.travis.yml`. See [the example](#Advanced-Configuration-YAML-Example) for more details. +† Specify the `language` and `group` for a job in the `.travis.yml`. Do not specify ownership-type selectors (`owner`, `slug`) in the configuration. See [the example](#Advanced-Configuration-YAML-Example) for more details. Note: We do not recommend using `dist` and `os` for these selectors. These two have some of their own routing processes built-in and may not entirely behave as intended. -All selectors should be given as above as a list in the "Advanced Configuration YAML" in the format: +Define selectors in "Advanced Configuration YAML" in the following format: ```yaml production: queues: @@ -48,7 +48,7 @@ see the [example](#Advanced-Configuration-YAML-Example) for details on syntax. C ### Advanced Configuration YAML Example -The syntax for the **Advanced Configuration YAML** field is very important. Incorrect syntax will result in builds being routed to defaults, usually a `builds.linux` queue (if this has not been modified on your installation.) Here's an example of a custom queue definition: +The syntax for the **Advanced Configuration YAML** field is very important. Incorrect syntax will result in builds being routed to defaults, usually a `builds.linux` queue, depending on if there are any modifications to your installation. Here's an example of a custom queue definition: ```yaml production: @@ -69,7 +69,7 @@ production: slug: 'travis-ci/docs-travis-ci-com' ``` -Although selectors that indicate ownership (such as `owner` and `slug`) do not need to be set in the `.travis.yml`, other selectors must be. For example, to build an `enterprise`, Ruby project owned by the `travis-ci` organization, a `.travis.yml` would need to look as follows: +For this example, to build an `enterprise`, Ruby project owned by the `travis-ci` organization, a `.travis.yml` would need to look as follows: ```yaml group: enterprise @@ -78,11 +78,11 @@ language: ruby ``` {: data-file=".travis.yml"} -but, to build this repo, [`travis-ci/docs-travis-ci.com`](https://github.com/travis-ci/docs-travis-ci-com), no special configuration would be required. +but, to build the [`travis-ci/docs-travis-ci.com`](https://github.com/travis-ci/docs-travis-ci-com) repo, no special configuration would be required. ## Define Custom Queues Settings on The Workers -To allocate a worker to a particular queue, the `QUEUE_NAME` variable must defined as indicated above in the worker config, which is located at `etc/default/travis-worker`. Update the environment variable to match the queue name specified in your [custom queue configuration yaml](#Advanced-Configuration-YAML-Example). Then restart the worker with: +To allocate a worker to a particular queue, define the `QUEUE_NAME` variable in the worker config. This is located at `etc/default/travis-worker`. Update the environment variable to match the queue name specified in your [custom queue configuration yaml](#Advanced-Configuration-YAML-Example). Then restart the worker with: ``` sudo service travis-worker restart ``` From be93a4fe43f18bfe9bcd69f4ba8a9f51ea22336b Mon Sep 17 00:00:00 2001 From: Anna Nagy Date: Thu, 14 Dec 2017 09:47:51 -0500 Subject: [PATCH 0113/2623] a few last passive voice changes were necessitated --- user/enterprise/custom-queues.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user/enterprise/custom-queues.md b/user/enterprise/custom-queues.md index a8e7251fecc..7cd02f57171 100644 --- a/user/enterprise/custom-queues.md +++ b/user/enterprise/custom-queues.md @@ -5,7 +5,7 @@ layout: en_enterprise Custom queues give your team more granular control over routing jobs to specific workers. This is especially helpful in conjunction with customized [worker configuration](/user/enterprise/worker-configuration/) and/or modified [build environments](/user/enterprise/build-images). -There are two [feature flags](#Enable-Queues-on-the-Platform) required for custom queues. Once these are set, you can define the configuration for your queues in the [Management Console settings](#Define-Custom-Queues-in-the-Management-Console), and [allocate workers to the new queues](#Define-Custom-Queues-Settings-on-The-Workers) +There are two [feature flags](#Enable-Queues-on-the-Platform) required for custom queues. After setting these flags, you can define the configuration for your queues in the [Management Console settings](#Define-Custom-Queues-in-the-Management-Console), and [allocate workers to the new queues](#Define-Custom-Queues-Settings-on-The-Workers)
@@ -32,7 +32,7 @@ There are a number of options/selectors used to define routing to a custom queue † Specify the `language` and `group` for a job in the `.travis.yml`. Do not specify ownership-type selectors (`owner`, `slug`) in the configuration. See [the example](#Advanced-Configuration-YAML-Example) for more details. -Note: We do not recommend using `dist` and `os` for these selectors. These two have some of their own routing processes built-in and may not entirely behave as intended. +> Note: We do not recommend using `dist` and `os` for these selectors. These two have some of their own routing processes built-in and may not entirely behave as intended. Define selectors in "Advanced Configuration YAML" in the following format: ```yaml @@ -78,7 +78,7 @@ language: ruby ``` {: data-file=".travis.yml"} -but, to build the [`travis-ci/docs-travis-ci.com`](https://github.com/travis-ci/docs-travis-ci-com) repo, no special configuration would be required. +Building [`travis-ci/docs-travis-ci.com`](https://github.com/travis-ci/docs-travis-ci-com) repo, however, does not require any special configuration. ## Define Custom Queues Settings on The Workers From d5e2ac8e5eb02370cff0b93382195865c60aa905 Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Thu, 14 Dec 2017 17:18:37 +0100 Subject: [PATCH 0114/2623] Minor language fixes --- user/deployment/bintray.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/deployment/bintray.md b/user/deployment/bintray.md index 34c19aad01e..152533c1930 100644 --- a/user/deployment/bintray.md +++ b/user/deployment/bintray.md @@ -126,12 +126,12 @@ The descriptor is in JSON file format in three sections: #### Package Section -Bintray package information. Following information is mandatory on open source projects. +Bintray package information. The following information is mandatory on open source projects: - `name` is the Bintray package name - `repo` is the Bintray repository name - `subject` is the Bintray subject, which is either a user or an organization -- `vcs_url` is the Bintray vcs url, could be a github repository url or either vcs repository url +- `vcs_url` is the Bintray version control system url, such as a github repository url - `licenses` is the [Bintray licences](https://bintray.com/docs/api/#url_licenses), which is a list with at least one item. From 1ba87582ab5a8cf771e5d58e83ad4eeae71efbc5 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Thu, 14 Dec 2017 20:29:45 -0500 Subject: [PATCH 0115/2623] Document `git.depth: false` See https://github.com/travis-ci/travis-build/pull/1093 --- user/customizing-the-build.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/user/customizing-the-build.md b/user/customizing-the-build.md index b38f68e13c8..78a8f59bb83 100644 --- a/user/customizing-the-build.md +++ b/user/customizing-the-build.md @@ -262,6 +262,14 @@ git: ``` {: data-file=".travis.yml"} +You can also remove the `--depth` flag entirely with: + +```yaml +git: + depth: false +``` +{: data-file=".travis.yml"} + ## Git Submodules Travis CI clones git submodules by default, to avoid this set: From 6f1f294ac2706be5494fc40dc831a76701f5d151 Mon Sep 17 00:00:00 2001 From: Godefroid Chapelle Date: Fri, 15 Dec 2017 14:28:20 +0100 Subject: [PATCH 0116/2623] be explicit about links The final rendering at https://docs.travis-ci.com/user/firefox makes it hard to know that the versions are clickable links. --- user/firefox.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/firefox.md b/user/firefox.md index f8d43a8d7bb..1d28c16bbc0 100644 --- a/user/firefox.md +++ b/user/firefox.md @@ -25,7 +25,8 @@ It is also possible to specify beta versions; e.g., `50.0b6`. ## Version aliases -In addition to specific version numbers, there are 6 special aliases you can use: +In addition to specific version numbers, there are 6 special aliases you can use +(the items in the bullet list hereunder are actually links to the respective versions): - [`latest`](https://download.mozilla.org/?product=firefox-latest&os=linux64&lang=en-US) - [`latest-esr`](https://download.mozilla.org/?product=firefox-esr-latest&os=linux64&lang=en-US) From 441e9f66d4b0ef7623e9b549dd4c10b972f9c3e9 Mon Sep 17 00:00:00 2001 From: Godefroid Chapelle Date: Fri, 15 Dec 2017 15:29:36 +0100 Subject: [PATCH 0117/2623] change formatting --- user/firefox.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/user/firefox.md b/user/firefox.md index 1d28c16bbc0..5b41b86813d 100644 --- a/user/firefox.md +++ b/user/firefox.md @@ -25,15 +25,14 @@ It is also possible to specify beta versions; e.g., `50.0b6`. ## Version aliases -In addition to specific version numbers, there are 6 special aliases you can use -(the items in the bullet list hereunder are actually links to the respective versions): - -- [`latest`](https://download.mozilla.org/?product=firefox-latest&os=linux64&lang=en-US) -- [`latest-esr`](https://download.mozilla.org/?product=firefox-esr-latest&os=linux64&lang=en-US) -- [`latest-beta`](https://download.mozilla.org/?product=firefox-beta-latest&os=linux64&lang=en-US) -- [`latest-dev`](https://download.mozilla.org/?product=firefox-aurora-latest&os=linux64&lang=en-US) -- [`latest-nightly`](https://download.mozilla.org/?product=firefox-nightly-latest&os=linux64&lang=en-US) -- [`latest-unsigned`](https://tools.taskcluster.net/index/artifacts/#gecko.v2.mozilla-release.latest.firefox/gecko.v2.mozilla-release.latest.firefox.linux64-add-on-devel/) +In addition to specific version numbers, there are 6 special aliases you can use: + +- `latest` [see at mozilla.org](https://download.mozilla.org/?product=firefox-latest&os=linux64&lang=en-US) +- `latest-esr` [see at mozilla.org](https://download.mozilla.org/?product=firefox-esr-latest&os=linux64&lang=en-US) +- `latest-beta` [see at mozilla.org](https://download.mozilla.org/?product=firefox-beta-latest&os=linux64&lang=en-US) +- `latest-dev` [see at mozilla.org](https://download.mozilla.org/?product=firefox-aurora-latest&os=linux64&lang=en-US) +- `latest-nightly` [see at mozilla.org](https://download.mozilla.org/?product=firefox-nightly-latest&os=linux64&lang=en-US) +- `latest-unsigned` [see at mozilla.org](https://tools.taskcluster.net/index/artifacts/#gecko.v2.mozilla-release.latest.firefox/gecko.v2.mozilla-release.latest.firefox.linux64-add-on-devel/) The `latest-unsigned` binary is an unbranded build, suitable for [Add-ons/Extensions Signing](https://wiki.mozilla.org/Addons/Extension_Signing#Unbranded_Builds). From db877267f3dd31a0f314c7a14c2efd553b880ac9 Mon Sep 17 00:00:00 2001 From: Godefroid Chapelle Date: Mon, 18 Dec 2017 12:24:54 +0100 Subject: [PATCH 0118/2623] better wording --- user/firefox.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/user/firefox.md b/user/firefox.md index 5b41b86813d..f3ee253af0d 100644 --- a/user/firefox.md +++ b/user/firefox.md @@ -27,12 +27,12 @@ It is also possible to specify beta versions; e.g., `50.0b6`. In addition to specific version numbers, there are 6 special aliases you can use: -- `latest` [see at mozilla.org](https://download.mozilla.org/?product=firefox-latest&os=linux64&lang=en-US) -- `latest-esr` [see at mozilla.org](https://download.mozilla.org/?product=firefox-esr-latest&os=linux64&lang=en-US) -- `latest-beta` [see at mozilla.org](https://download.mozilla.org/?product=firefox-beta-latest&os=linux64&lang=en-US) -- `latest-dev` [see at mozilla.org](https://download.mozilla.org/?product=firefox-aurora-latest&os=linux64&lang=en-US) -- `latest-nightly` [see at mozilla.org](https://download.mozilla.org/?product=firefox-nightly-latest&os=linux64&lang=en-US) -- `latest-unsigned` [see at mozilla.org](https://tools.taskcluster.net/index/artifacts/#gecko.v2.mozilla-release.latest.firefox/gecko.v2.mozilla-release.latest.firefox.linux64-add-on-devel/) +- `latest` [archive at mozilla.org](https://download.mozilla.org/?product=firefox-latest&os=linux64&lang=en-US) +- `latest-esr` [archive at mozilla.org](https://download.mozilla.org/?product=firefox-esr-latest&os=linux64&lang=en-US) +- `latest-beta` [archive at mozilla.org](https://download.mozilla.org/?product=firefox-beta-latest&os=linux64&lang=en-US) +- `latest-dev` [archive at mozilla.org](https://download.mozilla.org/?product=firefox-aurora-latest&os=linux64&lang=en-US) +- `latest-nightly` [archive at mozilla.org](https://download.mozilla.org/?product=firefox-nightly-latest&os=linux64&lang=en-US) +- `latest-unsigned` [archive at mozilla.org](https://tools.taskcluster.net/index/artifacts/#gecko.v2.mozilla-release.latest.firefox/gecko.v2.mozilla-release.latest.firefox.linux64-add-on-devel/) The `latest-unsigned` binary is an unbranded build, suitable for [Add-ons/Extensions Signing](https://wiki.mozilla.org/Addons/Extension_Signing#Unbranded_Builds). From d3b9f00630f3552daed6d4d6ee30ec7adbc792bb Mon Sep 17 00:00:00 2001 From: Giordon Stark Date: Wed, 20 Dec 2017 12:05:17 -0500 Subject: [PATCH 0119/2623] ports can be used with known_hosts, update docs As seen in the addon functionality here: https://github.com/travis-ci/travis-build/blob/a3395b694b00225118582b47432aed9c64614b3d/lib/travis/build/addons/ssh_known_hosts.rb#L48-L51, one can specify the port as well. This just updates the documentation to reflect the existing functionality. --- user/ssh-known-hosts.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/user/ssh-known-hosts.md b/user/ssh-known-hosts.md index a8bed4a53d1..56f3b5c007f 100644 --- a/user/ssh-known-hosts.md +++ b/user/ssh-known-hosts.md @@ -30,3 +30,11 @@ addons: - 111.22.33.44 ``` {: data-file=".travis.yml"} + +Hosts with ports can also be specified: + +```yaml +addons: + ssh_known_hosts: git.example.com:1234 +``` +{: data-file=".travis.yml"} From 1188dfe35b7787e1192d334a54a29872866dcf12 Mon Sep 17 00:00:00 2001 From: Stephen Date: Thu, 21 Dec 2017 15:36:51 -0800 Subject: [PATCH 0120/2623] Add brew bundle to upgrade outdated brew packages --- user/reference/osx.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/user/reference/osx.md b/user/reference/osx.md index 1f9379592b9..e8befacf85d 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -84,7 +84,24 @@ Or it can result in the command not found: xctool: command not found ``` -This is intended behaviour from Homebrew's side, but you can get around it by running first checking if the command needs an upgrade with `brew outdated`, like this: +This is intended behaviour from Homebrew's side, but you can get around it by using [`brew bundle`](https://github.com/Homebrew/homebrew-bundle) or by running first checking if the command needs an upgrade with `brew outdated` + +#### `brew bundle` + +[`brew bundle`](https://github.com/Homebrew/homebrew-bundle) uses a `Brewfile`, similar to to a Ruby `Gemfile` to multiple install dependencies. By creating a simple `Brewfile`: + +``` +gem 'xctool' +... +``` + +You can then easily update and/or install all of the dependencies with the following command (which will not error if the package is already installed and up to date): + +```sh +$ brew bundle +``` + +#### `brew outdated` ```yaml before_install: From 6f7d5598f9ae0cbf866ddbd6d5c637295bbe5228 Mon Sep 17 00:00:00 2001 From: Stephen Date: Thu, 21 Dec 2017 15:42:59 -0800 Subject: [PATCH 0121/2623] cleanup language --- user/reference/osx.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/user/reference/osx.md b/user/reference/osx.md index e8befacf85d..b854a938fb8 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -88,11 +88,10 @@ This is intended behaviour from Homebrew's side, but you can get around it by us #### `brew bundle` -[`brew bundle`](https://github.com/Homebrew/homebrew-bundle) uses a `Brewfile`, similar to to a Ruby `Gemfile` to multiple install dependencies. By creating a simple `Brewfile`: +[`brew bundle`](https://github.com/Homebrew/homebrew-bundle) uses a `Brewfile`, similar to to a Ruby `Gemfile` to install multiple dependencies. By creating a simple `Brewfile`: ``` gem 'xctool' -... ``` You can then easily update and/or install all of the dependencies with the following command (which will not error if the package is already installed and up to date): From cbdeebf618e16e3425a7a72fab6447d487d31dcd Mon Sep 17 00:00:00 2001 From: Andy Li Date: Wed, 27 Dec 2017 15:35:24 +0800 Subject: [PATCH 0122/2623] haxe: update neko default version Re. https://github.com/travis-ci/travis-build/pull/1280 --- user/languages/haxe.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/haxe.md b/user/languages/haxe.md index 89308c2e790..56de47d9798 100644 --- a/user/languages/haxe.md +++ b/user/languages/haxe.md @@ -40,7 +40,7 @@ the latest stable release defined in the [haxe.org download list](https://haxe.o ## Default Neko Version -By default, [Neko](http://nekovm.org/) 2.1.0 will also be downloaded and installed. +By default, [Neko](http://nekovm.org/) 2.2.0 will also be downloaded and installed. Use the `neko:` key in your `.travis.yml` file to specify a different Neko version, for example: From 5a10a630bd595cc2eedfb4e791c411b1a0a9fea1 Mon Sep 17 00:00:00 2001 From: john gravois Date: Wed, 27 Dec 2017 14:40:22 -0800 Subject: [PATCH 0123/2623] include local_dir example --- user/deployment/pages.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/deployment/pages.md b/user/deployment/pages.md index 4c15786c9de..806dc223eab 100644 --- a/user/deployment/pages.md +++ b/user/deployment/pages.md @@ -43,7 +43,7 @@ or via [encrypted variables in ## Further configuration * `local_dir`: Directory to push to GitHub Pages, defaults to the current - directory + directory (example: `${TRAVIS_BUILD_DIR}/yourfolder`) * `repo`: Repo slug, defaults to current repo * `target_branch`: Branch to force push to, defaults to `gh-pages` * `fqdn`: Optional, sets a custom domain for your website, defaults to no custom domain support. From 06fad9e4bfe49b90dcb0a2c86b238f215702d31c Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 28 Dec 2017 13:24:33 +0100 Subject: [PATCH 0124/2623] Add mention of bundle_type --- user/deployment/codedeploy.md | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/user/deployment/codedeploy.md b/user/deployment/codedeploy.md index f6a06afbb32..a93c478d2ae 100644 --- a/user/deployment/codedeploy.md +++ b/user/deployment/codedeploy.md @@ -6,6 +6,8 @@ layout: en Travis CI can automatically trigger a new Deployment on [AWS CodeDeploy](http://aws.amazon.com/documentation/codedeploy/) after a successful build. +
+ For a minimal configuration with S3, add the following to your `.travis.yml`: ```yaml @@ -48,7 +50,7 @@ Keep in mind that the above command has to run in your project directory, so it This command will also offer to set up [S3 deployment](http://docs.travis-ci.com/user/deployment/s3/), if you want to bundle to be uploaded from the Travis CI build. -### Branch to deploy from +## Branch to deploy from You can explicitly specify the branch to deploy from with the **on** option: @@ -84,7 +86,7 @@ Alternatively, you can also configure Travis CI to deploy from all branches: Builds triggered from Pull Requests will never trigger a release. -### S3 deployment or GitHub deployment +## S3 deployment or GitHub deployment For a minimal configuration with GitHub, add the following to your `.travis.yml`: @@ -102,7 +104,7 @@ For a minimal configuration with GitHub, add the following to your `.travis.yml` Please note that `region` should match the instance region on which codedeploy is configured. -### Waiting for Deployments +## Waiting for Deployments By default, the build will continue immediately after triggering a CodeDeploy deploy. To wait for the deploy to complete, use the **wait-until-deployed** option: @@ -116,12 +118,19 @@ deploy: Travis CI will wait for the deploy to complete, and log whether it succeeded. -### Conditional deployments +## Bundle Types + +The [bundleType](http://docs.aws.amazon.com/codedeploy/latest/APIReference/API_S3Location.html#CodeDeploy-Type-S3Location-bundleType) of your application is inferred from the file exension of `key` or `s3_key` set in your `.travis.yml`. + +If your `.travis.yml` contains both, and they do not match, set `bundle_type` explicitly to the correct value. + + +## Conditional deployments You can deploy only when certain conditions are met. See [Conditional Releases with `on:`](/user/deployment#Conditional-Releases-with-on%3A). -### Note on `.gitignore` +## Note on `.gitignore` As this deployment strategy relies on `git`, be mindful that the deployment will honor `.gitignore`. @@ -130,7 +139,7 @@ If your `.gitignore` file matches something that your build creates, use [`before_deploy`](#Running-commands-before-and-after-deploy) to change its content. -### Running commands before and after deploy +## Running commands before and after deploy Sometimes you want to run commands before or after deploying. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually deploying. @@ -144,7 +153,7 @@ after_deploy: ``` {: data-file=".travis.yml"} -### AWS region to deploy to +## AWS region to deploy to You can explicitly specify the AWS region to deploy to with the **region** option: From d2fe2da5ebf49f7958e4631f83a56825535a1979 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 28 Dec 2017 16:01:13 +0100 Subject: [PATCH 0125/2623] Update dependencies --- slate/Gemfile.lock | 97 +++++++++++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 44 deletions(-) diff --git a/slate/Gemfile.lock b/slate/Gemfile.lock index d4af72919fe..3e094f46844 100644 --- a/slate/Gemfile.lock +++ b/slate/Gemfile.lock @@ -1,34 +1,35 @@ GEM remote: http://rubygems.org/ specs: - activesupport (3.2.17) + activesupport (3.2.22.5) i18n (~> 0.6, >= 0.6.4) multi_json (~> 1.0) - chunky_png (1.3.0) + chunky_png (1.3.8) coffee-script (2.2.0) coffee-script-source execjs - coffee-script-source (1.7.0) - compass (0.12.4) + coffee-script-source (1.12.2) + compass (0.12.2) chunky_png (~> 1.2) fssm (>= 0.2.7) - sass (~> 3.2.17) - em-websocket (0.5.0) + sass (~> 3.1) + em-websocket (0.5.1) eventmachine (>= 0.12.9) - http_parser.rb (~> 0.5.3) - eventmachine (1.0.3) - execjs (1.4.0) + http_parser.rb (~> 0.6.0) + eventmachine (1.2.5) + execjs (1.4.1) multi_json (~> 1.0) - ffi (1.9.3) + ffi (1.9.18) fssm (0.2.10) - haml (4.0.5) + haml (5.0.4) + temple (>= 0.8.0) tilt hike (1.2.3) - http_parser.rb (0.5.3) - i18n (0.6.9) - json (1.8.1) - kramdown (1.3.3) - libv8 (3.16.14.3) + http_parser.rb (0.6.0) + i18n (0.6.11) + json (2.1.0) + kramdown (1.16.2) + libv8 (3.16.14.19) listen (1.3.1) rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) @@ -52,51 +53,56 @@ GEM rack-test (~> 0.6.1) thor (>= 0.15.2, < 2.0) tilt (~> 1.4.1) - middleman-gh-pages (0.0.3) + middleman-gh-pages (0.3.1) rake (> 0.9.3) - middleman-livereload (3.3.0) - em-websocket (~> 0.5.0) + middleman-livereload (3.3.4) + em-websocket (~> 0.5.1) middleman-core (~> 3.2) rack-livereload (~> 0.3.15) - middleman-sprockets (3.3.1) + middleman-sprockets (3.3.3) middleman-core (>= 3.2) - sprockets (~> 2.1) - sprockets-helpers (~> 1.0.0) - sprockets-sass (~> 1.0.0) - middleman-syntax (2.0.0) - middleman-core (~> 3.2) - rouge (~> 1.0) - multi_json (1.9.2) - rack (1.5.2) - rack-livereload (0.3.15) + sprockets (~> 2.2) + sprockets-helpers (~> 1.1.0) + sprockets-sass (~> 1.1.0) + middleman-syntax (3.0.0) + middleman-core (>= 3.2) + rouge (~> 2.0) + multi_json (1.12.2) + rack (1.6.8) + rack-livereload (0.3.16) rack - rack-test (0.6.2) + rack-test (0.6.3) rack (>= 1.0) rake (10.2.2) - rb-fsevent (0.9.4) - rb-inotify (0.9.3) + rb-fsevent (0.10.2) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + rb-kqueue (0.2.5) ffi (>= 0.5.0) - rb-kqueue (0.2.2) - ffi (>= 0.5.0) - redcarpet (3.1.1) - ref (1.0.5) - rouge (1.3.3) + redcarpet (3.1.2) + ref (2.0.0) + rouge (2.2.1) ruby18_source_location (0.2) - sass (3.2.18) - sprockets (2.12.0) + sass (3.5.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sprockets (2.12.4) hike (~> 1.2) multi_json (~> 1.0) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) - sprockets-helpers (1.0.1) + sprockets-helpers (1.1.0) sprockets (~> 2.0) - sprockets-sass (1.0.3) + sprockets-sass (1.1.0) sprockets (~> 2.0) tilt (~> 1.1) - therubyracer (0.12.1) - libv8 (~> 3.16.14.0) + temple (0.8.0) + therubyracer (0.12.3) + libv8 (~> 3.16.14.15) ref - thor (0.19.1) + thor (0.20.0) tilt (1.4.1) uglifier (2.4.0) execjs (>= 0.3.0) @@ -115,3 +121,6 @@ DEPENDENCIES ruby18_source_location therubyracer wdm (~> 0.1.0) + +BUNDLED WITH + 1.16.0 From c45f5f14bf37ee8248a13daaf1ff805d231f333d Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 28 Dec 2017 16:05:04 +0100 Subject: [PATCH 0126/2623] Update dependencies --- slate/Gemfile | 4 +- slate/Gemfile.lock | 129 ++++++++++++++++++++++++++++----------------- 2 files changed, 83 insertions(+), 50 deletions(-) diff --git a/slate/Gemfile b/slate/Gemfile index 4ef9a11560e..b0126890811 100644 --- a/slate/Gemfile +++ b/slate/Gemfile @@ -2,7 +2,7 @@ # the following line to use "https" source 'http://rubygems.org' -gem "middleman", "~>3.2.0" +gem "middleman" # For syntax highlighting gem "middleman-syntax" @@ -13,7 +13,7 @@ gem 'middleman-gh-pages' # Live-reloading plugin gem "middleman-livereload", "~> 3.3.0" -gem 'redcarpet', '~> 3.1.1' +gem 'redcarpet' # For faster file watcher updates on Windows: gem "wdm", "~> 0.1.0", :platforms => [:mswin, :mingw] diff --git a/slate/Gemfile.lock b/slate/Gemfile.lock index 3e094f46844..8dcf54dac1b 100644 --- a/slate/Gemfile.lock +++ b/slate/Gemfile.lock @@ -1,93 +1,120 @@ GEM remote: http://rubygems.org/ specs: - activesupport (3.2.22.5) - i18n (~> 0.6, >= 0.6.4) - multi_json (~> 1.0) + activesupport (4.2.10) + i18n (~> 0.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + capybara (2.4.4) + mime-types (>= 1.16) + nokogiri (>= 1.3.3) + rack (>= 1.0.0) + rack-test (>= 0.5.4) + xpath (~> 2.0) chunky_png (1.3.8) - coffee-script (2.2.0) + coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.12.2) - compass (0.12.2) + compass (1.0.3) chunky_png (~> 1.2) - fssm (>= 0.2.7) - sass (~> 3.1) + compass-core (~> 1.0.2) + compass-import-once (~> 1.0.5) + rb-fsevent (>= 0.9.3) + rb-inotify (>= 0.9) + sass (>= 3.3.13, < 3.5) + compass-core (1.0.3) + multi_json (~> 1.0) + sass (>= 3.3.0, < 3.5) + compass-import-once (1.0.5) + sass (>= 3.2, < 3.5) em-websocket (0.5.1) eventmachine (>= 0.12.9) http_parser.rb (~> 0.6.0) + erubis (2.7.0) eventmachine (1.2.5) - execjs (1.4.1) - multi_json (~> 1.0) + execjs (2.7.0) ffi (1.9.18) - fssm (0.2.10) haml (5.0.4) temple (>= 0.8.0) tilt hike (1.2.3) + hooks (0.4.1) + uber (~> 0.0.14) http_parser.rb (0.6.0) - i18n (0.6.11) + i18n (0.7.0) json (2.1.0) kramdown (1.16.2) libv8 (3.16.14.19) - listen (1.3.1) - rb-fsevent (>= 0.9.3) - rb-inotify (>= 0.9) - rb-kqueue (>= 0.2) - middleman (3.2.2) - coffee-script (~> 2.2.0) - compass (>= 0.12.2) - execjs (~> 1.4.0) - haml (>= 3.1.6) + listen (3.0.8) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + middleman (3.4.1) + coffee-script (~> 2.2) + compass (>= 1.0.0, < 2.0.0) + compass-import-once (= 1.0.5) + execjs (~> 2.0) + haml (>= 4.0.5) kramdown (~> 1.2) - middleman-core (= 3.2.2) + middleman-core (= 3.4.1) middleman-sprockets (>= 3.1.2) - sass (>= 3.1.20) - uglifier (~> 2.4.0) - middleman-core (3.2.2) - activesupport (~> 3.2.6) + sass (>= 3.4.0, < 4.0) + uglifier (~> 2.5) + middleman-core (3.4.1) + activesupport (~> 4.1) bundler (~> 1.1) - i18n (~> 0.6.9) - listen (~> 1.1) - rack (>= 1.4.5) - rack-test (~> 0.6.1) + capybara (~> 2.4.4) + erubis + hooks (~> 0.3) + i18n (~> 0.7.0) + listen (~> 3.0.3) + padrino-helpers (~> 0.12.3) + rack (>= 1.4.5, < 2.0) thor (>= 0.15.2, < 2.0) - tilt (~> 1.4.1) + tilt (~> 1.4.1, < 2.0) middleman-gh-pages (0.3.1) rake (> 0.9.3) middleman-livereload (3.3.4) em-websocket (~> 0.5.1) middleman-core (~> 3.2) rack-livereload (~> 0.3.15) - middleman-sprockets (3.3.3) - middleman-core (>= 3.2) - sprockets (~> 2.2) + middleman-sprockets (3.5.0) + middleman-core (>= 3.3) + sprockets (~> 2.12.1) sprockets-helpers (~> 1.1.0) - sprockets-sass (~> 1.1.0) + sprockets-sass (~> 1.3.0) middleman-syntax (3.0.0) middleman-core (>= 3.2) rouge (~> 2.0) + mime-types (3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2016.0521) + mini_portile2 (2.3.0) + minitest (5.10.3) multi_json (1.12.2) + nokogiri (1.8.1) + mini_portile2 (~> 2.3.0) + padrino-helpers (0.12.8.1) + i18n (~> 0.6, >= 0.6.7) + padrino-support (= 0.12.8.1) + tilt (~> 1.4.1) + padrino-support (0.12.8.1) + activesupport (>= 3.1) rack (1.6.8) rack-livereload (0.3.16) rack - rack-test (0.6.3) - rack (>= 1.0) + rack-test (0.8.2) + rack (>= 1.0, < 3) rake (10.2.2) rb-fsevent (0.10.2) rb-inotify (0.9.10) ffi (>= 0.5.0, < 2) - rb-kqueue (0.2.5) - ffi (>= 0.5.0) - redcarpet (3.1.2) + redcarpet (3.4.0) ref (2.0.0) rouge (2.2.1) ruby18_source_location (0.2) - sass (3.5.4) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) + sass (3.4.25) sprockets (2.12.4) hike (~> 1.2) multi_json (~> 1.0) @@ -95,7 +122,7 @@ GEM tilt (~> 1.1, != 1.3.0) sprockets-helpers (1.1.0) sprockets (~> 2.0) - sprockets-sass (1.1.0) + sprockets-sass (1.3.1) sprockets (~> 2.0) tilt (~> 1.1) temple (0.8.0) @@ -103,21 +130,27 @@ GEM libv8 (~> 3.16.14.15) ref thor (0.20.0) + thread_safe (0.3.6) tilt (1.4.1) - uglifier (2.4.0) + tzinfo (1.2.4) + thread_safe (~> 0.1) + uber (0.0.15) + uglifier (2.7.2) execjs (>= 0.3.0) json (>= 1.8.0) + xpath (2.1.0) + nokogiri (~> 1.3) PLATFORMS ruby DEPENDENCIES - middleman (~> 3.2.0) + middleman middleman-gh-pages middleman-livereload (~> 3.3.0) middleman-syntax rake (~> 10.2.0) - redcarpet (~> 3.1.1) + redcarpet ruby18_source_location therubyracer wdm (~> 0.1.0) From 58401caaee8875bcdcf04b93c28173bbd410c886 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 28 Dec 2017 16:12:19 +0100 Subject: [PATCH 0127/2623] Use local URL --- user/status-images.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user/status-images.md b/user/status-images.md index eaf6965db40..df64bb60306 100644 --- a/user/status-images.md +++ b/user/status-images.md @@ -15,11 +15,11 @@ The URLs for status images are shown on your Travis CI Repository page: 1. Click the status image in the top right to open a dialog box containing common templates for the status image URL in markdown, html, etc. - ![add to Github](https://github.com/pgensler/docs-travis-ci-com/blob/master/images/add_Markdown_bade_github.jpg) - + ![add to Github](/images/add_Markdown_bade_github.jpg) + 2. Select the branch and template in the dialog box. -3. Copy the text and paste it into your README or website. You should now be able to view the +3. Copy the text and paste it into your README or website. You should now be able to view the Build status images for public repositories are publicly available on Travis CI. From 63cde03f0f5070443e329a64a4bf018166f1c082 Mon Sep 17 00:00:00 2001 From: Stephen Date: Thu, 28 Dec 2017 07:17:18 -0800 Subject: [PATCH 0128/2623] language cleanup --- user/reference/osx.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user/reference/osx.md b/user/reference/osx.md index b854a938fb8..f00bd34f9e7 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -84,17 +84,17 @@ Or it can result in the command not found: xctool: command not found ``` -This is intended behaviour from Homebrew's side, but you can get around it by using [`brew bundle`](https://github.com/Homebrew/homebrew-bundle) or by running first checking if the command needs an upgrade with `brew outdated` +This is intended behaviour from Homebrew's side, but you can get around it by using [`brew bundle`](https://github.com/Homebrew/homebrew-bundle) or by first checking if the command needs an upgrade with `brew outdated` #### `brew bundle` -[`brew bundle`](https://github.com/Homebrew/homebrew-bundle) uses a `Brewfile`, similar to to a Ruby `Gemfile` to install multiple dependencies. By creating a simple `Brewfile`: +[`brew bundle`](https://github.com/Homebrew/homebrew-bundle) uses a `Brewfile`, similar to to a Ruby `Gemfile` to install multiple dependencies. By creating a `Brewfile`: ``` gem 'xctool' ``` -You can then easily update and/or install all of the dependencies with the following command (which will not error if the package is already installed and up to date): +You can then update and/or install all of the dependencies with the following command (which will not error if the package is already installed and up to date): ```sh $ brew bundle From 0e83c6861910a4c4cfef9f3c3b44e818f7585e8b Mon Sep 17 00:00:00 2001 From: Stephen Date: Thu, 28 Dec 2017 09:02:56 -0800 Subject: [PATCH 0129/2623] correct brew bundle issues also use custom formatting --- user/reference/osx.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/user/reference/osx.md b/user/reference/osx.md index f00bd34f9e7..f09c21b9656 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -91,14 +91,16 @@ This is intended behaviour from Homebrew's side, but you can get around it by us [`brew bundle`](https://github.com/Homebrew/homebrew-bundle) uses a `Brewfile`, similar to to a Ruby `Gemfile` to install multiple dependencies. By creating a `Brewfile`: ``` -gem 'xctool' +brew 'xctool' ``` +{: data-file="Brewfile"} You can then update and/or install all of the dependencies with the following command (which will not error if the package is already installed and up to date): - -```sh -$ brew bundle +```yaml +before_install: + - brew update && brew bundle ``` +{: data-file=".travis.yml"} #### `brew outdated` From 2fd0b3f08b59eee9bac2dc63fb1bc56796142b79 Mon Sep 17 00:00:00 2001 From: Benjamin Milde Date: Fri, 29 Dec 2017 17:29:09 +0100 Subject: [PATCH 0130/2623] Update elixir.md Remove incorrect `.` from typical install --- user/languages/elixir.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/elixir.md b/user/languages/elixir.md index 2dacd176c79..30e31de100e 100644 --- a/user/languages/elixir.md +++ b/user/languages/elixir.md @@ -8,7 +8,7 @@ layout: en | | Default | |:------------------|:------------------------------------------| -| Typical `install` | `mix local.rebar --force; mix.local.hex --force; mix deps.get` | +| Typical `install` | `mix local.rebar --force; mix local.hex --force; mix deps.get` | | Typical `script` | `mix test` | | Matrix keys | `env`, `elixir`, `otp_release` | | Support | [Travis CI](mailto:support@travis-ci.com) | From 1625fd04b996a7e0e84c8dca484f287b5e5fb218 Mon Sep 17 00:00:00 2001 From: tduehr Date: Mon, 1 Jan 2018 08:53:49 -0600 Subject: [PATCH 0131/2623] use .test instead of .dev .dev is owned by Google and has been added to HSTS preload. It should not be used for this purpose. --- user/customizing-the-build.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/customizing-the-build.md b/user/customizing-the-build.md index 78a8f59bb83..1b187c60b6c 100644 --- a/user/customizing-the-build.md +++ b/user/customizing-the-build.md @@ -686,7 +686,7 @@ hostnames in `/etc/hosts` for both IPv4 and IPv6. ```yaml addons: hosts: - - travis.dev + - travis.test - joshkalderimis.com ``` {: data-file=".travis.yml"} From 64f53426809a6bfe519cd8d85bca0f952e1300d3 Mon Sep 17 00:00:00 2001 From: Francis Go Date: Tue, 2 Jan 2018 17:10:26 +0000 Subject: [PATCH 0132/2623] Remove extra 'the' in the Ruby guide --- user/languages/ruby.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/ruby.md b/user/languages/ruby.md index 8d0ccc3fc32..7cabd4a41a2 100644 --- a/user/languages/ruby.md +++ b/user/languages/ruby.md @@ -202,7 +202,7 @@ To test against multiple versions of dependencies: 1. Create a directory in your project's repository root where you will keep gemfiles, such as `./gemfiles`. 2. Add one or more gemfiles to it. -3. Set the the `gemfile` key in your `.travis.yml`. +3. Set the `gemfile` key in your `.travis.yml`. Thoughtbot's Paperclip is [tested against multiple ActiveRecord versions](https://github.com/thoughtbot/paperclip/blob/master/.travis.yml): From c0d0eeefdc8170688d1ad44571ce852df9cb8794 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Wed, 3 Jan 2018 12:48:17 -0500 Subject: [PATCH 0133/2623] Improve S3-based shared files example --- user/build-stages/share-files-s3.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/user/build-stages/share-files-s3.md b/user/build-stages/share-files-s3.md index 59c7c055c98..2fb0c1dc1de 100644 --- a/user/build-stages/share-files-s3.md +++ b/user/build-stages/share-files-s3.md @@ -19,21 +19,21 @@ env: before_install: # set up awscli packages - pip install --user awscli - - mkdir -p ~/shared - - aws s3 sync s3://travis-build-stages-shared-storage-test/shared ~/shared + - mkdir -p ~/$TRAVIS_BUILD_NUMBER + - aws s3 sync s3://travis-build-stages-shared-storage-test/$TRAVIS_BUILD_NUMBER ~/$TRAVIS_BUILD_NUMBER jobs: include: - stage: setup files - script: echo one | tee > ~/shared/one + script: echo one | tee > ~/$TRAVIS_BUILD_NUMBER/one - stage: setup files - script: echo two | tee > ~/shared/two + script: echo two | tee > ~/$TRAVIS_BUILD_NUMBER/two - stage: use shared files script: - - cat ~/shared/* + - cat ~/$TRAVIS_BUILD_NUMBER/* after_success: - - aws s3 sync ~/shared s3://travis-build-stages-shared-storage-test/shared + - aws s3 sync ~/$TRAVIS_BUILD_NUMBER s3://travis-build-stages-shared-storage-test/$TRAVIS_BUILD_NUMBER ``` {: data-file=".travis.yml"} From 41d012a16f601eab897c125e6cbe5e90b4a028c2 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Wed, 3 Jan 2018 12:52:56 -0500 Subject: [PATCH 0134/2623] Add step to remove the intermediate files --- user/build-stages/share-files-s3.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user/build-stages/share-files-s3.md b/user/build-stages/share-files-s3.md index 2fb0c1dc1de..3f259b3485a 100644 --- a/user/build-stages/share-files-s3.md +++ b/user/build-stages/share-files-s3.md @@ -31,6 +31,8 @@ jobs: - stage: use shared files script: - cat ~/$TRAVIS_BUILD_NUMBER/* + after_success: + - aws s3 rm --recursive s3://travis-build-stages-shared-storage-test/$TRAVIS_BUILD_NUMBER # clean up after ourselves after_success: - aws s3 sync ~/$TRAVIS_BUILD_NUMBER s3://travis-build-stages-shared-storage-test/$TRAVIS_BUILD_NUMBER From 6eb6a9390a8441d4bd6588a5c9bdf89b6158bafc Mon Sep 17 00:00:00 2001 From: Sviatoslav Sydorenko Date: Thu, 4 Jan 2018 18:34:21 +0200 Subject: [PATCH 0135/2623] Add info about new behavior of Pages provider Ref travis-ci/dpl#719 --- user/deployment/pages.md | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/user/deployment/pages.md b/user/deployment/pages.md index 806dc223eab..d9471208a65 100644 --- a/user/deployment/pages.md +++ b/user/deployment/pages.md @@ -4,7 +4,7 @@ layout: en --- -> Deploying to GitHub Pages uses `git push --force` to overwrite the history on the *target* branch, so make sure you only deploy to a branch used for that specific purpose, such as `gh-pages`. +> Deploying to GitHub Pages uses `git push --force` to overwrite the history on the *target* branch, so make sure you only deploy to a branch used for that specific purpose, such as `gh-pages`. It is *possible* to disable this "force push" behavior by setting `keep-history` option to `true`. Travis CI can deploy your static files to [GitHub Pages](https://pages.github.com/) after a successful build. @@ -18,14 +18,15 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: pages - skip_cleanup: true - github_token: $GITHUB_TOKEN # Set in travis-ci.org dashboard + skip-cleanup: true + github-token: $GITHUB_TOKEN # Set in travis-ci.org dashboard, marked secure + keep-history: true on: branch: master ``` {: data-file=".travis.yml"} -> Make sure you have `skip_cleanup` set to true, otherwise Travis CI will delete +> Make sure you have `skip-cleanup` set to `true`, otherwise Travis CI will delete > all the files created during the build, which will probably delete what you are > trying to upload. @@ -42,12 +43,20 @@ or via [encrypted variables in ## Further configuration -* `local_dir`: Directory to push to GitHub Pages, defaults to the current - directory (example: `${TRAVIS_BUILD_DIR}/yourfolder`) +* `local-dir`: Directory to push to GitHub Pages, relative to the current + directory, defaults to the current directory (example: `your_build_folder`) * `repo`: Repo slug, defaults to current repo -* `target_branch`: Branch to force push to, defaults to `gh-pages` -* `fqdn`: Optional, sets a custom domain for your website, defaults to no custom domain support. -* `project_name`: Defaults to value of `fqdn` or repo slug, used for metadata -* `email`: Optional, comitter info, defaults to `deploy@travis-ci.org` -* `name`: Optional, comitter, defaults to `Deployment Bot` -* `github_url`: Optional, the URL of the self-hosted GitHub enterprise, defaults to `github.com` +* `target-branch`: Branch to (force, see: `keep-history`) push `local-dir` + contents to, defaults to `gh-pages` +* `keep-history`: Optional, create incremental commit instead of doing push + force, defaults to `false`. +* `fqdn`: Optional, sets a custom domain for your website, defaults to no custom domain support +* `project-name`: Defaults to value of `fqdn` or repo slug, used for metadata +* `email`: Optional, committer info, defaults to `deploy@travis-ci.org` +* `name`: Optional, committer, defaults to `Deployment Bot` +* `committer-from-gh`: Optional, defaults to `false`. Allows to use token's + owner name and email for commit. Overrides `email` and `name` options. +* `allow-empty-commit`: Optional, defaults to `false`. Enabled if only + `keep-history` is `true`. +* `github-url`: Optional, the URL of the self-hosted GitHub enterprise, defaults to `github.com` +* `verbose`: Optional, be verbose about internal steps, defaults to `false`. From 3869dcdda590847028366bdacb7e422dce3cc74a Mon Sep 17 00:00:00 2001 From: Kristofer Svardstal Date: Thu, 4 Jan 2018 12:50:00 -0500 Subject: [PATCH 0136/2623] Update script.md Based upon this conversation: https://twitter.com/rossjones/status/946330472967233536 End user suggested that we add a note stating that it is experimental. I agree, so adding. :) --- user/deployment/script.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/deployment/script.md b/user/deployment/script.md index a6e9438a311..4f1725afdc9 100644 --- a/user/deployment/script.md +++ b/user/deployment/script.md @@ -5,7 +5,7 @@ layout: en --- If your deployment needs more customization than the `after_success` method allows, -use a custom script. +use a custom script. Do note that custom scripts are still considered an experimental feature. The following example runs `scripts/deploy.sh` on the `develop` branch of your repository if the build is successful. From c4d4d73d2523cd57e9feebf69365a0a3edca144e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SZEDER=20G=C3=A1bor?= Date: Sat, 6 Jan 2018 00:21:20 +0100 Subject: [PATCH 0137/2623] caching: Travis CI fetches the cache of the default branch The documentation states that "If a branch does not have its own cache, Travis CI fetches the master branch cache". However, this is not quite true: it fetches the cache of the repository's default branch, whatever it is called. While the default branch is indeed called 'master' in most repositories, that's not always the case. --- user/caching.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/caching.md b/user/caching.md index 4d0ed99fd73..35582021243 100644 --- a/user/caching.md +++ b/user/caching.md @@ -13,7 +13,7 @@ Travis CI can cache content that does not often change, to speed up your build p *ON*. * Travis CI fetches the cache for every build, including branches and pull requests. -* If a branch does not have its own cache, Travis CI fetches the master branch cache. +* If a branch does not have its own cache, Travis CI fetches the cache of the repository's default branch. * There is one cache per branch and language version/ compiler version/ JDK version/ Gemfile location/ etc. * Only modifications made to the cached directories from normal pushes are stored. From 2b4450500d2f1741969b7d4f41ad709ee2ce44f7 Mon Sep 17 00:00:00 2001 From: Josh Sherman Date: Sun, 7 Jan 2018 22:28:06 -0600 Subject: [PATCH 0138/2623] Add `-L` flag to `curl` command The URL to download `phpunit` is returning a 302 status code and the `curl` command was failing to download the file. Added the `-L` flag to tell `curl` to follow to the new location. --- user/languages/php.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/php.md b/user/languages/php.md index 6a22b7e38b6..cb3f48bff8b 100644 --- a/user/languages/php.md +++ b/user/languages/php.md @@ -93,7 +93,7 @@ Please note that if you want to run PHPUnit on HHVM, you have to explicitly inst ```yaml before_script: - - curl -sSf -o ~/.phpenv/versions/hhvm/bin/phpunit https://phar.phpunit.de/phpunit-5.7.phar + - curl -sSfL -o ~/.phpenv/versions/hhvm/bin/phpunit https://phar.phpunit.de/phpunit-5.7.phar ``` {: data-file=".travis.yml"} From 310bae550e36b0bed2c95a5cb767c48a272b71db Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 8 Jan 2018 09:20:43 -0500 Subject: [PATCH 0139/2623] Fix rubygems.org links --- user/deployment/rubygems.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/deployment/rubygems.md b/user/deployment/rubygems.md index f371432965d..cedd6204b25 100644 --- a/user/deployment/rubygems.md +++ b/user/deployment/rubygems.md @@ -30,7 +30,7 @@ deploy: If you tag a commit locally, remember to run `git push --tags` to ensure that your tags are uploaded to GitHub. -You can retrieve your api key by following [these instructions](http://guides.rubygems.org/rubygems-org-api/). It is recommended to encrypt that key. +You can retrieve your api key by following [these instructions](http://guides.rubygems.org/rubygems-org-api). It is recommended to encrypt that key. Assuming you have the Travis CI command line client installed, you can do it like this: ```bash @@ -49,7 +49,7 @@ Keep in mind that the above command has to run in your project directory, so it ## Pre-releasing -Instead of releasing for each new version of your gem, you can have Travis CI create a [prerelease](http://guides.rubygems.org/patterns/#prerelease_gems) for each build. +Instead of releasing for each new version of your gem, you can have Travis CI create a [prerelease](http://guides.rubygems.org/patterns#prerelease-gems) for each build. This gives your gem's users the option to download a newer, possibly more unstable version of your gem. From 0cd480141241518e6650b6e0bed5b2d577d02d06 Mon Sep 17 00:00:00 2001 From: Ian Date: Tue, 9 Jan 2018 11:34:06 -0500 Subject: [PATCH 0140/2623] Note that PlatformIO is a paid service and not a free program PlatformIO charges a monthly subscription fee for unit testing. --- user/integration/platformio.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/integration/platformio.md b/user/integration/platformio.md index fefde8e7521..150223693cd 100644 --- a/user/integration/platformio.md +++ b/user/integration/platformio.md @@ -8,7 +8,7 @@ layout: en ## Overview -[PlatformIO](http://platformio.org/) is a cross-platform code-builder and library manager for embedded development with no external dependencies. Using PlatformIO you can test your code on multiple platforms, frameworks and boards: +[PlatformIO](http://platformio.org/) is a [paid service](http://platformio.org/pricing) that offers a free cross-platform code-builder and library manager for embedded development with no external dependencies. Using PlatformIO you can compile your code on multiple platforms, frameworks and boards (although unit testing requires a [paid monthly subscription): - *Platforms* - pre-built different development platforms for the most popular host OS (Mac OS X, Windows, Linux 32/64bit, Linux ARMv6+). Each of them includes compiler, debugger, uploader, etc: From 99e1b1eac19310f7aac7da32e5ef55a752867367 Mon Sep 17 00:00:00 2001 From: Ian Date: Tue, 9 Jan 2018 11:35:31 -0500 Subject: [PATCH 0141/2623] Fix typo --- user/integration/platformio.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/integration/platformio.md b/user/integration/platformio.md index 150223693cd..bfdd87a7919 100644 --- a/user/integration/platformio.md +++ b/user/integration/platformio.md @@ -8,7 +8,7 @@ layout: en ## Overview -[PlatformIO](http://platformio.org/) is a [paid service](http://platformio.org/pricing) that offers a free cross-platform code-builder and library manager for embedded development with no external dependencies. Using PlatformIO you can compile your code on multiple platforms, frameworks and boards (although unit testing requires a [paid monthly subscription): +[PlatformIO](http://platformio.org/) is a [paid service](http://platformio.org/pricing) that offers a free cross-platform code-builder and library manager for embedded development with no external dependencies. Using PlatformIO you can compile your code on multiple platforms, frameworks and boards (although unit testing requires a paid monthly subscription): - *Platforms* - pre-built different development platforms for the most popular host OS (Mac OS X, Windows, Linux 32/64bit, Linux ARMv6+). Each of them includes compiler, debugger, uploader, etc: From d6e591ee3898bb7c6f46ae28975db3eaef65459b Mon Sep 17 00:00:00 2001 From: Anna Nagy Date: Tue, 9 Jan 2018 16:02:18 -0500 Subject: [PATCH 0142/2623] add enterprise docker version mismatch error to ops manual --- user/enterprise/operations-manual.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 85be985ad91..0625d32053b 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -43,11 +43,11 @@ The files are located at `/var/travis` on the platform machine. Please run `sudo ### The problem -In the Travis CI Web UI you see none of the builds are starting. They're either in no state or `queued`. Cancelling and restarting them doesn't make any difference. +In the Travis CI Web UI you see none of the builds are starting. They're either in no state or `queued`. Canceling and restarting them doesn't make any difference. ### Strategies -There are a few different strategies to make your builds start. Please try each one in order. +There are a few different potential approaches which may help get builds running again. Please try each one in order. #### Connection to RabbitMQ got lost @@ -83,9 +83,14 @@ $ sudo restart travis-worker #### Ports are not open Security groups / firewall A source for the problem could be that the worker machine is not able to communicate with the platform machine. + Here we're distinguishing between an AWS EC2 installation and an installation running on other hardware. For the former, security groups need to be configured per machine. To do so, please follow our installation instructions [here](/user/enterprise/installation/#11-Create-a-Security-Group). If you're not using AWS EC2, please make sure that the ports listed [in the docs](/user/enterprise/installation/#11-Create-a-Security-Group) are open in your firewall. -If none of the steps above lead to results for you, please follow the steps in [#Contact-support](#Contact-support) to move forward. +#### Docker Versions Mismatched + +Upon inspecting the `travis-worker.log` file, you may notice an error: `Error response from daemon:client and server don't have same version`, which is especially common on workers installed before November 2017 or systems running a `docker version` before `17.06.2-ce`. For this issue, we recommend [re-installing worker from scratch](/user/enterprise/installation/#2.1.-Install-Travis-CI-Worker-on-the-second-host) on a fresh instance. Please note: the default build environment images will be pulled and you may need to apply customizations again as well. + +If none of the steps above lead to results for you, please follow the steps in the [Contact Support](#Contact-support) section below to move forward. ## Contact support From 1f9815169d86889cd540eeed15cb377ebd1d1662 Mon Sep 17 00:00:00 2001 From: Anna Nagy Date: Wed, 10 Jan 2018 08:31:18 -0500 Subject: [PATCH 0143/2623] wording edits to docker mismatch error in ops manual --- user/enterprise/operations-manual.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 0625d32053b..249523baa0a 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -88,7 +88,7 @@ Here we're distinguishing between an AWS EC2 installation and an installation ru #### Docker Versions Mismatched -Upon inspecting the `travis-worker.log` file, you may notice an error: `Error response from daemon:client and server don't have same version`, which is especially common on workers installed before November 2017 or systems running a `docker version` before `17.06.2-ce`. For this issue, we recommend [re-installing worker from scratch](/user/enterprise/installation/#2.1.-Install-Travis-CI-Worker-on-the-second-host) on a fresh instance. Please note: the default build environment images will be pulled and you may need to apply customizations again as well. +This issue sometimes occurs after maintenance on workers installed before November 2017 or systems running a `docker version` before `17.06.2-ce`. When this happens, the `/var/log/upstart/travis-worker.log` file contains a line: `Error response from daemon:client and server don't have same version`. For this issue, we recommend [re-installing worker from scratch](/user/enterprise/installation/#2.1.-Install-Travis-CI-Worker-on-the-second-host) on a fresh instance. Please note: the default build environment images will be pulled and you may need to apply customizations again as well. If none of the steps above lead to results for you, please follow the steps in the [Contact Support](#Contact-support) section below to move forward. From 74a2971cd38eb5250ba0a2f9cb3c35298290097a Mon Sep 17 00:00:00 2001 From: Anna Nagy Date: Wed, 10 Jan 2018 10:34:46 -0500 Subject: [PATCH 0144/2623] start changing installation anchors --- user/enterprise/installation.md | 27 ++++++--------------------- user/enterprise/operations-manual.md | 2 +- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/user/enterprise/installation.md b/user/enterprise/installation.md index 8be797469be..f519a697f52 100644 --- a/user/enterprise/installation.md +++ b/user/enterprise/installation.md @@ -18,14 +18,14 @@ and information on obtaining a [license](/user/enterprise/prerequisites/#License
-## 1. Setting up the Travis CI Enterprise Platform +## Setting up the Travis CI Enterprise Platform The Travis CI Enterprise Platform handles licensing, coordinates worker processes, and maintains the Enterprise user and admin dashboard. It must be installed on it's own machine instance, separate from that of the Travis CI Enterprise worker. -### 1.1. Create a Security Group +### Create a Travis CI Platform Security Group If you're setting up your AMI for the first time you need to create a Security Group. From the EC2 management console, create an entry for @@ -40,7 +40,7 @@ each port in the table below: | 80 | HTTP | Web application access. | | 22 | SSH | SSH access. | -### 1.2. Install Travis CI Enterprise Platform on the first host +### Install Travis CI Enterprise Platform Before running the installation script, we recommend downloading and reading it. When you're ready to run it on the host, run one of the following pairs of @@ -63,13 +63,13 @@ installation's hostname, port 8800) to complete the setup. From here you can upload your license key, add your GitHub OAuth details, and optionally upload an SSL certificate and enter SMTP details. -## 2. Setting up Travis CI Enterprise Worker +## Install Travis CI Enterprise Worker The Travis CI Enterprise Worker manages build containers and reports build statuses back to the platform. It must be installed on a separate machine instance from the Platform. -### 2.1. Create a Security Group +### Create a Travis CI Worker Security Group If you're setting up your AMI for the first time you will need to create a Security Group. From the EC2 management console, create an entry for @@ -79,7 +79,7 @@ each port in the table below: |:-----|:--------|:------------| | 22 | SSH | SSH access. | -## 2.1. Install Travis CI Worker on the second host +## Install Travis CI Worker 1. From the Travis CI Enterprise Platform management UI under Settings, retrieve the RabbitMQ password and the hostname for your Travis CI Enterprise @@ -123,18 +123,3 @@ specified as follows: ``` export http_proxy="http://proxy.mycompany.corp:8080/" ``` - -## Backups - - - -We recommend a weekly machine snapshot and weekly backups of `/etc/travis` and -`/var/travis`. - -One good way to do this is to run -``` - sudo tar -cvzf travis-backup-$(date +%s).tar.gz /var/travis /etc/travis/ -``` - -Doing a machine snapshot and backing up those directories before performing an -update is recommended as well. diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 249523baa0a..0efe914167a 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -88,7 +88,7 @@ Here we're distinguishing between an AWS EC2 installation and an installation ru #### Docker Versions Mismatched -This issue sometimes occurs after maintenance on workers installed before November 2017 or systems running a `docker version` before `17.06.2-ce`. When this happens, the `/var/log/upstart/travis-worker.log` file contains a line: `Error response from daemon:client and server don't have same version`. For this issue, we recommend [re-installing worker from scratch](/user/enterprise/installation/#2.1.-Install-Travis-CI-Worker-on-the-second-host) on a fresh instance. Please note: the default build environment images will be pulled and you may need to apply customizations again as well. +This issue sometimes occurs after maintenance on workers installed before November 2017 or systems running a `docker version` before `17.06.2-ce`. When this happens, the `/var/log/upstart/travis-worker.log` file contains a line: `Error response from daemon:client and server don't have same version`. For this issue, we recommend [re-installing worker from scratch](/user/enterprise/installation/install-travis-ci-enterprise-worker) on a fresh instance. Please note: the default build environment images will be pulled and you may need to apply customizations again as well. If none of the steps above lead to results for you, please follow the steps in the [Contact Support](#Contact-support) section below to move forward. From 8d1d86ad794ec2bc8ca8eb17e185cca987489728 Mon Sep 17 00:00:00 2001 From: Anna Nagy Date: Wed, 10 Jan 2018 10:42:36 -0500 Subject: [PATCH 0145/2623] update links... --- user/enterprise/operations-manual.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 0efe914167a..12433ee5dd7 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -84,7 +84,7 @@ $ sudo restart travis-worker A source for the problem could be that the worker machine is not able to communicate with the platform machine. -Here we're distinguishing between an AWS EC2 installation and an installation running on other hardware. For the former, security groups need to be configured per machine. To do so, please follow our installation instructions [here](/user/enterprise/installation/#11-Create-a-Security-Group). If you're not using AWS EC2, please make sure that the ports listed [in the docs](/user/enterprise/installation/#11-Create-a-Security-Group) are open in your firewall. +Here we're distinguishing between an AWS EC2 installation and an installation running on other hardware. For the former, security groups need to be configured per machine. To do so, please follow our installation instructions [here](/user/enterprise/installation/#create-a-travis-ci-enterprise-security-group). If you're not using AWS EC2, please make sure that the ports listed [in the docs](/user/enterprise/installation/#create-a-travis-ci-enterprise-security-group) are open in your firewall. #### Docker Versions Mismatched From f5c0bed7dd84f51484b4d6bbf195e988010e4e5d Mon Sep 17 00:00:00 2001 From: Anna Nagy Date: Wed, 10 Jan 2018 10:55:03 -0500 Subject: [PATCH 0146/2623] fix ops manual links? --- user/enterprise/operations-manual.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 12433ee5dd7..7a6f5d65f41 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -84,11 +84,11 @@ $ sudo restart travis-worker A source for the problem could be that the worker machine is not able to communicate with the platform machine. -Here we're distinguishing between an AWS EC2 installation and an installation running on other hardware. For the former, security groups need to be configured per machine. To do so, please follow our installation instructions [here](/user/enterprise/installation/#create-a-travis-ci-enterprise-security-group). If you're not using AWS EC2, please make sure that the ports listed [in the docs](/user/enterprise/installation/#create-a-travis-ci-enterprise-security-group) are open in your firewall. +Here we're distinguishing between an AWS EC2 installation and an installation running on other hardware. For the former, security groups need to be configured per machine. To do so, please follow our installation instructions [here](/user/enterprise/installation/#Create-a-Travis-CI-Platform-Security-Group). If you're not using AWS EC2, please make sure that the ports listed [in the docs](/user/enterprise/installation/#Create-a-Travis-CI-Platform-Security-Group) are open in your firewall. #### Docker Versions Mismatched -This issue sometimes occurs after maintenance on workers installed before November 2017 or systems running a `docker version` before `17.06.2-ce`. When this happens, the `/var/log/upstart/travis-worker.log` file contains a line: `Error response from daemon:client and server don't have same version`. For this issue, we recommend [re-installing worker from scratch](/user/enterprise/installation/install-travis-ci-enterprise-worker) on a fresh instance. Please note: the default build environment images will be pulled and you may need to apply customizations again as well. +This issue sometimes occurs after maintenance on workers installed before November 2017 or systems running a `docker version` before `17.06.2-ce`. When this happens, the `/var/log/upstart/travis-worker.log` file contains a line: `Error response from daemon:client and server don't have same version`. For this issue, we recommend [re-installing worker from scratch](/user/enterprise/installation/#Install-Travis-CI-Enterprise-Worker) on a fresh instance. Please note: the default build environment images will be pulled and you may need to apply customizations again as well. If none of the steps above lead to results for you, please follow the steps in the [Contact Support](#Contact-support) section below to move forward. From dc56516c27d14fb7b668ce35c90152690532d163 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Wed, 10 Jan 2018 11:31:29 -0500 Subject: [PATCH 0147/2623] Explain use of `pg_config` --- user/database-setup.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/user/database-setup.md b/user/database-setup.md index 81b681436e3..58045de15d1 100644 --- a/user/database-setup.md +++ b/user/database-setup.md @@ -199,6 +199,23 @@ before_install: ``` {: data-file=".travis.yml"} +### Using `pg_config` + +If your builds rely on the use of the `pg_config` command, you need to install an additional +apt package `postgresql-server-dev-X.Y` for the version of PostgreSQL you are using in order +to obtain meaningful output from the command. + +For example: + +```yaml +addons: + apt: + packages: + - postgresql-server-dev-9.4 +``` + +See [this GitHub issue](https://github.com/travis-ci/travis-ci/issues/9011) for additional details. + ## MariaDB MariaDB is a community-developed fork of MySQL. It is available as an addon on Travis CI. From a1fa0a5000b5f3b8927f753868c76a4dca63172f Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Thu, 11 Jan 2018 17:05:11 +0100 Subject: [PATCH 0148/2623] Dont over emphasize free/paid --- user/integration/platformio.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/user/integration/platformio.md b/user/integration/platformio.md index bfdd87a7919..9b0ccd4ac7c 100644 --- a/user/integration/platformio.md +++ b/user/integration/platformio.md @@ -8,7 +8,7 @@ layout: en ## Overview -[PlatformIO](http://platformio.org/) is a [paid service](http://platformio.org/pricing) that offers a free cross-platform code-builder and library manager for embedded development with no external dependencies. Using PlatformIO you can compile your code on multiple platforms, frameworks and boards (although unit testing requires a paid monthly subscription): +[PlatformIO](http://platformio.org/) is a cross-platform code-builder and library manager for embedded development with no external dependencies. Using PlatformIO you can compile your code on multiple platforms, frameworks and boards. Unit testing requires a [monthly subscription](http://platformio.org/pricing). - *Platforms* - pre-built different development platforms for the most popular host OS (Mac OS X, Windows, Linux 32/64bit, Linux ARMv6+). Each of them includes compiler, debugger, uploader, etc: @@ -28,7 +28,8 @@ layout: en - *Embedded* - pre-defined compilation profiles for a variety of embedded boards. - \+ [Full list](http://platformio.org/#!/boards) at PlatformIO + +[Full list](http://platformio.org/#!/boards) at PlatformIO ## .travis.yml Settings From 801cedc8f14cde6f37085cef1a7f0647ac8e7b81 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 11 Jan 2018 17:22:47 +0100 Subject: [PATCH 0149/2623] Detangling the mess? Or making things worse? --- images/ui/what-infrastructure-blank.png | Bin 0 -> 43526 bytes images/ui/what-infrastructure.png | Bin 0 -> 49152 bytes user/reference/overview.md | 41 +++++++++++++++++++++--- 3 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 images/ui/what-infrastructure-blank.png create mode 100644 images/ui/what-infrastructure.png diff --git a/images/ui/what-infrastructure-blank.png b/images/ui/what-infrastructure-blank.png new file mode 100644 index 0000000000000000000000000000000000000000..27753bff338d6fde34b14b7fc8956b156eb543e4 GIT binary patch literal 43526 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 literal 0 HcmV?d00001 diff --git a/user/reference/overview.md b/user/reference/overview.md index 72eca81cbc7..83b803f6e88 100644 --- a/user/reference/overview.md +++ b/user/reference/overview.md @@ -16,13 +16,23 @@ Travis CI can run your builds, and why you might want to pick one over another. ## Virtualization environments -Each build runs in one of the following virtual environments: +Each build runs in one of the following virtual environments. -- Sudo-enabled: a sudo enabled, full virtual machine per build. Running either Linux [Ubuntu Precise 12.04](/user/reference/precise/) or [Ubuntu Trusty 14.04](/user/reference/trusty/) -- Container-based: Fast boot time environment in which `sudo` commands are not available. Running Linux [Ubuntu Trusty 14.04](/user/reference/trusty/) -- [OS X](/user/reference/osx/): for Objective-C and other OS X specific projects +### Sudo-enabled -The following table summarizes the differences between the virtual environments: +A sudo enabled, full virtual machine per build, that runs Linux, either [Ubuntu Precise 12.04](/user/reference/precise/) or [Ubuntu Trusty 14.04](/user/reference/trusty/). + +### Container-based + +A fast boot time environment in which `sudo` commands are not available. Running Linux [Ubuntu Trusty 14.04](/user/reference/trusty/) + +### OS X + +An [OS X](/user/reference/osx/) environment for Objective-C and other OS X specific projects + +### Virtualisation Environment vs Operating System + +The following table summarizes the differences across virtual environments and operating systems: | | Ubuntu Precise | Ubuntu Trusty | Ubuntu Trusty | [OS X](/user/reference/osx/) | |:-----------------|:--------------------------------------|:----------------------------------|:-------------------------------------|:-----------------------------| @@ -37,6 +47,27 @@ The following table summarizes the differences between the virtual environments: | Memory | 7.5 GB | 4 GB max | 7.5 GB | 4 GB | | Cores | ~2, bursted | 2 | ~2, bursted | 2 | +## What infrastructure is my environment running on? + +The short answer is, it depends. +More specifically, usually you have one of these two questions: + +* you want to see what infrastructure a [finished build](#For-a-finished-build) ran on. +* you want to determine what infrastructure a [particular `.travis.yml` configuration](#For-a-particular-.travis.yml-configuration) will run on. + +### For a finished build + +To see what infrastructure a finished build ran on, look at the *hostname* at the top of the build log: + +![Infrastructure shown in hostname](/images/ui/what-infrastructure.png "Infrastructure shown in hostname") + +if it contains: + +* `ec2`, as in the previous example → the build ran in a container-based environment on Amazon EC2. +* `gce` → the build ran in a sudo-enabled environment on Google Cloud Engine. +* `jupiter` → macOS + +### For a particular .travis.yml configuration ## Deprecated Virtualization Environments From 304b182b549e78c74dbd651a5c4b47bf4f586144 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 11 Jan 2018 17:28:39 +0100 Subject: [PATCH 0150/2623] Minor fixes --- user/reference/overview.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/user/reference/overview.md b/user/reference/overview.md index 83b803f6e88..87d925b21dc 100644 --- a/user/reference/overview.md +++ b/user/reference/overview.md @@ -49,8 +49,9 @@ The following table summarizes the differences across virtual environments and o ## What infrastructure is my environment running on? -The short answer is, it depends. -More specifically, usually you have one of these two questions: +Usually, knowing the virtualization environment charactistics from the [table above](#Virtualisation-Evironment-vs-Operating-System) is sufficient. + +But, if you do need more detail, you have one of these two questions: * you want to see what infrastructure a [finished build](#For-a-finished-build) ran on. * you want to determine what infrastructure a [particular `.travis.yml` configuration](#For-a-particular-.travis.yml-configuration) will run on. From 4cce6d47328bf9affa9eb2fa7da32670c6cf1106 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 11 Jan 2018 17:40:27 +0100 Subject: [PATCH 0151/2623] link fix --- user/reference/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/overview.md b/user/reference/overview.md index 87d925b21dc..e01a1c424bb 100644 --- a/user/reference/overview.md +++ b/user/reference/overview.md @@ -49,7 +49,7 @@ The following table summarizes the differences across virtual environments and o ## What infrastructure is my environment running on? -Usually, knowing the virtualization environment charactistics from the [table above](#Virtualisation-Evironment-vs-Operating-System) is sufficient. +Usually, knowing the virtualization environment charactistics from the [table above](#Virtualisation-Environment-vs-Operating-System) is sufficient. But, if you do need more detail, you have one of these two questions: From faf6d74f3c260fdac316cd341cf574c034848792 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Fri, 12 Jan 2018 13:05:16 +0100 Subject: [PATCH 0152/2623] Dont index the button --- _layouts/en.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/en.html b/_layouts/en.html index 5ce32a0d6c7..2f514a06ace 100644 --- a/_layouts/en.html +++ b/_layouts/en.html @@ -14,7 +14,7 @@
{% unless page.no_header %} - +

{{ page.title }}

{% endunless %} {{ content }} From 246be14fe5b81da5867dcb1b9c084b0b0aad8fe0 Mon Sep 17 00:00:00 2001 From: Keith Dahlby Date: Tue, 16 Jan 2018 08:59:56 -0600 Subject: [PATCH 0153/2623] Clarify what the branch attribute means for PRs --- user/conditional-builds-stages-jobs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/conditional-builds-stages-jobs.md b/user/conditional-builds-stages-jobs.md index 5c90201a5e5..27fee765b02 100644 --- a/user/conditional-builds-stages-jobs.md +++ b/user/conditional-builds-stages-jobs.md @@ -99,7 +99,7 @@ Known attributes are: * `type` (the current event type, known event types are: `push`, `pull_request`, `api`, `cron`) * `repo` (the current repository slug `owner_name/name`) -* `branch` (the current branch name) +* `branch` (the current branch name; for pull requests: the base branch name) * `tag` (the current tag name) * `sender` (the event sender's login name) * `fork` (`true` or `false` depending if the repository is a fork) From fe83996e78badf3357404f1cd3035aad5c0440fa Mon Sep 17 00:00:00 2001 From: James Harrison Fisher Date: Fri, 19 Jan 2018 11:59:12 +0000 Subject: [PATCH 0154/2623] Clarify encryption scheme using notes from https://github.com/travis-ci/travis-ci/issues/2982 --- user/encryption-keys.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/user/encryption-keys.md b/user/encryption-keys.md index 4166acba8d1..0f0f302cfc8 100644 --- a/user/encryption-keys.md +++ b/user/encryption-keys.md @@ -6,13 +6,14 @@ layout: en **We have separate documentation on [encrypting files](/user/encrypting-files/).** -Travis CI generates a pair of private and public RSA keys which can be used -to encrypt information which you will want to put into the `.travis.yml` file and -still keep it private. Currently we allow encryption of -[environment variables](/user/environment-variables/), notification settings, and deploy api keys. +A repository's `.travis.yml` file can have "encrypted values", such as [environment variables](/user/environment-variables/), notification settings, and deploy api keys. These encrypted values can be added by anyone, but are only readable by Travis CI. The repository owner does not keep any secret key material. **Please note that encrypted environment variables are not available for [pull requests from forks](/user/pull-requests#Pull-Requests-and-Security-Restrictions).** +## Encryption scheme + +Travis CI uses asymmetric cryptography. For each registered repository, Travis CI generates an RSA keypair. Travis CI keeps the private key private, but makes the repository's public key available to everyone. For example, the GitHub repository `foo/bar` has its public key available at `https://api.travis-ci.org/repos/foo/bar/key`. Anyone can run `travis encrypt` for any repository, which encrypts the arguments using the repository's public key. Therefore, `foo/bar`'s encrypted values can be decrypted by Travis CI, using `foo/bar`'s private key, but the values cannot be decrypted by anyone else (even the "owner" of the `foo/bar` repository!). + ## Usage The easiest way to encrypt something with the public key is to use Travis CLI. From a9de2456c9c3a1378e4e359d470d9a405b006c10 Mon Sep 17 00:00:00 2001 From: James Harrison Fisher Date: Fri, 19 Jan 2018 12:00:58 +0000 Subject: [PATCH 0155/2623] also not readable by encrypter --- user/encryption-keys.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/encryption-keys.md b/user/encryption-keys.md index 0f0f302cfc8..dbbd6d41c29 100644 --- a/user/encryption-keys.md +++ b/user/encryption-keys.md @@ -12,7 +12,7 @@ A repository's `.travis.yml` file can have "encrypted values", such as [environm ## Encryption scheme -Travis CI uses asymmetric cryptography. For each registered repository, Travis CI generates an RSA keypair. Travis CI keeps the private key private, but makes the repository's public key available to everyone. For example, the GitHub repository `foo/bar` has its public key available at `https://api.travis-ci.org/repos/foo/bar/key`. Anyone can run `travis encrypt` for any repository, which encrypts the arguments using the repository's public key. Therefore, `foo/bar`'s encrypted values can be decrypted by Travis CI, using `foo/bar`'s private key, but the values cannot be decrypted by anyone else (even the "owner" of the `foo/bar` repository!). +Travis CI uses asymmetric cryptography. For each registered repository, Travis CI generates an RSA keypair. Travis CI keeps the private key private, but makes the repository's public key available to everyone. For example, the GitHub repository `foo/bar` has its public key available at `https://api.travis-ci.org/repos/foo/bar/key`. Anyone can run `travis encrypt` for any repository, which encrypts the arguments using the repository's public key. Therefore, `foo/bar`'s encrypted values can be decrypted by Travis CI, using `foo/bar`'s private key, but the values cannot be decrypted by anyone else (not even the encrypter, or "owner" of the `foo/bar` repository!). ## Usage From 2d65f508acab873efc64665d97342d7da1be34b9 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Fri, 19 Jan 2018 14:04:49 -0500 Subject: [PATCH 0156/2623] Explain use of chrome on containers --- user/chrome.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/user/chrome.md b/user/chrome.md index 868fbd2b18d..7d748a1e92a 100644 --- a/user/chrome.md +++ b/user/chrome.md @@ -11,6 +11,7 @@ The Google Chrome addon allows Travis CI builds to install Google Chrome at run You can install the `stable` or the `beta` version of Chrome but you can't select a specific numeric version. ```yaml +sudo: required addons: chrome: stable ``` @@ -19,3 +20,18 @@ addons: ## Headless mode You can use Google Chrome in [headless mode](/user/gui-and-headless-browsers/#Using-the-Chrome-addon-in-the-headless-mode). + +## Sandboxing + +For security reasons, Google Chrome is unable to provide sandboxing when it is running in the +[container-based environment](https://docs.travis-ci.com/user/reference/overview/#Virtualization-environments). + +To use Chrome in the container-based environment, pass `--no-sandbox` when invoking the `chrome` command. + +```yaml +sudo: false +addons: + chrome: stable +script: + - chrome --no-sandbox + From 3f08aa6a80732a32cfd5974e7c8f356c995d06e0 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Fri, 19 Jan 2018 14:13:52 -0500 Subject: [PATCH 0157/2623] Fix markup in the last snippet --- user/chrome.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/chrome.md b/user/chrome.md index 7d748a1e92a..414673304a9 100644 --- a/user/chrome.md +++ b/user/chrome.md @@ -34,4 +34,5 @@ addons: chrome: stable script: - chrome --no-sandbox - +``` +{: data-file=".travis.yml"} From 531f0c624ce8164ea7460042e421735bfa94d18c Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Fri, 19 Jan 2018 14:44:17 -0500 Subject: [PATCH 0158/2623] Add details on how to pass `--no-sandbox` --- user/chrome.md | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/user/chrome.md b/user/chrome.md index 414673304a9..0820bf09a4d 100644 --- a/user/chrome.md +++ b/user/chrome.md @@ -26,13 +26,35 @@ You can use Google Chrome in [headless mode](/user/gui-and-headless-browsers/#Us For security reasons, Google Chrome is unable to provide sandboxing when it is running in the [container-based environment](https://docs.travis-ci.com/user/reference/overview/#Virtualization-environments). -To use Chrome in the container-based environment, pass `--no-sandbox` when invoking the `chrome` command. - -```yaml -sudo: false -addons: - chrome: stable -script: - - chrome --no-sandbox -``` +To use Chrome in the container-based environment: + +1. +1. Pass `--no-sandbox` when invoking the `chrome` command. + + ```yaml + sudo: false + addons: + chrome: stable + script: + - chrome --no-sandbox + ``` {: data-file=".travis.yml"} + Your testing framework may have a different mechanism to supply this flag to the `chrome` executable. + For example, with [the customlauncher plugin for Karma](https://github.com/karma-runner/karma-chrome-launcher), you would add it to the `flags` array: + + ```javascript + module.exports = function(config) { + config.set({ + browsers: ['Chrome', 'ChromeHeadless', 'ChromeHeadlessNoSandbox'], + + // you can define custom flags + customLaunchers: { + Chrome_no_sandbox: { + base: 'ChromeHeadless', + flags: ['--no-sandbox'] + } + } + }) + } + ``` + Please consult your tool's documentation for further details on how to add the `--no-sandbox` flag. From 6e89cc4a34a6a6a3268b664e4423902788cac08c Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Fri, 19 Jan 2018 14:45:27 -0500 Subject: [PATCH 0159/2623] Fix itemization in ordered list --- user/chrome.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/user/chrome.md b/user/chrome.md index 0820bf09a4d..c1a97e14543 100644 --- a/user/chrome.md +++ b/user/chrome.md @@ -28,7 +28,6 @@ For security reasons, Google Chrome is unable to provide sandboxing when it is r To use Chrome in the container-based environment: -1. 1. Pass `--no-sandbox` when invoking the `chrome` command. ```yaml @@ -39,7 +38,7 @@ To use Chrome in the container-based environment: - chrome --no-sandbox ``` {: data-file=".travis.yml"} - Your testing framework may have a different mechanism to supply this flag to the `chrome` executable. +1. Your testing framework may have a different mechanism to supply this flag to the `chrome` executable. For example, with [the customlauncher plugin for Karma](https://github.com/karma-runner/karma-chrome-launcher), you would add it to the `flags` array: ```javascript From c1da4af0b7ee5de35fa4490fa8e0fc4b44881089 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Fri, 19 Jan 2018 14:59:05 -0500 Subject: [PATCH 0160/2623] Blush up code snippet --- user/chrome.md | 54 ++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/user/chrome.md b/user/chrome.md index c1a97e14543..5948746daaf 100644 --- a/user/chrome.md +++ b/user/chrome.md @@ -26,34 +26,32 @@ You can use Google Chrome in [headless mode](/user/gui-and-headless-browsers/#Us For security reasons, Google Chrome is unable to provide sandboxing when it is running in the [container-based environment](https://docs.travis-ci.com/user/reference/overview/#Virtualization-environments). -To use Chrome in the container-based environment: +In that case, you may see an error message like this: -1. Pass `--no-sandbox` when invoking the `chrome` command. +``` +30 11 2017 13:35:42.245:ERROR [launcher]: Cannot start Chrome + [4315:4315:1130/133541.781662:FATAL:setuid_sandbox_host.cc(157)] The SUID sandbox helper binary was found, but is not configured correctly. Rather than run without sandboxing I'm aborting now. You need to make sure that /opt/google/chrome/chrome-sandbox is owned by root and has mode 4755. +``` - ```yaml - sudo: false - addons: - chrome: stable - script: - - chrome --no-sandbox - ``` -{: data-file=".travis.yml"} -1. Your testing framework may have a different mechanism to supply this flag to the `chrome` executable. - For example, with [the customlauncher plugin for Karma](https://github.com/karma-runner/karma-chrome-launcher), you would add it to the `flags` array: - - ```javascript - module.exports = function(config) { - config.set({ - browsers: ['Chrome', 'ChromeHeadless', 'ChromeHeadlessNoSandbox'], - - // you can define custom flags - customLaunchers: { - Chrome_no_sandbox: { - base: 'ChromeHeadless', - flags: ['--no-sandbox'] - } +To use Chrome in the container-based environment, pass the `--no-sandbox` flag to the `chrome` executable. + +The method to accomplish this varies from one testing framework to another. +For example, with [the customlauncher plugin for Karma](https://github.com/karma-runner/karma-chrome-launcher), you would add it to the `flags` array: + +```javascript +module.exports = function(config) { + config.set({ + browsers: ['Chrome', 'ChromeHeadless', 'ChromeHeadlessNoSandbox'], + + // you can define custom flags + customLaunchers: { + ChromeHeadlessNoSandbox: { + base: 'ChromeHeadless', + flags: ['--no-sandbox'] } - }) - } - ``` - Please consult your tool's documentation for further details on how to add the `--no-sandbox` flag. + } + }) +} +``` + +Please consult your tool's documentation for further details on how to add the `--no-sandbox` flag. From edeb792ee8e679dadea77932afeeb1c39f88f3d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20G=C3=B6tz?= Date: Sat, 20 Jan 2018 11:52:02 +1000 Subject: [PATCH 0161/2623] Document the security implications of the ssk-known-hosts option and potential work-arounds. --- user/ssh-known-hosts.md | 60 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/user/ssh-known-hosts.md b/user/ssh-known-hosts.md index 56f3b5c007f..a7a2fe14b00 100644 --- a/user/ssh-known-hosts.md +++ b/user/ssh-known-hosts.md @@ -38,3 +38,63 @@ addons: ssh_known_hosts: git.example.com:1234 ``` {: data-file=".travis.yml"} + +## Security Implications + +Note that the `ssh_known_hosts` option may introduce a risk of man-in-the-middle attacks for your builds. +(Also see the _Security_ section of the [ssh-keyscan man page](https://linux.die.net/man/1/ssh-keyscan "man page for ssh-keyscan").) +For example, it may prevent a build from detecting that an illegitimate 3rd party attempts to inject a modified git repository or submodule into the build. +This possibility might be of particular relevance where Travis CI build outputs are used for release packages or production deployments. + +### Background + +What is the basis for such a scenario? +It lies in the fact that the `ssh_known_hosts` option updates SSH's `known_hosts` file for every new build by retrieving and trusting whatever public key an SSH or git server, legitimate or not, presents. + +In a non-CI environment, SSH can detect this with the `known_hosts` file permanently storing the public keys of SSH servers after first connecting to them. +While a 3rd party may at some later stage be able to redirect an SSH-based `git clone` request to a git server they control (e.g., via DNS spoofing), they would typically not be able to spoof the SSH key of the legitimate git server. +Therefore, the public key of the spoofed git server would differ from that stored in `known_hosts`. +A `git clone` request would make SSH compare the two keys and reject a connection to the spoofed server given the key mismatch. + +However, in a CI environment, the `ssh_known_hosts` option makes every build obtain a fresh copy of the server's public key. +When the build proceeds to clone a repository or submodule, it compares the key of the repository server against the key that the `ssk_known_hosts` option triggered it to retrieve from the same server seconds earlier. +Effectively, the `ssh_known_hosts` option makes a build trust any SSH key that a server presents at the beginning of the build, even if the server is being spoofed by a third party. + +### Mitigations and Workarounds + +#### Git Cloning + +Currently, the simplest mitigation is to host all your repositories and submodules on one of the `github.com`, `gist.github.com`, or `ssh.github.com` domains. +They can be considered trustworthy because their actual SSH server keys are preconfigured in the Travis CI build images. +A build can therefore detect when a spoofed repository server presents an invalid key. + +A potential work-around for repositories or submodules on other domains can consist of the following three-step approach. +How successfully it can be employed heavily depends on the complexity of your existing Travis CI configuration. +0. Set up `.travis.yml` to clone a boot-strap git repository from `github.com`, `gist.github.com`, or `ssh.github.com`. +0. In the installation phase of the boot-strap repository, configure the build instance with the public SSH keys of your application git repositories and submodules. +This is described in more detail in the next section. +0. Configure the boot-strap repository to clone the application repositories and submodules explicitly and then proceed with the rest of the installation and test phases of the application. + +#### Other SSH Connections + +Depending on its configuration, your build may establish further SSH connections beyond git cloning, e.g., during deployment. +If you use the `ssh_known_hosts` option for such connections, the same security implications as outlined above apply. + +To make your builds reject spoofed SSH servers, you configure them with known good SSH keys. +Say your build instance connects to the SSH server *ssh.example.com*: +0. Remove the `ssh_known_hosts` option. +0. Obtain the public key of the SSH server: + - Ideally (but rarely), the owner of *ssh.example.com* can provide you with the server's public SSH key through e-mail or some other channel. + - If you have previously connected to *ssh.example.com* from a trusted local computer, run `ssh-keygen -F ssh.example.com` to display its public key. + - If you have not yet connected to *ssh.example.com*, run `ssh-keyscan ssh.example.com` to retrieve it and `ssh-keygen -F ssh.example.com` to display it. + Ideally, you would double-check with the owner of *ssh.example.com* that that is indeed the server's public key and not the key of a spoofed instance of *ssh.example.com*. +0. Configure Travis CI to use the public key of the SSH server: +Add the key *KEY* to the `known_hosts` file, e.g., with the following addition to the installation phase: + +```yaml +install: + - echo 'KEY' >> $HOME/.ssh/known_hosts +``` +{: data-file=".travis.yml"} + +Make sure to replace *KEY* with the complete line of text containing the public key of the SSH server as obtained in the previous step. From 57d7dffb0c50e79e8ef8678ca3c84bf75e3c88f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20G=C3=B6tz?= Date: Sat, 20 Jan 2018 12:06:08 +1000 Subject: [PATCH 0162/2623] Fix lists --- user/ssh-known-hosts.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/user/ssh-known-hosts.md b/user/ssh-known-hosts.md index a7a2fe14b00..f2bee2960bd 100644 --- a/user/ssh-known-hosts.md +++ b/user/ssh-known-hosts.md @@ -70,10 +70,13 @@ A build can therefore detect when a spoofed repository server presents an invali A potential work-around for repositories or submodules on other domains can consist of the following three-step approach. How successfully it can be employed heavily depends on the complexity of your existing Travis CI configuration. -0. Set up `.travis.yml` to clone a boot-strap git repository from `github.com`, `gist.github.com`, or `ssh.github.com`. -0. In the installation phase of the boot-strap repository, configure the build instance with the public SSH keys of your application git repositories and submodules. + +1. Set up `.travis.yml` to clone a boot-strap git repository from `github.com`, `gist.github.com`, or `ssh.github.com`. + +2. In the installation phase of the boot-strap repository, configure the build instance with the public SSH keys of your application git repositories and submodules. This is described in more detail in the next section. -0. Configure the boot-strap repository to clone the application repositories and submodules explicitly and then proceed with the rest of the installation and test phases of the application. + +3. Configure the boot-strap repository to clone the application repositories and submodules explicitly and then proceed with the rest of the installation and test phases of the application. #### Other SSH Connections @@ -82,13 +85,19 @@ If you use the `ssh_known_hosts` option for such connections, the same security To make your builds reject spoofed SSH servers, you configure them with known good SSH keys. Say your build instance connects to the SSH server *ssh.example.com*: -0. Remove the `ssh_known_hosts` option. -0. Obtain the public key of the SSH server: + +1. Remove the `ssh_known_hosts` option. + +2. Obtain the public key of the SSH server: + - Ideally (but rarely), the owner of *ssh.example.com* can provide you with the server's public SSH key through e-mail or some other channel. + - If you have previously connected to *ssh.example.com* from a trusted local computer, run `ssh-keygen -F ssh.example.com` to display its public key. + - If you have not yet connected to *ssh.example.com*, run `ssh-keyscan ssh.example.com` to retrieve it and `ssh-keygen -F ssh.example.com` to display it. Ideally, you would double-check with the owner of *ssh.example.com* that that is indeed the server's public key and not the key of a spoofed instance of *ssh.example.com*. -0. Configure Travis CI to use the public key of the SSH server: + +3. Configure Travis CI to use the public key of the SSH server: Add the key *KEY* to the `known_hosts` file, e.g., with the following addition to the installation phase: ```yaml From c6812eecb24fc87ed5a8717dd96bf8382f315a2c Mon Sep 17 00:00:00 2001 From: Anna Nagy Date: Sat, 20 Jan 2018 14:52:47 -0500 Subject: [PATCH 0163/2623] moved ops manual contact support to snippets --- _data/enterprise.yml | 2 +- _data/snippets.yml | 27 ++++++++++++++++++++++++++ user/enterprise.md | 2 ++ user/enterprise/operations-manual.md | 29 +++++++--------------------- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/_data/enterprise.yml b/_data/enterprise.yml index 1ec7dbd72bf..0bf77ba6d3d 100644 --- a/_data/enterprise.yml +++ b/_data/enterprise.yml @@ -7,4 +7,4 @@ Worker Configuration: "/user/enterprise/worker-configuration/" Worker Start & Debug Containers: "/user/enterprise/worker-cli-commands/" Platform Administration Tips: "/user/enterprise/platform-tips/" Trusty Build Containers (BETA): "/user/enterprise/trusty/" -Operations manual: "/user/enterprise/operations-manual/" +Operations Manual: "/user/enterprise/operations-manual/" diff --git a/_data/snippets.yml b/_data/snippets.yml index 553d2542c34..56034a0ba8a 100644 --- a/_data/snippets.yml +++ b/_data/snippets.yml @@ -34,3 +34,30 @@ trusty_note_no_osx: | > information are in our reference pages: > * [Precise](/user/reference/precise/) > * [Trusty](/user/reference/trusty/) + +contact_enterprise_support: | + ## Contact Enterprise Support + + To get in touch with us, please write a message to + [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). If possible, + please include as much of the following info as you: + + - What is the problem? + - Which steps did you try already? + - A support bundle (You can get it from `https://yourdomain:8800/support`) + - Worker log files (They can be found at `/var/log/upstart/travis-worker.log`) + - If you're using multiple worker machines, we need the log files from all of them. + + Is anything special with your setup? While we may be able to see some + information (such as hostname, IaaS provider, and license expiration), there + are many other things we can't see which could lead to something not working. + Therefore , we'd like to ask you to also answer the questions below in your + support request (if applicable): + + - How many machines are you using? + - Do you use configuration management tools (Chef, Puppet)? + - Which other services do interface with Travis CI Enterprise? + - Do you use Travis CI Enterprise together with github.com or GitHub Enterprise? + - If you're using GitHub Enterprise, which version of it? + + We're looking forward helping! diff --git a/user/enterprise.md b/user/enterprise.md index 025e6aa7caf..171800a21b9 100644 --- a/user/enterprise.md +++ b/user/enterprise.md @@ -64,6 +64,8 @@ If you'd like to talk more about licensing, support, and onboarding, please email us at [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). Our team looks forward to hearing from you! +{{ site.data.snippets.contact_enterprise_support }} + ## Further Reading * [System Prerequisites](/user/enterprise/prerequisites) * [Travis CI Enterprise Installation](/user/enterprise/installation) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 7a6f5d65f41..be7920dc70f 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -1,11 +1,11 @@ --- -title: Travis CI Enterprise Operations manual +title: Travis CI Enterprise Operations Manual layout: en_enterprise --- Welcome to the Travis CI Enterprise Operations Manual! This document provides guidelines and suggestions for troubleshooting your Travis CI Enterprise instance. If you have questions about a specific situation, please get in touch with us via [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). -This document provides guidelines and suggestions for troubleshooting your Travis CI Enterprise instance. Each topic contains a common problem, and a suggested solution. If the solution does not work, please [contact support](#contact-support). +This document provides guidelines and suggestions for troubleshooting your Travis CI Enterprise instance. Each topic contains a common problem, and a suggested solution. If the solution does not work, please [contact support](#Contact-Enterprise-Support). Throughout this document we'll be using the following terms to refer to the two components of your Travis CI Enterprise installation: @@ -14,6 +14,8 @@ Throughout this document we'll be using the following terms to refer to the two > Please note that this guide is geared towards non-High Availability (HA) setups right now. +
+ ## Backups This section explains how you integrate Travis CI Enterprise in your backup strategy. Here, we'll talk about two topics: @@ -25,7 +27,7 @@ This section explains how you integrate Travis CI Enterprise in your backup stra Without the encryption key you cannot access the information in your production database. To make sure that you can always recover your database, make a backup of this key. -> Without this key the information in the database is not recoverable. +> Without the encryption key the information in the database is not recoverable. To make a backup, please follow these steps: @@ -90,23 +92,6 @@ Here we're distinguishing between an AWS EC2 installation and an installation ru This issue sometimes occurs after maintenance on workers installed before November 2017 or systems running a `docker version` before `17.06.2-ce`. When this happens, the `/var/log/upstart/travis-worker.log` file contains a line: `Error response from daemon:client and server don't have same version`. For this issue, we recommend [re-installing worker from scratch](/user/enterprise/installation/#Install-Travis-CI-Enterprise-Worker) on a fresh instance. Please note: the default build environment images will be pulled and you may need to apply customizations again as well. -If none of the steps above lead to results for you, please follow the steps in the [Contact Support](#Contact-support) section below to move forward. - -## Contact support - -To get in touch with us, please write a message to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). It would be very helpful for Support if you could include the following: - -- What is the problem? -- Which steps did you try already? -- A support bundle (You can get it from https://yourdomain:8800/support) -- Worker log files (They can be found at `/var/log/upstart/travis-worker.log`) - If you're using multiple worker machines, we need the log files from all of them. - -Is anything special with your setup? While we may be able to see some information (such as hostname, IaaS provider, ...), there are lots of other things we can't see which could lead to something not working. Therefore we'd like to ask you to also answer the questions below in your support request (if applicable): - -- How many machines are you using? -- Do you use configuration management tools (Chef, Puppet)? -- Which other services do interface with Travis CI Enterprise? -- Do you use Travis CI Enterprise together with github.com or GitHub Enterprise? -- If you're using GitHub Enterprise, which version of it? +If none of the steps above lead to results for you, please follow the steps in the [Contact Support](#Contact-Enterprise-Support) section below to move forward. -Please write your support request to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). We're looking forward hearing from you! +{{ site.data.snippets.contact_enterprise_support }} From 50a1771322d7e58155dc8b5ea1725840869d89ff Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 22 Jan 2018 09:27:16 -0500 Subject: [PATCH 0164/2623] Explain GitHub releases advanced options --- user/deployment/releases.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/user/deployment/releases.md b/user/deployment/releases.md index 67ee4df7ce2..0742aa42ac4 100644 --- a/user/deployment/releases.md +++ b/user/deployment/releases.md @@ -166,3 +166,11 @@ after_deploy: ## Advanced options Options from `.travis.yml` are passed through to [Octokit API](https://octokit.github.io/octokit.rb/Octokit/Client/Releases.html#create_release-instance_method), so you can use any valid Octokit option. + +These inclue: + +* `name` +* `body` +* `draft` + +Note that formatting in `body` is [not preserved](https://github.com/travis-ci/dpl/issues/155). From 351aaf60636bf069804d1bd17829d8904c7bf68e Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 22 Jan 2018 10:30:50 -0500 Subject: [PATCH 0165/2623] Fix typo --- user/deployment/releases.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/deployment/releases.md b/user/deployment/releases.md index 0742aa42ac4..63dc99ae9d2 100644 --- a/user/deployment/releases.md +++ b/user/deployment/releases.md @@ -167,7 +167,7 @@ after_deploy: Options from `.travis.yml` are passed through to [Octokit API](https://octokit.github.io/octokit.rb/Octokit/Client/Releases.html#create_release-instance_method), so you can use any valid Octokit option. -These inclue: +These include: * `name` * `body` From f2ff46916d39fc835d3843c0601e788625ad3649 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Mon, 22 Jan 2018 14:37:33 -0100 Subject: [PATCH 0166/2623] Travis.yml settings --- user/reference/overview.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/user/reference/overview.md b/user/reference/overview.md index e01a1c424bb..e251bf1b832 100644 --- a/user/reference/overview.md +++ b/user/reference/overview.md @@ -36,9 +36,9 @@ The following table summarizes the differences across virtual environments and o | | Ubuntu Precise | Ubuntu Trusty | Ubuntu Trusty | [OS X](/user/reference/osx/) | |:-----------------|:--------------------------------------|:----------------------------------|:-------------------------------------|:-----------------------------| -| Name | Sudo-enabled VM | Container-based | Sudo-enabled VM | OS X | +| Name | Sudo-enabled | Container-based | Sudo-enabled | OS X | | Status | Current | Default as of August 2017 | Current | Current | -| Infrastructure | Virtual machine on GCE | Container | Virtual machine on GCE | Virtual machine | +| Infrastructure | Virtual machine on GCE | Container on EC2 | Virtual machine on GCE | Virtual machine | | `.travis.yml` | `sudo: required`
`dist: precise` | `sudo: false`
`dist: trusty` | `sudo: required`
`dist: trusty` | `os: osx` | | Allows `sudo` | Yes | No | Yes | Yes | | Approx boot time | 20-50s | 1-6s | 20-50s | 60-90s | @@ -66,10 +66,23 @@ if it contains: * `ec2`, as in the previous example → the build ran in a container-based environment on Amazon EC2. * `gce` → the build ran in a sudo-enabled environment on Google Cloud Engine. -* `jupiter` → macOS +* `jupiter` → the build ran on macOS ### For a particular .travis.yml configuration +Many different parts of your `.travis.yml` affect what infrastructure your build runs on. The following list describes some of the main settings that determine build routing: + +* Any of the following "sudo related settings" route your build to a sudo-enabled linux (Ubuntu Trusty) environment on Google Cloud Engine. + + - `services: docker` + - `sudo: required` or `sudo: true` + - *any* other `sudo` command in your build script + +* Using `os: osx`, setting a version of OS X using `osx_image:`, or using a macOS specific language such as `language: objective-c` routes your build to macOS infrastructure. + +* If none of the previous keys are present in your `.travis.yml`, the default is a container-based linux (Ubunty Trusty) environment on Amazon EC2. + + ## Deprecated Virtualization Environments Historically, Travis CI has provided the following virtualization environments. From 004d173d3ec8860cfc91a22485a8f84b9e59a5ae Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 22 Jan 2018 10:38:15 -0500 Subject: [PATCH 0167/2623] Clarify `X.Y` in `pg_config` use --- user/database-setup.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user/database-setup.md b/user/database-setup.md index 58045de15d1..36956d999b0 100644 --- a/user/database-setup.md +++ b/user/database-setup.md @@ -201,9 +201,9 @@ before_install: ### Using `pg_config` -If your builds rely on the use of the `pg_config` command, you need to install an additional -apt package `postgresql-server-dev-X.Y` for the version of PostgreSQL you are using in order -to obtain meaningful output from the command. +If your builds rely on the `pg_config` command, you need to install an additional +apt package `postgresql-server-dev-X.Y`, where `X.Y` matches the version of PostgreSQL +you are using. For example: From 0e88ebbba348a24082351ffcdaf1fbf4e15dc70a Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 22 Jan 2018 10:39:31 -0500 Subject: [PATCH 0168/2623] Explicitly specify `X.Y` in pg_config example --- user/database-setup.md | 1 + 1 file changed, 1 insertion(+) diff --git a/user/database-setup.md b/user/database-setup.md index 36956d999b0..368ea96c4ba 100644 --- a/user/database-setup.md +++ b/user/database-setup.md @@ -209,6 +209,7 @@ For example: ```yaml addons: + postgresql: '9.4' apt: packages: - postgresql-server-dev-9.4 From 373fd0eeec6da7011609266f83a19057000e7d38 Mon Sep 17 00:00:00 2001 From: Carla Date: Mon, 22 Jan 2018 17:50:56 +0100 Subject: [PATCH 0169/2623] characteristics typo --- user/reference/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/overview.md b/user/reference/overview.md index e251bf1b832..15bc025bec4 100644 --- a/user/reference/overview.md +++ b/user/reference/overview.md @@ -49,7 +49,7 @@ The following table summarizes the differences across virtual environments and o ## What infrastructure is my environment running on? -Usually, knowing the virtualization environment charactistics from the [table above](#Virtualisation-Environment-vs-Operating-System) is sufficient. +Usually, knowing the virtualization environment characteristics from the [table above](#Virtualisation-Environment-vs-Operating-System) is sufficient. But, if you do need more detail, you have one of these two questions: From ca3fc61385f41ac2ff35ecd82f458ab54d6cb3bc Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Mon, 22 Jan 2018 16:16:46 -0100 Subject: [PATCH 0170/2623] No need for this --- images/ui/what-infrastructure-blank.png | Bin 43526 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 images/ui/what-infrastructure-blank.png diff --git a/images/ui/what-infrastructure-blank.png b/images/ui/what-infrastructure-blank.png deleted file mode 100644 index 27753bff338d6fde34b14b7fc8956b156eb543e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43526 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 Date: Mon, 22 Jan 2018 16:25:50 -0500 Subject: [PATCH 0171/2623] Explain cache naming rules re: env vars --- user/caching.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/user/caching.md b/user/caching.md index 35582021243..7b8ee8c9f1b 100644 --- a/user/caching.md +++ b/user/caching.md @@ -411,6 +411,19 @@ CACHE_NAME=JOB1 to `.travis.yml`. +Note that when considering environment variables, the values must match *exactly*, +including spaces. +For example, with + +```yaml +env: + - FOO=1 BAR=2 + - FOO=1 BAR=2 + - BAR=2 FOO=1 +``` + +all three jobs will each use its own cache. + ## Caches and read permissions When caching [custom files and directories](/user/caching/#Arbitrary-directories), From fbe36fb1753555f085838bd04005cd4c6eb54fec Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 22 Jan 2018 17:38:13 -0500 Subject: [PATCH 0172/2623] Explicitly document `prerelease` parameter for Releases --- user/deployment/releases.md | 1 + 1 file changed, 1 insertion(+) diff --git a/user/deployment/releases.md b/user/deployment/releases.md index 63dc99ae9d2..f332e0c5a4b 100644 --- a/user/deployment/releases.md +++ b/user/deployment/releases.md @@ -172,5 +172,6 @@ These include: * `name` * `body` * `draft` +* `prerelease` Note that formatting in `body` is [not preserved](https://github.com/travis-ci/dpl/issues/155). From 6af60887280f51c579bbba6dfea348bd9cd33f92 Mon Sep 17 00:00:00 2001 From: Kristofer Svardstal Date: Tue, 23 Jan 2018 14:49:59 -0500 Subject: [PATCH 0173/2623] updating from OS X to macOS --- user/languages/python.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/python.md b/user/languages/python.md index f1da692fa90..cb47afe4e53 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -33,7 +33,7 @@ Minimal example: {{ site.data.snippets.trusty_note_no_osx }} -Python builds are not available on the OS X environment. +Python builds are not available on the macOS environment. The rest of this guide covers configuring Python projects in Travis CI. If you're From b1369553579874829d75ba9c5666d6296a2028a2 Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Thu, 25 Jan 2018 09:24:08 +0100 Subject: [PATCH 0174/2623] minor wording fix --- user/caching.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/caching.md b/user/caching.md index 7b8ee8c9f1b..aa380d383ef 100644 --- a/user/caching.md +++ b/user/caching.md @@ -422,7 +422,7 @@ env: - BAR=2 FOO=1 ``` -all three jobs will each use its own cache. +each of the three jobs will use its own cache. ## Caches and read permissions From 4674481d0a26cf751fce5724e5520a5f1bd556cf Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 25 Jan 2018 11:03:31 +0100 Subject: [PATCH 0175/2623] More docker --- user/reference/overview.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/reference/overview.md b/user/reference/overview.md index 15bc025bec4..dd5c221c3da 100644 --- a/user/reference/overview.md +++ b/user/reference/overview.md @@ -72,11 +72,12 @@ if it contains: Many different parts of your `.travis.yml` affect what infrastructure your build runs on. The following list describes some of the main settings that determine build routing: -* Any of the following "sudo related settings" route your build to a sudo-enabled linux (Ubuntu Trusty) environment on Google Cloud Engine. +* Any of the following sudo or docker related settings route your build to a sudo-enabled linux (Ubuntu Trusty) environment on Google Cloud Engine. - `services: docker` - `sudo: required` or `sudo: true` - *any* other `sudo` command in your build script + _ *any* other `docker` command in your build script * Using `os: osx`, setting a version of OS X using `osx_image:`, or using a macOS specific language such as `language: objective-c` routes your build to macOS infrastructure. From 1c96aaad7521efaf8ce215e5c10a8966432f5da0 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 25 Jan 2018 13:18:16 +0100 Subject: [PATCH 0176/2623] Xcode not OSX --- user/reference/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/overview.md b/user/reference/overview.md index dd5c221c3da..fd306ef6121 100644 --- a/user/reference/overview.md +++ b/user/reference/overview.md @@ -79,7 +79,7 @@ Many different parts of your `.travis.yml` affect what infrastructure your build - *any* other `sudo` command in your build script _ *any* other `docker` command in your build script -* Using `os: osx`, setting a version of OS X using `osx_image:`, or using a macOS specific language such as `language: objective-c` routes your build to macOS infrastructure. +* Using `os: osx`, setting a version of Xcode using `osx_image:`, or using a macOS specific language such as `language: objective-c` routes your build to macOS infrastructure. * If none of the previous keys are present in your `.travis.yml`, the default is a container-based linux (Ubunty Trusty) environment on Amazon EC2. From 7d8ea615c9196927b8c488bc0391bc64f8f28782 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 25 Jan 2018 14:04:54 +0100 Subject: [PATCH 0177/2623] Add Mysql table and 5.7 --- user/database-setup.md | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/user/database-setup.md b/user/database-setup.md index 368ea96c4ba..5389c497672 100644 --- a/user/database-setup.md +++ b/user/database-setup.md @@ -55,6 +55,16 @@ and a blank password. > Note that the `travis` user does not have the heightened privileges that the > `root` user does. +Current versions of MySQL are + + +| | Ubuntu Precise | Ubuntu Trusty | +|:----------------|:---------------|:--------------| +| Sudo-enabled | 5.5.x | 5.6.x | +| Container-based | - | 5.6.x | + +You can also [install MySQL 5.7](#MySQL-5.7) on sudo-enabled Ubuntu Trusty. + ### Using MySQL with ActiveRecord `config/database.yml` example for Ruby projects using ActiveRecord: @@ -93,10 +103,30 @@ before_install: ``` {: data-file=".travis.yml"} -### MySQL 5.6 -The recommended way to get MySQL 5.6 is switching to our [Trusty CI -Environment](/user/reference/trusty/). +### MySQL 5.7 + +On *sudo-enabled* Trusty Linux, you can install MySQL 5.7 by adding the following lines to your `.travis.yml`: + +```yaml +addons: + apt: + sources: + - mysql-5.7-trusty + packages: + - mysql-server + - mysql-client +``` +{: data-file=".travis.yml"} + +You'll also need to reset the root password to something other than `new_password`: + +```yaml +before_install: + - sudo mysql -e "use mysql; update user set authentication_string=PASSWORD('new_password') where User='root'; update user set plugin='mysql_native_password';FLUSH PRIVILEGES;" + - sudo service mysql restart +``` +{: data-file=".travis.yml"} ## PostgreSQL From 33bff416f9d1f7b7edb331dcb2154840caad31d5 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 25 Jan 2018 14:05:10 +0100 Subject: [PATCH 0178/2623] Tweak DB --- user/reference/precise.md | 2 +- user/reference/trusty.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/user/reference/precise.md b/user/reference/precise.md index f4a3eeeeec8..4a6094eec4a 100644 --- a/user/reference/precise.md +++ b/user/reference/precise.md @@ -79,7 +79,7 @@ to accommodate projects that may need one of those runtimes during the build. Language-specific workers have multiple runtimes for their respective language (for example, Ruby workers have about 10 Ruby versions/implementations). -### Data Stores +### Databases - MySQL - PostgreSQL diff --git a/user/reference/trusty.md b/user/reference/trusty.md index 8fdf8ae5220..065c5d5aaf4 100644 --- a/user/reference/trusty.md +++ b/user/reference/trusty.md @@ -331,6 +331,7 @@ We pre-install the following services which may be activated with the built-in - CouchDB - ElasticSearch - MongoDB +- MySQL - Neo4j - PostgreSQL - RabbitMQ From c62860c5f4305735f3cc690def267802588afa7c Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 25 Jan 2018 14:13:48 +0100 Subject: [PATCH 0179/2623] Link fix --- user/database-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/database-setup.md b/user/database-setup.md index 5389c497672..b31571f17cb 100644 --- a/user/database-setup.md +++ b/user/database-setup.md @@ -63,7 +63,7 @@ Current versions of MySQL are | Sudo-enabled | 5.5.x | 5.6.x | | Container-based | - | 5.6.x | -You can also [install MySQL 5.7](#MySQL-5.7) on sudo-enabled Ubuntu Trusty. +You can also [install MySQL 5.7](#MySQL-57) on sudo-enabled Ubuntu Trusty. ### Using MySQL with ActiveRecord From f7c65d29101b0876f529c2893bed10221bb08522 Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Mon, 29 Jan 2018 14:20:05 -0500 Subject: [PATCH 0180/2623] Updated macOS IP addresses range --- user/ip-addresses.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/ip-addresses.md b/user/ip-addresses.md index ff88ee365da..cfcf64c4c2c 100644 --- a/user/ip-addresses.md +++ b/user/ip-addresses.md @@ -13,7 +13,7 @@ on the infrastructure your builds are running on: | ------------------------------- | ----------------------------------------------------------------------------------------------------------------| | Container-based (travis-ci.com) | `{{ site.data.ec2_public_ips['com']['host'] }}` (`{{ site.data.ec2_public_ips['com']['ips'] | join: "`, `" }}`) | | Container-based (travis-ci.org) | `{{ site.data.ec2_public_ips['org']['host'] }}` (`{{ site.data.ec2_public_ips['org']['ips'] | join: "`, `" }}`) | -| OS X | `208.78.110.192/27` | +| OS X | `208.78.110.192/27`, `207.254.16.8/29` | | Sudo-enabled Linux | See notes below (`{{ site.data.gce_ip_range['ip_ranges'] | join: "`, `" }}`) | > **Note:** We do not have static public IP addresses available for jobs running on the From b2355f2167a41701b1bd0c3bd3e0717378ce573b Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Tue, 30 Jan 2018 11:33:58 +0100 Subject: [PATCH 0181/2623] Yak shaving PR text --- user/pull-requests.md | 62 +++++++++++++++---------------------------- 1 file changed, 22 insertions(+), 40 deletions(-) diff --git a/user/pull-requests.md b/user/pull-requests.md index b6836239bdc..69933533bf8 100644 --- a/user/pull-requests.md +++ b/user/pull-requests.md @@ -4,51 +4,41 @@ layout: en --- -Pull requests are an essential feature of Travis CI. For a project that has -testing via Travis CI enabled, whenever a pull request is opened for the -project, Travis CI will build it and update a status on the pull request. +Pull request builds are an essential part of Travis CI. +Whenever a pull request is opened on GitHub, Travis CI builds it and updates the status icon on the pull request page. -## How Pull Requests are Tested +
-When a pull request is opened, Travis CI receives a pull request notification -from GitHub. We turn this notification into a build and run it. +## How Pull Requests are Built -During the build, we update the status of the commits to one of: +When a pull request is opened on GitHub, Travis CI receives a notification and runs a build. +During the build, we update the status icon of the pull request to one of the following statuses: - a warning that the build is still running. -- that the pull request should be merged with caution because the build failed. -- that the pull request can be merged safely because the build was successful. +- a notification that the build failed -- the pull request should not be merged. +- a notification that the build succeeded -- the pull request can be merged. -Travis CI builds a pull request when it is first opened, and when commits are -added to the pull request . +Travis CI builds a pull request when it is first opened, and whenever commits are added to the pull request. +Rather than build the commits that have been pushed to the branch the pull request is from, we build the merge between the source branch and the upstream branch. -Rather than test the commits that have been pushed to the branch the pull request -is from, we test the merge between the origin and the upstream branch. To only -build on push events, you can disable **Build on Pull Requests** from your -repository settings. +To only build on push events not on pull requests, disable **Build on Pull Requests** in your repository settings. ## Pull Requests and Security Restrictions -The most important restriction for pull requests is about secure environment -variables and encrypted data. +The most important restriction for pull requests is about secure environment variables and encrypted data. -A pull request sent from a fork of the upstream repository could be manipulated -to expose any environment variables. The upstream repository's maintainer would -have no protection against this attack, as pull requests can be sent by anyone -with a fork. +A pull request sent from a fork of the upstream repository could be manipulated to expose environment variables. +The upstream repository's maintainer would have no protection against this attack, as pull requests can be sent by anyone who forks the repository on GitHub. Travis CI makes encrypted variables and data available only to pull requests coming from the same repository. These are considered trustworthy, as only members with write access to the repository can send them. Pull requests sent from forked repositories do not have access to encrypted variables or data. -If your build relies on these to run, for instance to run Selenium tests with -[BrowserStack](https://www.browserstack.com) or Sauce Labs, your build needs to take this into account. You won't be able to run +If your build relies on encrypted variables to run, for instance to run Selenium tests with [BrowserStack](https://www.browserstack.com) or Sauce Labs, your build needs to take this into account. You won't be able to run these tests for pull requests from external contributors. To work around this, restrict these tests only to situations where the -environment variables are available, or disable them for pull requests entirely. - -Here's an example of how to structure a build command for this purpose: +environment variables are available, or disable them for pull requests entirely, as show in the following example: ```yaml script: @@ -59,22 +49,14 @@ script: ## My Pull Request isn't being built -If a pull request isn't built or doesn't show up in Travis CI's user interface, -that usually means that it can't be merged. We rely on the merge commit that -GitHub transparently creates between the changes in the source branch and the -upstream branch the pull request is sent against. +If a pull request isn't built or doesn't show up in Travis CI's user interface, that usually means that it can't be merged. +We rely on the merge commit that GitHub transparently creates between the changes in the source branch and the upstream branch the pull request is sent against. So when you create or update a pull request, and Travis CI doesn't create a -build for it, make sure the pull request is mergeable. If it isn't, rebase it -against the upstream branch and resolve any merge conflicts. When you push the -fixes up to GitHub and to the pull request, Travis CI will happily test them. - -Travis CI also currently doesn't build pull requests when the upstream branch is -updated. When this happens, GitHub will update the merge commit between the -downstream and upstream branch, and send out a notifications. But Travis CI -currently ignores this update, as it could lead to a large number of new builds -on repositories with lots of pull requests and lots of updates on the upstream -branches. +build for it, make sure the pull request is mergeable. +If it isn't, rebase it against the upstream branch and resolve any merge conflicts. When you push the fixes up to the pull request, Travis CI will happily build them. + +Travis CI also currently doesn't build pull requests when the upstream branch is updated, as this would lead to an excessive number of new builds. If the pull request has already been merged you can't rerun the job. You'll get an error like: From 6fb9732f10974c69f42df530ea7a58a464738b69 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Tue, 30 Jan 2018 11:36:59 +0100 Subject: [PATCH 0182/2623] Spelling --- user/pull-requests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/pull-requests.md b/user/pull-requests.md index 69933533bf8..cca84d549c2 100644 --- a/user/pull-requests.md +++ b/user/pull-requests.md @@ -38,7 +38,7 @@ If your build relies on encrypted variables to run, for instance to run Selenium these tests for pull requests from external contributors. To work around this, restrict these tests only to situations where the -environment variables are available, or disable them for pull requests entirely, as show in the following example: +environment variables are available, or disable them for pull requests entirely, as shown in the following example: ```yaml script: From fb47576a7c87d3a45ec569ab32afb5c7ab745aae Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Tue, 30 Jan 2018 11:41:28 +0100 Subject: [PATCH 0183/2623] See also --- user/pull-requests.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/user/pull-requests.md b/user/pull-requests.md index cca84d549c2..12e9b226782 100644 --- a/user/pull-requests.md +++ b/user/pull-requests.md @@ -66,3 +66,8 @@ The command "eval git fetch origin +refs/pull/994/merge: " failed ``` Restoring the branch of a merged pull request will not trigger a build, nor will pushing a new commit to a branch that has already been merged. + +## See Also + +* [Building only the latest commit](/user/customizing-the-build/#Building-only-the-latest-commit) +* [Building specific branches](/user/customizing-the-build/#Building-Specific-Branches) From 4f6345492ca45f15a92608bf8f34da17a5985475 Mon Sep 17 00:00:00 2001 From: mariadeanton Date: Tue, 30 Jan 2018 16:57:46 +0100 Subject: [PATCH 0184/2623] update to match permissions behaviour --- user/travis-pro.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/travis-pro.md b/user/travis-pro.md index 71c1e95ce93..51f155983c7 100644 --- a/user/travis-pro.md +++ b/user/travis-pro.md @@ -29,8 +29,8 @@ accompanying the launch of pull requests for Travis CI. Access rights on Travis CI is based on the access rights on GitHub: - Users that can access a repository on GitHub can see the build status and logs on Travis CI. -- Users that can push to a repository on GitHub can trigger, cancel and restart builds. -- Users that have admin access to a repository on GitHub can enable/disable it on Travis CI and change its settings. +- Users that can push to a repository on GitHub can trigger, cancel and restart builds, and change its settings. +- Users that have admin access to a repository on GitHub can enable/disable it on Travis CI. To keep the access rights up to date, we sync every user account approximately once every 24 hours with GitHub. You can use the "Sync account" button on [the profile page](https://travis-ci.com/profile) or `travis sync --pro` in the CLI to force a sync. From 45ba4802bcfbbc9c6135460c835e19f612a73dd8 Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Tue, 30 Jan 2018 17:25:01 -0500 Subject: [PATCH 0185/2623] Switch to dnsjson.com for DNS lookups as it is slightly more reliable than dig.jsondns.org --- Rakefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Rakefile b/Rakefile index ac09c708f87..3dd280ec053 100755 --- a/Rakefile +++ b/Rakefile @@ -12,10 +12,10 @@ def print_line_containing(file, str) File.open(file).grep(/#{str}/).each { |line| puts "#{file}: #{line}" } end -def dns_txt(hostname) +def dns_txt(hostname, record: 0) JSON.parse( - Faraday.get("https://dig.jsondns.org/IN/#{hostname}/TXT").body - ).fetch('answer').fetch(0).fetch('rdata').fetch(0).split.map(&:strip) + Faraday.get("https://dnsjson.com/#{hostname}/TXT.json").body + ).fetch('results').fetch('records').fetch(record).split.map(&:strip) end task default: :test From 0221dd1e15754d8ae8b582e5a4263a0e2de2a67a Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Thu, 1 Feb 2018 14:52:57 -0500 Subject: [PATCH 0186/2623] Updated macOS ip ranges some more --- user/ip-addresses.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/ip-addresses.md b/user/ip-addresses.md index cfcf64c4c2c..00f339f15a3 100644 --- a/user/ip-addresses.md +++ b/user/ip-addresses.md @@ -13,7 +13,7 @@ on the infrastructure your builds are running on: | ------------------------------- | ----------------------------------------------------------------------------------------------------------------| | Container-based (travis-ci.com) | `{{ site.data.ec2_public_ips['com']['host'] }}` (`{{ site.data.ec2_public_ips['com']['ips'] | join: "`, `" }}`) | | Container-based (travis-ci.org) | `{{ site.data.ec2_public_ips['org']['host'] }}` (`{{ site.data.ec2_public_ips['org']['ips'] | join: "`, `" }}`) | -| OS X | `208.78.110.192/27`, `207.254.16.8/29` | +| OS X | `208.78.110.192/27`, `207.254.16.35/32`, `207.254.16.36/30` | | Sudo-enabled Linux | See notes below (`{{ site.data.gce_ip_range['ip_ranges'] | join: "`, `" }}`) | > **Note:** We do not have static public IP addresses available for jobs running on the From fc8bde52f9d3abe62a2403608b782f52175efb10 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Fri, 2 Feb 2018 11:32:12 +0100 Subject: [PATCH 0187/2623] Intial list of web ui settings to document --- user/web-ui.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 user/web-ui.md diff --git a/user/web-ui.md b/user/web-ui.md new file mode 100644 index 00000000000..cd7c5430868 --- /dev/null +++ b/user/web-ui.md @@ -0,0 +1,27 @@ +--- +title: Web Interface +layout: en + +--- + +This page lists settings that are only available in the Travis CI .com and .org web user interface. + +## Build only if .travis.yml is present + +## Limit concurrent jobs + +## Build pushed branches + +## Build pushed pull requests + +## Auto cencel branch builds + +## Auto cancel pull request builds + +## Environment variables + +## Cron jobs + +## Caches + +## Trigger a custom build From e1ffa8aee9402892d5383105ce25c2edd8b68acb Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Fri, 2 Feb 2018 11:56:07 +0100 Subject: [PATCH 0188/2623] Some basic info --- _data/snippets.yml | 8 ++++++++ user/customizing-the-build.md | 10 +++------- user/web-ui.md | 10 +++++++++- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/_data/snippets.yml b/_data/snippets.yml index 553d2542c34..3c60664cc8a 100644 --- a/_data/snippets.yml +++ b/_data/snippets.yml @@ -34,3 +34,11 @@ trusty_note_no_osx: | > information are in our reference pages: > * [Precise](/user/reference/precise/) > * [Trusty](/user/reference/trusty/) +concurrent_jobs: | + The maximum number of concurrent jobs depends on the total system load, but + one situation in which you might want to set a particular limit is: + + - if your build depends on an external resource and might run into a race + condition with concurrent jobs. +auto_cancellation: | + If you are only interested in building the most recent commit on each branch you can use this new feature to automatically cancel older builds in the queue that are not yet running. diff --git a/user/customizing-the-build.md b/user/customizing-the-build.md index 1b187c60b6c..8430aa8ddbf 100644 --- a/user/customizing-the-build.md +++ b/user/customizing-the-build.md @@ -214,11 +214,7 @@ Some common reasons why builds might hang: ## Limiting Concurrent Jobs -The maximum number of concurrent jobs depends on the total system load, but -one situation in which you might want to set a particular limit is: - -- if your build depends on an external resource and might run into a race - condition with concurrent jobs. +{{ site.data.snippets.concurrent_jobs }} You can set the maximum number of concurrent jobs in the settings pane for each repository. @@ -237,9 +233,9 @@ If you are only interested in building the most recent commit on each branch you The *Auto Cancellation Setting* is in the Settings tab of each repository, and you can enable it separately for: -* *pushes* - which build your branch and appear in the *Build History* tab of your repository. +* *Auto cancel branch builds* - which build your branch and appear in the *Build History* tab of your repository. -* *pull requests* - which build the future merge result of your feature branch against its target and appear in the *Pull Requests* tab of your repository. +* *Auto cancel pull request builds* - which build the future merge result of your feature branch against its target and appear in the *Pull Requests* tab of your repository. ![Auto cancellation setting](/images/autocancellation.png "Auto cancellation setting") diff --git a/user/web-ui.md b/user/web-ui.md index cd7c5430868..0203e2f94df 100644 --- a/user/web-ui.md +++ b/user/web-ui.md @@ -10,14 +10,22 @@ This page lists settings that are only available in the Travis CI .com and .org ## Limit concurrent jobs +{{ site.data.snippets.concurrent_jobs }} + ## Build pushed branches + + ## Build pushed pull requests -## Auto cencel branch builds +## Auto cancel branch builds + +{{ site.data.snippets.auto_cancellation }} ## Auto cancel pull request builds +{{ site.data.snippets.auto_cancellation }} + ## Environment variables ## Cron jobs From b40a2810ca2d8e5851c7272fd2c5417bbfb7189e Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Fri, 2 Feb 2018 12:04:05 +0100 Subject: [PATCH 0189/2623] PR setttings --- user/web-ui.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user/web-ui.md b/user/web-ui.md index 0203e2f94df..2bc6d631839 100644 --- a/user/web-ui.md +++ b/user/web-ui.md @@ -14,10 +14,14 @@ This page lists settings that are only available in the Travis CI .com and .org ## Build pushed branches +If *ON*, builds will be run on branches that are not [explcitiy excluded](/user/customizing-the-build/#Safelisting-or-blocklisting-branches) in your `.travis.yml`. +If *OFF* builds only run on branches that are [explcitiy included](/user/customizing-the-build/#Safelisting-or-blocklisting-branches). ## Build pushed pull requests +If *ON*, builds will be run new [pull requests](/user/pull-requests/). + ## Auto cancel branch builds {{ site.data.snippets.auto_cancellation }} From 05502f2d57ebcf1dde12ed08cf31782fa9afa441 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Fri, 2 Feb 2018 12:16:11 +0100 Subject: [PATCH 0190/2623] Full house? --- _data/snippets.yml | 11 ++++++++++- user/cron-jobs.md | 2 +- user/environment-variables.md | 7 +------ user/web-ui.md | 18 +++++++++++++++++- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/_data/snippets.yml b/_data/snippets.yml index 3c60664cc8a..36cb051cbb2 100644 --- a/_data/snippets.yml +++ b/_data/snippets.yml @@ -41,4 +41,13 @@ concurrent_jobs: | - if your build depends on an external resource and might run into a race condition with concurrent jobs. auto_cancellation: | - If you are only interested in building the most recent commit on each branch you can use this new feature to automatically cancel older builds in the queue that are not yet running. + If you are only interested in building the most recent commit on each branch you can use this new feature to automatically cancel older builds in the queue that are not yet running. +cron_jobs: | + Travis CI cron jobs work similarly to the cron utilty, they run builds at regular scheduled intervals independently of whether any commits were pushed to the repository. Cron jobs always fetch the most recent commit on a particular branch and build the project at that state. Cron jobs can run `daily`, `weekly` or `monthly`, which in practice means up to an hour after the selected time span, and you cannot set them to run at a specific time. +environment_variables: | + Variables defined in repository settings are the same for all builds, and when you restart an old build, it uses the latest values. These variables are not automatically available to forks. + + Define variables in the Repository Settings that: + + - differ per repository. + - contain sensitive data, such as third-party credentials. diff --git a/user/cron-jobs.md b/user/cron-jobs.md index a190c7857ed..0fdce287a85 100644 --- a/user/cron-jobs.md +++ b/user/cron-jobs.md @@ -6,7 +6,7 @@ layout: en
-Travis CI cron jobs work similarly to the cron utilty, they run builds at regular scheduled intervals independently of whether any commits were pushed to the repository. Cron jobs always fetch the most recent commit on a particular branch and build the project at that state. Cron jobs can run `daily`, `weekly` or `monthly`, which in practice means up to an hour after the selected time span, and you cannot set them to run at a specific time. +{{ site.data.snippets.cron_jobs }} Cron job builds use the same notification settings as normal push builds, and you can [skip them](#Skipping-Cron-Jobs) in the same way diff --git a/user/environment-variables.md b/user/environment-variables.md index 880e9338c7d..4e0a5174664 100644 --- a/user/environment-variables.md +++ b/user/environment-variables.md @@ -126,12 +126,7 @@ The encryption scheme is explained in more detail in [Encryption keys](/user/enc {: #Defining-Variables-in-Repository-Settings} -Variables defined in repository settings are the same for all builds, and when you restart an old build, it uses the latest values. These variables are not automatically available to forks. - -Define variables in the Repository Settings that: - -- differ per repository. -- contain sensitive data, such as third-party credentials. +{{ site.data.snippets.environment_variables }} To define variables in Repository Settings, make sure you're logged in, navigate to the repository in question, choose "Settings" from the cog menu, and click on "Add new variable" in the "Environment Variables" section. diff --git a/user/web-ui.md b/user/web-ui.md index 2bc6d631839..20c629ac8fa 100644 --- a/user/web-ui.md +++ b/user/web-ui.md @@ -1,13 +1,14 @@ --- title: Web Interface layout: en - --- This page lists settings that are only available in the Travis CI .com and .org web user interface. ## Build only if .travis.yml is present +Limit builds to branches that contain `.travis.yml`. This is the default. + ## Limit concurrent jobs {{ site.data.snippets.concurrent_jobs }} @@ -32,8 +33,23 @@ If *ON*, builds will be run new [pull requests](/user/pull-requests/). ## Environment variables +{{ site.data.snippets.environment_variables }} + +More information on [environment variables](/user/environment-variables/#Defining-Variables-in-Repository-Settings). + ## Cron jobs +{{ site.data.snippets.cron_jobs }} + +Check the full cron jobs docs for more information on [skipping and detecting cron jobs](/user/cron-jobs). + ## Caches +More information on [caching](https://docs.travis-ci.com/user/caching). + ## Trigger a custom build + +Custom builds exist only on Travis CI and will not appear in your Git history. + +> BETA Custom builds are a beta feature. Please provide feedback on [GitHub](https://github.com/travis-ci/beta-features/issues/27). +{: beta} From ea25bbf6d320792d848bd27e88235562058abe6b Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Fri, 2 Feb 2018 12:20:25 +0100 Subject: [PATCH 0191/2623] Minor fixes --- STYLE.md | 2 +- user/web-ui.md | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/STYLE.md b/STYLE.md index 655ef50ab47..192267ef386 100644 --- a/STYLE.md +++ b/STYLE.md @@ -54,7 +54,7 @@ Add a table of contents to a page with the following HTML snippet: ### Beta features Mark all beta features with a specially formatted note. Both the `> BETA` and -the `{: beta}` are required. +the `{: .beta}` are required. > BETA Awesome new feature that might not be enabled and is subject to change. {: .beta} diff --git a/user/web-ui.md b/user/web-ui.md index 20c629ac8fa..58a5d99ec40 100644 --- a/user/web-ui.md +++ b/user/web-ui.md @@ -5,9 +5,11 @@ layout: en This page lists settings that are only available in the Travis CI .com and .org web user interface. +
+ ## Build only if .travis.yml is present -Limit builds to branches that contain `.travis.yml`. This is the default. +Limit builds to branches that contain `.travis.yml`. This is the default. ## Limit concurrent jobs @@ -52,4 +54,4 @@ More information on [caching](https://docs.travis-ci.com/user/caching). Custom builds exist only on Travis CI and will not appear in your Git history. > BETA Custom builds are a beta feature. Please provide feedback on [GitHub](https://github.com/travis-ci/beta-features/issues/27). -{: beta} +{: .beta} From aaeda6ee1c9b0e1bdf477d3fa2c63abcff014508 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Fri, 2 Feb 2018 14:35:25 +0100 Subject: [PATCH 0192/2623] Seeing double? --- user/pull-requests.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/user/pull-requests.md b/user/pull-requests.md index 12e9b226782..82dbbd5ce29 100644 --- a/user/pull-requests.md +++ b/user/pull-requests.md @@ -67,6 +67,12 @@ The command "eval git fetch origin +refs/pull/994/merge: " failed Restoring the branch of a merged pull request will not trigger a build, nor will pushing a new commit to a branch that has already been merged. +## 'Double builds' on pull requests + +If you see two build status icons on your GitHub pull request, it means there is one build for the branch, and one build for the pull request itself (actually the build for the merge of the head branch with the base branch specified in the pull request). + +[Build pushed branches](/user/web-ui/#build-pushed-branches) and [Build pushed pull requests](/user/web-ui/#build-pushed-pull-requests) control this behaviour. + ## See Also * [Building only the latest commit](/user/customizing-the-build/#Building-only-the-latest-commit) From 93234c40b1db2071335d5490d46b115714a57244 Mon Sep 17 00:00:00 2001 From: nem2p Date: Sat, 3 Feb 2018 17:24:52 -0500 Subject: [PATCH 0193/2623] Add link to encryption for env vars --- user/docker.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/user/docker.md b/user/docker.md index 602302909c3..c9eebfda0b1 100644 --- a/user/docker.md +++ b/user/docker.md @@ -135,6 +135,9 @@ travis env set DOCKER_USERNAME myusername travis env set DOCKER_PASSWORD secretsecret ``` +Be sure to [encrypt environment variables](https://docs.travis-ci.com/user/environment-variables#Encrypting-environment-variables) +using the travis gem. + Within your `.travis.yml` prior to attempting a `docker push` or perhaps before `docker pull` of a private image, e.g.: From b2483c2f9bcb2c4030c624a2d58530f60699f97d Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Sun, 4 Feb 2018 11:23:33 -0500 Subject: [PATCH 0194/2623] Add JWT deprecation warning and .warning class --- assets/stylesheets/_base.sass | 4 ++++ user/jwt.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/assets/stylesheets/_base.sass b/assets/stylesheets/_base.sass index 5c7acfa57bf..b640b5c303f 100644 --- a/assets/stylesheets/_base.sass +++ b/assets/stylesheets/_base.sass @@ -100,3 +100,7 @@ table background-color: $cream-light color: $grey-dark border-right: 1px $cream-dark solid + +.warning + color: $pebble-grey + background-color: $brick-red diff --git a/user/jwt.md b/user/jwt.md index ecf27ffa9fc..16ee6d38d8d 100644 --- a/user/jwt.md +++ b/user/jwt.md @@ -4,6 +4,10 @@ layout: en --- +{: .warning} +> The JWT addon is deprecated and will be +> [discontinued on April 17, 2018](https://blog.travis-ci.com/2018-01-23-jwt-addon-is-deprecated). + Integration between Travis-CI and third-party services like Sauce Labs relies on [encrypted variables](http://docs.travis-ci.com/user/environment-variables/#Encrypted-Variables) which works well for trusted branches and committers. From bff9f27ffa71e6ffce219faaeb8877a4ae94706c Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Mon, 5 Feb 2018 10:41:17 +0100 Subject: [PATCH 0195/2623] local links --- user/docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/docker.md b/user/docker.md index c9eebfda0b1..14ca2d85b6c 100644 --- a/user/docker.md +++ b/user/docker.md @@ -135,7 +135,7 @@ travis env set DOCKER_USERNAME myusername travis env set DOCKER_PASSWORD secretsecret ``` -Be sure to [encrypt environment variables](https://docs.travis-ci.com/user/environment-variables#Encrypting-environment-variables) +Be sure to [encrypt environment variables](/user/environment-variables#Encrypting-environment-variables) using the travis gem. Within your `.travis.yml` prior to attempting a `docker push` or perhaps before From 39df37594d553db11009114c6a9bc4cf779c4767 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20G=C3=B6tz?= Date: Mon, 5 Feb 2018 21:49:19 +1000 Subject: [PATCH 0196/2623] Trim the amount of information provided on the security posture of the ssh_known_hosts option. --- user/ssh-known-hosts.md | 47 +++++++---------------------------------- 1 file changed, 8 insertions(+), 39 deletions(-) diff --git a/user/ssh-known-hosts.md b/user/ssh-known-hosts.md index f2bee2960bd..00b13e1660a 100644 --- a/user/ssh-known-hosts.md +++ b/user/ssh-known-hosts.md @@ -46,51 +46,20 @@ Note that the `ssh_known_hosts` option may introduce a risk of man-in-the-middle For example, it may prevent a build from detecting that an illegitimate 3rd party attempts to inject a modified git repository or submodule into the build. This possibility might be of particular relevance where Travis CI build outputs are used for release packages or production deployments. -### Background - -What is the basis for such a scenario? -It lies in the fact that the `ssh_known_hosts` option updates SSH's `known_hosts` file for every new build by retrieving and trusting whatever public key an SSH or git server, legitimate or not, presents. - -In a non-CI environment, SSH can detect this with the `known_hosts` file permanently storing the public keys of SSH servers after first connecting to them. -While a 3rd party may at some later stage be able to redirect an SSH-based `git clone` request to a git server they control (e.g., via DNS spoofing), they would typically not be able to spoof the SSH key of the legitimate git server. -Therefore, the public key of the spoofed git server would differ from that stored in `known_hosts`. -A `git clone` request would make SSH compare the two keys and reject a connection to the spoofed server given the key mismatch. - -However, in a CI environment, the `ssh_known_hosts` option makes every build obtain a fresh copy of the server's public key. -When the build proceeds to clone a repository or submodule, it compares the key of the repository server against the key that the `ssk_known_hosts` option triggered it to retrieve from the same server seconds earlier. -Effectively, the `ssh_known_hosts` option makes a build trust any SSH key that a server presents at the beginning of the build, even if the server is being spoofed by a third party. - ### Mitigations and Workarounds -#### Git Cloning - -Currently, the simplest mitigation is to host all your repositories and submodules on one of the `github.com`, `gist.github.com`, or `ssh.github.com` domains. -They can be considered trustworthy because their actual SSH server keys are preconfigured in the Travis CI build images. -A build can therefore detect when a spoofed repository server presents an invalid key. - -A potential work-around for repositories or submodules on other domains can consist of the following three-step approach. -How successfully it can be employed heavily depends on the complexity of your existing Travis CI configuration. - -1. Set up `.travis.yml` to clone a boot-strap git repository from `github.com`, `gist.github.com`, or `ssh.github.com`. - -2. In the installation phase of the boot-strap repository, configure the build instance with the public SSH keys of your application git repositories and submodules. -This is described in more detail in the next section. - -3. Configure the boot-strap repository to clone the application repositories and submodules explicitly and then proceed with the rest of the installation and test phases of the application. - -#### Other SSH Connections - -Depending on its configuration, your build may establish further SSH connections beyond git cloning, e.g., during deployment. -If you use the `ssh_known_hosts` option for such connections, the same security implications as outlined above apply. +Currently, Travis CI only detects the above attacks out-of-the-box for repositories on `github.com`, `gist.github.com`, or `ssh.github.com`. +If you host your code on other domains, there is currently no straightforward alternative to using the `ssh_known_hosts` option and its security implications. -To make your builds reject spoofed SSH servers, you configure them with known good SSH keys. +However, you can protect other SSH connections that occur after the cloning phase in your build, e.g., when deploying build outputs. +To make your builds reject spoofed SSH servers for such connections, you configure them with known good SSH keys. Say your build instance connects to the SSH server *ssh.example.com*: -1. Remove the `ssh_known_hosts` option. +1. Remove the `ssh_known_hosts` option for *ssh.example.com*. -2. Obtain the public key of the SSH server: +2. Obtain the public key of the SSH server at *ssh.example.com*: - - Ideally (but rarely), the owner of *ssh.example.com* can provide you with the server's public SSH key through e-mail or some other channel. + - Ideally (but rarely), the owner of *ssh.example.com* can provide you with the server's public SSH key through e-mail or some other trusted channel. - If you have previously connected to *ssh.example.com* from a trusted local computer, run `ssh-keygen -F ssh.example.com` to display its public key. @@ -98,7 +67,7 @@ Say your build instance connects to the SSH server *ssh.example.com*: Ideally, you would double-check with the owner of *ssh.example.com* that that is indeed the server's public key and not the key of a spoofed instance of *ssh.example.com*. 3. Configure Travis CI to use the public key of the SSH server: -Add the key *KEY* to the `known_hosts` file, e.g., with the following addition to the installation phase: +Add the key server's public key *KEY* to the SSH `known_hosts` file, e.g., with the following addition to the installation phase: ```yaml install: From d633525a16b243f9cd1eb858e8e8dadc07896eed Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 5 Feb 2018 10:49:36 -0500 Subject: [PATCH 0197/2623] Tone down red in .warning class --- assets/stylesheets/_base.sass | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/stylesheets/_base.sass b/assets/stylesheets/_base.sass index b640b5c303f..d5559b3876d 100644 --- a/assets/stylesheets/_base.sass +++ b/assets/stylesheets/_base.sass @@ -102,5 +102,5 @@ table border-right: 1px $cream-dark solid .warning - color: $pebble-grey - background-color: $brick-red + color: $grey-light + background-color: $red-light From 07abfe9cd8edb5d720ba6de25c175fc45159a8d2 Mon Sep 17 00:00:00 2001 From: AJ Bowen Date: Thu, 1 Feb 2018 14:47:03 -0800 Subject: [PATCH 0198/2623] Specify that travis_retry only works in 'script', not 'deploy'. --- user/common-build-problems.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user/common-build-problems.md b/user/common-build-problems.md index 86885c43f1a..d8d2bae6998 100644 --- a/user/common-build-problems.md +++ b/user/common-build-problems.md @@ -480,6 +480,10 @@ install: travis_retry pip install myawesomepackage Most of our internal build commands are wrapped with `travis_retry` to reduce the impact of network timeouts. +Note that `travis_retry` only works within the `script` step. It will not work +in other steps, like `deploy`. + + ### Build times out because no output was received When a long running command or compile step regularly takes longer than 10 minutes without producing any output, you can adjust your build configuration to take that into consideration. From 39b9967b1b827dcec5d80bed8eac3293da27c267 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Tue, 6 Feb 2018 15:10:48 +0100 Subject: [PATCH 0199/2623] Minor nits --- user/private-dependencies.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/user/private-dependencies.md b/user/private-dependencies.md index c019d834274..428310f323a 100644 --- a/user/private-dependencies.md +++ b/user/private-dependencies.md @@ -22,7 +22,7 @@ disavantages, so read each method carefully and pick the one that applies best to your situation. | Authentication | Protocol | Dependency URL format | Gives access to | Notes | -| ----------------------------- | -------- | ----------------------|----------------------------- | ----------------------------------- | +|:------------------------------|:---------|:----------------------|:-----------------------------|:------------------------------------| | **[Deploy Key](#Deploy-Key)** | SSH | `git@github.com/…` | single repository | used by default for main repository | | **[User Key](#User-Key)** | SSH | `git@github.com/…` | all repos user has access to | **recommended** for dependencies | | **[Password](#Password)** | HTTPS | `https://…` | all repos user has access to | password can be encrypted | @@ -212,11 +212,11 @@ gem 'lib2', github: "myorg/lib2" ``` > In case of private git submodules, be aware that the `git submodule -> update --init recursive` command will by default run before the `~/.netrc` credentials -> are updated. If you are writing credentials to `~/.netrc`, disable the loading of -> submodules first, and do this as a separate explicit step after updating the credentials: -> -> ```yml +> update --init recursive` command runs before the `~/.netrc` credentials +> are updated. If you are writing credentials to `~/.netrc`, disable the automatic loading of +> submodules, update the credentials and add an explicit step to update the submodules: + +> ```yaml > git: > submodules: > false @@ -277,11 +277,11 @@ gem 'lib2', github: "myorg/lib2" ``` > In case of private git submodules, be aware that the `git submodule -> update --init recursive` command will by default run before the `~/.netrc` credentials -> are updated. If you are writing credentials to `~/.netrc`, disable the loading of -> submodules first, and do this as a separate explicit step after updating the credentials: -> -> ```yml +> update --init recursive` command runs before the `~/.netrc` credentials +> are updated. If you are writing credentials to `~/.netrc`, disable the automatic loading of +> submodules, update the credentials and add an explicit step to update the submodules: +> +> ```yaml > git: > submodules: > false From 184c326f7d1bdc8dde1f2dceadd97e6d8b64f99a Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Tue, 6 Feb 2018 15:30:51 +0100 Subject: [PATCH 0200/2623] Make IPv6 availabilty more clear --- user/reference/overview.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user/reference/overview.md b/user/reference/overview.md index fd306ef6121..0106b690a5f 100644 --- a/user/reference/overview.md +++ b/user/reference/overview.md @@ -46,6 +46,8 @@ The following table summarizes the differences across virtual environments and o | Operating system | Ubuntu 12.04 | Ubuntu 14.04 | Ubuntu 14.04 | OS X | | Memory | 7.5 GB | 4 GB max | 7.5 GB | 4 GB | | Cores | ~2, bursted | 2 | ~2, bursted | 2 | +| IPv4 Network | IPv4 is available | IPv4 is available | IPv4 is available | IPv4 is available | +| IPv6 Network | IPv6 is not available | IPv6 is available on loopback | IPv6 is not available | IPv6 is not available | ## What infrastructure is my environment running on? From 0ed31fe929f34633aa2f12e9aab46829252f9bb8 Mon Sep 17 00:00:00 2001 From: Dorian Thiessen Date: Tue, 6 Feb 2018 09:17:21 -0600 Subject: [PATCH 0201/2623] Update Scala versions, add note about using 2.12.2 (#1217) * Update Scala versions, add note about using 2.12.2 - Updated versions listed to most recent releases: 2.10.6, 2.11.11, and 2.12.2 - Add note that using 2.12 requires overriding Travis-CI's default JDK (oraclejdk7) to oraclejdk8 * Minor updates --- user/languages/scala.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/user/languages/scala.md b/user/languages/scala.md index fbefc542f9c..dc6093ea4f9 100644 --- a/user/languages/scala.md +++ b/user/languages/scala.md @@ -47,11 +47,14 @@ To specify Scala versions in your build: language: scala scala: - 2.9.3 - - 2.10.4 - - 2.11.2 + - 2.10.6 + - 2.11.11 + - 2.12.2 ``` {: data-file=".travis.yml"} +On Ubuntu Precise, to use Scala 2.12.X you need to enable Oracle JDK 8 by adding `jdk: oraclejdk8` to your `.travis.yml`. + ## Projects using sbt If your project has a `project` directory or `build.sbt` file in the repository From 5cc44922cd09fc4e18c6fb8b9e4cfd67f2f1e13e Mon Sep 17 00:00:00 2001 From: Lyoness Date: Wed, 7 Feb 2018 17:34:06 +0100 Subject: [PATCH 0202/2623] Adds xcode9.3beta build env update --- user/build-environment-updates/2018-02-07.md | 78 ++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 user/build-environment-updates/2018-02-07.md diff --git a/user/build-environment-updates/2018-02-07.md b/user/build-environment-updates/2018-02-07.md new file mode 100644 index 00000000000..5db9c6dc26b --- /dev/null +++ b/user/build-environment-updates/2018-02-07.md @@ -0,0 +1,78 @@ +--- +title: Build Environment Update History +layout: en +permalink: /user/build-environment-updates/2017-11-08/ +category: mac_build_env_updates +date: 2018-02-07 +--- + +## 2017-11-08 + +This update applies to `osx_image: xcode9.3`, for osx builds +Xcode 9.3 (build 9Q98q ) + +### Schedule + +2018-02-07 22:30 UTC + +### Added + +This xcode image is running on High Sierra 10.13 + +- iPhoneOS11.3sdk - iOS 11.3 (iphoneos11.3) +- tvOS 11.3 (15L5175d) +- iOS 11.3 (15E5178d) +- watchOS 4.3 (15T5176c) +- macOS 10.13.4 (17E150d) + +### Changed + +- Bundler version `1.15.4` +- xctool version `0.3.4` +- carthage `0.28.0` +- cgal `4.11_1` +- cmake `3.10.0` +- coreutils `8.29` +- git `2.16.1` +- gnutls `3.5.17` +- go `1.9.3` +- icu4c `60.2` +- libtiff `4.0.9_1` +- libxml2 `2.9.7` +- lzlib `1.9` +- maven `3.5.2` +- mercurial `4.5` +- node `9.5.0` +- motion version `5.6` +- pod version `1.4.0` +- postgis `2.4.3` +- postgresql `9.6.5` +- pyenv `1.2.1` +- python `2.7.14_2` +- sqlite `3.22.0` +- swiftlint `0.24.2` +- swift `4.0.2` +- tmate `2.2.1_3` +- wget `1.19.4_1` + + +### Deprecated + +N/A + + +### Removed + +N/A + +### Fixed + + + +### Security + +N/A + +### Details + +See a full diff of the xcode9.1-beta to xcode9.1 GA image [here](https://github.com/travis-ci/docs-travis-ci-com/commit/f73c2664e632ff0f60328ddd569c8b9a2755fe45) From b5d0969316d2c4b5ff3a57883efcdccc7f5c6302 Mon Sep 17 00:00:00 2001 From: Lyoness Date: Wed, 7 Feb 2018 18:06:57 +0100 Subject: [PATCH 0203/2623] Adds xcode9.3beta to docs --- _data/xcodes.yml | 48 ++++++++++++++++++++ user/build-environment-updates/2018-02-07.md | 12 ++--- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/_data/xcodes.yml b/_data/xcodes.yml index 4369db9ff2a..8441747135c 100644 --- a/_data/xcodes.yml +++ b/_data/xcodes.yml @@ -1,4 +1,52 @@ osx_images: + - image: xcode9.3 + xcode: "9.3beta" + osx_version: "10.13" + xcode_full_version: "9.3" + image_publish_date: 2017-02-07 + sdks: + - macosx10.13 + - iphoneos11.3 + - iphonesimulator11.3 + - appletvos11.2 + - appletvsimulator11.3 + - watchos4.3 + - watchsimulator4.3 + simulators: + - iOS 8.1 + - iOS 8.2 + - iOS 8.3 + - iOS 8.4 + - iOS 9.0 + - iOS 9.1 + - iOS 9.2 + - iOS 9.3 + - iOS 10.0 + - iOS 10.1 + - iOS 10.2 + - iOS 10.3 + - iOS 11.0 + - iOS 11.1 + - iOS 11.2 + - iOS 11.3 + - tvOS 9.0 + - tvOS 9.1 + - tvOS 9.2 + - tvOS 10.0 + - tvOS 10.1 + - tvOS 10.2 + - tvOS 11.0 + - tvOS 11.1 + - tvOS 11.2 + - tvOS 11.3 + - watchOS 2.0 + - watchOS 2.1 + - watchOS 2.2 + - watchOS 3.2 + - watchOS 4.0 + - watchOS 4.1 + - watchOS 4.2 + - watchOS 4.3 - image: xcode9.2 xcode: "9.2" osx_version: "10.12" diff --git a/user/build-environment-updates/2018-02-07.md b/user/build-environment-updates/2018-02-07.md index 5db9c6dc26b..0f689664946 100644 --- a/user/build-environment-updates/2018-02-07.md +++ b/user/build-environment-updates/2018-02-07.md @@ -1,15 +1,15 @@ --- title: Build Environment Update History layout: en -permalink: /user/build-environment-updates/2017-11-08/ +permalink: /user/build-environment-updates/2018-02-07/ category: mac_build_env_updates date: 2018-02-07 --- -## 2017-11-08 +## 2018-02-007 This update applies to `osx_image: xcode9.3`, for osx builds -Xcode 9.3 (build 9Q98q ) +Xcode 9.3 (build 9Q98q) ### Schedule @@ -24,6 +24,7 @@ This xcode image is running on High Sierra 10.13 - iOS 11.3 (15E5178d) - watchOS 4.3 (15T5176c) - macOS 10.13.4 (17E150d) +- tmate `2.2.1_3` ### Changed @@ -46,13 +47,12 @@ This xcode image is running on High Sierra 10.13 - motion version `5.6` - pod version `1.4.0` - postgis `2.4.3` -- postgresql `9.6.5` +- postgresql `10.1` - pyenv `1.2.1` - python `2.7.14_2` - sqlite `3.22.0` - swiftlint `0.24.2` - swift `4.0.2` -- tmate `2.2.1_3` - wget `1.19.4_1` @@ -75,4 +75,4 @@ N/A ### Details -See a full diff of the xcode9.1-beta to xcode9.1 GA image [here](https://github.com/travis-ci/docs-travis-ci-com/commit/f73c2664e632ff0f60328ddd569c8b9a2755fe45) +See a full diff From e44f5070b15e4add547435fc8855afd79b67c32e Mon Sep 17 00:00:00 2001 From: Lyoness Date: Wed, 7 Feb 2018 18:10:06 +0100 Subject: [PATCH 0204/2623] Adds a github diff b/t xcode9.2 xcode9.3beta --- user/build-environment-updates/2018-02-07.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/build-environment-updates/2018-02-07.md b/user/build-environment-updates/2018-02-07.md index 0f689664946..cbd777d11fc 100644 --- a/user/build-environment-updates/2018-02-07.md +++ b/user/build-environment-updates/2018-02-07.md @@ -75,4 +75,4 @@ N/A ### Details -See a full diff +See a full diff here: https://github.com/travis-ci/docs-travis-ci-com/commit/2d947844dff36b4acd8a59abcdf69af3bf9b1933 From 513b1ad91ea8f33808f6d35f167e8d012e5ab305 Mon Sep 17 00:00:00 2001 From: Evan Kroske Date: Wed, 7 Feb 2018 18:42:30 -0500 Subject: [PATCH 0205/2623] Uses new name for Capybara parameter --- user/common-build-problems.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/common-build-problems.md b/user/common-build-problems.md index d8d2bae6998..c337528a637 100644 --- a/user/common-build-problems.md +++ b/user/common-build-problems.md @@ -105,7 +105,7 @@ Capybara has a timeout setting which you can increase to a minimum of 15 seconds: ```js -Capybara.default_wait_time = 15 +Capybara.default_max_wait_time = 15 ``` Poltergeist has its own setting for timeouts: From 50fac1542d82bbf34b520e06ad60f8225fbb8147 Mon Sep 17 00:00:00 2001 From: Lyoness Date: Thu, 8 Feb 2018 17:50:20 +0100 Subject: [PATCH 0206/2623] Change release date to today --- user/build-environment-updates/2018-02-07.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user/build-environment-updates/2018-02-07.md b/user/build-environment-updates/2018-02-07.md index cbd777d11fc..7089cb27e9a 100644 --- a/user/build-environment-updates/2018-02-07.md +++ b/user/build-environment-updates/2018-02-07.md @@ -3,17 +3,17 @@ title: Build Environment Update History layout: en permalink: /user/build-environment-updates/2018-02-07/ category: mac_build_env_updates -date: 2018-02-07 +date: 2018-02-08 --- -## 2018-02-007 +## 2018-02-08 This update applies to `osx_image: xcode9.3`, for osx builds Xcode 9.3 (build 9Q98q) ### Schedule -2018-02-07 22:30 UTC +2018-02-08 14:30 UTC ### Added From 2fba65e967cfaa4499c69d0c1edca98cff6826ee Mon Sep 17 00:00:00 2001 From: Lyoness Date: Thu, 8 Feb 2018 18:15:52 +0100 Subject: [PATCH 0207/2623] Correct osx_image name to beta, date --- _data/xcodes.yml | 2 +- user/build-environment-updates/2018-02-07.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_data/xcodes.yml b/_data/xcodes.yml index 8441747135c..9e6a2a92fdb 100644 --- a/_data/xcodes.yml +++ b/_data/xcodes.yml @@ -3,7 +3,7 @@ osx_images: xcode: "9.3beta" osx_version: "10.13" xcode_full_version: "9.3" - image_publish_date: 2017-02-07 + image_publish_date: 2017-02-08 sdks: - macosx10.13 - iphoneos11.3 diff --git a/user/build-environment-updates/2018-02-07.md b/user/build-environment-updates/2018-02-07.md index 7089cb27e9a..d3a7dbbb62a 100644 --- a/user/build-environment-updates/2018-02-07.md +++ b/user/build-environment-updates/2018-02-07.md @@ -8,7 +8,7 @@ date: 2018-02-08 ## 2018-02-08 -This update applies to `osx_image: xcode9.3`, for osx builds +This update applies to `osx_image: xcode9.3beta`, for osx builds Xcode 9.3 (build 9Q98q) ### Schedule From 5fc873d6d60e05992d056f58a9a96a5b04fbf000 Mon Sep 17 00:00:00 2001 From: Lyoness Date: Thu, 8 Feb 2018 18:35:01 +0100 Subject: [PATCH 0208/2623] Corrects xcode9.3 image name to beta --- _data/xcodes.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_data/xcodes.yml b/_data/xcodes.yml index 9e6a2a92fdb..d0a22c3f4d8 100644 --- a/_data/xcodes.yml +++ b/_data/xcodes.yml @@ -1,8 +1,8 @@ osx_images: - - image: xcode9.3 + - image: xcode9.3beta xcode: "9.3beta" osx_version: "10.13" - xcode_full_version: "9.3" + xcode_full_version: "9.3beta" image_publish_date: 2017-02-08 sdks: - macosx10.13 From caaeea0c5f2e2014b8e6f4e253c853ea8098a3fc Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Thu, 8 Feb 2018 13:01:03 -0500 Subject: [PATCH 0209/2623] Typo: Cloud => Compute --- user/reference/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/overview.md b/user/reference/overview.md index 0106b690a5f..be3f75217e4 100644 --- a/user/reference/overview.md +++ b/user/reference/overview.md @@ -67,7 +67,7 @@ To see what infrastructure a finished build ran on, look at the *hostname* at th if it contains: * `ec2`, as in the previous example → the build ran in a container-based environment on Amazon EC2. -* `gce` → the build ran in a sudo-enabled environment on Google Cloud Engine. +* `gce` → the build ran in a sudo-enabled environment on Google Compute Engine. * `jupiter` → the build ran on macOS ### For a particular .travis.yml configuration From 89324abdfa0828347c5acf8ae86d572beec1f71b Mon Sep 17 00:00:00 2001 From: Thomas Kluyver Date: Thu, 8 Feb 2018 18:26:24 +0000 Subject: [PATCH 0210/2623] Fix URL for Sauce connect proxy The `https://` url doesn't work. At the suggestion of [this SO post](https://stackoverflow.com/questions/48236104/ssl-errors-using-sauce-labs-in-travis-ci-with-selenium-webriver-tests-django-pr), I changed it to `http://` and got a step further. --- user/gui-and-headless-browsers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/gui-and-headless-browsers.md b/user/gui-and-headless-browsers.md index ef890ab0326..de483cdffc5 100644 --- a/user/gui-and-headless-browsers.md +++ b/user/gui-and-headless-browsers.md @@ -33,7 +33,7 @@ username = os.environ["SAUCE_USERNAME"] access_key = os.environ["SAUCE_ACCESS_KEY"] capabilities["tunnel-identifier"] = os.environ["TRAVIS_JOB_NUMBER"] hub_url = "%s:%s@localhost:4445" % (username, access_key) -driver = webdriver.Remote(desired_capabilities=capabilities, command_executor="https://%s/wd/hub" % hub_url) +driver = webdriver.Remote(desired_capabilities=capabilities, command_executor="http://%s/wd/hub" % hub_url) ``` The Sauce Connect addon exports the `SAUCE_USERNAME` and `SAUCE_ACCESS_KEY` environment variables, and relays connections to the hub URL back to Sauce Labs. From 9365eaddb5d60021c60450ff39fdb4d22d492b19 Mon Sep 17 00:00:00 2001 From: Nick Holden Date: Thu, 8 Feb 2018 18:07:48 -0800 Subject: [PATCH 0211/2623] Correct filename in database setup documentation The database setup documentation provides an example `config/database.yml` file for using MySQL with ActiveRecord, but it's mislabeled as `.travis.yml`. This corrects this label. --- user/database-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/database-setup.md b/user/database-setup.md index b31571f17cb..da74c2abca7 100644 --- a/user/database-setup.md +++ b/user/database-setup.md @@ -76,7 +76,7 @@ test: username: travis encoding: utf8 ``` -{: data-file=".travis.yml"} +{: data-file="config/database.yml"} You might have to create the `myapp_test` database first, for example in the `before_install` step in `.travis.yml`: From 3ced0d4c347e40700954cbe523ecf9c3af647e8e Mon Sep 17 00:00:00 2001 From: Chad Whitacre Date: Fri, 9 Feb 2018 06:23:57 -0500 Subject: [PATCH 0212/2623] Document a simpler xvfb setup (#1696) * Document a simpler xvfb setup - point out `xvfb-run` - fix a typo while we're at it * Respond to review * Change headings as requested --- user/gui-and-headless-browsers.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/user/gui-and-headless-browsers.md b/user/gui-and-headless-browsers.md index de483cdffc5..4472a638bfa 100644 --- a/user/gui-and-headless-browsers.md +++ b/user/gui-and-headless-browsers.md @@ -56,7 +56,25 @@ Virtual Framebuffer) to imitate a display. If you need a browser, you can use Firefox (either with the pre-installed version, or the [addon](/user/firefox)) or Google Chrome (with the [addon](/user/chrome), on Linux Trusty or OS X). -Start `xvfb` in the `before_script` section of your `.travis.yml`: +### Using the xvfb-run wrapper + +`xvfb-run` is a wrapper for invoking `xvfb` so that `xvfb` can be used with +less fuss: + +```yaml +script: xvfb-run make test +``` + +To set the screen resolution: + +```yaml +script: xvfb-run --server-args="-screen 0 1024x768x24" make test +``` + +### Using xvfb directly + +To use `xvfb` itself, start it in the `before_script` section of your +`.travis.yml`: ```yaml before_script: From 0a5950a53fcfcc2a630b7c7e86848a50141255b9 Mon Sep 17 00:00:00 2001 From: Carla Date: Fri, 9 Feb 2018 14:57:21 +0100 Subject: [PATCH 0213/2623] Call custom scripts with bash --- user/deployment/script.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/user/deployment/script.md b/user/deployment/script.md index 4f1725afdc9..c4a5d9cdfe5 100644 --- a/user/deployment/script.md +++ b/user/deployment/script.md @@ -12,7 +12,7 @@ The following example runs `scripts/deploy.sh` on the `develop` branch of your r ```yaml deploy: provider: script - script: scripts/deploy.sh + script: bash scripts/deploy.sh on: branch: develop ``` @@ -31,12 +31,12 @@ It is possible to pass arguments to a script deployment. deploy: # deploy develop to the staging environment - provider: script - script: scripts/deploy.sh staging + script: bash scripts/deploy.sh staging on: branch: develop # deploy master to production - provider: script - script: scripts/deploy.sh production + script: bash scripts/deploy.sh production on: branch: master ``` @@ -47,7 +47,7 @@ The script has access to all the usual [environment variables](/user/environment ```yaml deploy: provider: script - script: scripts/deploy.sh production $TRAVIS_TAG + script: bash scripts/deploy.sh production $TRAVIS_TAG on: tags: true all_branches: true From 714d185a8c4e8c1e0ac3064c20dc86ae3defa8e2 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 12 Feb 2018 15:06:27 +0100 Subject: [PATCH 0214/2623] Update Python & PyPy version Resolves https://github.com/travis-ci/travis-ci/issues/9206 --- user/languages/python.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/user/languages/python.md b/user/languages/python.md index cb47afe4e53..7b2270a734a 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -58,6 +58,7 @@ python: - "3.6" - "3.6-dev" # 3.6 development branch - "3.7-dev" # 3.7 development branch + - "3.8-dev" # 3.8 development branch - "nightly" # command to install dependencies install: @@ -104,8 +105,8 @@ python: - "3.5" - "3.6" # PyPy versions - - "pypy" # PyPy2 5.8.0 - - "pypy3" # Pypy3 5.8.0-beta0 + - "pypy2.7" + - "pypy3.5" # command to install dependencies install: - pip install . @@ -118,13 +119,14 @@ script: pytest ### Nightly build support Travis CI supports a special version name `nightly`, which points to -a recent development version of [CPython](https://bitbucket.org/mirror/cpython) build. +a recent development version of [CPython](https://github.com/python/cpython) build. ### Development releases support -From Python 3.5, Python In Development versions are available. +From Python 3.5 and later, Python In Development versions are available. -You can specify these in your builds with `3.5-dev`, `3.6-dev` or `3.7-dev`. +You can specify these in your builds with `3.5-dev`, `3.6-dev`, +`3.7-dev` or `3.8-dev`. ## Default Build Script From 81da629fe705c662b4bc8dc22ee9fff84e4a71e5 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 12 Feb 2018 18:47:29 +0100 Subject: [PATCH 0215/2623] Document TRAVIS_OX_IMAGE --- user/environment-variables.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user/environment-variables.md b/user/environment-variables.md index 880e9338c7d..bc26ec85974 100644 --- a/user/environment-variables.md +++ b/user/environment-variables.md @@ -203,6 +203,8 @@ to tag the build, or to run post-build deployments. - `TRAVIS_JOB_NUMBER`: The number of the current job (for example, "4.1"). - `TRAVIS_OS_NAME`: On multi-OS builds, this value indicates the platform the job is running on. Values are `linux` and `osx` currently, to be extended in the future. +- `TRAVIS_OSX_IMAGE`: The `osx_image` value configured in `.travis.yml`. If this is not set in `.travis.yml`, + it is emtpy. - `TRAVIS_PULL_REQUEST`: The pull request number if the current job is a pull request, "false" if it's not a pull request. - `TRAVIS_PULL_REQUEST_BRANCH`: From 5719b7cd8ef2a8db160b746dc42abe78d418a7be Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Tue, 13 Feb 2018 15:08:29 +0100 Subject: [PATCH 0216/2623] Reorganize ssh-known-hosts page (#1692) * Reorganize ssh-known-hosts page Explain the new means of adding previously-known SSH host keys An additional minor change is eschewing die.net, which tends to be outdated. * Fix man page link * Update ssh-known-hosts Based on input --- user/ssh-known-hosts.md | 96 ++++++++++++++++++++++++++--------------- 1 file changed, 61 insertions(+), 35 deletions(-) diff --git a/user/ssh-known-hosts.md b/user/ssh-known-hosts.md index 00b13e1660a..0bf20ed80e4 100644 --- a/user/ssh-known-hosts.md +++ b/user/ssh-known-hosts.md @@ -12,8 +12,60 @@ your git repository, which is necessary if there are git submodules from domains other than `github.com`, `gist.github.com`, or `ssh.github.com`. -Both hostnames and IP addresses are supported, as the keys are -added via `ssh-keyscan`. A single host may be specified like so: +Each entry in the configuration is one of the following: + +1. a hash with `host`, `type`, `key` +1. a hostname +1. a numeric IP address + +In the first case, we write the key directly to `~/.ssh/known_hosts`. + +In the last two cases, we run `ssh-keyscan` to add the host key. +See [Security Implications](#Security-Implications) below to understand what this means. + +## Examples + +Here are some examples of the different ways to add hosts. + +### A single hash with `host`, `type`, `key` + +In the case where a host is defined with `host`, `type`, and `key`, + +```yaml +addons: + ssh_known_hosts: + host: ssh.example.com + type: ssh-ed25519 + key: AAAAC3NzaC1lZDI1NTE5AAAAIOd6AtszfjD3nI7WvvnN+B39XsrjPzAMCByYO1hwUGf9 +``` +{: data-file=".travis.yml" } + +a line of the form + + HOST TYPE KEY + +is added to `$HOME/.ssh/known_hosts`. + +Each of `host`, `type`, and `key` is required. If any is missing, the entry is ignored. + +### Multiple hashes + +Multiple hashes can also be specified in an array (alongside other means of specifying SSH hosts): + +```yaml +addons: + ssh_known_hosts: + - host: ssh.example.com + type: ssh-ed25519 + key: AAAAC3NzaC1lZDI1NTE5AAAAIOd6AtszfjD3nI7WvvnN+B39XsrjPzAMCByYO1hwUGf9 + - host: ssh2.example.com + type: ssh-ed25519 + key: AAAAC3NzaC1lZDI1NTE5AAAAIOd6AtszfjD3nI7WvvnN+B39XsrjPzAMCByYO1hwUGf0 + - ssh3.example.com +``` +{: data-file=".travis.yml" } + +### A single hostname ```yaml addons: @@ -21,7 +73,8 @@ addons: ``` {: data-file=".travis.yml"} -Multiple hosts or IPs may be added as a list: + +### Multiple hosts or IPs in a list ```yaml addons: @@ -31,7 +84,9 @@ addons: ``` {: data-file=".travis.yml"} -Hosts with ports can also be specified: +### Nonstandard SSH port + +If the host is listening on a nonstandard port, it may be specified as follows: ```yaml addons: @@ -42,37 +97,8 @@ addons: ## Security Implications Note that the `ssh_known_hosts` option may introduce a risk of man-in-the-middle attacks for your builds. -(Also see the _Security_ section of the [ssh-keyscan man page](https://linux.die.net/man/1/ssh-keyscan "man page for ssh-keyscan").) +(Also see the the [SECURITY section of the `ssh-keyscan` man page](http://man7.org/linux/man-pages/man1/ssh-keyscan.1.html#SECURITY "man page for ssh-keyscan").) For example, it may prevent a build from detecting that an illegitimate 3rd party attempts to inject a modified git repository or submodule into the build. This possibility might be of particular relevance where Travis CI build outputs are used for release packages or production deployments. -### Mitigations and Workarounds - -Currently, Travis CI only detects the above attacks out-of-the-box for repositories on `github.com`, `gist.github.com`, or `ssh.github.com`. -If you host your code on other domains, there is currently no straightforward alternative to using the `ssh_known_hosts` option and its security implications. - -However, you can protect other SSH connections that occur after the cloning phase in your build, e.g., when deploying build outputs. -To make your builds reject spoofed SSH servers for such connections, you configure them with known good SSH keys. -Say your build instance connects to the SSH server *ssh.example.com*: - -1. Remove the `ssh_known_hosts` option for *ssh.example.com*. - -2. Obtain the public key of the SSH server at *ssh.example.com*: - - - Ideally (but rarely), the owner of *ssh.example.com* can provide you with the server's public SSH key through e-mail or some other trusted channel. - - - If you have previously connected to *ssh.example.com* from a trusted local computer, run `ssh-keygen -F ssh.example.com` to display its public key. - - - If you have not yet connected to *ssh.example.com*, run `ssh-keyscan ssh.example.com` to retrieve it and `ssh-keygen -F ssh.example.com` to display it. - Ideally, you would double-check with the owner of *ssh.example.com* that that is indeed the server's public key and not the key of a spoofed instance of *ssh.example.com*. - -3. Configure Travis CI to use the public key of the SSH server: -Add the key server's public key *KEY* to the SSH `known_hosts` file, e.g., with the following addition to the installation phase: - -```yaml -install: - - echo 'KEY' >> $HOME/.ssh/known_hosts -``` -{: data-file=".travis.yml"} - -Make sure to replace *KEY* with the complete line of text containing the public key of the SSH server as obtained in the previous step. +We recommend adding hosts using the hash with `host`, `type`, `key`. From 517af1b8d6c204ee5c13654e09d6e8f8f77d908c Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Tue, 13 Feb 2018 15:14:39 +0100 Subject: [PATCH 0217/2623] Oops, Merged this too early Waiting on https://github.com/travis-ci/travis-build/pull/1304 Revert "Reorganize ssh-known-hosts page (#1692)" This reverts commit 5719b7cd8ef2a8db160b746dc42abe78d418a7be. --- user/ssh-known-hosts.md | 96 +++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 61 deletions(-) diff --git a/user/ssh-known-hosts.md b/user/ssh-known-hosts.md index 0bf20ed80e4..00b13e1660a 100644 --- a/user/ssh-known-hosts.md +++ b/user/ssh-known-hosts.md @@ -12,60 +12,8 @@ your git repository, which is necessary if there are git submodules from domains other than `github.com`, `gist.github.com`, or `ssh.github.com`. -Each entry in the configuration is one of the following: - -1. a hash with `host`, `type`, `key` -1. a hostname -1. a numeric IP address - -In the first case, we write the key directly to `~/.ssh/known_hosts`. - -In the last two cases, we run `ssh-keyscan` to add the host key. -See [Security Implications](#Security-Implications) below to understand what this means. - -## Examples - -Here are some examples of the different ways to add hosts. - -### A single hash with `host`, `type`, `key` - -In the case where a host is defined with `host`, `type`, and `key`, - -```yaml -addons: - ssh_known_hosts: - host: ssh.example.com - type: ssh-ed25519 - key: AAAAC3NzaC1lZDI1NTE5AAAAIOd6AtszfjD3nI7WvvnN+B39XsrjPzAMCByYO1hwUGf9 -``` -{: data-file=".travis.yml" } - -a line of the form - - HOST TYPE KEY - -is added to `$HOME/.ssh/known_hosts`. - -Each of `host`, `type`, and `key` is required. If any is missing, the entry is ignored. - -### Multiple hashes - -Multiple hashes can also be specified in an array (alongside other means of specifying SSH hosts): - -```yaml -addons: - ssh_known_hosts: - - host: ssh.example.com - type: ssh-ed25519 - key: AAAAC3NzaC1lZDI1NTE5AAAAIOd6AtszfjD3nI7WvvnN+B39XsrjPzAMCByYO1hwUGf9 - - host: ssh2.example.com - type: ssh-ed25519 - key: AAAAC3NzaC1lZDI1NTE5AAAAIOd6AtszfjD3nI7WvvnN+B39XsrjPzAMCByYO1hwUGf0 - - ssh3.example.com -``` -{: data-file=".travis.yml" } - -### A single hostname +Both hostnames and IP addresses are supported, as the keys are +added via `ssh-keyscan`. A single host may be specified like so: ```yaml addons: @@ -73,8 +21,7 @@ addons: ``` {: data-file=".travis.yml"} - -### Multiple hosts or IPs in a list +Multiple hosts or IPs may be added as a list: ```yaml addons: @@ -84,9 +31,7 @@ addons: ``` {: data-file=".travis.yml"} -### Nonstandard SSH port - -If the host is listening on a nonstandard port, it may be specified as follows: +Hosts with ports can also be specified: ```yaml addons: @@ -97,8 +42,37 @@ addons: ## Security Implications Note that the `ssh_known_hosts` option may introduce a risk of man-in-the-middle attacks for your builds. -(Also see the the [SECURITY section of the `ssh-keyscan` man page](http://man7.org/linux/man-pages/man1/ssh-keyscan.1.html#SECURITY "man page for ssh-keyscan").) +(Also see the _Security_ section of the [ssh-keyscan man page](https://linux.die.net/man/1/ssh-keyscan "man page for ssh-keyscan").) For example, it may prevent a build from detecting that an illegitimate 3rd party attempts to inject a modified git repository or submodule into the build. This possibility might be of particular relevance where Travis CI build outputs are used for release packages or production deployments. -We recommend adding hosts using the hash with `host`, `type`, `key`. +### Mitigations and Workarounds + +Currently, Travis CI only detects the above attacks out-of-the-box for repositories on `github.com`, `gist.github.com`, or `ssh.github.com`. +If you host your code on other domains, there is currently no straightforward alternative to using the `ssh_known_hosts` option and its security implications. + +However, you can protect other SSH connections that occur after the cloning phase in your build, e.g., when deploying build outputs. +To make your builds reject spoofed SSH servers for such connections, you configure them with known good SSH keys. +Say your build instance connects to the SSH server *ssh.example.com*: + +1. Remove the `ssh_known_hosts` option for *ssh.example.com*. + +2. Obtain the public key of the SSH server at *ssh.example.com*: + + - Ideally (but rarely), the owner of *ssh.example.com* can provide you with the server's public SSH key through e-mail or some other trusted channel. + + - If you have previously connected to *ssh.example.com* from a trusted local computer, run `ssh-keygen -F ssh.example.com` to display its public key. + + - If you have not yet connected to *ssh.example.com*, run `ssh-keyscan ssh.example.com` to retrieve it and `ssh-keygen -F ssh.example.com` to display it. + Ideally, you would double-check with the owner of *ssh.example.com* that that is indeed the server's public key and not the key of a spoofed instance of *ssh.example.com*. + +3. Configure Travis CI to use the public key of the SSH server: +Add the key server's public key *KEY* to the SSH `known_hosts` file, e.g., with the following addition to the installation phase: + +```yaml +install: + - echo 'KEY' >> $HOME/.ssh/known_hosts +``` +{: data-file=".travis.yml"} + +Make sure to replace *KEY* with the complete line of text containing the public key of the SSH server as obtained in the previous step. From 4b95795f82b9657bc0b586cc91b220a725222cec Mon Sep 17 00:00:00 2001 From: Bogdana Vereha Date: Tue, 13 Feb 2018 15:26:03 +0100 Subject: [PATCH 0218/2623] Add more information on how to use Tox with Travis (#1676) * Add some tox usage details * Add a separate section for tox * Restructure tox section --- user/languages/python.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/user/languages/python.md b/user/languages/python.md index 7b2270a734a..3856f1868b4 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -152,6 +152,17 @@ If you do not provide a `script` key in a Python project, Travis CI prints a message (_"Please override the script: key in your .travis.yml to run tests."_) and fails the build. +## Using Tox as the Build Script + +Due to the way Travis is designed, interaction with [tox](https://tox.readthedocs.io/en/latest/) is not straightforward. +As described [above](/user/languages/python/#Travis-CI-Uses-Isolated-virtualenvs), Travis already runs tests inside an isolated virtualenv whenever `language: python` is specified, so please bear that in mind whenever creating more environments with tox. If you would prefer to run tox outside the Travis-created virtualenv, it might be a better idea to use `language: generic` instead of `language: python`. + +If you're using tox to test your code against multiple versions of python, you have two options: + * use `language: generic` and manually install the python versions you're interested in before running tox (without the manual installation, tox will only have access to the default Ubuntu python versions - 2.7.6 and 3.4.3 for Trusty) + * use `language: python` and a build matrix that uses a different version of python for each branch (you can specify the python version by using the `python` key). This will ensure the versions you're interested in are installed and parallelizes your workload. + +A good example of a `travis.yml` that runs tox using a Travis build matrix is [twisted/klein](https://github.com/twisted/klein/blob/master/.travis.yml). + ## Dependency Management ### pip From 1bf954ac502891bba7facd0724bce38bcdbf6412 Mon Sep 17 00:00:00 2001 From: Andreas Kohn Date: Wed, 14 Feb 2018 13:05:32 +0100 Subject: [PATCH 0219/2623] Fix typos --- user/web-ui.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/web-ui.md b/user/web-ui.md index 58a5d99ec40..15d42797baa 100644 --- a/user/web-ui.md +++ b/user/web-ui.md @@ -17,9 +17,9 @@ Limit builds to branches that contain `.travis.yml`. This is the default. ## Build pushed branches -If *ON*, builds will be run on branches that are not [explcitiy excluded](/user/customizing-the-build/#Safelisting-or-blocklisting-branches) in your `.travis.yml`. +If *ON*, builds will be run on branches that are not [explicitly excluded](/user/customizing-the-build/#Safelisting-or-blocklisting-branches) in your `.travis.yml`. -If *OFF* builds only run on branches that are [explcitiy included](/user/customizing-the-build/#Safelisting-or-blocklisting-branches). +If *OFF* builds only run on branches that are [explicitly included](/user/customizing-the-build/#Safelisting-or-blocklisting-branches). ## Build pushed pull requests From f1656b1f27058a067c32444bde99bd76f7b5e9f8 Mon Sep 17 00:00:00 2001 From: Kristofer Svardstal Date: Thu, 15 Feb 2018 13:00:54 -0500 Subject: [PATCH 0220/2623] Update database-setup.md Adding "mysql_upgrade", as suggested by @rpkamp82 over on Twitter :) --- user/database-setup.md | 1 + 1 file changed, 1 insertion(+) diff --git a/user/database-setup.md b/user/database-setup.md index da74c2abca7..3e65eac5330 100644 --- a/user/database-setup.md +++ b/user/database-setup.md @@ -124,6 +124,7 @@ You'll also need to reset the root password to something other than `new_passwor ```yaml before_install: - sudo mysql -e "use mysql; update user set authentication_string=PASSWORD('new_password') where User='root'; update user set plugin='mysql_native_password';FLUSH PRIVILEGES;" + - sudo mysql_upgrade - sudo service mysql restart ``` {: data-file=".travis.yml"} From add5620fb3aac6c889e3486dafb5cea2552de235 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Fri, 16 Feb 2018 10:08:00 +0100 Subject: [PATCH 0221/2623] Add note on `3.7-dev` and up for Trusty --- user/languages/python.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/user/languages/python.md b/user/languages/python.md index 3856f1868b4..e0628a89fd3 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -21,7 +21,6 @@ Minimal example: language: python python: - "3.6" - - "nightly" script: - pytest ``` @@ -58,8 +57,6 @@ python: - "3.6" - "3.6-dev" # 3.6 development branch - "3.7-dev" # 3.7 development branch - - "3.8-dev" # 3.8 development branch - - "nightly" # command to install dependencies install: - pip install -r requirements.txt @@ -128,6 +125,11 @@ From Python 3.5 and later, Python In Development versions are available. You can specify these in your builds with `3.5-dev`, `3.6-dev`, `3.7-dev` or `3.8-dev`. +{: .warning} +> Recent Python development branches [require OpenSSL 1.0.2+](https://github.com/travis-ci/travis-ci/issues/9069). +> As this library is not available for Trusty, `3.7-dev`, `3.8-dev`, and `nightly` +> do not work (or use outdated archive). + ## Default Build Script Python projects need to provide the `script` key in their `.travis.yml` to @@ -154,12 +156,12 @@ and fails the build. ## Using Tox as the Build Script -Due to the way Travis is designed, interaction with [tox](https://tox.readthedocs.io/en/latest/) is not straightforward. +Due to the way Travis is designed, interaction with [tox](https://tox.readthedocs.io/en/latest/) is not straightforward. As described [above](/user/languages/python/#Travis-CI-Uses-Isolated-virtualenvs), Travis already runs tests inside an isolated virtualenv whenever `language: python` is specified, so please bear that in mind whenever creating more environments with tox. If you would prefer to run tox outside the Travis-created virtualenv, it might be a better idea to use `language: generic` instead of `language: python`. If you're using tox to test your code against multiple versions of python, you have two options: * use `language: generic` and manually install the python versions you're interested in before running tox (without the manual installation, tox will only have access to the default Ubuntu python versions - 2.7.6 and 3.4.3 for Trusty) - * use `language: python` and a build matrix that uses a different version of python for each branch (you can specify the python version by using the `python` key). This will ensure the versions you're interested in are installed and parallelizes your workload. + * use `language: python` and a build matrix that uses a different version of python for each branch (you can specify the python version by using the `python` key). This will ensure the versions you're interested in are installed and parallelizes your workload. A good example of a `travis.yml` that runs tox using a Travis build matrix is [twisted/klein](https://github.com/twisted/klein/blob/master/.travis.yml). From c9fe6c17154f40c7aad98ee3fbec1da5ddfe8cde Mon Sep 17 00:00:00 2001 From: Pavel Djundik Date: Mon, 19 Feb 2018 11:08:43 +0200 Subject: [PATCH 0222/2623] Document yarn test --- user/languages/javascript-with-nodejs.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user/languages/javascript-with-nodejs.md b/user/languages/javascript-with-nodejs.md index 9648b57bab8..bb8b06d6b40 100644 --- a/user/languages/javascript-with-nodejs.md +++ b/user/languages/javascript-with-nodejs.md @@ -90,6 +90,10 @@ The default build script for projects using nodejs is: npm test ``` +### Yarn is supported + +If `yarn.lock` exists, the default test command will be `yarn test` instead of `npm test`. + ### Using other Test Suites You can tell npm how to run your test suite by adding a line in `package.json`. From 016df7f1729bc8a113cb5a36ed53e45a7f0d47cd Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 19 Feb 2018 05:11:09 -0500 Subject: [PATCH 0223/2623] Update environment-variables.md (#1711) --- user/environment-variables.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/environment-variables.md b/user/environment-variables.md index 9662076883a..1f3b3b3923b 100644 --- a/user/environment-variables.md +++ b/user/environment-variables.md @@ -199,11 +199,11 @@ to tag the build, or to run post-build deployments. - `TRAVIS_OS_NAME`: On multi-OS builds, this value indicates the platform the job is running on. Values are `linux` and `osx` currently, to be extended in the future. - `TRAVIS_OSX_IMAGE`: The `osx_image` value configured in `.travis.yml`. If this is not set in `.travis.yml`, - it is emtpy. + it is empty. - `TRAVIS_PULL_REQUEST`: The pull request number if the current job is a pull request, "false" if it's not a pull request. - `TRAVIS_PULL_REQUEST_BRANCH`: - + if the current job is a pull request, the name of the branch from which the PR originated. + + if the current job is a pull request, the name of the branch from which the PR originated. + if the current job is a push build, this variable is empty (`""`). - `TRAVIS_PULL_REQUEST_SHA`: + if the current job is a pull request, the commit SHA of the HEAD commit of the PR. From c1c0c8cfcbe11b668a26f9b720208421c3e4263a Mon Sep 17 00:00:00 2001 From: George Brighton Date: Mon, 19 Feb 2018 16:36:44 +0000 Subject: [PATCH 0224/2623] Update AWS Lambda deployment provider documentation to include changes introduced in travis-ci/dpl@a20489d --- user/deployment/lambda.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user/deployment/lambda.md b/user/deployment/lambda.md index b2994954095..0cebc43f514 100644 --- a/user/deployment/lambda.md +++ b/user/deployment/lambda.md @@ -16,12 +16,12 @@ deploy: role: "arn:aws:iam::0123456789012:role/lambda_basic_execution" runtime: "nodejs4.3" handler_name: "handler" - access_key_id: "AWS ACCESS KEY ID" - secret_access_key: "AWS SECRET ACCESS KEY" ``` {: data-file=".travis.yml"} -It is recommended that you encrypt your password. +AWS credentials can be passed in via the `access_key_id` and `secret_access_key` parameters. +If these are not set, Travis will fall back on the standard `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` environment variables. +If you choose to provide parameters, it is recommended that you encrypt your secret access key. Assuming you have the Travis CI command line client installed, you can do it like this: ```bash From afb43a4ac61081d7f66ea15e98bdf2c288318b09 Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Wed, 21 Feb 2018 10:21:08 +0100 Subject: [PATCH 0225/2623] Add JDK info (#1708) --- _data/xcodes.yml | 12 ++++++++++-- user/reference/osx.md | 21 ++++++++++++++++++--- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/_data/xcodes.yml b/_data/xcodes.yml index d0a22c3f4d8..23882cdda65 100644 --- a/_data/xcodes.yml +++ b/_data/xcodes.yml @@ -45,8 +45,9 @@ osx_images: - watchOS 3.2 - watchOS 4.0 - watchOS 4.1 - - watchOS 4.2 - - watchOS 4.3 + - watchOS 4.2 + - watchOS 4.3 + jdk: "1.8.0_112-b16" - image: xcode9.2 xcode: "9.2" osx_version: "10.12" @@ -92,6 +93,7 @@ osx_images: - watchOS 4.0 - watchOS 4.1 - watchOS 4.2 + jdk: "1.8.0_112-b16" - image: xcode9.1 xcode: "9.1" osx_version: "10.12" @@ -134,6 +136,7 @@ osx_images: - watchOS 3.2 - watchOS 4.0 - watchOS 4.1 + jdk: "1.8.0_112-b16" - image: xcode9 xcode: "9.0" osx_version: "10.12" @@ -173,6 +176,7 @@ osx_images: - watchOS 2.2 - watchOS 3.2 - watchOS 4.0 + jdk: "1.8.0_112-b16" - image: xcode8.3 xcode: "8.3" osx_version: "10.12" @@ -210,6 +214,7 @@ osx_images: - watchOS 2.1 - watchOS 2.2 - watchOS 3.2 + jdk: "1.8.0_112-b16" - image: xcode8 xcode: "8" osx_version: "10.11" @@ -246,6 +251,7 @@ osx_images: - "tvOS 9.0" - "tvOS 9.1" - "tvOS 9.2" + jdk: "1.8.0_92-b14" - image: xcode7.3 xcode: "7.3" osx_version: "10.11" @@ -273,6 +279,7 @@ osx_images: - "tvOS 9.0" - "tvOS 9.1" - "tvOS 9.2" + jdk: "1.8.0_92-b14" - image: xcode6.4 xcode: "6.4" osx_version: "10.10" @@ -287,3 +294,4 @@ osx_images: - "iOS 8.1" - "iOS 8.2" - "iOS 8.4" + jdk: "1.8.0_45-b14" diff --git a/user/reference/osx.md b/user/reference/osx.md index f09c21b9656..442b8199349 100644 --- a/user/reference/osx.md +++ b/user/reference/osx.md @@ -43,13 +43,14 @@ Travis CI uses OS X 10.12.6 (and Xcode 8.3.3) by default . You can use another v - + {% for image in site.data.xcodes.osx_images %} - + + + {% endfor %}
osx_image valueXcode versionOS X version
osx_image valueXcode versionOS X versionJDK
osx_image: {{image.image}}{% if image.default == true %} Default {% endif %} Xcode {{ image.xcode_full_version }}OS X {{ image.osx_version}} -
OS X {{ image.osx_version}}{{image.jdk}}
@@ -130,6 +131,20 @@ directory alphabetically. The JDK available in the OS X environment is tied to the Xcode version selected for your build, it is not set independently. To use a particular JDK for your build, be sure to select an [OS X image](#OS-X-Version) which includes the version of Java that you need. + + + +{% for image in site.data.xcodes.osx_images %} + + + + + + +{% endfor %} +
osx_image valueXcode versionOS X versionJDK
osx_image: {{image.image}}{% if image.default == true %} Default {% endif %}Xcode {{ image.xcode_full_version }}OS X {{ image.osx_version}}{{image.jdk}}
+ + ## Compilers and Build toolchain - automake 1.15.1 From 321911192c8aecfc17fdd0a36e8eb9c53953fbcd Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Wed, 21 Feb 2018 12:03:10 +0100 Subject: [PATCH 0226/2623] Clarify artifacts' S3 upload paths --- user/uploading-artifacts.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/user/uploading-artifacts.md b/user/uploading-artifacts.md index 9cc6307b7f9..133eb4a619e 100644 --- a/user/uploading-artifacts.md +++ b/user/uploading-artifacts.md @@ -9,8 +9,7 @@ layout: en Travis CI can automatically upload your build artifacts to Amazon S3, after the [`after success`](/user/customizing-the-build/#The-Build-Lifecycle) stage of the -build. Unless you programatically generate unique filenames and folders, -artifacts are overwritten every build. +build. For a minimal configuration, add the following to your `.travis.yml`: @@ -80,6 +79,21 @@ addons: ``` {: data-file=".travis.yml"} +### Target Paths + +By default, artifacts will be uploaded to the path in the bucket +defined by `/${TRAVIS_REPO_SLUG}/${TRAVIS_BUILD_NUMBER}/${TRAVIS_JOB_NUMBER}`. +This value can be overridden by the `target_paths` option. +This can be computed at build time; for example: + +```yaml +addons: + artifacts: + target_paths: + - /$TRAVIS_OS_NAME/$(lsb_release -rs) +``` +{: data-file=".travis.yml"} + ### Debugging If you'd like to see more detail about what the artifacts addon is From 2515ef5625b5c99b78f26c61483b06ef1570a35d Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Wed, 21 Feb 2018 12:14:05 +0100 Subject: [PATCH 0227/2623] Re-word how TRAVIS_TEST_RESULT is set (#1714) * Re-word how TRAVIS_TEST_RESULT is set --- user/environment-variables.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/environment-variables.md b/user/environment-variables.md index 1f3b3b3923b..8a7f92abe34 100644 --- a/user/environment-variables.md +++ b/user/environment-variables.md @@ -216,7 +216,7 @@ to tag the build, or to run post-build deployments. + set to `true` if there are any encrypted environment variables. + set to `false` if no encrypted environment variables are available. - `TRAVIS_SUDO`: `true` or `false` based on whether `sudo` is enabled. -- `TRAVIS_TEST_RESULT`: is set to **0** if the build [is successful](/user/customizing-the-build/#Breaking-the-Build) and **1** if the build [is broken](/user/customizing-the-build/#Breaking-the-Build). +- `TRAVIS_TEST_RESULT`: **0** if all commands in the `script` section (up to the point this environment variable is referenced) have exited with zero; **1** otherwise. - `TRAVIS_TAG`: If the current build is for a git tag, this variable is set to the tag's name. Language-specific builds expose additional environment variables representing From ad61c96e0254cd808d6d5ac18fede21e9dbfa971 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Wed, 21 Feb 2018 13:05:48 +0100 Subject: [PATCH 0228/2623] Tweak wording on target_paths key --- user/uploading-artifacts.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user/uploading-artifacts.md b/user/uploading-artifacts.md index 133eb4a619e..7ed70d443a9 100644 --- a/user/uploading-artifacts.md +++ b/user/uploading-artifacts.md @@ -83,14 +83,14 @@ addons: By default, artifacts will be uploaded to the path in the bucket defined by `/${TRAVIS_REPO_SLUG}/${TRAVIS_BUILD_NUMBER}/${TRAVIS_JOB_NUMBER}`. -This value can be overridden by the `target_paths` option. -This can be computed at build time; for example: +You can change the upload path at build time using the `target_paths` +key, for example: ```yaml addons: artifacts: target_paths: - - /$TRAVIS_OS_NAME/$(lsb_release -rs) + - /$TRAVIS_OS_NAME/$(lsb_release -rs || sw_vers -productVersion | grep --only -E '^\d+\.\d+') ``` {: data-file=".travis.yml"} From d999a6a47bb52c94d019038fc34ecaabcc3c6a92 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Wed, 21 Feb 2018 13:40:10 +0100 Subject: [PATCH 0229/2623] Fix target_paths computation --- user/uploading-artifacts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/uploading-artifacts.md b/user/uploading-artifacts.md index 7ed70d443a9..5f7c09ab4ff 100644 --- a/user/uploading-artifacts.md +++ b/user/uploading-artifacts.md @@ -90,7 +90,7 @@ key, for example: addons: artifacts: target_paths: - - /$TRAVIS_OS_NAME/$(lsb_release -rs || sw_vers -productVersion | grep --only -E '^\d+\.\d+') + - /$TRAVIS_OS_NAME/$((lsb_release -rs 2>/dev/null || sw_vers -productVersion) | grep --only -E '^[0-9]+\.[0-9]+') ``` {: data-file=".travis.yml"} From 00a41b6c499d8c200742538ed8be8de4a1ac1437 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Wed, 21 Feb 2018 09:56:40 +0100 Subject: [PATCH 0230/2623] Use strings in Go version examples --- user/languages/go.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/user/languages/go.md b/user/languages/go.md index 37183a2d4a3..004e18aca9d 100644 --- a/user/languages/go.md +++ b/user/languages/go.md @@ -25,7 +25,7 @@ Minimal example: ```yaml language: go go: - - 1.6 + - "1.10" ``` @@ -51,9 +51,9 @@ handled by [gimme](https://github.com/travis-ci/gimme). language: go go: - - 1.x - - 1.6 - - 1.7.x + - "1.x" + - "1.8" + - "1.10.x" - master ``` {: data-file=".travis.yml"} From f472afa580d8cc903ca504c6f71850e9de844c14 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Wed, 21 Feb 2018 15:33:45 +0100 Subject: [PATCH 0231/2623] Emphasize use of String, not float, for choosing Go 1.10 --- user/languages/go.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user/languages/go.md b/user/languages/go.md index 004e18aca9d..3f911ae53b7 100644 --- a/user/languages/go.md +++ b/user/languages/go.md @@ -27,6 +27,10 @@ Minimal example: go: - "1.10" ``` + +Note that, in order to choose Go 1.10, you must use `go: "1.10"` (a string), +not `go: 1.10` (a float). +Using a float results in the use of Go 1.1. ## What This Guide Covers From 3e12e385bd3f77fc3352be71d8a6ccd4e9ead2e8 Mon Sep 17 00:00:00 2001 From: Curtis Ekstrom Date: Thu, 22 Feb 2018 12:08:30 +0100 Subject: [PATCH 0232/2623] Remove reference of Travis token from profile page --- images/repository-build-status-image.png | Bin 0 -> 123818 bytes ...repository-build-status-modal-with-url.png | Bin 0 -> 67273 bytes user/cc-menu.md | 18 +++++++++++++----- 3 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 images/repository-build-status-image.png create mode 100644 images/repository-build-status-modal-with-url.png diff --git a/images/repository-build-status-image.png b/images/repository-build-status-image.png new file mode 100644 index 0000000000000000000000000000000000000000..5c2c80b5766feb8520efd052afb8a0b0c358dff2 GIT binary patch literal 123818 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
+NJ;sc25GAds-GM?xw`J6gm zs8OxuuD$)WljZ>Oc!4;x*XT-F2gDzLvu2ww#^uPwlLU#yYGgc0iE z!8{MNmkV@Kr{>{B@wP9_M;V@YU<9Yp(b>^RV2IosLz%M551!9Ikg`_9cnxKI4W+Mr z)juY`(ijQA`5wK|5`xfVRm!ORQCFd_u@H=Je$V=lB7jrIn`!_)G%B%NYHFO*{rJqC ze8B7WatUVGl}~^W<_Baf-X-u87FAwY)5Vym&%OEF`ws`B_Z4W2^@c_$TuXo;t*l#U zt4nN@!iHw9${M;cXfNHnSub?Dy{Rs0N|c>JE}UdHwn=BpH>kCu?co%jz`B}EuBl~L zox^=>@OhNkbab93fID{Ms)44&x-lv=D0URnn+$wHv1L?o{q;e_&-Q~1gj|(f8_9<1TIoR!^(RE z2+E8;FXmuaR^Ib9)H9I4|6~SGLtEfXr9H?YdnngZASI~R2=q4~pj_|dENEV{><42B zLrp0!tpE!vq~tX<25k^`Uz(#OD7mXandtg}m%2wOIL1y+GA9_!CaLjHsicIoXD$OxI!GtXq^$Z%=GT{Hi14kl6yX971H{K~GWEvL{^3B{T@ptKO()@_a!SxDy_% zay8?6%3^N6ll-(&m&oN*R7_?bv2?iWwQTiDBc7h8ivxf%yF5O)A)fJYmq`%Ij_tf` z7Ke0Pd46xRYJhp}0pd}&x`6}aDRgtl$vHz0)E-v>>@!dU__pN7Tjz& z(HQgQ>_*H32G+by=+V?q)WJ01;tly{%U(Gr&?%e1-A&8cu6^F@kSU!`?^MM6M3Rl~ z7?UzkH~`Ty!Xdt%Tp`H}Wx$DfwQC0AUn@PIfbX#`(s&i3G1?GpHq&5=c1jWdltN;R zv~EXTbWmh{J6pDzPKT6)9Rckiq9x!M7&0+py zy0#tPU;^$yqmTJXb1i=|?rkBLbs&pb(k=*i_F?|j4Ljm8j5l z%VpsrWXG_w@}{WRve|`FT$P))Ht9Xq^oUJ$E6b&=>u&4n(D_ z8(mLqfro~w$YVNOS3R*Jn3mYd_83{*0?)~~A_NF}oXpWYbD^u-BBI;!!Gb}l*m;ej z7n{n3BU8(rfv#VO%)~JJV*p~Sg;6e62hXhePGCZ-mOr*emN%Snm-m5jp*7%9YBmh0 zkjf-(?XF!ibm6RWHNiaX=k{ZKSXSrX)(%pnjkS2+Ux+u$(uo0@96`;|CRQdeS!4}> zRQ)FXx>Q^0ED$KhceTm%Mbl{A-dyK9gs`9eM!NE=eSGM)J)HV+m9qh8#4z@*@mkNC zW_QfxoB^uNAcb&OKz_*wYg<6*y1bN}&MJYMmA*vkEYB?c5$OaVr!@doHN)B=d3>zV z9+*$*hY2HH_1VZuGWD*W^?9@xke)ppJOh!%RjIb)j3ET3?E#bYPFsC-h7OtdWB~ML z{M~@ra z-cYGsC<09ZF}Lx#rWuWT#UT;yin~eFLZ6wfSB4fn|DMFl6|LD*15OyM@$ac$j@G>i zd{WK&eTD6l$QCa$cZ_EdWaC=mXmzwtgfM8>=5)2DSaZiOTXBCC{*Fy|KoLluh$Y1YotM4?&7OPukGK@E}b=0t)p35_i1l8Ihu%wQgIHgL8Fum;AbkJsAw$nG?9UYKA|^*4#uJBAq>6a2h!v(SxB+`IZPZB-^SgxT~5| zX#>|iThAE|ga6!1w!0qO>1joGBSUbtiO7e$cU;0?Ihyt4Vgwb}E zdc?y=JfKWY`AIw)UoTML8Bi`30pDcw3alxqMt@b@jB-08$-V>&wFx&DX-Me&5;App zfCyaN|4`=sI03vfWxtj*%1PcjkAF}nrFVk}@_8xD%)1mB=8KuA{!G_!t6bO07mL?q z-ZZW*v6o-7spxLxgxImU$>&m8O@I)ohU8fD9dht@%bjn_gimP3swyubmnm0Hg5POA zH-z*`#@FWZ_1hk}Gk2Y6c*T+XXfsti_Xti^y=Iy+90-9_+N9KlqmOJsb$p|(j0f{4 z(qHWhevHtL|4>`m7vE2h~JaD-kCTD0XGGI1in=Nczj`vlGX4x62I1S8mW0-RD4 zV4a9QIEqLsfBiDg!v-CT?b3EXKEyH`;Fd>p~MY=0S(q+MJ?T3toWXXZYei+>kFJ(eewwDI~$?so96< zt#kbdLq6#toW1_#fSJhr?*_)4@o8bVJC7y$QT^D%8j+5b9JL8ncvUF{#FA`q# zU4J+<=DYcs&c~BD27n7>j(WhNZ-}wD5FY zJn!9(fPksK_*IqQ0tQkAJtTL$wQ&s)N`Bx8nLigI9A({@Txn|cXsKCE>UM~5ydnP< z654!!ev=I7wRU)3V(WVavOmVTgh>z~>0$nO-wIEc*V~{Xo^ViErGnNO(X4n_xTmch zaY^hIA;|DWf31#8lVA_VHY#|F+eQ2rNaXMP6kue5esPF{{5Z3dB?+AHqKLGH2$9^3 z)Rg(rP?5%FRO6I<1Ub$^S}kAwIaFevOh?*oAjb5-Q%!XvzS?rNcQdBeSF$&$`8!eA zR*YDzdPNP%jw)PUY>PH-mL(RERpT_Klf5()ahtQ%8l6!h zg5xW%My|N!In4(f%G3=d$Wk3V84n)gY8u&76OqmX#Hc6g3hIa889=AUaUvPjlYrxB zd#Tqi=}m^X;scNAObJsO!b;{<@~s@HGW=FcGm7wFIM_)$_{6qY$0zG3P%x$*E<0hspAq1v`H z$v8e?8~sKlyyy)vt8Z#I97_idnez)9TI5Gti9XV->8Q7(l5{6Y6B(t$nu)}_I1n6o z0Ux6BLA_ZaF~M1xghQicp)IbRS0qtbU4CpIU81ZljtH5f;o+mJQt7bAuG2s%X^9@e0tsY9$Gt+5SRJl{_@aAM+qAG!7M9>;T0~xB1Jo+XF?b9 zE!CLtOz!~(Q=837VUI`aMr3~Q6;}DKH zP5yaF8K8c^u1N|dZ5_GkloL6=fm3YgtjX59;_;R>B+^nYVu4tk&-dlKd1WjBZwFOw z_K#JqlY_6$ByT1e$(I4XH}IA;LKbwm{?HKm*Jru22Sm*%ad2z0x;quM@}KH9!eSJd zyX4EW!ZyR~EYek-p4yC?&XUBR<@f@Dpuz-X---kb-*&T6?qkN!+zRM)6b?GFmm>oK z6<=$Mq7oWw)G8JkkHs!#D%C7AP1H%aBh%zu<*}HE=rUiAxSxbU(BLUDkVgx zlVzSZlnDBxrdTyyF6A6uY3Ni&vJxd|n%cpQ9GRuHL{ccOgwP7d1CkS2(H;!OL`^y) zGAm0Kw{C3j8rwBGgCgJEPBN!56OJgcLHPunb>Er}V-H_aR`?pmBSqvR`r!EBqef8E zB#r8kQSbF*hFRg(*;o1DJ&E>{*#qvAGjD*7bPl_01A}U+K3-_XFncx(=d$#GYlBJ; z>*anM(-R@#G9*X)cv+zICvy?geD#X=;Hc9i6Ts${r_xmEIxim*2>=`b)8O;XgpgYR z+9_%CmkWeh;)z^n>g>6aK5HiIwKVZN1NzHqm&h_lt_*IV*kR7%&{LW~E`9IV?`^oD zV8QcE8mb>2-j@>Or1ErU8HbB7nZ2%+^2(=l3J^2QE|f)7nqV5_?``_JZa>-lE}ud* zUmb)3!P#47Z5+N$LjwX3>Qxk(^tkCnh%{z2H&(l;B?r>(eT_s z+?+~FM=O^zEf}NdB^wA|&&)J6nfrX?*?OYbd1Vve5_l-KTAgB)%AQo!j5LR&VZNAB zaU7fdST-WlbRPeRlqgYyx6_K~>KaMCf)Td1lfzBXweQalMRa;{yYKOK9A#sz*ej4r zNMa278(bb4q$Ov%+~)LLhb=wYL|Da(M}zFKSN_ht{YzAugAYrgLZQRD>LaETla`;) z5GZZdX`i@N=VT^u)Xx`|nWH7s?x4P#WIUF8*VJ99!;11ajU!~EKY4qWw)x$f1@q7~ zyIT<#bVVawej_RE0J<=qJEr9lp&~EV;21`ryrN#EHA$1qG&H1vx~)iSEAyE*Q#<3_ zbaGFu*yq)iSgp3iuH0wx@p^;Z`wkdd5f`K7CqKqWfx3 zSn3IBG{W*Xk=nT`_Za)}MxY4l8OfLAc`_4Zs5~nM$6aoo)U>zBJzcARgZjXmd3QWl zF_CtDsJ2u_ma_&5Pv@sw4cz%$Qiprn(pzWs=03Zq1)V)D!sl#_&^8A(f(8sq>2bo~ zfk4H%&Dc8l^tfH^Zw*HMgjE$ZKQtLfSTqvg;C8?NlW`CWO1~`V36GR1?u#)}fsn=ZL|J6DfN(D&I^pv8+utMMsK;BasmTYeb}Edp3?X)Rw($eHM@ zvEss9^nF%~kbN{vFd?!+Le5QCBI9sf$S-iwBJT!gQ-A2y-`71ldjH7#(M#9-ot^kA zy5zpxIpv9o36BJbqRu-TkW(dclQna*aS`1n#1Zo_%rh}TuKMI~?5Fz~+j69A*vv$* zg2%D_X+7nymWP}=6CYkya0dGMPj)qEp-1mK*es>5WAyA!M(U0hFxHuBBNVD*G-j@v z4=9F;F3l<*h2K95WJJtcOCnBrB-ynP)o{3rQTEP549yaOY{#24 zp6uicp!U(+YK&bUW3dl)wKi&ynQ7Q8=(=+7GF0O$*3Qa<)-};pvt`QU+vS^$i@peo z@p6zE(@vPxwtw`wtjMmg*tOST9A>t4QB-8HX~!}GO~F`1PiaIDHh6E@z_03Ql^?mD z-_$(ObflespzX;U)@Ly1dsL)<%XBYcjCXP<$^6=ujQ{xR4#F3cWY>yOO8Fe9%y?j`wygoI}Q)=CXyRy~6B^>vn zIK!dTc3@Vu)Yao^SEx@vqgjeVDS^@C>>;)cL!_}qZlq$ux;n?w)drh}+RX-Aa{x@S zorPrtL{#%lQZmc-z}&fN=}mK$N%DwF`qP_+Gnc$~Phw8N!u;{s@u-JmNWNuF z^8-f-x!kMb;$}8T&F-LT)5h0Wo_aE)7>5u?s6~FU!0_u%M2?ttkBO zu2CAZ=_ZRbm9sh%UNpY?QgIQG{r0pU<&%0Nk*nWSXRUF{i$DoxQx$m9LW=aLNyKMe z#8iGOi_N@v`TnlGipG@S~ecNi{QyY>E8G5i+1a)BSL6mm*ucZ*XXD zyx&2R@o<=fN5$a^_>-wx$hdN5pTeV>ui2Xc(*d#FPl>b#tN6Fh`9ckz5;=}VzV#;YHTJ0XheFdjQ&^u1{3M?d1;(T;w9MBg9+ zt%^hZ`e4Z61>J5J7v0&^)Vp3|GK>0Uh7lg_Hz_QcjolZVdnMmidZ~)dh8Vl27}No zny1Fb*+084aNH_*A?@kqbn&B~9EiC3@kYRtjxiw_&@Bg;sK}2*hRtOi~ zPc!Z-RSvJo2HOSWdn_*35zl8D^VbI`Ry|M4Q!0zXygv^C3x}iRvj(z7fcxt5=lzlT z^J1zQ50o}1AGLY|ZJyKx!ssOZTE7uh3TUxY5g-gD>*H3IC0~e zy|22Pm~oo|eA&g9G#t?!i9xL>CuzUf^CVwB{mU$VWU$WF3dTNx+T>7Hk$66?@5qPf=gF&wy*I zi?ez*W|!WOAagGF$-L4O7S(Wsz>F(>Bd24*)KPEpQWB8Fsr2Xt7|_KOXf>6rP!Uji_lkfWQ*tu@rM(r7e(GNsnFNBUFsOzdlHZJY~ z@8#OGhbLB4=|vc0$#wwd7TvB#foI)=kVom%iD+)ru`h0~6WQ8p$sihoRNf&?j1yW| z@D+PK6GzT!>D$Lkn)uiEhp5I@P9h1!;8mkW?mdQ-EAFX6G7~678w|daC>C)<5=$d; ztbOU083wj-*(ZJHr9~;tHJ%gs+7mbAQwrOfH9XMkoj1+1cq~j_H&-f6`w>;&MT!(h z<1B$g+0T<=uZ7zB>!wA*gsus$O1sPQlxuT01G&qLkYLyBAETL)T)Yd6Ru(?4J9w-{@r#C^94$S4UC;VX&Qfp#W zl=}cS{mS~HzdZgV+56MrcX`M0&6})D(n^eT+(N$lYC|WcuXY_`P7+(cbzPIWoh-uISKiuLNJmc!==Ooo1PctwRN=_b@-D(q+h~K+i&$wPaIA|(*;CS)Y?<9Y9ffB!p}SU1G3JfUxdI1~rMw4`3Bc881) zxop|CKSkmurK?ds_(YU1Cd4>zJyGoGpy_$O zUU)V`ant(Tv*g4@X43&C`UD(;8Y!yFv~cG#PFJL@Tou>Oa^sB{K1y)BW4J$XZf=|a zi}xy$Yx9D;d-I&StqP7e29xHV@Nb;YIJ&P>=>$|a?pqYLi~?~oT+nAf_1Q(VpuR2T z9cqzw+$9f|<{20`URt2k*Livu9(5eqJt~HL2WzJfw3LpxR3C{_2`= z=Ev5cr<9cvUiIQbaR5zUzI)jGf(z}RimHJ_q z=DD%U9$vEu)4uFk-i`7zum|%tff1?RVw}Dy4fUWtKJUh7U8^XcX_{)5or@@Sd-dnQ zOBxkP?wxwDrSEaW+vX(wqs5`n`rG|nOdJaDWJW>LiSKe(d%b*}D?I2OrH=<_6sM!6 zhY#ywXX<$$_2y)rKQ-#q=7Qj4H?7s67=11y6J=UQb3wN2EoGA2G%e7;70Oh!p7|!* zDHJL?-(;?Q)i>&&W;OUhwVF43MnmU=D)Qq*T15QhcO5Y3c1O>m59z7Ghb@azxsMdrxVI#Y7&N?$s$N8BHC4fA#(G{s=!(rPqnIU9}?KoI$NU!3;TJxP0vQ@Bqae3j$Gk0-w;dmVz zP_?@`UJXtBeKN6SdjJ!i`@~bk{knQt4MR9HRDV0h2*t7Y{g+Ib|g46Xah_UC+aBQ5#d z5S3RsQ$dBLGQwE_9dVLM`{!jfn@ycJ9k)N1ZrLV_Qnc=&@EG=1CU2#vt)#5G-kwC> zXFd1q;v(b{%U3E~m1`WD+7nJP@6}bDAdKEzE3V@^s~zeH1W^M+dAGx7TYI4!&U&Wx z?(DsSMCXilysfajv}~owDvLsOgh*xx7Ox zpLj1uLaVYu@=w=KI29M2LeMe$PE!5x-br7w&e(3SFs*wyEShOwY8|+~NdzV1)uLc~ zpg~x%L-bK1DOX*N_iQMRDI2;fe*ndR!onD`#5^i4ow1@Pq=t`NLh;YLMOWGxUoWXr zh}Nu$MZU{x9b^n~7(A^grr3WSZ>(jcdklaFW)D?6^Zjw2orO3xq`&Yf2zBgV&1dOl zEG})r$3k#9@6%}#n4B5W4j#|-aw3H`j2A0Pa3<&Q?D;=6oZk{c6z= zJB;GYLZ)6WiVT`Jw|+@EarQ>>kxGg~(}sugzQxH*XYxnxqP#h7Fa3Q*nZ8*yHthON zgXGGdiglM_MGJiByk_WO(t-PC?2wLU4DU&p_Iv*s|rH(GMpzQXgUNX3lBk8qBlbO;6+x6b=!MTgKP>qYl-E)}N zahTZ;gKS;L)26N0bhBT_NSSHK^dHuB zayq#!PK}=u&G{svm$@Pyb4BBR*GQ9ratz*4crl&a53Q^n662lX$keRDs4W`Ys8BYI zNXO3q+6}r!6No>hPI#g9(JmWXJ?65t?j6xFDMu?VDMQ=xyEl zQJODTdt7!BrYL@$=#K)NfODq4Y@z(Oll)c)MR);CD4#y3E~+wAutpcEt4*r9($n60 zHHT(T4SbFgy3a7mM0fFcBias>NtWx_otw2*yskIj1bGl^I9oZYY;48vq4miOC+-w5 zi79C@ag6tZ@L1OQ+$a5AcukIzu(UGXDkhvVyV&c6$tQ|yK>hzcQ4a@K2i3z@r zC)T;kNR+MaVc8scxw>3c2Ns8F#6-WByPe0}-Vb0gd!(;>8Zx3Ivd4Y(bGGKY8ybB%zOHZ=FrZ zL)h)BfA%inB6AI5O}{hj4-;3eJL+V7sH3KN0|N;Tc^}A zjFgA;O{u)>@g3_k$s#Z2SuZY#l3V00Pdez^B;NI3?bkmGdU|s`sm8P&hwXOSjG<)@ zYH-iJOb)sqjsS74;mJC-+Ny70Tb!INLS)~`Nne4%x)xnu@$266&Z@*fMVk=)hd2B3 zx5@ktO)eg1`~c!g(qywfS_55NFGRKV-j^1i7`J`AcYVcvyVhYNrN*{hE8%j0q3x_U zZ$BoDx+u5^<=9L_?E?K#pRV&Scf3dLfdo|~rl0H2ss3+K*#HQ}z|wv~E{(Ed<*$s} z;WQ7O&Oyz8Ka!JF$u=iQkn6}*H~>>MdZAPYWOns)q*`MrK1x3Y;44rYVMnLa)_kNI zC9jNf_nsn(iGmx$t2<+?L- zT1PGJlD*tX`9Q}Me5ldDrv;4ukQhk4VxoIDM8hE|BShmQ`i}ReD!Z$lW=%8_YW`i_kF@1gRQVuib(MyU+U# zv|nFgj{>HWOl4ugA70cSz6*FDZwfeYpSuGTzrJFd1Z?9;?=;ll|NN_ecy>i3aG!he ziocELzrVtt-tw3@7(mX6sxp+nPm_QBB#Qvt=OJ_UFYodoD*_DQ|2q@KyYpeBtE;Oz z0@u)j!xNnUW%43zp_yp%=N1IAO}E03it`9$tuFM_*OGf8W3_M`QrW#DG5+ zOF13w&wuI<1M6)e^wq|U+yc7*^5GxH9rl~UIAFuda=gA$fh|HyFN)&VS8#wU2681|{d!Zhf6dRIOI5)5>y4FJ z6kNgKkW2FGAua+tgoCeg)~~PF09UYN(?z4yKEYwxQ*SM2dsl$Rp7{opnh78b#q*RS4T zVO=M~!otzPy8%2|K+d#bVclUi5f@i{BQ8#-Xk%$;VrGDa_1ZT~<>vd4zo2;7?_b?G zBtP#ulcuU`_IU8Cz ztmqVi+dZ&5DYzNW#Wm%z)D^cm>0#J)2kQZ+rtc%l0bDw%Sk?dne7yh#dEHIV_dm#W=I zy_#5f6N;81!YVkNB!##F?_Lw@;a~4k)K$1HuQc;IRnC=-a`rt|D>sKqH1?OuuVk!2 z5!fexz~6`8c98i#wD>w4#5BM2@bu31kJ#7@V$)$UvylC`1b>f1S<0Qi3x;=eKd?zZ zyb1mE%WT8{jEnkA!=`Y-%Qmv{C8>0y{(Vl?op2tWm!2lX31sOK65`ne+dL#XCV6!V z-*>jYVPlAdC@2^2oEm-UJsh9L`$6!Km()l~f^hkyS0ah(hwes?<690UZ645qOnNin zq15j6!k^_YI>MeTy&JyQUUV1drmF?$_H!>0O8jrzZ=S>(Ys52i-qy4KvH7=fmi~sB z_C36jw_d#OoU*@i9WRl;j__{IGdpdc*VNw?|x$A*6E6I zJ*R&&!r*OB#f;_g@)1^HlJ$!=ZR}RBBe1yohjpypuo|Z}618cTCVo1cPmPupHldEj zrLVSdKfe;~?DEnq(tV3M`K@nqXXVGkrjL5hIYW)1l+*6zL^QWnu~cKN6~;|}4)M7( zD7_S%A(;_K^0IRA`=fYt%@#zCFF@DQ?YZ1r8$?+4ReNHKZk+7Mr`Gzh1s0W+%5x>U z4WcCnuhGqlHXr)a@OEsSds4ThDI{+t4j;FQO~_A}w?gTarj}m9S){^3B=RSHw zh>DmoxED8p^l#?d4!>E$8T>YI4dg&&TBn|$a$BgFH=cQ@dD^T%T12foXgM8Se$Dnt z;bYruhc%mHq3)YD*U=Szoel9%q8{Eiz_V5J+$sj;Ki8XVC1Ep?Vsi9*(&awTvlE^n z)JL)ix2(J#gS{m@JT>JpAH$JM^5q&MmZGJ5pBln@4E+desolxOBwpHw^$AWQ4nesR z%9B&5%IxE-t~%<&FIdDl&0ma(iGJ08iZpttnf~r6bqCJw3le5**18Az*k;&c^&I(R zYd7~2Z^hyo)iZYA$n~nS%CY+zk$AKEnj7BNpTq(UVki>Qrn?1Fu_OvjM7Lhh2dh4! zcq8$Qn3G=0@FD)syT9*^d@&Qx{5cie*!pH3r#En1l7?QZm2#fcFNyp8O`exI-EaRe zJ@_G+xV`*{`&yhgC=tKMU|FCTXTobRiK$0s*}nLioA16JmQrJ6B+KF#Cp|N^2Qu}& zoGiRIS)1GPZ)e{y{pNA>WYE)IpVpebt4^)_nr7aNBTiRi`i$*X>fsGnGHsuP=Db;= zZJJ|NPx+^hhDob$Q8hTeyrC`NQmp3o<|%k5$|8AD~yT@$XC8xdE`cy6)e}{pc0jf%bvb{=7f1-b7>7&$ypu2bsH>`<^FStEFg! zB%7rE9i0E%)x$OgAPIH2uKA|uoj}v%BZAu*|pC<3yr5&dnN26t~r84nq!ga!CBBhdA*53p^|FkHo zJqi=W7n$HqL4Z&7n7s6pYG*!cmic4yh<<@ZZlNbC1EQmDys-yr$Hv+*vLC-Q45vEh;;U2Z|9Lqiprr z-Pwa{wfqC)eL@qiB~C?7LEnAhs!%o100_dy5*{D^vb`jHiETThW$VTo-K>1f!PR;kqb#Ja?O%-Wa~v7}=F zanK)f>pss#;^m)9itAfek8D59w>AXtG3W#ol7~I}yzs|1rBlaG0YO?C=i&okByvJ0_BrG~DbjF3pQ#W`vv}iyy z88no_7S1b<&5j&w|Amf2j=&B#wG-ZTwn(}B7`DpB2{kjL8Ub8kVGddJ~0eUti@cL(;Db9U?bhuC;d8hyhc ze(D#{AJAdqZRTE%cMnFMgQx`!*D?zZlG#$4-tP6#MU&P%Idb>6?=`uTWmJK`6? zFNwbdEWbmWLaAA5NMAnAj_T&`G1u#9q72DqT2QEbI`YwGe?CQtJIyMc>NVr<$Eh3g zCmjKc%2qCY&rK-%oE^<3)hA`#u{?NSGSjTg_l0B*~T1S16O#5qcXAj)|jm8V@tzb zwm!98BjH%;=PqMZpX5hl7b_NR$-35K$#^Y?Tvv{>(H{2%K;fX%8ak5~b1zfA?}9{5 z8P_6K==bPNdO9UUprvfhWKd8UhqYRv``;lw_igyymS2Ux5He0O;L{b}qO5~cV zS{As&j}VmKD03rjh7DP8kC%U%!^j=Wsqo%3%N@}xPW{xLo|BwYR{GsMD=R;fc}#vh zzU;)rKyRU9O2{K?R5w56Q%gkLY#eo!9waVz=TGLSdAW-dk2-ta#weGy!r0_=4FL}! z&)Dav5=Km&2)dRGmVWB4@6mL+crE_sXF_$FamOFlf656nV%`oZfwMP_Ut1W93N2dM zrYOuMF)#$JnLRUqBAV%9hvr-<_}+39L`JnK{E)xL?b+P?+#*XSL?J-bejQcbmt#cV z6)Q^Vyx(6@XWN3n#9LNQyUlD#AfS5@iBSg!Y_fm7Va4GbZ30WtoM1^@ugpV->x=HkP+JKY^?g+@zV&-gfK67!ci| zeSh4(uTw(3K`ljlL)6Ua-of&Q{^VSQ!Y2h02#2e*hx&fUyxM^6(vqB3l9oC6arLq* zi_^%E7Ak!(fl_CrTHsKnPKRB1&P6~+M&|&gcBFi^-UZV-v)Bkgx@~bRX-#2fiH>L; z+)&4k8%n+DMs9tgAtHGgJxuDhY15F)3IEB--Q3Wu>f0al6Ol-)>XBPm!W3ANl+~iL ziZz{~U;j*oNaLQ8D%VVf&Jv0dnB5z)+P{UhU$1u`%dJt_`g#x%)*ooQA_cKpCA6rG zjG$H(kM;;N^#EJ!>p>K__w=+@?&L)0$-|K`tk}pjXVNFHwr@n872?NsGt1@tY=Idnf+>KSl2np*+0 zv9N?31%N-z4eWI39L>!vYy}*J>HnD_0Q`Oa7)($1&lEdTVR}_LMLKay8v{BX4sMR8 z^dh(E=;(xOJ{bzUdnNfFuLJ)QrZ={;vl0MrIG(4^xxi8{jWDUxj3Ky`>X#p^lz`8lOmvCV`2cD()n44a0-DhJ^PRO zLg4d*`nQAo7gzpy3a~}wwh;LLvRLHyu~JAi7M2*+n^!O1J7TX*Kti=t+`wDH5B4S* zHA>l3D#*rJr@z(*{JOc=0}^^ix6osLw-x`V*fJyTvG!{$CNUgxD^1SkX07HA8*-(O zGzuBBRBM7zU7N3$Y?fB!2aMaI5Zb182w|gyLeZs_gw4@ZT@B@5FTY@6gWuyGnBU{^iH6=0;(T)P(&aupH897hCKk=@OLJ)@UC9Q*3u_W7TSf3fPZ zyy7vIr~EBEGC}y_qe~|Qy!j34e(mDHoiAu7Eml6v!plVR-;VTOpQ6)5QC{&_EKv!k z0WM#_?|TI^uxFB|u6m3UcbAyM!LRepRYU+Rx^dO%{4b0CUuF^ca7NKpGMD%YM@8Go zU^05QOAt&zBji|CYSxz~hpb%9ZQtBZ2;!Xd>Vf>}yAtS?u=mBYJ1SX_;(h zYU7DSKKa2DaT1R38TQZD{v~PurfYQ^w_XLox93{YCn%mO--KG{l^f}R8{oC4H-ts6 zn2q10xD3o3#0NnRwpO(yOrw#ttTdU zy;9&Kn{7V%?*_QTY5seLeBym;z#J&I2?Vb_zCTzx*vG+|k?Q82x;5e}b{X-dhUkSJ<3o2+rQiCb9C3%GKVT zh4#L~?YTaurML)s|1~0s@?qM^Lf*TVtbtvWn0XyJ*+x*kUa>|w`R&`6zKsQ(#rvE7 z*6JRs1*(cswgo@8-dth5#C!k~MLqj2>N4A4`0o$Y{b``vWR1!Clkn$*34T@uqBZ8` zm(OdM(R1`8C&r%LB+cc)ZumFAPj^;_LBDBgTl=F>A6-mMUD{kUO~h1F(qN z{+GAqs?{b5m(}z{Ju%A*j#JcezGcUDk;@+SD5q}YHVD7F@ShzMTtVw{8P1RvL`%Ka z)#-t#yQ{!v_3pcGo?2Qf*ZsBJf;MX7tqQ8(6G4~Rta5v;>tlhjm3^J++G=~kxu8Z+ zPLEus0grf@0$Z5OrFlZ@ib0eU;5idKzCXCkF0n)-K*)sWHgYd-9rvgjfCC8FOM*)> zPE6O$1vtETYlzCFL&e5%(+1RTNhj&XRVqaR(1IwhV!c8uM8E(l*v(VCc7@|Z`2(~V zjZcJKI;AgS31q|^`)HLv*jMbqSrVXyYhy$DvVtWd03d`pX6?tiVh_R$04)>{$Yq71 z>s|uPsoUxO&zDKT@{A_|Xz{PAx96&B4NXITdcw)*6hAlcJ4(;Jl>o{Ny6v#bCtD=H=z~ z8qx`86YIz*Mj3V2V2#3fe*}kC^eI1vlFLl>s9i~3mWwISvY_^wFnFsqIigP-U#CMH z&Sfa8(AN^Uf%e(Ky(oyD?oSlktgIWu*^&A~r;l?c^OJVenSvgK1ty5FuLEzk*|ZdY z9LPjJwyU{uw`IXsU9XGM*?kQs^$r=#p=BcMqxCD^yjh)CXFUPe zo!<{8O^`W0)V~JJMq}L%>%@`qXv9)Wp4-}AZo}nn)X}y5tc-+SH+=2PJ2`=03e%-6 zodV-O!!Vac97X8an*%!OPKF~h;NYdo#v26EQ`O4^_Fv(m(?L{1%qI(PT2g~*j{3Rj zR&Vj?wf;m!o0Xf_+->{=?G15TbZ)o32fE6{ri&q+IVAIHlU=9h=lXtT>K4OKofD+w z;(pb-&rrUb`{HfJi0m!sH!XC#c=Ujsad?wx$1-|kRtsnD!M9#)@}+K|5H&NdT0NN0 zUtaN9V@JF_kuAM!IFEe9kbs9OA^7V|OZa(h^zD?_4Kvu}mo=`2_O5V)RleT_tApw0 zW2Fl;c45hY*8x@21A`|5w#TUhroEW~F*`~v z21z^fB#mR$vesSAY3wG)-MS`uoGGJ1={dKnjx_#2PF738kZ6(1`AZP4Eet4;S)l zv>M2$=j%zhXV_Enr6DHmG>Y1rg?^-X-;s}qwU(ZsTMt~)d0i%a;2K@@=}l%lS3!Ae z2TMrbO?e>>xj%g_HYy4FdjP^^E$ft~EYgm%Y*TI&aoRM2n`@jLqxBVj-z?N!EO@dj zB`?S#_dp~Yenc4)-FvX%_Efn1qwZ*|`A|4Zic~rum8+P5?G#0ck3;)`52z;A{TU|M zEE4ktHDmT70gq@dVmri#Mh@n(I8vOkNFikeJ=AnXkswiS`;$ngh8b_B_(^1JWWsKc zg5w7P2ZXSLKza#v)sBWSva+W%L1f3V(xA)ML~Fk`tG%v+?l?Xg&)uQ;GP4o+p#VBlQ;>!7L2uPQk{_u;BwDKU^n;5H z+soa8tULt|mwnT|)43L2!RjnT0Vn>O1f5zTkJ8lD(gS8Q2QN@9n|jG(_70o@yx>8j ztk3D71~^j$n~YB7!v4J%A7l)+Ge01G4upQ@IgC>^-}-XKVHw|e=wN>_`=rLPGDAn;!SK5Zm-??LDIc2Z zz8PAPEvrg&6u;m)*rBOpGg=Tlan|q^mBFPGckqcV5PcE%{Y#gI)&v$2jGSxizxomQSyRG`qiBh)7?ogTG5l=EA4h@hw2pO?Qx=N)Vm|6K`7@2?Ly+;kiLqW>k){* z6yk0S-?X>dSkVQ7g%H=%j%!Lv$_Ho1i)qqT`-sI&A@Hgb#jfLEyltbBLV9DmymSGx zVoh%t?EC1d&splwq~fi-mLT%rNvDorWVwmUeEnx3QXl?x`$VH+m0U61*<8QlS$GUKH0N@7ik$fqc#rlMhePs9&ij z+baVmuR-*u)|BEeQig`>%odQ$oM&?`fr0{*HiE)u+9wKk8UymTLtwQmnz@SMmLJabk!c@{+Kp_|zAjqqY`<2vJVV~N zGB=(yQgy28(AD8P2UU7!-Bo5Z5wYQRigrEAqj4#OTNSW+;D`AP7i@bJEpd1|(hAtG z$P3#akn=oqI}9c5)k17Wola%D?Cj^XIX~C7Y5rRhk?9&l0|f%}^|PvMKJ)c_WXeJ0 zuUT*!LHXXul1-N7)E)*^va2(cy=1YF%zFW{dcM1DwmJEsFs)`UU%Yp_@9Zf=`%cga ziU8K>a#tjnU}jy`chV>ZatAXJ?FO6!&=ou!#l?gJMp_ZUk+`YjmUK_ zQXTJ8B1}PS%A%_Y2DVIrZHrp|cWptE`OjHazf;t_24b2O+tb^h#u?Yj$(&sX$(X4o{f>f8lE|3>L9i=pt!ALZZ$%6Nh z?X^-ncZKz!?-t4aoyw1L%RatV5LVf9)Bm$i)+JmtpvcvLP>~xevQfu{>NuaMWvE6~ z*(82u=;C+Ztl1GJ;cXcYXAhg$)`-Nk`L!u-mKh0)j~&IqtABbG)je&yhEF!&)=&F^ zfY#&eR*PW`cbQMRJ?rK$I$p)#V3LIV3^KT?{P037brd9K(g=6_zGP(EuuZl$VI(3OB=G^iaoquQ||m>;aF?J7-6Z~Rk*(Us+l!X#85V-%zp;W06}&6 z-|seU2Vh0-92B%vb`|+gyPQ=tyh|#B5(q zp7+=}LSnO?wtBtONugP9*^~fJQ*%{2>xq5$(xozD zTP8`0$UVu}?gr_}fdl9P4~s@CW19@C%KAMVk?0&%?d(IhjgFJu>$*E_>xV{*f!bvx zPsxUiTTC)9Mv`utiFWvv#V8SaRo{63ZHQ&*?F~fX_t$#X;mjmIjv=MV8(O>Ctv(3C z5l%a9(Q?YOD45;{XFX(ZF&#!TwA21TkC*S04l9`vt9VPb2d9*7$HIZ9j&|H+Jb{#` zEsTQtcDl286;bq45n4%Fa}!GnF1yz*S*7ZhD(?6ig^G3~m3t!y8S;q&4UMsq8nTwGBVdTWG@vu4t%49#Uy>byY*GMH!eS;3n zw;0*3!l$@K@_XB99hr&XvyOL=$A=}bH#!Iqbq0ZUCSr5Vfi2v6F1EsC9||pWy021J zZY*PzH$}PxUm2(UtE_a|Yz|q()<@l_Ii9@P8?>1aC*P{v;x1Eaa{!=Cm)RZxSHz6h z&D81^(|UotNm(^lMvR{k8@WdqfCVwGn}oBQqT-0$O*iwgtx|}`?7YT$AkVoP52(xhl>vB^dX(*_;!3y zv;ZS@!4i!VqKX`Jbl5J_m$9zNUY45Bwq$WCo==`M8&ib7#nA7&m8Q+&95x_0sIni> z@in!K*2(zvV7XnU7fjkf%9ZLERxAG)oEqAIRfyzVHSxDoD z0ld;4nPkS%6Ql#tKPn;(lIdaPYg_3!7A-iAKcfoxpL&8zkDSKH75938G$UD5uTiok;uC-8CT!T9CS50y*0_ zW`BisxN>4NkAD}w`wH9xJ6qpe5mB$kK#c13WRlR~X*p;oN?uEOaISjaB2}Qhr5@7- zFx8!hdjpjNC^x*#Pv~Z>In^VmRv_dx3 zF@PN+(gLVsrg)vbCyPE-DL_P|fIdIS8Ay-WE!&R9;5A4)sMT9~h!vv{9a-x*S%F+T zImm%LpMrGHuZt(mMOCewy@c}FUJznp=I>$%Nb0JDe_xBg$(~7}Z1#k~$s)Vc1j~pX zdq|~Y$$X%Yl+dd?A82B)EA%krFr>1obOdVK(snL>I&R{Db&+*B@oHpL!9pkYG=4Zy zovp`XY@1cdmnlb{EO8#Yj~o%GAsST!Ts3&f7JuHGv2gKzPAg*aPUMrQ`=W~Q>3gU! z6{g*#?_vTu(cJUho~EmDPdidvW$LH0+3>JK`)Yr=+vF~K60d=<3#5_3QD8Z~m4wd4 zR{PSY%#xNx8S!1j+QLOz-1;4BnBWnWb;fcJuaJfnV;k!_)dscg-ozBV2H%I9H!V3} z-7WAq33Dh4H(g(udUiH; zW|SmN0*luiwf{5qh@Mo+zZGUNTFA&#(&Lu@e0-9aedFwex~4mGQ_Zr90r56gM+hHZf@7^E{0~PZbL!l?pg$>?5OmnVZB0V zL?O+`1H-JtQe_}9)QF@l3QOfPOwx9dmWpS{B}?ila9NMi5m*#FK6N8n7~4Blt9CFy zno`k9P%a}8Yp#Gf&t?b_pX};rh3FY94@y`2Y>vBGiaZink)tfKbsQT-yP=0Sj@aKL zQqikS32(NmrUqY zfon>uWXP*^pCVj{6Te7TR@EA<)8Z{GX zK8rjtuAGmi+@XOM5O-!^x|j(!Q4|P|q4A~N6B0jnG^8vYJZ@vOp{c>|9Ht$;_su_% zr|q}d^1A8%M0%+@3v9D%s^QyAWAE@xqixxO8uM{Fto+Fd%!Q`a!<1xS>#U=w^VGuG zLc4Mk9?@I92BF-{)An6DK}DsftIh~Xqi|2_z9=x~_@cBdb2W9zQT_X6>FZHnfhz*>+-keEb+34caA=%ovi{$`?*c zlj(Y%3g^EY6f3|_)Eu6z9e2~p;~*xccR5L1siVGJZ=&+J@>-G8bsdj7cVx$j;qNJ7 zL9j5))oD^=bIRSrUY7kd3|UW}6>O?h)|ItUi~T~Z}=dqi=Qe6i;7YN~Rm>b?1*JV91=?W)HU{1ENh zs(mN=Z$~>$OTRrTSL5x@@bPy96gaeFMO@})T{mF27^D`l2Uw%p+cKSKd<>HYm~?E_ zq0Q*;>S!aG(w)5xwvu%-M9rvx5#$6kOMN`IijejQJ~5ny(0FXu`auRqi&_LltP_yP zpdeAhbbbmS!!xPcuu@|q5z-}NO8S>NS#HlV^rs&Y;VT9RK7 z#JLyc2 zbpW2N$XVr3ny;Fba_EPVtr>b%e>VijMD1;xe!%@`hlq;5<=dcqsQt}cg4uQ}lm%T> zyA;XLn`TyS9~!x9Z5*dN0=E~~p@Q>oqXSb2Wi~}NBBhC%hslH|Gri!B@n;88WT`bp zy6t_E0bQ$-9|a1!{D!uvXayF&0r)OHZnpZ6hVf-?t|h`Zn8K(R7ZsFY9{l)Jv2*!6q|_ zx|H#7{5#xW+NyoNu-z;K^vm|@QbNe2>%49l{L8H4u>)DIYVg@2bjnIrYO6FQ==Ir7 zIDX%7l6WRq|5DZh8r!D7zQk1vmGa{pEe6UMI#Zn*-NLCzh0I7aVpqkU}ekZ6E z-7%8ab!{?0@a4*=LyJp7#C5Npl>OQzoj|ZSZFZ1D?&}**oSt^NR0_wtZ#(EPB8b|f5lgKlV1Ms`d zA$f4IOv1-R(LyY4MwBt=dCE_ zlP^*6nFqPnb`DR9OnYF$Juao#sex*l!z&proSIi3H~iLFEnCKaVm^tF3aaZp`?kFI z=VI80>mVUkUe4;=#n>&5GmvFy#PC~Clcv*IB)1F1;P=d8xSKFx6ZeuA2Wo34gm|bI zp2AY*It8w#gV(nsf<$_fK-rVUEN-j&>-hCe(t}1DFiW2^gzUKC#+OosN%lyKW_-x>D42w)r2}ZZ?qh89*jNW~-UgH_9vpKJ|Wc9TUBv z*;t-|w^i9IQ}k9yml<)&I$cCgRyQ}ZggSqEUh6}usX8|MBhfrI6uT_TnP!TmA!7NdH+@0tZr)Pv>@aaF9;_+6<9GK=qWa zW_LKHPYu&)tYB|{AvD0oVZV(>rt#bQi`W$Lk3CIy%-XnJ9~UAuLOEAi-$ zI7~)I-{`9jlj*$1pR^Hw#m1%S=rq~tW%@5E4e$wJAY@#-Wq)unmk&^;hy#@IZ)qn# zzNDc*E5a>cOyN(}#Te;-S@*xJ`|n2Ue~Q-C)y0=1H_DeXfxwNuZ2Z@aJI3)5fmHm@ z){77#CR1()<_=>Owo7RvMMmi_yl(J}(e4omZPjs`j}{wZpkTf!S6e?9x!C8NaSo#< z@QpU3Z7S=Dp_&c*jDms!8#Z1V*R6WgS`i{`E>Mu8GmZbGl%PP# zXCX^KKw#1j6sm^xgF45E!^+IZ!rgacrskL6dnxkvPTO#@zHGIk-bt6uIQi!@-&Vx0 zC}`u^Wr&$Hz$0|r`PsE9?U-VR&&F*LsZumfkF@N1B*Nx)7dvJ0s&}LpTngUy2U%^z z+IF!xEG3u@<;v|YArRMUpYy$h={9=vWGS6c0b3LkI6a(;p$^*OJRQtd>oYs^yU*Gi zrlK8HYB5pScN$|+$wKWgtcz?SRghgB%#k6XlXRr8H*IX+1M+}jtSV_UjXr!;f#53) zQ>A($_lzD%VE`o`N1WUKhzUTO6Y;@TBT>2p6tqx3N2(wcOvpd~b3A`}#&J2xXAu(} z9levk-6KUS*B;I;1FqhB>AVi(;s^~@Td&8ule zlh5YXIumJHHvJ$$E6$!bYu4zOv!8ZS|*(B&5(|Vn}G#fcz;-*smk+OOwgSmVos1t20ICsBr$otKFZGjyK<&i z{pitK%OeyLy&N^;7$1mR>G>nm!-PPh|{l% zC3zJEN;s*j734ojAIr9$Ne0nqSqF4);g&ICU#bZNQ6=uS=UDReT_TLL24%YRw0;sB;1 z;Hpgv_IWN^Tu=?m8XlbybVho-v=o)~E0Nz7e~9@Cf_SjSmk^tN0KZ|b>;dMNJAodtUM38lVfOd()rTzNPPh1@1( zpsU$#rWADM-@5`l*{LSl36n8oXR#Z_T1!3niCXdS0LxjjygT{$BoQ#cnt zXcigDO^R>HSvo5{5OgqGc!p2LAb76^)}YSt1Jv3erVy69!Z-77MZv& zlR|uK-l?W#PgtZ;L1jlICj${iPbZtM2C)0bTc?;!9j%-~w>s>b^J65pK`%b8{UOtf zcRxa+s{^ft7QbY3v`|AdpDcR&pIA@LI=gJvK%6mSQ}H(lkHtZn9et{90mB@lO0I)6 z2XR+mU6othpK4|VYTsL{Oib9X+-{G# zA1>!KAKxD8@9$?EvM0G1G6RSHuzPqo()$j@uQLK_0qy{Dk!qcKZnJjj5%p@P_V8lk zo@Al-Y#L+5mt`gK;P$J!=k{%(+*ThmFsKjO=e<*5S<0!YG7)L5vU3K34|tvcS00b~&^fHt$^eG_z{0gLx-g=lV;02Ze@)#zN;7(PpR znIbYWgS?vkyKIYhPcNJOWqHr#HPFcWP;#v*#+cf?j#TcM*sPnIS9ej&9*Dk z$9w4jJttX-@vHq2&oU!R!OyauMZEh41^i`eOHm6Hz;l{WQxTZ_lai9c)Cn)sO1v!M z+1%WGY^V_(UAdVy;hO%gqhh$z&_e3Jqx^s97JCd_o#ML8XCT!7pLumk%!4FS*u}xa z3BseJe$N7!W#dlXVfIWQxkMbYndkNjOnEnr9M?0>JK(@-?ALH(L_P@W$~BYb0H<5mq`tLeI5rHVzD1hPtj?kjvbM^z*FAbF<8 zLorzBq&~T@#17eePaNt)NF6O1@F0xWVm$IZ;3@v}_t(9o3BXq*oWpqOlRuc{l%O>9 z?o#?WP{~kAPYaP3U?CvywsD|b0x$$qXPh7(>~yg+rtdt;2?RjoF-;g$#k`4ML1_Dx z^UQa$9n2j{UN&m0I&70>e~K{m?d-Kc3^&1Z$(OWvs4 z2sarr3q)QkB9?4hccE39jx*owgAU5#2-K#FbMp9{yNVEta?k1TPaI0JwQB^loRO($ zq3b)cldtb$8fkBjfxy}%p{gVTa zGe{)>&mfhC@BO#Hi*K@p!C%|K9_V&7x|1W)je=9}l?ZGWh3xBV5k1|mwD+@}JlTMx z_sI+997g9>u4LM+mkcS_s#sQ|J1yn&JWf`#AgKw*^GwJ=4a-iiCWPxE7ZNjd=1!9d z3X>PwZbHFMht8hV9$m`*p!hvur>n3oLDQ1`>4Z~M`fi|J&VaAJR+L7GeO~a{ zc*kgMD+IZu<{g$=%tlooq;@y1^5Jv?P!tnAZWR5EaNjQyybkU0$76w=tXuL4@;NiP z&oj`zfdSM-ujg4fbc7wE5gxT8^lUxX%Xn3@32BFNwPL`&G{VGVZGI_yhHq;RYBqWB zK`HCv-gj6C({)Z(RFL5s78$NV0rg%tm!{@Kwqr@0l_OFD1u~Da%r6={v4p!nJ|yYi zGuB9T5NR%5iP$UG?OAs$@}Y4yK1w*-^;i`DeYQSz$_{@z%?z$R)H|i9Avh1o(@*xt zz$ZsTF!^l;wm>OFGr0&Aqc=kW0B@XzM*fB{rI*$2<)F7#hG~bY*9zNr6gj{CZK3rL zqPA`#K|7t}|5QFbq4t|1Tb@F={!h2tSo37ha|B22u;X@a!;Z*%f1Uj?XXzeC>Bq6; z(bU2ZQ(hTA5YJ0#;+X?WuLXsr2JtUO9%FRWE5wwT(uHW^2@3qfX@Yh zjp~ zen1PTH4;#pj#aX=S3e!=uao^Ie@4yNyhk=O3&fm$pV69u5}OT&)j+_p3rl|a&1WDa zKyr)1mJWm<+w<$rf4-zoi&32noWGULxXFlK@#Tf_WXd4OFUkfA=vEZD}P(=zROm$tF+=M2lzTYF1Sk%}WH?K-E=HXrhv^!{$E9pu$xb};v?vt0mMsyE1+sSp|(dfLr8 z$FpQkn=N=UtHQhfW)Gw0f<$Zg-%nk#!XZ^bFC zq@-jX)<(P-NBDmI$A{QW*x4!SJf*P|?~*%EaNNW7)S0`PpOZ;nmfX4f#m!W{>KOub z{)%H-U}(AgTRlQg)x=b19V)0r9lVzQ2U{152tsJLqwP2pE^$p#GKc&ht8!P9keDA*s4{9gjFI!4E?$_(F72k!H+%o|3Vx3;~jf8@1 z!e__3$b>U=0#v+HL_aC?-1;E91UF^R69?**b|&sZpbzNnAdlF*(c=vWtZIax-Hn3R zOm#t#jg8A@zP0UOG{ATjNP(zTjX^FdGJsXzln)1pevMqs#{=nmhRJ|yxIg6OQtfh< zD(fBEc6=xIC}?dDaz~|bLpH{bLjlLZ0Drn*(wA1^;Cnn=Zaw$Jo>267%MiceJ>l>r zjDq6w1fu4pC>fU+YU=WA(1bSoo`V{ld!mHzhZLZZc38(UuqD}j-6$LDUV;yG8^0NNX}0Ji@Mn=Aa?c8gLm0wj10XVvBQ1BD&#Rw(Q4hP6&ye8AMdQmlM52*G&MjMLFsA)EY zNHu*TVcD3h>9#k3PJVix5p6kDX&H7j<54fyyNT)NY zQYWQF*W4t-XV$ufIs$M{r>sObQdB;&ZS*RuRXLc`JeI6ctzG~uneK#ApwLe1`)|-| zH}1Snk9YoDyCw5JaO>%5G8F(EkfaHRuLKUKz4|mJcfwKUW?>3uHPe8CgWWl&a!;4) zZ_>)LDrdhg(6bK>A60e>yzE(YK#rR(Q!(J|v3Hco5dGlB;`iyWwISPrMLDTF7^i;o zyo*#24Uj*`%6Nx<@Njav-ivh#3gCRhdoi6|K^27HiuqsCc@5I3X8MaAQOKC7V?)1z zl$3kWDp>%U=)5>O-bE-B;K|n9CG`P7BdwXka)70)zF%EIDI0)v?l)#30Ox=T4sv}2 z7hVZ7mJ+fA0_3<^v|iORHO1Ja`duO$PH&{>M7}A;t7z{nfz*C^ft17N)^25;b zwK3bm50NQU`DdqY(C9)Na~Ic4ZqE&b7(8Vq`%hyF4=Qqy6Bif)#!GDVdxlGhCeg= z=uuCQJNM=zWmn79BJiTJc}d0*;G+i~Oq6S(EMmD$-uY}ic=1U}TK3fg5A(3)IMoU9 zf}Eqki(TiqZEVC0y!t%L?O<4SZ^tB2WL0(+E_qdY>wFe7h1%AbQOi$Rt2pW@F?_InPaISmYWIvFL zdJiXnTvH_)d&&m5uzTgta1_(ishUwpl@AvNFkGe#7Y`WMG`rsN@CrMKs}2I3pV=JV zMO{CS$Z~+vs7Af@kIM-aEYEPDe#<`g{Hh-l5o0}fV^&mG{U}JH0dOqsyn$DE1-foO zpjdgI%IAtBBQ{n`yf>q#udhGZkd~GfuCa0j!JZcPmGr`5XV-~0`Vg#ko;@KFc50z10k$nJE>_<%mMkD+bMPG8&J#YwqGq+0fX=e{Eq929oUrtWB&tK=jl1& z);M7eBZyH_ud&upFEcS!uVP7M*MPKWX?h2aSHVouddQHvzj8D-rE6n2Ey)-NRgk!1GuNXA|QJ z=SZoAE6eHobc~?39q!{Fe~Zj$w%LvKIH;KfIHm8|7;&UHGle>C(xnUlExg)7-hf@R zW~GS+4OBC(@8{&Z;wr6V<)?F#%BAQ}rFzgT-ZrSksO_IQz;=|q8Cq{0|u zq@mfA)u+oVXRfRHdf^EhHeBn#Qro_Y8XE{ESrs3bxq8w|tc5rf48j;V#-80CiiG-I zI_gi5tQHM;Nnb_SnOnorvBeMaVK$)vt&ZM|gqN~lE~;Qr`7O8kR9u|lm+_b(4ElPRho2kG!O#7~v6KMzP9{&a zpnI=`vaU++)4MvS_0MdiX`NN}EiJa&G}i#zt}nL1#I>Y9KWBTKNNh2jDdW{-|e4#nD*ilUZwFHbhQGxZJvB3DnH}&w=#06+ttv0Ax=X^v5ug@62kEG!Bd}| zKiGnzXXg*fyl$I3$S(#{dW9-{mJb`ndWLRF(~|!g?#Kr_ko_>{Qr=27LdTVJElaFE zrwujxAIS9yuDj_on~J={B!(u^Q@d1Gb^P9i4|0GLj(f$zR}TQW z+DFu+e{k@P_MU!zey#?lfn|Bhpx`s_{}fxo-DcV~JXTrkh5cccWC6Jrq|I~`?GG+{ z4qjTt-NxZJFb|M&JqF?tz4o`4e~MM^z-Q-4zo`Cm^nj;VhR3QyLN2f0&y%9(@L07l zOY$2u0;uo+r5!YA;s^HcBlsn!d$u$6YkS!3t_JDa6}=`00j@A$X}GbTE;W?<_~{e; z`ls~mW$4F=xgav8z{V>=Bpx;dn7MuFEex7Ber&G9XsievRkg`cZ;(v;| zfr(0fdeMaC9+B#FI;NHlG|z`YCR`h>#;|VUCs}!*O$EAH!tzL{KMb`P#lT%DMkcEVHI2n;TXo2B95d4*8&QrVYo7f z%;RFoe*`X=0^|yb=eES0A6~&~FNWsb&gYzX2_|^2cgj>iCCswK3pN8n!9{g$~oiYeoSaGm;(1H*9Hq;bx6zWM<*+jMIF! z>I49E>#Y?_u!ZpV>(1w0Q#t_Xoar|F{!k=H;t##E|0aqY+;&AURv9=S3`fB+!sk7Y z{9E(h<&ar)SZ**DR%K9v4K@Mfc)9z0D-;cRfN%Y)Y%zWZpctu<-ET(2V5vJ9HtGmI z#uC0*JW1Yn&E6}?P_$!d)1S1p%D=MdOXP|ryKW7{IZlZR7d(;{_BTMz_?wGh$gVwT zMmO1;tu_HbO1L=6q}k`u{X!L*(m$-IE?uL*yOUfcTA2~XQmZ*Jw*EZeeVEwm#%8-I_u<*NZr+PEy+Q~s?N ziEiu34yw5w`YdA|jHvdX%I)(j%uN@H;55T_LFHQdva#^-my_Fl50So9kp^qoeCt~P z*kNfCM1UJKquBc_@e1rZru(g;I|jHy>~fFKW-YVG6~=gJ579iX^ti6PJk1*j+^yPI z^0*ptbvRiINlEzavXjPw-pWs05NldkO}pRw^L*Z=Qnf&bxGYVs&(!^7NQ%)#kq;Jw zX=mlOSG|5j(QD-ihv$*71dFW;=Bi(x@P=r|mo&=T0p<6EjykDEChE_Ap6uV>?b~^` z{lHmw2Q&%&>uw?YY+qeEBPdF~XuBS^JLH=C{+Vn>x9wFY`;2 zit(`NOMHzyjWq*j=87YG0YXgG^A{njHCHZ-m7Bv7Y)S?(_@w}A(ZG-Okm`AeUSCPg zYvf1^ryh-AxTIrWqx{3`E8ycq)gmCDCS<69$Ir8)nY{$9FO+9KVLx0u98b&kb(wLf z-WWPAr1M+>AhxmIB)vWOPo+OOa23t4d3z%JNy+JIGy8aH2oCqV#y;Q0N z=!x1=x;6P7>72b&Uc0T)u&>iucK>2Ka1?nd8rFc)cgF*8p^w`l5?QAUo2q}x;a4`| zD|DR;acvgdh(KS13`LO5-L8d4l7DdJoV^A=0Qx39{LWTnz{c_(`3n-t2HH#(%W&I& z%$KM6vj95==Bh<6^EzXlhA);SzC8G1Q-ECM9q;tnUP5*;U3Ulp$M9hXS;I(y!Q>HJ z2XWcR-6Wgq#epl=HlUN_6d-MSugQYz5ttHs=mgiC*ii=D0=AcG;r~`{!rWd==Rev6 zXl^JuZrfiFJz*YNU&g1o8m?4ROF+rO#Wj7-wI(D8h}mY;s?kl8oz}kC;c4g8OM=3~ ze2w)F6UW!U0ix`FYC85)hL@X_3+^s7njz0}sXm1~k!TDijk?6V|2>wTpaY?F%ruOZ zNmVZFp?pUEyPvsRA7+yLiLIrDrSwKM0T_IS&ekS0frpKjDD-W?jD|j-Ybs*v52P5` zcU>1ab|NAJD8ue$u95?VN&4Tz=dD~LwG-FA3*ZZ4h2V^+;jeE*LwQ9B;lQ0=7{f+Y3|r9zuVPG_pC45EUzCK zoE5U$wqNhxu)6@@)KcpnhuRgAOWEPJunK2(RhAuVKn%2c%-9c5ydrJ@YoGv}RGFD! zzg?#WjUO5fq$J})po4qs;X^5^!R9<__dft70~I8gVrWQ(MZDUfZd;3qTX;5j2IzmI?wk?0QD57)6weIoK`)_02DI*1iiGiyMHXp`E+CJ zw$1*unR!6?`jfDrGaUC=;^^o7_G9h$E@eN|*9z3%4Lswd=Fd7k*N58nv5@;A=)mQ) zbtM5^Toalqm)dpMLPQM*zATvoZhJPd2YXBwPI88KO>iNu8z2S!At30y)a<)ibbnQ( z0+Msz%!)a2GH)xz@@MJhpjjx|B{Tw6*b&l-E^~YUbT?jS@Hv6`?yV?@@sJ85dehe&+--i zi>Hj;*Q&$5XQLz!i3N;JueSmJn7R8?qm$`z^6#q{Ze&C36 z3>1pI0P3yMFF+96@x@)|>?U9ylF7>)&E4k>_qS~mif*bb;wt-y*p5IDNTGL@d)bK3 z__9MsO17l92k@j&zTJ}%rJ_&2tB_(O7vbl@E8u7_uWth&`Ji-FWp+r7uZ|dUNW7-C zjProYd^DgmP^nby{dtj&<@S6`E|*I8rj<@O5|A#bp3lOW=-{@SzJ(iwU>o-KKO$=$owPr_N7aYAmbgZa+IUsPDi})B-&u<1L2O@;U3^9&@xCTR`)_fAIe;wM10y z5nRTY3`gr(@Jv-s&LuT-^$1H-KF#DhoSg0Y>wM}aJFKQrFu6M_xID}K;r&FK3MBEk##nym^ac?|*mPx4LxBHss9vBLoM1vIdwkL`#?0>;| zH~Qv|aalX})6Sb%r?H_a@y6F@1R}bXFttmJn#lH~Xv$v~B(F!{p? zqHaK&DR7HFq3vP@o5g=z_?t`ZW&kIb>i>o6x582VKHU=K>eNs8xN}O{CxzS`wCrv- zhaJZ~FDyC$&fY?eWz+Sy?NWsMH_~qi0Iu|F`fn1^H>xLRTPhhm)ys^sfa75${hHoa z9t&-lbmm!`W<+fA@8~|wQ^$qt`FO1Gu(z4p1$M8SX&rvZG`C?|ofdUtGc!Yr)6~D| z++R&(Q-$$nObP!UkPM%}ckR_8sz^eZ@YO~sw^jT!jpi&({ZR_>_D$=-Iy8h9HzTmH zA#xB;%d=<3n(4P&CMO;k!hQbZj#e{&yjTkxkm^Y9J5T&#STOr->d?SHo)xFb6$JcA zZi`k9zpXOU#{Ta2;ok!@j|W}+XXOld3!=XOjCEIE`S)uWa9ex_M8E&fn}d@AfFOzJ z7jQYV=Xyu;pNk7zxPED*b>;@`d~{eSqASz^jyol6l{3I)QVGB2Hzx#iGa29zJ~oE! ze9V4KGx-{j%ULy^89immN8XqGlfJ7;H1aJM=HxtEVK`6r-by^BCUNn~L$k@^baSfR zKisteR8>-yE3M=ywx(9Sa`~shG*1)JaThBfH^O8r_pKe#$3Jyy?@2%i102Rj!62U0 zs@y%hj`?ob;*ZgDz?}sMmNNCG&RSUPe`OK<4$^_8leo{jKawqL%yU;O^yUG4C6% z;q~S=J#W;^F``PNC4JfZ)Vkx((fL1W9PN}+`sDiMqCgp+$qA?#$<@V>#a=XuzIkJ< zEczlw$vP^HGUzio-#UmvTGM)7(CPcN!2MRvRAOb3OO1<>p2Pb5LVx|l{@bxUemlnG znzvjT6f5uejf`F~r#eJWoBm933o$jduo2>D73UXNH6$HWk@KR^MZ-t*`}~I=HV+Yh za)nNp77ZEllVcknslFi9FA3MoPv!|(T;oUTJ?tYuJ%LgbR=sjQDVqu*8k*gC8HT@^ zNJ#Y4#3;GPXm~EFg!Ye5{`;4rTxgAaV`F1Zn2(urtE+Q5x28fgOqK}m!`gnXB&}l< zek?50%%4aJMi1?;InRd8ZhX(z_*h@-vJ!pQ^Ua%5l-;PzPT0GJ;}_wdhwxWJsoaQi z11tu-1?VVZUpkI|LsU+7j}N26@+-FVh(tZlTE*EA!T zjQ;NEpQgwAWm+NaimEpCc6<19D1&uM=Mnn*U?>mfl})Pi0~?xZG+7d@Qs~#O+f?{Y z+;u|x-+#h1jR$H=jFLIO{Ff>JS9`r~XrmLWw|7DLwHU*1)@PMhKCThuNe**OLNIm|NeF0nTs6aX^JSpeWy2ub3ahl3AfkSR7>zCoV+w|LTp=wP5+zW{A&~- zQ)DCNE7EaR=rYDX^b%+$O&K{vGyf@@jm1Ac5Fe2gfeKFn`;UYDKfg?4fIsaq_woDx z$J1UiCu087G60{6zD2{YhCchW*7e^e`LA|EG&xEB%QF1kGtXQwt91#(WN-8zw%Y$? zXVoA0|LdOo>kr>j=&tI&E&f9HkLw4RhV_u`e>IT5dX_8R*x8n=%c1mtb>a{EX*FZ> zPy68CzxKxWb7b(_CZm+UNB!SczEg7KzkT%gRR4GkEO(w)pCG{>`tt8<8yWl^>EAo? zhedt$4Dlti>cb=__CN2H|J_}{z)=79fBrnV|Gya6$Mt7u@7}$eU8PsiG&auefmt8R zmO@DWY1lRth*O`&$0jCz9j>%judS_Bvp$4L@56PYh-Zc)`>TKcC>r1Bx=7bbI>L?xw< zRYbRH_2rERAGf9ilaP>T>xDpXdV4}8|H(i_(Jp9)*u5mk3D@6#q3dibE=`i>VEe~K zTth}iRO4bv#bQ^A2)6Mmg%bbcf_eh|j|^^M>R_t-r-Ar2f`L7^3`Q_%`h$J_+kS1q z0L<23BTU2jAKjiO1$^64AP#%|^Jx5t0L#U!B(6O9=MX311B^lfIrE{xzi*A-Tn&f^ z@Q%dhKz=3HKTe__8hjLJ(&+7fZ^u8nH+*xzLGsR8&kp}Tf&n&s6xb2CA;0zL-)EC` z7VubBRj{h8iGOaE5^4w(i<<}RVi(Um6Q6x)nkCoU)JoO1LD~|K-P#d7pDq7onbhs%HP6S<=auu$+tu>4D)q)Td>YurwO3 z{vHkMEH)5R9%Fp4uyEj+cl@@0!pY5Dqrg3t8T4w+jOEgGUJDRF?g2Txha@fftNI!m zNdS@5BlubX;0p#qG~ZiVj=fd8l%E2KnYpzj3t=Ur!5NE&-G0GidDK1Af}e3S9{0EF z&!bT4s+WTpX94(hb!&TjF5KhBpb~gcf3y=@_Qu^T;vPUaYy%m5MpDVwSuAc{SZnKX zRUL=a3j_SykaOV4S66%4BDXoFA3p{qyRMzbj{C>)q&mgDed@WC*znBr&G!{x9v0@T zdzj`=xAKZoWSQB!t^lH_S|*y-$>DfFq+y?jmQJPTQC{zdzSI5`=Pi1vIE764R#e@nJ`SbSVcqX~OCC z2^zkx{?HfXIPer`J_h=Kjo#+X83z8BrLPT0UMjxcRm`$ys3xX>PW-(?JAtud#tx7+ z?{G5*kWE0saF~q;0GeI9mArx85@ULk$upzKEEA^8jQyWovIar!wJzZi0YICz?~2J= z+Kx*PD*;oz%q}P>fG>{?na52DU9um;HdNIOU>1IDj${jkRoRf%UI8v%pYv{9(uR z*g3^`a#7Q!tdxkn=skqvL%ohKc?VVy^(-n81;+MZ-N z0fPLKQ)oi%%|yc;EbiS$`g30v*YttVIebKKFA2bcJ3@kt=jtMXy;XI<=RouG*wtf7O{!#4XZfUN=5; zLS<9KOpnLy*G)Z~BfC5B-vjW%lNS`%)v;y%wAZi1%*mJdC#!nR?`O;^lP9cD1R3*- zy@=TKTX*i>OD;*+lR9sthuy}JjXuUG^=xeS7k4spI0lSmHc z5wJLoem8)sIg3^=XKJemxyT<@HgWslbgT}0W4A!keN(`U($a#rJK=iVw+;}HT9xgD zrd2>qfsV?$lV{98oqz`G2h@AD$BKZ{_Lp^K$oV?cftmVP`V9Mj9Hi$IJjm4zqC{B$ z!n!>qm!s9LJNGY!aRkby3D)@~-Bu%bLwq}au>4Q0p)sXvE&vB6*wwA;-=ZljM<8II z@9miPVy#_}vfqYZ5B0Knp%!8jwKuTI3%oY=p6Pw;TUDzr8tYNA&e=Dl4L2~BYua zs|>3Zjb!Fv&XQ&x^3Z>Wd>$Gmwj-awO2M0R(Ve32<9kZ>UX*PqQ_}|)azpblzY~v@ zCM6S(F;%}+1zI0wheOxxMNe{pC2}+9u*3H=5o2P6|8VCNFJA^JuIs{Q0fa2AQ=G8O zCpUYk;O^xjtwhZ1Bqy9k2k0M9&LeUmkFdmrYXMGL_#Q1Ufz;P>#ln|$*|gDT|L7KK zjHp-wP!gzCt3e`h)&&4Dd7JMX?cROaSE&PJUo(&)+L4(W9$r2s7Z&xgePuM6{R|-$fTE|@1@^sSf?U|^^)+BYYby$XJ*euj42@SiBXee)TX&_N zTUa?usAm!DQYcMjHZi8c$3-V>UBwUpRI zS9BAs)5p+}up!jPS5MdFs&6rtzxYwOv=3vxia#h&zAfV|fQ^ckTw5y58_;WQo_pPU z7Mj2q#*tX5L#ah4M! zudBOE3bRwitgC0sdTM{|%_Z-~Vp`x0DHnPRPVYrY30JoZe--X8eg^U=$4n9F#@R$O zRVt^9l1@i3Z`jE%=Jws!1#l00;5@YZKr-uKHq|wtucx(N<~bGtIN)0jLbo%W+SMpI z*&01>Oa4yVjVTMzl%7Ay&C-J<))3wY{QV-=Qv-qsV3BNZ2cYKzPb_8!yY2uL___eW z&G(VkCT@@;1q&wsMp{Ok_}8ESNNFdf`>P!f>N^AQll(|>kbX0k*XQW(6mO%NNhNJ( z;pva=?&RmiPd;CGi@xVOgCoV64kDk0f!YzqB{8*2eneM_v^V3G^)T*9U2pXpKh#gn z?m+T|f9jnxkk-e42S#I1^rlgu&^$T=#46`b=zC%tC(-K=stylw-WHd_2~C^OYe0E2 zC^fq5SNF9Or{3yp%6LFrehAOyG{?0aRN(t?!&Fi9hDOENY|VmOJhA= z9S>9kXhr+hQmKaiEGbJTGu(pOw;!@;P~3T~b9WSbhU~_m8xuw!VJR3gQ~PQ@LG$rumbUO(g25~>dw5Ea_N9^j;q|8O2=0{nmk^#g z+i0D+Vt}#e2+ym*!ujs_-Hf(SMsN5M@VV!1-m3!Blv`g}1G`*~sLGS&U%nDa0m^&a zZb@H-MkL3c@HAH%fHr#$h?d!LSq;bz-O7=P^P`nzNSia*HnCA1dn5%Ez;U zcDX2~(<%j8Xcm4j-b{_$FG(ZXI0KGZn=+EX0rVDO`32dRU9G6gcM1z}7V#srqUM;K z^#Ru^;PCZS5BHBEMEZw7wyBlQeJXEEp3WgM`Q6``njaqG)Kcv1T~5}w7MWzQb?;-! z-qxd}22tK&t27+npURNlqoK<*G2?@zr#E8!eqmBov~zE-lJ+UBI$&h?7g9rt!rrF* z-c8OZ4WRz$R{h!6h7~D_t^pj$%$=gmy5ISya;W8f5S+;|zHBOO>n>x?BGNw@*x}$^ zEKcIo$M!(;=MlASN2FcSST!Lm32@<;&P4BNg6gA>c=Bhlg<0V*37?TQ!+sHSW8(x@ z`LAA{7J2LzRxJm;(Z}YwkPP<{X8(~P5fUL1F>dnYtZsD_JQu=nN?c>P+yMwy8$c(c{ZYM@scbKTze~(D zUm)f>0oqE|icU>}G;^`)xJ+<_-~f|lo9nn2y=tDmX3a38(hq z8%NyivP5?AJGKahmyjcpEtF196y_4p%gW~W4_CDSPd}r7^|W4&Pi)y1uSdr+KXYD; zWkmvivWQC|!SV5_Wbs|-O3UgSNDQnBvdB#vK+mZ6gzAiEP$;hSD>UgPWEn4ynl@M5 zjqD`Cq08CJSPWue6m>qf+Gkcdw{}dUPWRBYTAVebvZVFYG0RM32}J90s3f42N=d*n z|1e$HsFY4RYghCDPbcTzYYd-J5Maz2PV2r4S8e6yUAga9%$U2KN=mbslg|eI`~sw# zdD3k}wd$kA)L`ZHG@+d$WGY5bTlLy(;a%}r5s}W?WHGIjZ@w2I+L8*8neVt&Zq@{Z z7L0oqKKt$XPwY#C$=w3VuZoBHpS#90*5I5gEIV`o7ER}|DG_(EcZn_E)Vz7WY&imJ14++Z#FTCZ&$j>%HN;5?)*G)$U_}bHqd{s02>Y~sflPm~ZXiE$r!Hz9?2%tuyyh+4Op;7F98r!L z(x9GCg|knCTHofA#bkRzz}wOD7S2Ui0*?0z76%oJOwqlR=}6%u2MgJztr+ffS+IH6 z06x))k&NF3l+q$f#*Sr8Yx_OQUG8??e#UIBoycNmBL=0^?Dllx+=bwYuoIz!vIKN# z2CfM>4~G$$ppO@AkR2MXr5b~!p+;#Ey1ru_z|CiGB_u`sgnX5Q+7QClC8sG1dw6H* z0i>Q?kT)Wuhb^M+Y`iF=&L1UBoVQsPIie>eXXAa}PA1ghjFf>#NhIgrga*9>Qhc}2 z5tG*jLEW+!m@s1EP0o8j^d#H&4gBEl4A3GJrN%ru2xJN}Fr`FW5gqmBO1AG-uDyZy z^!!ZN>oBik`OcDw&@=f8MTXJJ(DH!{GM_Ao_xvo72WXyTRw08jcm6Aiy;+xiLjWPI z0~A6~j2!%Wxm8&&U%t3l0*EOfFGOr`>JyB}Zc&WV5Nic3zn>4s1=095gDw=-EVxcF zVKMxHoZr@=CcaHc;XZf2?(eQ!3TEC%D_rfhDE#nl*&kdxAaVs1p;D>1Cq%)TC@vdz zG>F(@?#NBKu~#Y1cqDp@{p8X1&kN=s-$kkQBsHyL^rTRr4te+SEX>}Q#Kd=rY|W-! zM-Xp#Oe?oVu)r#An{GuX^e=-O7>jC$E0rifTP+0@)7|F+37Rj|)P=ybnEtsWXl6Ke zkkiFEhlSl4`(2$da=hs-A`{ft+&~mF>qcBmj>SJ3ta#zuo<3o z)WE>OyHbBzx2dXLeKDC^lI7P5L=qRUibtz<)dr}v#UE6_wq7-9Lg%0g0w{+is985I3C0q=gTq1gL$Q-Ae^ZD6(;`m97PQSx>q>t>@s z$ctCjxG`bENC^Dxt5|WF5F7c&dabMY`|97lB;Vr46sr+?$Tag3s7_n(8{D+TrDS^d zPl=WSD%w+QTRo2&(LMG-G?LfN2sXuNa!Fq<7l7IzwMn0eE}N9?0)FVKf7X$nPjlEw zMLK*VOMWqEhfIQoYkh+vkk82Y?1-!A%8g!%AHL1haL?XE zH}p3njClVp2X)fOvk4Ii3W4CC(8&bK_Mjo_C9p32ijmyvCWjuvC7Sbz-o{`MSWlM= zf6j}VhNM+Q`0bYq3DR~udc!Bpkp4<=!$o3TLv2y{eELm>Mg;ao#|!mm?RK~|el&E= zi+1GVh;zCNHRNzHb1J3;Z^<)pu4Yv-F$Wm|+yVruX)fAGa#a1E3F~?TCzT&MDA7EN z14lAPzLs9B)vfGy6;`6*#V`EI!{?AIV}bp#0N)?z^w=7aV%lw}PhaDSat@KcR`jnS zNoznpbnjuRyeOXf?p2CCO;|5e_a*;W+_~xN8M(Z?a*-(FYen#lx7!bk1Zdcd-j#h! z_A5W}DwyV!qVFBLxZpoB-il)3{iyYdAk|p})je#=7sD2+{26A}<|JknqWn1A8EL z42E%88)!>!r`z95)5dVvf8M~r?O4TfTh@(~Cf>Z}C<%o@%!u4VIfsiA+#f=AKK^C? zg4p=uJsA>l{s;`os)TAjC<&OK20EBXuE1YL}e8wG8jqqe<|?tBL2f)IE?% zq1rGhwtS@5KJEp@1yS41x9Enbd*rhlkPvrzOuL*xFsSiOTDHjPGu?_?DPcU|OP>K! zt8`-jeNVMdOW41#%$uJvHon)^y~RJmS7sz|mxrJ_P}E-VM*zNk(a($;@Z@@%Bz8nr%rtFV!NO?TvJoco5v;VJ(x(A=2aX_`w4s+goIAxyn=9Z&G%f#E{H;7s%~g&5-+Hk=0Kt`JPzNV;8r#2ZNoJV?js6hn&u zD%Io^x$8Hqmfy)puK)_~>2)4K@0dr3e1yHekFWo(1rX470D8g{vtWs_-(4r(?Uz-m z+maHH)vS-m#&jQix*2uYD9*-b6-rdEW#U0az^$6<2?gy3n34}Sa}-LvMtyr!cQNB# zZR}MXLppdKPDgNw>-MFJjI>)cKq|`&bjM(Zv+S<%E(wi-q}!s_PBegOB7zxB{|b0J zhkV2E?DSt$l_&hpT%ie?3W4Ey!Q?hT#Xi)WjZIq9KcVZzqwK-umMGVd0vxe~)^JQ6 z@?-HU=saPZffz44dZ-}=2};~1vV&DEKI?&+d@(oZ8WFc_wwYyI5X=g)9+7SZ3m-PW z!#W3%lh<`)7Y7JHOUTZMAG^?IVU!wFO1Oplni3WsI*?Ou+>~_CIL1AJBq3UXSwg={ z;Gfk|hkE)zp5dy}f}TwA66;-F0tob0ymJ|{;NIdN(EeH0S8P z>R&yH8%>TmOgE`Y%Y&fPEG(B|)2c1+tJ+vNaa`2OR6HD&k?(&krOOwiYCdw5J6s{c6tY^T zd`U!WaOnNkmYt-lcyNSVVhl6w7<$V#73gz^aT{GOlYellueSAY_;vmQ_&Rt5M}%x6 z#Y{n5sN08=5l6O5_b9eJMrHlY@WS(F69>%NLf9#Nh5P{rBlURo0+XhR%&&@u&(e`* z)fizFY^w$|X5xH@fjumCn9c;~n~&o{1(jy9D>ZL}T7J6x4X${Ko))ZVhGAhqd- z#lPT4kZa*(`gDe&|B65wyZfO__o0-wl{2NYcd=`<3eJcRY%U@gB7ns%5GW}<$@&2a zi@)CFN&MV}u)W3(-ys$?<|=`zlU@;I>#?FAmU4HEJ^37#UW^M<94hQe$tGU)W%DA* zxl9HhCY8*%pF`}1>VbEd*lJX27A>RKwKcHLcnxEt0ufJQBy1_Q2^FRuo#L76_xw;k z%&di%-92%EDO(&%%{7w6i9>V!aFXfIBVZ<{0(Pvpnq8%@w`O8%%W4T+=Y2}O9tvHr z<7xxgsXipAx^{ZP6K)Q{yp83Vw4~>b8E3aX( zSKAf31VgGX6|>y(Rvq&CCcuhZx1o!b!`nN#-a&2NkCgLGgB3p0+`g_L&-JGHbmVrE zR2oqD3MF?a_TzMd?6ePWVcXuy5z&=%+w8Q>|19Xg6d^>rgg^z$P1>LrK_Kji`)Kgdl88QX4yd(Go50pH1%Y!TzDe z>hsZ00|=!T65h9b41|qVz029gP%d_|Rj z#Zp>{%X^m>w6{_V!eNo&$#PfA(4hFL8`~2#=b7*7mFfvBu>9rC$z03a(dldaV?`5P0Fz4Ju*}#ofQ_thh4(4PF<9NIW zhz{DVpU=01mdf5qJRcOcDP_APohXT2Rrz@*3$ys)5g^6K|7?OJw$+WiG9pMX&u=kK zSdMSzGxB-r8ker5dO@bJbg;qCOIhgH8PD+Y>;AH-x2VsqxmVST6Is@1-7({u8p+*- zN6)=Y47$y5x&v)A-8b`mWJWj}PSkU!*r}KxE=GSJ62SNstCS?#0Z;N3nq`W1w#5zP zi~~lHHb-qN5w6dN*xt8Wo5xhG#87K*K=qcI$&g4evveP^H!EwP^moA=P4HQ%g4>9r zUJ{~+*j@!-C2v1d(_|Ce`&BxjLylX5+g8KAH{0sHA*}Rl7Wv5!M3%BKdJ|t(46m^# zBwgeP!3P3PhE#5ylF0fv zwLX2|d8eF)tY)_b&3-X2nstH`tawOib=?S3B>$V%3 zR8$h9SB*_fSrrV@S4`^;Xd?C+=Gw|wF;UjG==ZBCjd-)D0{AS?=;krL&!>}8VGXiK z6XbJx`!YDI_aC*szj^+PxV{aZakj4Hf_W)U(wAZ~>KmbyMa@h!7SU{?r!fywnE!0x ziYP>V0_Z#DcqZ3xb!UFPQi}}tQ40gbG+1f9QWPTmMV4#-nOA@J%Z+dx^u%zZqfbU$ zNYv%=<)dnqph0@N`LR{TCCrM3*NU@I=0;K^F*h%7lCE%FyJ>z7QEbgjF#*dNpiyns zEV>!cvjW`o1sBB(kbI5z{}w%X;(O}JF(V?rr)YgfBE;_jb<^X*b=WEa(L2a!fId~9 z!$71cD}H^WE!K>~>RY3_itk{pCIMr*)uP5##Man7-25gH53+5$#ZQV0*5{IiqKe@;vWoWeIHYBl$Mdg7mw$&Zj}tGO z1?6Kdv_73Dk786 zr4|!nIdL7MBP~2*?1?SEJyb*KUYI<3wEd2@O14cv-2r^3JA*KN$oi-o0U|GooN-or z+;3B^7CXMrhEleYa#r_d;rV5s^)c5}xU3(}J?SS8D$Kmu>#5hMu~*#DuGbrjxqLDx zGwswP%I0;^-z7@wi}eG|g#HFbL7wU2x|6B6eGih|);5ScdQdk(qWEH77(bD{ye&6B zWXtfG>w7>kP@)(F>9o>Y`Zzkj4-Of(I6`!n_mMqp`=by^cNotBI%s|$HSPp2?u7w8 z9+vR3<+8#u-z(bCh!uf0AN6xfFGDsSLDUgPvhRy=BWg%5!9B2dr$ZDXK*q!zK#ngs z;Dhwq<3v3N(H9ub6I5pQUCaqrS@bAaEO=4VvrUq)>%BBE~;>NU93aQq*rJPw}*jP#*u; zq~I#);BCl!eXsYr{lQv<1mUk#Z@(WKC2U%H%FF#`s&q$6%&giKrJFuS<6 zUmbN<48lS)_N!353)`{L5zOuDy z_z8tBIkDFQBmwG{1+qh|rm+;so38Wqr#3XaZ8kG)F29k7+<`IC^%)UUuzB2Z zxZk5D)dR`Qd-GZ)_p+Od0Mxl2Z>bVTpjoO!GeexFwD`D$n12qs9MvvM6Y;|KjG!~4 zg{`TVJgAfi?S}Wp(^kY@U{ENN#3ZekV^RX7~*2sVd*4oKE1Q0#Q=yA5Uv!lEkzcUl@D{|9~}>`)%0%v%9$U(eY;_%!8qI zrw`%9Cs??(@K+Tqa3g?IM*Sszs+rQyHm?#nb!Ia8D3-boqxg0)O@Fw;MB4S2uP@zw zSOtXPt&!Luog4G#S438huz4&)k~e!i>(mZ_g^!g#f`yPkBfZ8bn_p14v7Ll)M{|3! zJ#aIRJMs@K<9nnO9Q;4JtVSTWte6gOQ=SS0+I-L|E=5pEP7gvsp|Y)_pxY3n1e4uR zL?Arr zZs920Ab4R*gBXZ9gxutlc5LFpRr)D0TKMv1i2C!?3npBLd9jU>1qvTL_hMVV^I03G zF{S4tRp>7$SiI{`Y!WU!UAmEaA|9n$tLEoNW`k@?CLbw>?X7Stx*R0cdJO?o^jet6 zouiUC4jIaY37r&&^kU3D)T{p}KZ+f3r~|nTgJ*Wp+xx>kjKzZhb$7pH*=G@5ImcY= z2?`~Xx}rqFl5D-Gt&iuEIG!5{P$wW%>MT8SC_YtWCv_E(=e8u1V{`M40bOb5e+Bm| z3hcg#vJ7o#6Ed50Xtbr6 ziqWz&ci?v2<9IholT-?k2z@gYGrm>*tlbB8Pgfaz-a+JNeRpZdo4(AVHT$4DigzoA z{kYGevQmT8HSGh)o*}LWn0*xqkrqlfj29r|EPV?VUtn=>cPkD3mXB*{yezDRMyF`} zL#|n%(0kLORj)&@{oG_>_4d`c7|fN$UZuMj&zg4G~|EyL>b93ulqM)`H( z*%X^t;sHWf-aZ8T2T6(_BZ{dBP0Jlc;tx_7tw27{4k2e+XdolG=mcz(vI3~0UbS~- zwI29^XE|KebVPa{LDhuVj5>Tx7Kbc`4?%8HlJ|+)OQTz5oBWy$@7YKBJ2{5}*e+?_8?(-zCX3{MxNZ zqMKP}$DZ}6GSEXUyulndy1{e`y;kP$bh#;+P$i73HQprl7KT{p(`O5=2!nTl$mjx5 zA)mv?r-W?@o3B)LICuVnPBNYWbwUsP@jk07H-^eQKC_aO{b}f9`GW)cm~>kaE!8nC z4_;qchhRx7tH#%t!75YpH5rH+6hrPF?ZpN0ZnK74ALc^)M}b0ga{l3??@-st3dFn* zn5Hr~N47vlu$_-aj_97K^HatKXm44OLFa_N^9Lu6a=_btPc|n$N~}PT8KFv1n?74X zCHQprglrmp%e%ZPedYSYOhDCLP9_O?7+a*+oZLH$noU}5CyJdaw?&Hav2-kPq7X@3 zWk}tf;c~+(l;sYqFA5bc<)(*07y+%TxJWU-s?2r0I24x8zPP_igmG8_m@rzf>+^AY zKZ~XB(|0fV@cmlOqwo)J({sJW-&Mt3Y3~%yUgO_$3I(*tY+rlt`#i#_Eqh=6<6l;| z_zM=oQXG^eKdhsO18_8sgBr~w(hbASCB}b+`4)7~5dKeXJk?2Z#g3A4ih#IH%bq## zu=j%>61$_gF^zB+Qx)*y1ofL@`N*sikRXMex~hB!v2y;`7G!cxiZ>GeV7Z#|tN_Tl zCu@2ccEIa=8g(OoU$NpE&|z57j%R0-z-TC@+{WiN^JSOLhxzddhem;{-ofR(4@IE* zq(F({lo)dJ2>I4f!~NQCID|NzO*(vP%K-XKc5N6BdV*Mue{+;lWt~WNh;q(J$yCK+ zPeVp7(J2s+Wqni#g?c-MVY0DOrFL0J*F`LNKf-HR3?O}|mB*yrC) zW~x;hSW4{+wI4iDNVyl+v+>_Fh&vkt*FoT67d8umdX6U3+Y)iUT`v~Ucng-%fhsrvvTzz0Q z^HBE4?b5N0x$<|U8WlnMsRb)Xim)AJ+4w-C;YvMnVshIa6kP)*-dLbM4lnmPb0c?M z=0%-L3(M-oe1@B9=wZNW_bQ}s)=|fdNJSy()u)|^R;Cby4+8W9ZS4V?OPXwrg zQa^%-pr+`&k?AkNuHVySz5EE*HUiBXkS8)`7Q7*L6nVNp&qIcil;U~wP2#2x)AQhw z%lo%D?unS+eZB4UhsD|Yw5kW1Nk8`z0HL^n5}O0NBAleNYRH-y&%4t& zw7s;#8q%Lrjjh5&Yb0wY-;*|d{Px5XdEJ7QJ;B+SbwS~ZhBS7~ggr#RA&-eDj_2VE zW2t%28|EMw%|I8P4=aP&bzR5&eQux5bc6Nu$%O`Nlw|a0*7O{2E#H#xE_p4lcGnrD zyV{mJYt3th*@4oA*JdPd7=&zketn!t__&p9-2*euLAQ~sR~P*2UfeB_R*YFCSh>~> zPI%~P2~-^QYePW<1Nu8TgAHmREzAZTal>L#Bmd1;E7ZsU)F9Jq3e z9olBJHkgQUJT{8jydPCa$3 zp6Ez@7mTdSGGo8Sub&^hP%F;xz0miNj%)gMk0v+AJL@AvudeM=oR3yIXS>ky`pjcV z6urV8P^|Och*9A-i(8o4^3S2Xeyqk&wquYkP(9J8Tum;}3^?Bib8z?He zB|!6q#uOY-A{tbpM*jXfJN^2wQf_Vl!_Y^ie=0nLrm3q=K`yIrzRw*QPO#B|96tdFpx;Vh7nu6N^pJizvz1Jf42Yd?fcWET5T0YQB@SJ*_y4DT2-}L zdxfgKV#W&58b#GArDlrO7F!Ub_TC~DBQ;YZLhOX(a^KhWeLU{#hx-qB|N4HN=W!m# z^H7G@oboNy!4!F8uIG?p>vnda7?UN{&N{qI^aYEQZ_D$v_sMwB#L!jCIN(tq5$Vz{ zKkV=_!MlE_e05=3w6WNYJShl2*yaMBx#Alw&h%c73Gp7`$N^}q4 zmQcoVn%eZOA?2-#wz*8E9+!UBrWi6d_ey~Nl9U$24Go{Djs(>CW=0N8%k_sA;WJ3F zL(?dBsw@8bk`Q2<1g9*>0YSZfrigu<6*{Z38KaTzHCxyj+i|ijjy}N_0nczIz8SrO zJc&9Ut!|L5`{~3jFI~LH`Y|xZYZ2TkKw}WgC5v?qKDz%3M81PQ80CV4c7FjI%&`V7 zbN8EuWZ?B5m*@U2+@VNd7oP8B`KVhU7XxQeUu?!5`o0(jFYee*i&w>jrH>u$zaQt) zzc`B9*V|<>QSlL*I^b$?RAwMHuFuV-ink7>F2bedLQBJm-ZFN*eT#96Dbae{QnQ@t zhW8!S&3^UpqU8%dd`r{;{SN$F?lh@Ml2Q#q&r?DVuMh7pjtQ`@p5-doCxY($ejm{nTn1kw@wDQ6^p!ST*~}+VqV+9q&ky?GzuHFQwDykyT!pHT3mKO2tjQ6=)Yz@FOnhhk_{gn< z7=~H{oc;!f(b(Z858sVZJev~2087o*RD|1cC!M%LaQW0r2XQ%YO<6{mE!rPD0w=Vj zX!s@gA1H*(ttkg#QQ}S6{ndh|?W9aN;p3bY4lCge&I(%qFZz8OiurI3Ud98D<|>hy z-g^qTfu5F#8_i8z3^))8UDPFyu7l=-Xm_fgjp!=uy-J7455ylYNS?>1*~#Af!|W{YJ(v}GDVXsH&YI~Sg#a_6r%plqx{0n7l+>RB_u8q zFtnifp)Z^(!PbxoyO|c^5*&JB3~a0KskaJi3NukqX~c7l*v!7QHzi(><mebj=vhJ46^>lD; zF|cP1`~BahKW6BlWv7m7ccB1?E~9}%0(!>|eeJ|snqG)s=OVSK*n<;ew#(a4Cxc-g=e6v)W@cC0eV4blW^#Rt(mHtx}RdH|%~2M+L3f*hNh`;oK)#5wa%6?3s^lV$+>%-T2 z(G|&~P&%SNrp!?p{{pc;V?zoqaS(X80BX_Nx(|L_ij;|ak%lwMJJ92Mdg1R->ZFX& zXV{Os0y>{{nunR4HY85^)OBW|st;BZH#?fI4Mhu`RT}F^?`NfM@K|iv7>AVkeK_>j zQ+;cCr$X^Zq^vIpbzH5 z5`Cu%734}M9MUuYl6XQ^U1zM&EX?LNfBW#=_pNMO4i;?t+q~U4(4=Snb7TL{eY!5b zuNGs^N5Ko=xL4iLR!43=d&6CDN|R>G6~0ybv(Ijg{^mRNRBSAt;Cn$LFC| zYQ8TYcvIuy(^tes(}&n8{pWIysayf;D9*nCJV^!&x1RZKb~NEF^yIz%e@%yMrnI%n!1r_jZZvHo{`rclY1tFZ=rfDRS$bM4CW<|v zLe84dtns@6d%}o58CJ{v08VjeJ>I%R4LB>DLmuwwfz3}w;@nj*+f4)DdEbaKRu^dk z0^kco1Gh=p({u7YGN4){efwKJo%I0jLH7Ria{7h&XwPO&CP^@#)Ex0EmUU+5p&J@V zn?%qytKmRz-6kS4hlsWc)8!-`0(NEYD} z+M7n(t=5})kXVN_YwO5#lD@q$vY(rj7lc$&OqM-cjffmzgP(0;k@xA7f0^9A21yqZ z%9O>-=qmUzqW6xw_%dLAH_18dE~q@kk+^?l8CBW+8s^ELpNxi)l854Uz)2E(pLs{* zBW+(keA~xz6!g`V{L86nW@yw$@9r~m^g+K3T1l??(@22VLd}aF*GfXK2oO5h2iLxA zw!IJwhwgC$6X}abarX~`ro`OlXYdlJT3qVOWbdPe&6*+jzh+nq78SQT8cNC&Qjy<> zuc0+X;HFIp3bbw7CVI9z#r`&b?tkPl!`v$O6wpC`@EyLkEJ^-W&)XTZP`nKg-_#d( zH*`Mz3Vqg$$e1_x`9HdO$O^|FK%b>)r?N3XYEwvf2};1TCl3A*>;JTxVS@z@q*>P}HRjVEbpm|I}qw zWD(Z>g+lwm%GBQ@&(5CU)@{0FJgUBxvA?B%j>$hFn4ZD#%mWL1>)MNxtcYWerbE7T zmfdT4bHDcMuv9s8o4!Qu7IXAkkhZNLTj80# zXS$(zx93n#yH5o!XKDVcaP4bnJr)iRr!%Xn^^mrGMM@+d3RJHfG(#-bWBqet-l85O zY;dH4K9NxoNZC?zk6@$8M(EKT3wO8Qm}Mn$W-8I=xvt`~T&c0q6`a=WJ~#mIBM7GuXpQsr)Ln$~85m}{kdksfFswLchkZT=qkv;{ z96O8r^E5P!+HnI;{rfXWkm$5|@YR#C)vJHJ6QT8hkfJi6tGV2nKJFyA$&lryUZfWx zJnqr0Vdnvi)n&01pqW5G>6W96mdx28w&|11jIR`RS5yD86Q{<`=khG?5!y*?iulsA z19t4&oVu1yi(y^lzRt$#-Qk(bAUmX}d_*Q$YV9`4cv4HS z<@-;Ubht`CqAX#cRMEfe3(D1}z>r`XFF04|M!MkBZU`;Oays3*=9J-=DnW`xK)7AjVSWTIWyev(JNS_1COZ7faZ)*Igg$2Vnm? zW}o?<7&fcFG@QZ6xTxGEe0Iyi)CDts!jl&e)ct&GS{bYWt|Iljpe!lS_W!qn;H3V6nQHd8(~OTqR6o z*X4h9*H0`LVb?tmI4-(E#7!=?$$uh@DQ#OwJVUKn-+s%k?FmRo(D3hJb@+IgIlLu* zU3@wZZjRHgQHRVlZTOi$ln(vtDB&6UCeLfW47MJAjyX4UJ#{~s42I*Xqu10Es{K0j zO=u+%|DqVe4nDuArTdz5+tECoRV5j+w$|pglMaMFH$`r*!>!r;z;O~Qh4)%QKRUlr ztQ8R@`p{A!ojkMuByU`{A4r8MqT;E5o2wdRzrkklf(tIxoYndYYO0d$SEEn{IBe!W0j?vpl&-sBtUj zoz!1?3?j5ElziaDf()D*fkWrzy}dF--^Mc3-{=m#EV^DG!`+&3-x5l+6W6pusD!NW?t85`@eFR?v+R(7=Z^!TE`hkzlSy z&SbC>v1PlL+ZWDbujcpe=IkLlE;8$MQ1ao?=O@LL;Ce0(0n(ws#;o>WnE8@x5@v5a zbaM9qIL6P&wr>|XIX=13bv3K^QXpo*loPoxb2_gz1nvAeu0G;H9fzn zu+x!?hXlUebcD323r9)7#R#};gO zNPf+`Q1iEZ&PS6e6Y>0LSDLAhvqi)P7+romV{UqRmurz+2aTxsg=8n6b_O?l!_9PmAndCF>pIhhNt;G&J(<=DPwC#M)@%|BmdL? zxE8IbaO`aULVP>+6Cv9e}t@ZUZsoc=K5j97OWk^-IAhQajkMe_cXJQ zucDzVtfiN1j6zJjl^6kU9)%t7g*@VqZSs;{&** z*^Hzd=Y%QhUo*)!W}kuA=asQ9&F?K*LO)m|hp#UVHc>z*-PgqaDe?W80#V({Z@+wx z;>KbkGyY;EZoe(BNy+dm=L$Lvf&*Cu>aVvOu7;fn+JHy6K!n2FGlnILqS)K!UtzxC zWmpH8>H>e~ueYG@ksFOh>cv%+*wC={n^$LA#P}E$G=$M%V2R|lni*90#mgggEN#S> zJOR0g@Cv4gYdA0 z{w{rX^Vy|}k!lNf)K9Y&_O`8|?He21@}KLy%G%74m~^Aw`@SoqGd~mi|K@7(Ak$Xb zh&3?F2^n`p5zKF(b+R(CrfVZj#L- zVwzt(%x0{9K}5tm`MVe{XBpoHGG|PDvoKjApXc~dgCWJV^QzmjiLSbe4ywF9c`$V| z>ImyM0^upGP&Z*+I+obTcxBap_nRDMruk4Ew=E*sZJ*W)_Vlc z1%IU5f08vZ7}X;BJBv|Cd@VTF2wL%rir&+2?j?Ty zkftn62uR)EdSHs^$_3pi<8qEur&GP#0HAzFWI8NY8H0ZqX31`s10dQ~f^U>QWxgp! z4Su)a7!Y7%N@CWeHAvkIWAF-O%ZmO>(Q@^8V*C$@5r|EWXUynL}<^!RotyCAgS3 zO5m>@=9)^sEg}E3Cg^s_b5UZogx-gBA3{#F9LaJ?XSa6`N((Z&Km68=mO6+BO+z)C zIWk{y)l-hQm2;6d9$%iIO1%zx^Rae}H7Pdy100Xom#!bne~#->^?3BDgIh*!qVl-?PKT?;hVY zK0xXBNByY;N^vNgO1V}sN4xT1JbA^?Ern>o3iUTwDL9(GnVp<{xX{lS(Xeh8hOhW2PbKbmK7e%~`r*pgus6`3tW|%E zsrX4@opH)c-h3a2yP7Apf5$($4aK)DeNby4g>?Qk1K&ziqX%-Njyn$a{soO7zzSC|jp}t?Z8%tV;xXZf#4y*kC~J z_&Yv3?akSTbUzOB%CXp<1G8MZY@S~JApfS%eMv4k`k+pwF;%O;`-{F~zJuC1et^{Y zehM=hSlT7v`OJ50%6uo7yxWpHn3JelRhq%4}*w1g(?;fMO z{NviEVKei*`eIP{4~Yx31oVD{7vSx0-zAyD$+?Bp zGX&{Cd@T=@rDRn^w+L4|c;cYdfrf&el2-!Q1n>UlYPUMT#BJA>x%`J1#MCgS{F>pW z-7yK)TJ+{t7?kOk&#rj<`)TboGvDh5l6^RKb7{BF=wv3=Y*KDwLvR6sSN_L4##ch? zg$@GD2L{3=j)*uQVMd`bm!`<8YN1{!_^xJ%foNI}AjoHCCu^8*JD^UK-LJHNCmDBZ zM5N8CiLa`^sQ&f>`c+WQ88Xcluc$|Osh=+N*8+4BSN=wS0;$JT*SX}u^uDGgGGutr z=ayuJ+QZj-jC%VKKvCh=E36S`*fMJuleY4jLOYS`4Y*>RPysj@E9%k?R{Eh5~eXETI-q$CS=&tz6A2~Rn9fO=Q1jV9nCOz3&+RF&2z|? zJszJ#Wg**0%jQza>Mhb>oQ3V4ryOZtyM8UYVgL38Y`&P>_(4M))V$wN*R1JjY7U(o z*)(jw`**4xqgRuhjmf=Vwfqh}LI&k8(?~$Rhmtjzv6#Egn6nq2whO^E^nreMI<;Kj zO@W&Jwh@__I!DVpPddoe{sRs`p|o`VzCl&0czW0#ck&=5X1<$j{cOk}Y=0MrbkT&W zU3iSuXjsR-dH!(zfiTZBi!Nla`H(!MIPuKDGVwSxw%#EBEI_Dv0%wgwyx;hWD#@A< zyuzvl?OlUgs%u2_@0Y*&<>GX2Nz4ifPp?1Ck89-A6}Q!TZIyAOUq3|6L6@Sgjdn$2 z%$m=t7bUi6n;NCV&vq%3S3Cr&{)K~11p-_w*_ph2t`_RJ{t$8JiFm^F%!0*8M+e-# z`&Ce=GC8VsU*)0KkZ0I-Y@NS(q(2Q$hprmyz^FQgD>_)U?nj|m7Z8i9Q@t1UrP6p|bGCp}O8n~mV;gV)vLgj50FGY};( zKUNxS9Tvs)EBHp)TY9#JBHN+V87vRcRo&_!=80W6eXA#RNed%rCne`Xj5oR(kAAp^ zhZ_9!&*DC_{{ovIzkJ!G4mzpPoC_gc`=voM+RkbVZA6O*z7A2ymwnesB3J`WRt3sL98Z_e4>_24 z4K}cy8E-zptXEh(RgQj7)>biPk}{=8=N%GP`i{ds5DP2_>7GelZtcJFs<+X4sga=S5k;o&mtLZ<o?)5DA54*U$~~PolCkpSEr8ov$E9;IoZnKw zArev`Sc5S#g%}tU9;R@WH+%7+vcdvu+$eKBaDOmH)BLWR`+pp_O3W(18BHZFq8;k< zKN&0W>nmc>6lLZ^*#Gvf{txjM1~1YVOZh%=hVOx|FxI@%VyUOh$|#>p6N*zbu}kxx z>zrOOGXz>A-UYLG2m@x;fCDeYUO zWiAg6GGmNy*3dC`a>?W?A}&SsPT`boG`H#2f1m#pdVgEPS`KO|MU|h9S%Y}ApPC0s?HEV60FJMVYq}!; zGxzZWoP8K-9oM$r(OZoW`tTmel$?wrwV0QutC`jAaqhqmxsDT~YCf=fh<4~&C~tDl zOoREZVI;;Ms!d8P_3Qc{$f(csXS#adl;qv*O)xqu^0^$#xd}VYYCY2FUd6H}8|$do zIIOd{95m3q^gfO8B@&03eEd7OnDYfuVqL#yh4K>}Ml?0q*rel~$~(K&1ZDJi{@@nJdWpf$ejMlr+Wh5>)o^#DRa)J@+bP1l zR;PRHpIvIUmkX>tztgicef$e;*(7U4T~ma?nQlfM8&DtM73?*dKKPl;IJMnlK}-l2 z)ztV@Wd8j!^w^tMrz$UGpX$i>zB?dnvyi*0H2`M*N*zF91|04TlUWr_Zs+N?zP?+1 z`&K?~mCM8-spI76j?nz47G~Z!nIJT_lG#OW5YqqRoy)8rbh%sAa@1b%fWakeMnOe8 zvlt0>QT+GsVqOJ=Cv3+y+>lyR<~FIJ?lCr%NYDQ*?pbbgrMamIneVh}CQ@`0O3v%N z+@ny+a{Ni~x|x^(V#5Er0#0o8^kJ;>+8&*oM13VRqh6@QAyn+^(@L>Nr;+rlfli3B z1wXgGnWqJM&#);_s#kNsViI_Lmyfb2+FfSKC^;lr;(6W8oHxZ2Tr*8<-jIlbri=ay zk^imA76SU}_t_a6UBzet?PEw>z2m3r#TkSQ}WNyT8kuC#?UpCSk4LW`)DSA&PTw~;8=n`TbNnKap& z&R$XjZdX&KNB^(Pc1ydP65&x#6iF~qCo^(D@?JbwUTiE&s@zD80X1c_o)T)gYgL5eJE~bCwys+=9Bw`rCQPA?t_KNn}V;#Z3StVW}xHjHMq(Q zme3B+_!BaF(7%}y3f|*!!TMCly8iJo)t5(PLnHkRz%~0x6#*nO;O5`o698IHxp=zq zUkPoAMXka4{%XyLP=#-~EokC?&vS>9Vm zA*UrrnYW&IptX{g{?c>I`eK!o0S_iMPt8mgHv|3$6>pUAyQtUF_+ddDpt!0 zw-LZ5R#XY^3L!EyAev7_|NHM5vzEGwk#u8_1m`mm_zinsiMA)cJLX#7Nn-|)!;~ez-^YJO8x@;~VlhCeeu5DEb<%T@FiR3d}mqyVcvpMAoIyg=6VwL)@ zws@`bb04rn8lm2mR_+&jd^?~`qHF}p;wJ1r`^|I$*;1}xlVy&jkH*9!_Ss<2GN#T~ z*ALRlsfyLt=`IjcCBN; z;0xtK{K#it3NgNV<(xA951-Q#nG0;u^4JFK#hoD^6^e3lN13Qa-%Firy zlw3YnEy><7wFfvzR`)yFxQ2ZZ!(cnUE)(-Z2hWh~By0yo=B7_OMuZ-VQ<=_pb8EH` zv&I^U00s)D+9aLaqHX1z*VwnCe_rF)79^XbH)GBP=Cnk}*Be`1Gi+woYNVw^0Lfl? zV^F9S91A^UIpynq+C2vt4{M2#Mt^2$zqn42bDBX7w9H&y7Ig@J7Jp|~L5pR*Ti_O; zJCVI--zbi*GY&AIr z>T;t|_3-fPxp`{k7R9-QjH`!{@~@|V(EUIDQ(=vBtoLgs%8mK3%#7|f#R~aXc`Ny~ z6uI8F&7nBxC;8Vd+C?%faXlZ1RwXOrKhB`?;79*K?z765^Ci~ZDFvZDT{!9-r6UBw zIVrt7Jh)8hso}}g?J#QSI(tgaafat-Y>CZpgVy;ll*`SW&cE^%EQJBLuX2cS4=Npn zc$t%5Uls7%`Sn$Rqow#e4RG@pK}>DZF2a6@rA_BG*j zg+;D4N3>m>e+Ffo)ap*p0ouHRLvXsn+1FWUWZ$ zmKk)$dm#$G0qJX;u?u@+{fOz)Vg#Ms0i?J#c;w^?>5Yr)ADWk(LD9on4%&X#k+34; z5c^ac-+Wf$b8QH~MWPx;#9h7NGOC>7bUW9qO7htojQRDrD3zQ;5z^H=E=^9tC71P1 z55{WDQ$CDNn)Ad2#)rILGATF{g49hvrD3=xxE6$qF(VDrveys?Vb-G(Cq44jZz(^( z-ajJJ9KhH>;B#e}H`+J;+AsCAC7#=CfIIq1y}4iFbiH!)H^#rWTTM7=7=PAr)Hg{} z4#3_)L4LjeDIK^WhNIqJa5G#`cw@aEEQas=Va@g=G++LQEsW>HA@N@Gw0HI4g?qzC zRn6B-%tCoeNS{1-I^R_fKByv>%)YSXo%h9+^S%k_HPP(2GRE8W4CPOuk>0Q2nB^1-!?Ah*IsPtg^ zd>zUwB3#Ts?tGu0m#xLomM5^dnEAbBBi_yNf_Z6}(bB^!w!5Z!xyyQuPHg6l@1C0L za6iABdT@{26IzGM>AFZvKa_KfHdZ&{?oT5Hie*P)!T`!n%8be1!HGck{f_pk|( z_UiI|xY4##N26U@Q?k8zCxPCt97nWKNPe@>(TRQmVJI z%FdE0>bs=5q?Tg?Y(W#5E}NI7Nj0A?*?L+O`Bn5{(ZFZZl#bT3rQv)AXGl8AVInBZ zyT!aGFSLfip!&5pd-$^D9o3;&Z+7S{Yb zwOS#ZxbQdhkIMw>`~Jr<_3{;UEB9~u)DKruEjMFa?j?oMlx`YH2c|?Z4Egt-QF-8a zC4%w63>USESwGN4%|Xw6MEvY|vdX!AxJ%!czhR*Z99uQ4M5%Lp%r$T3;eJlVs<%)+ zgxYS{#K7d4lswytFWvDEAjqA*)qX9Ll&4l?KGu7wj(1t z&Q0ye1ihns-UtN0aOrZd^vHNHNynS|=IY%LZ*FwsQ3sq7)hF|6M)KB`0l}>{{sPZh z+z-Q+bG|yeM{`?|n^~9}8ankYDj|7(ro1Sg+~@Z9r5Ts|Pl2~J(m_YMo;{s~r%(xD zo`l2q?@f*_naj8|1Wvo8H*?6xO3^mU_;zkh#kL6{M-kK_z2?)e;_W&wxsR@_Pr28M zvakk({rJrn7vpDOp-y$Ei%y%mFBQry3WlFEQOdbOr#Ikd+jv$9Fd1yz=* zTB-U-X9iQ`(mJ17Z@&-8eC^j{!oL4DSDSCKY>rD%Qfs02wQ4pgjH( z$8e3k>WjwE@q=r4Kj#kstCyEz3%m69AwSow!%(&ZawJ^M2P5S*EV_nMJ?QD?R$1Ma zeK;QaZ@W{9iYBdP*3Ym^D83Dn14{KmC=Qm~w8p}}FKsEKWh9Qtr#CWrIi)Q4P$90OB6xXfME-Se>I<@- z9#HkKHu|59)cfgPT9Nxk?P1@BL6fg5jlGUe4Jd#@>JOh^dGfG6O@>?l97WI)8=|;`EMtrgG{G--QZ==H(QP(zhC~X zx}iR#)HxC)Tmbyv%n!LD-+h0gvP93gw9a_jLI)Djy0@rf zbG^tK66e5%w$+eudGPg4=%-6QFGKK}(BG5bqBNMmL%CfPRev>FNt2R>k3tBu%*wPE z*9hlq3DA?I1Sx7CTusrr?TNpWK1dBCOENjkoD4&G^1gUEnl}p7tmb za4hAi`n(iL+U_GJqk4p{04BO4j@YUEqi&TIQ(Lsv^pD=}Wz)L#j58`L!;wC4+seK_ zVrjhOmySzUj1p4EK3--3Me5oFrwUmUC!ErDRDLF7r;Db!d=w6A=1y~+#Mra*L;r%Z zH{>GO;kQ9L?_S*B{E?e~F}LS(O{%m?@IdJzvGQeh_&=_#RlJbV$^1}5^?p_ z!$%rM?6rWu#r$JlH#7bIQO!J-<~-RKjVXZ3VdX~-kt=gr^&dkiWiO$ppFeZ189q1b zH*fdX0jm%S=Nf|vHhs1n3kdAJsPZ|!XHRE0Yl1m8?hfSw5u2Hdv4g`tEJptAWo_ZN zc7iND6dYh4ma1pT!`f{+F#WT^VLk>e0Dmi;rx^BK-$eaw*H9FXzl z1>rpW4-AWBRPBWNl~+f$G=gRXgjc~Gn%W?`PxUiC$B1G6Dv)fl9U-& zzso`kKi(g?_DMb-4k}qY?VaU^`Zv5v^3O3r)ZqWBYj{)*KmO#NodA1^c>_~g_rYWp z>!~}$>*=ng{>H#yE12!ZMHG={7)G+4YR+P7D>yR?ZmTH(JWo$KAHo;BNDsKe&~A3# z+jzgP?w=BNU)y-;%3rC}EgJJ?7T5OKtcx~iJ)GXX9KNhXs*7tyy=^N~8_F|5!}MOD zHhf1ciOW+{@RWCZd=K$|qBVz@k@ZVTMSV3k`Uu%UxQ(ZF&P>xMyw$l`w_^Xxcx+-e zy%}Og5R{sB)0>Q?Ap#_J8gln?eq&pYW+_&_k-NK0yxz?^0d9sVJcC z9{pI6txI(_lp4HKQ2N^SiE>4rS}APu?nAY=2sWwD-rC*2?nd-Ke}3LOj@_dG+$!yG zEkXkj6JHm-wz%xpBV_K;VJNKr(7GKL1S`7Fz>ymKG-AFICW|G6?AKy+(qx!=d_XF5 zK5;ihVV0i`+Yjm&Hrb`5mJ=OLOK+@N+nH8`oR^7=EPB~yEqTdGMZ$r(TFjf-EQP2a z^9;E5rja`e0j|NI_3sVJCuqqS@?(!DN2J-WPiOp3ha;ME07w1h>FKW=6@fw1=sjEB z6?@bJ0*74jsQ2?FyDOLH3_(j>M3>qxpb?!UnIES)k3*9xh5qb-> z=TcY3FDbj*sJn)~9Odn!4z`NNA;AOOwCJ#j-VXDozSg-LnKCIWu5`<}CmEOXIfk5u zfO?+10V8S6B6ikd4s@fOq9JJh+&`-QYdUZP7E>K8j=EswxH|7mi z1qZ)}Ql~glsff&jnHyi)vpK{~7gIhCN;E&qvk(LYQp+$W9!&=xa~{uRvi^2ziuc>! zwt0mI2Sbdik^s*{-c@#Vn;HnYJ=x*3^bn|xfDM#KWDvMQeLFoU+Wf3#Rg zDJ~v-0j=ZoKuUjZwe9|D@<(hYKxVWpxXTEp@2dGbAiDllJD(~RwklUC!y#s^s_B5_ z<_tHhyuFz|WhJ{*0%2VevUduze@D6T#-^5Oto^vDpsK*))Hg|{Ypo$#86H1T@3Vwl z{=V~sC0r*ba8CNapG*&0wS}dXw*@>mO{i42g;S9+P-|wP)DJSIw*qFlO{>KGIM^c& zHrjCXxvr-P3H)fY*<1wH&|sUlsB4zZ-}Gq*#ij<~IT;Yg@`gl*HwOxipT=*H0FWaH zB4co9sj!`vusvC%^wW~&Q!e%K<$(^6IxrRxm!Va&u>7t1dg74IA|&i+mO%a@KI!~r zAd@3-SKm742|08jt*HHp3K{v*fz)Qeax^VEisz{H#HZvgh>CASWS}<|;dO@Zd&b z38Nd&E2r(CVAI-caYxaz`gV%VMk`V*Z=aap_-6DS)lews&&Vo9f{LDwaEEOEy!<00 z)R*iZ(9ih1{R@YQ6lB!FAmWltN#|7w=hn(OGru5-lGuBgXT~R9QsDFQtRTiRt(S*R zX)_tfoJGR$>V*Sx8M^y@uxCIJk1LDOG+w4MdS*p{C)?jqaB}TNc>8`|r3WIGn?^!7 ze*Hd#Y)uS(Yfau3Bc3AQ?xD6!r}D9CEO{p<kN*RvC&5VAevUAe~K>_C1&rxB&%ZD&_pP43Wy`> z=}%mjVA|wIIvX!J17Y{Deu7J8Bkqd_WFR!35C?tUMwL*ZqLw0pA>cys33Ce<_iG&1v`O)>z7 ztk*IyX_vGhj-Q9z>%6ym8HDWtGVKwDMRS*VSJn<>;u)vp^efLK1g1-VKff^0k)FF? z?dj2g^@O_l&H2eh#^3D47j5gpIAIb{*%Y2%384Fi(na;;*u*van%S#LKeI;MN(4ur zCEfRwd5f|D*?A`J65y<_dD_lIF}sa8`>mENe~QiV>P(XK5ku475({x`7wQmlhb6S) zL71S_fXSt4cSi{uC~nRo^m$!%X^M>c%S9=C+SKN5OPZFg>y0KgC6Jr@q_@%#Rs$)u za@h98)}k`bM3d2DtID&6Kt3~wkBJU;Gz~4cz25uLQdhb@C}a|&zPUKx#giUuK1#4e z?KMIB9I~4>bTG9?*|p6Fak5|VO^P#&l|uDZ@E}yjY1m%D%}cux(n(*iEF`Egi`PBH zBMq0TA>s@_uyTa!&v6^Ok7IxgoqcO0o^!e}xb~>U25}&Mw3Q}#GVT*!@W(hXV29pv z&dlgw`AVfbOX=3xQTv}wGdKE@y~ff$rrfr{#d0q6VX5rwY3YlF*|%u;OvwxPmBW9o z^w{01FGt_8Q$swh@Ae@pgR*A$nSzA9olkLx-Ms+g?H!y*%;Nl1h~dfg0|d?!N4A76 z$ppawr^)Raq?i83ll-(0vk&t1xSyat78rU2mUS&mvcphfMJmh+gXDQ8RrM_=hoT2z7KaRH9mbeZx@_?^yZGt3YSY z^x~jeqI}`**h*!Pk4)IkO!eqPujWoWt3nTnusDI~^2Lk-02%*Gwn0hURK#>Po)mqE zQoiDD_65d8EQZ2Irq?Z+PLsUy4;o5vlH);;pXpQ15H3nN&edG0^z`^H=1_KUH3V(w zC{vpW8u*V`P*Z<)ikN-BKkRHC+U_0d8j^SYzU2u9q~yA=+xAlX;`g1cNut0by|IDd zY42aBuBu%bA$Q&H6Ov?SMtt2UM+tQ7m4pOZzwW=uQ3t!T(#PMK8vCRgwp1*?4bDCrFHjkB-<#c&A&b|yUR$d zOfyH#qoC~^sUe#tP7YBeM2-mM8eN&B$X=>U9CFgCu(|N=N=P*Icg5LE!(KaPW>QWZ z)L}gG+w2ltXcP0K+;^C|JbRHUTABMz2LJxb#yM8MO(_3+C7C; z86F~6JDeM0fi#(VUg;n26EgG|;XnH;sA69DCJ%eS+;-+-^|h2+(EZNKTaackq4`2? z>@tmNc5mIH-x_UK?N~XydaV{g+XYdSh;yUAfO!9b&^rPUjV%Mt{u;$fAZ%BkjLD$GIo~WbWfRo!;V}G9GA*ezp;e?1eS2Gh&-mQ6(*GW!7Rv)RFb9+-HxLi^tY~Its<}`F*sNbw&Sen zXpmEKRGwNHIwMo6LONl1d7S4Rm20RF;8Zv!;V%{Nx=ZsAK`5d+EK0O5j0gq7 zIU35SgxBMiXgisX?Zs!FT3utLK8Y=V>ZYe@g~vhuj5!r!Drws>v?t&1RxkKz@Gs3! zDErUCs)py5c$i18-{}qoSz>s&dTHM=SMRUJ7bigCR zykO;ls@D}!i=MpuYH5k-(9mSXwVRU5zTSyAyx?8}MD61JkMsV#Ov03coR{tBNnK+G zU`~KzggY+?D*dAXV>9bMZU8Be`O5tASkraPy6m0WMBGQWZ)$SwvBlXjQySRZTAZS( zIW0dXKYN|qWfO%39!gn3$dq8NIdH`IS3sJ>Jy~7MIa$R?StKX3ZSD{-bQ2XO~*-aL9^S9W%fyui?OO zY`DjEl#$EQ19mJv{e1KB%oGonAo|#WKv<-|X%Q6eggLI81hS>kIgQ70XpX1%(;r$F zaaa0%wH6}xuNEdUkMnqi;@>WJ3(USo5w1v2C1aU*{!2CxIxeqmh3o#L zgot&@{v}!fHLud|4B^&Zt2s(IEJNk2h#~5JgZt)mLNdD}#=FrzX77C0dQ~`F?!1^_ za(UowBOa7VVctDO^DY}xk?_Kgw9qmW<|zw6pBzZ5(U(Rq8;g7#$-(03YHTw63D!)m z=ap<29mhcQaJbqZSGu$zm@8zq6M7)v1}@ixzv4fsmHFdrkHnLH?}#z(ok#w5=s!LSkbg$UNi}hSs3n9aiK_^LVs?2^tr8vtn6i1i>CnvVQhZQZ{bVh3cst z>4jMZDHhE0gD|sQufj6~Z;h#)yivp9h;^lo5@!#iJZKwUmAF@H@1D?UJMwnH%=)wQ zPaCCDR2%Y~kt=h;#M9tR)*9yS!V#sx^^0HHGr&m@!h4?Md~*q>+2^cF^t$GGxY(oC z?wrwdo>`?cw>j$Mb@m5px?Y!-fKIt?j&HSXfB>eOKF@=13jA9r*7#tG>I~^y7Hc(^ z(e@MNl2JoCr@Gd*=uQ;ia$VsmpK*e#Ab(eiNuGgn#|LWs=*4=&*n@g`Zy@Z@-b3Z% zGxeaxL-6pqX|0$k>IH_mR`?3}~lUP7s!N`j(NIK@|JT* z&p^LKQl( zMarmK#x>hXD$iohNh%`VTy`8+du6#!cZN$uF7K3ceXU;1c~@IMrdCa;^H-tRg9#|j z>jZ?Fys0bI9UOac$eQAW&a|)LDqKZmxQ!216uIshf{J!RvbhN%o*m&UVNP6)9L{7= z_D4TgSB4$W??^giAUGRo(Wm35r5iRV{`EpfQ{c}urbA{o#kg;2*vlE>PMxs>#h){G zbQ_Oo=P3b+muWHNUSfW=?5HpgygUG7+0=t&+woMC2I}?(fkcE~7rg!)ayP`3MQbP6^FNtn zSJZ-#bT6|fU>p!1jVb$B6$BkpeqAP0 zyXe9aczd^|`BHqnzD>cATb%=ubs}6ZiJyn}EJc@J3pa;0)zs)g#0q3OWWXC94X$Py2Zk_E?c`(S+$tPWnmg+~u;m&rDYdQ>gtF zN#P})Ebb0w4k{eh06~wNRhI!y)D^^g6ee1~U-DTg4MyKglr9qE`y@sTJxNSqT0|mA z#l02QY&Tr;tk%6_muw@wx#A=0fBUm4MrV9<)&A0~bs)RA(|PZ&Rr7H^f5r zw?l5KxY%pZ*@{G;vEe7`-W1ycjEAy9|MjLixA5&ZG-lS^@EB(+#20`?0LPe7=c^ah z0+Cx|^d#*R=o(i%u#K(PpXxriM$K}~7u$ObIuy(cOC=ty(m%C05CYTiLW=d+IwCob zc2CWQf+@wUjDDG#*$iag=~XTVry;ymkxE)7jXnXM*ptIqH9&>9AZc$OW z?DYXE(cj$cGg)gLE|JeZB%Wp4%pbFpZX?82yO5b2m}L(Wifz*iyK&JlDhV6n+^>X5 z^*j)s@-rP~&1jrFnQ)HE3_1~RSLX4gDpxwv3WeqgCJ@*Mn8r8QONr^lyAUzZo*z2y zo~2w1?<}w@0|YAQ0s~p8BmDQTJb@fy zu&(SPc9u&|7)UN`VU-vhr0R^t;nONj(7l->5A?#(Vquc-)g&tW!l8oo9z*B+4;6Y( zZ>SW*qK1O|MSkTx9~u#@)Qyk9aTegyHN#XDtQ&vSsg)D2Xi@VZ8tWG2YN+-xje|GD z^AxMu+iORi9xmK9(#>#S~U40%b<+qYGLedW~ zN;0tPutz9>A2s35^UbopsRaE%J4w3_>|0drHt(S9hnEXquNl&edc6*64)^q28aaQ| zY`BLwKpXzN5@C3{wYS3gr3tJ;L3!L1mBBai^PTko=I5w^%BVHYf178wZ#^DnS< zKZm8EJ0_8uXDiNy0{wZ1>4s2Dd4Jx%a!jO>@VPY1aG@r)V*N(uD%8)_vz_;^d)0oF z51iu{%jFF%mZDPw4=Kox)rBGk;!b|HEqCHkqf=QUlXO}&&HdPYWsoQzf-BX4C_xJ6 zbS)T0lwZguv~K_i>ywH6R|m%tm7k# zEq-xTiC3<=E`O_*9$CR+qk(7pfXf#=J32DkUn<1i8BEp-7|^L(Csh&aC=G~tuYIHY z?Lx~=^I?A0&&aCT-80oiItK)aw>@y_lr`U}yk5Rx4=xXNjkxbORz@)9yj0SSx3R#~ zH=0F&Q2;#;ng+`96EX8hdaMbQ!@%V%1A~3-r$)G(~>6YDui`1-NwT z&@+S+Y=s1J*vu*^_Ly=xR-?4(k&?o-di|Cg?&luRLmP<~b>VM;!@n96QEUH$Iu}d0}V)qLg<$ zW*fuW@xQ0ui{>g-ts;q!e@rBP7rAXa=%;|P1Z#48q%zYW>8V;qLv_zR8Uy_$$b~tf zA(~v{Pyc_n%C+e%dxZan{e_r%h;<^~HPsX5pXQCmzQI1pZ{8DZ7b4b?^(GQ7pe*{UEqe2kgnXxWR^iN8%~>TXhMhH9%U5 zE{vjVVZk5P3`jXX7?hHW=-((*J)m4XWk)MYQUN{3^`$?rU_6>>h%j>#!5-P5z)FX< zx})imzMPioP}{Xl(AC2lkhgKG`p1&u3g|c6#TC)R9W|Q(da6<6N3V1Z z>-lOf*PX>HVVU|*9pMnKXibwyq&L6$2WR{H`_CuFnxrB(VEEWR8Am6lnWn{VXjp%L zKlNWxY~>wy1}q-9zhq1pU2RHM2cr#Cpwa?Iq%;#*bKrLdG5)NBBUJXDeT zFfUnbl7apHZEN!WER{{l+`eN0sJ%8*VRM5zuUDi>M|5Ph(j!DuEY`-Qv4w4I{>()9 zD~?pDoU!8uPsMBQ9w`4rbYJu`#7*lc{Y=`graL|%uZ=`*l5{flb)u;cbrjK%gOrUi zQMY`qtqz{ccHG3QxMpFSFd=gA+-6dzB*hhZhtvP6ng6-ugr%@fi(Hc3ptrEvt_s_W zriX_%iJtfmGBR3wEUzVOh>ftHYl;h~g5H+ctX%I9HaR -Private repositories use a different URL scheme, served from a different [API endpoint](https://api.travis-ci.com): `https://api.travis-ci.com/repos///cc.xml?token=token>`. +To add a repository feed, we provide a generated URL (for both public and private repositories), which can be accessed by visiting the repository page and clicking on the Build Status Image, shown below:
- Screenshot of private CC feed + Screenshot of Build Status Image
-Private repositories require an authenticated URL with a token in it. You can find the token in your profile: +Once the modal is open, select `CCTray` from the second dropdown, which +then displays the URL to be copied. If the repository is private, it will also +include the required token parameter: -![Travis CI user token](/images/user-token.png) +
+ Screenshot of Build Status Image Modal with generated URL +
-By default, the feed will fetch the status of the default branch of the repository. To specify a different branch, use the `branch` parameter: +The generated URL includes the branch name selected in the modal. To specify a +different branch, either select a different branch before copying the URL or edit the +branch parameter manually. Should you choose to manually generate the URL, it +must have the following form: - For open source projects use `https://api.travis-ci.org/repos///cc.xml?branch=` - For closed source projects use `https://api.travis-ci.com/repos///cc.xml?token=&branch=`. From 280557fba24e900ac7e36adf68a593be5db2216b Mon Sep 17 00:00:00 2001 From: Curtis Ekstrom Date: Thu, 22 Feb 2018 12:26:52 +0100 Subject: [PATCH 0233/2623] Reference relevant documentation on where to fetch feed token --- images/token.jpg | Bin 31641 -> 0 bytes user/build-feeds.md | 9 +++++---- 2 files changed, 5 insertions(+), 4 deletions(-) delete mode 100644 images/token.jpg diff --git a/images/token.jpg b/images/token.jpg deleted file mode 100644 index d9df83c6b919e2522bdda2946e74a958735c7b47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31641 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

LMytN&59bn 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 s;9VTys*C8QY{rna$8guUVTtR1O9xs{u7gV7`~Q From b1b6569d02f1228ca98521eb18664fee9ab4ea92 Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Thu, 22 Feb 2018 17:35:24 +0100 Subject: [PATCH 0234/2623] Make sure you don't push for PRs (#1719) * Improvement? * " * How about deploy? * One command please * Get the shell right! * !- * Im done with this now --- user/docker.md | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/user/docker.md b/user/docker.md index 14ca2d85b6c..f764da63805 100644 --- a/user/docker.md +++ b/user/docker.md @@ -135,8 +135,8 @@ travis env set DOCKER_USERNAME myusername travis env set DOCKER_PASSWORD secretsecret ``` -Be sure to [encrypt environment variables](/user/environment-variables#Encrypting-environment-variables) -using the travis gem. +Be sure to [encrypt environment variables](/user/environment-variables#Encrypting-environment-variables) +using the travis gem. Within your `.travis.yml` prior to attempting a `docker push` or perhaps before `docker pull` of a private image, e.g.: @@ -148,17 +148,27 @@ docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD" #### Branch Based Registry Pushes To push a particular branch of your repository to a remote registry, -use the `after_success` section of your `.travis.yml`: +use the custom deploy section of your `.travis.yml`: ```yaml -after_success: - - if [ "$TRAVIS_BRANCH" == "master" ]; then - docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD"; - docker push USER/REPO; - fi +deploy: + provider: script + script: bash docker_push + on: + branch: master ``` {: data-file=".travis.yml"} +Where `docker_push` is a script in your repository containing: + +```bash +#!/bin/bash +docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD"; +docker push USER/REPO +``` +{: data-file="docker_push"} + + #### Private Registry Login When pushing to a private registry, be sure to specify the hostname in the From 5214255d3cc17f11ef9ff8bc3a5a9ba0dcbe138c Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Tue, 27 Feb 2018 23:45:20 -0500 Subject: [PATCH 0235/2623] Typos: slack => Slack, notifcations => notifications --- user/notifications.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/notifications.md b/user/notifications.md index 430522a6214..b799940387f 100644 --- a/user/notifications.md +++ b/user/notifications.md @@ -521,7 +521,7 @@ Other flags, such as `on_success` and `on_failure` also work like the IRC notifi Pull Request builds do not trigger Pushover notifications. -## Configuring slack notifications +## Configuring Slack notifications Travis CI can send notifications to your [Slack](http://slack.com) channels about build results. @@ -607,7 +607,7 @@ screenshot below: ### Notifications of PR builds -Turn pull request notifcations off by adding `on_pull_requests: false` to the `slack` section of your `.travis.yml`: +Turn pull request notifications off by adding `on_pull_requests: false` to the `slack` section of your `.travis.yml`: ```yaml notifications: From f0617d5c59e8a5e67edb3f183b98f209e62361d9 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Wed, 28 Feb 2018 14:37:43 +0100 Subject: [PATCH 0236/2623] Explain Trusty build images --- user/enterprise/build-images.md | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/user/enterprise/build-images.md b/user/enterprise/build-images.md index b0a2339f36b..e12c9f0d52b 100644 --- a/user/enterprise/build-images.md +++ b/user/enterprise/build-images.md @@ -20,6 +20,29 @@ place, you can fully customize these images according to your needs. **Note**: you'll need to re-apply your customizations after upgrading build images from [quay.io](https://quay.io/organization/travisci). +### Ubuntu Trusty build environments + +For Ubuntu Trusty build environments we ship three Docker images in total. Depending on the user's `.travis.yml` configuration we will pick the corresponding image to run the build. + +We're shipping the same Docker build images as travis-ci.org and travis-ci.com are using. The base image, `connie` contains all databases and frameworks preinstalled, such as postgresql, mysql, memcached, pyenv, rvm, gimme. Though there are no interpreters available. Based on `connie` there is `garnet`, which adds the following programming languages: + +- Ruby +- Node.js +- Go +- PHP +- Python +- Java / JVM + +The third image, `amethyst`, additionaly ships with Android, Erlang, Haskell and Perl preinstalled. + +> Any modification to one of these images will be available for other languages as well. + +### Ubuntu Precise build environments (deprecated) + +In the Ubuntu Precise environment we're shipping a separate Docker image for each language we support. There we support the same languages as in our current Trusty environment. + +### How to customize + The process is to: - start a Docker container based on one of the default build images @@ -32,7 +55,7 @@ For example, in order to install a particular Ruby version which is not available on the default `travis:ruby` image, and make it persistent, you can run: -``` +``` docker -H tcp://0.0.0.0:4243 run -it --name travis_ruby travis:ruby su travis -l -c 'rvm install [version]' docker -H tcp://0.0.0.0:4243 commit travis_ruby travis:ruby docker -H tcp://0.0.0.0:4243 rm travis_ruby @@ -44,7 +67,7 @@ In order to build other docker images, the Worker needs to be setup to support D ``` export TRAVIS_WORKER_DOCKER_PRIVILEGED="true" -``` +``` You will then need to restart each Worker, you can find more information on this here: https://docs.travis-ci.com/user/enterprise/worker-cli-commands/#Stopping-and-Starting-the-Worker. From 59cf376bf09df2a187c26c0db1459a48583cb5ef Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Wed, 28 Feb 2018 15:03:41 +0100 Subject: [PATCH 0237/2623] Remove devicemapper installer from docs --- user/enterprise/trusty.md | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/user/enterprise/trusty.md b/user/enterprise/trusty.md index d785bdd3ac7..b779387d7b3 100644 --- a/user/enterprise/trusty.md +++ b/user/enterprise/trusty.md @@ -9,7 +9,7 @@ layout: en_enterprise ## System Setup -**Platform Requirements**: To use the Trusty build containers, the Travis CI installation must be at 2.1.9 or higher. Please be sure to [upgrade](/user/enterprise/upgrading/), if needed, before getting started with this feature. +**Platform Requirements**: To use the Trusty build containers, the Travis CI installation must be at 2.1.9 or higher. Please be sure to [upgrade](/user/enterprise/upgrading/), if needed, before getting started with this feature. **Worker Requirements**: While workers with the older Precise (Ubuntu 12.04) containers can co-exist with Trusty workers in an installation configuration, _Precise build containers and Trusty build containers must be on different instances_. To run both Precise and Trusty builds, at least two worker instances are required. @@ -22,16 +22,7 @@ layout: en_enterprise 5. Disconnect from the Travis Enterprise platform machine -## Installation on AWS -Spin up at least one additional AWS worker machine. Please note: DeviceMapper installer only supports the recommended c3.2xlarge machines due to the storage layout. Once this are ready, run: - -`curl -sSL -o /tmp/installer.sh https://enterprise.travis-ci.com/install/worker/trusty-devicemapper` - -Next, run the following to complete the install: - -`sudo bash /tmp/installer.sh --travis_enterprise_host="[travis.yourhost.com]" --travis_enterprise_security_token="[RabbitMQ Password/Enterprise Security Token]" --aws=true` - -## Installation on Non-AWS +## Installation Start at least one additional worker machine and run: @@ -41,8 +32,10 @@ Next, run the following to complete the install: `sudo bash /tmp/installer.sh --travis_enterprise_host="[travis.yourhost.com]" --travis_enterprise_security_token="[RabbitMQ Password/Enterprise Security Token]"` +This installer uses Docker's `aufs` storage driver. If this default doesn't work out for you, please [get in touch with us](mailto: enterprise@travis-ci.com?subject=Trusty%20Workers) to discuss alternatives. + There are two differences with the non-AWS installer. First, it uses AUFS instead of DeviceMapper and, second doesn't have strict storage device layout requirements which would otherwise be required for setting up the DeviceMapper volumes. ## Running builds on Trusty -To run builds on a worker with Trusty images, please add `dist: trusty` to your `.travis.yml`. If that key is not present in your project's `.travis.yml`, the build will routed to the Precise build environments instead. +To run builds on a worker with Trusty images, please add `dist: trusty` to your `.travis.yml`. If that key is not present in your project's `.travis.yml`, the build will routed to the Precise build environments instead. From 7f1ba04b94e5095ab4f3b330244a782c3f539de1 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Thu, 1 Mar 2018 10:29:08 +0100 Subject: [PATCH 0238/2623] Get rid of obselete devicemapper paragraph --- user/enterprise/trusty.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/user/enterprise/trusty.md b/user/enterprise/trusty.md index b779387d7b3..0128cf9f389 100644 --- a/user/enterprise/trusty.md +++ b/user/enterprise/trusty.md @@ -34,8 +34,6 @@ Next, run the following to complete the install: This installer uses Docker's `aufs` storage driver. If this default doesn't work out for you, please [get in touch with us](mailto: enterprise@travis-ci.com?subject=Trusty%20Workers) to discuss alternatives. -There are two differences with the non-AWS installer. First, it uses AUFS instead of DeviceMapper and, second doesn't have strict storage device layout requirements which would otherwise be required for setting up the DeviceMapper volumes. - ## Running builds on Trusty To run builds on a worker with Trusty images, please add `dist: trusty` to your `.travis.yml`. If that key is not present in your project's `.travis.yml`, the build will routed to the Precise build environments instead. From 773ed3967ff9ccec31eb506064152dd2bbc0268b Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Thu, 1 Mar 2018 10:30:09 +0100 Subject: [PATCH 0239/2623] Better wording to encourage people to get in touch --- user/enterprise/trusty.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/trusty.md b/user/enterprise/trusty.md index 0128cf9f389..1c57a8044bb 100644 --- a/user/enterprise/trusty.md +++ b/user/enterprise/trusty.md @@ -32,7 +32,7 @@ Next, run the following to complete the install: `sudo bash /tmp/installer.sh --travis_enterprise_host="[travis.yourhost.com]" --travis_enterprise_security_token="[RabbitMQ Password/Enterprise Security Token]"` -This installer uses Docker's `aufs` storage driver. If this default doesn't work out for you, please [get in touch with us](mailto: enterprise@travis-ci.com?subject=Trusty%20Workers) to discuss alternatives. +This installer uses Docker's `aufs` storage driver. If you have any questions or concerns, please [get in touch with us](mailto: enterprise@travis-ci.com?subject=Trusty%20Workers) to discuss alternatives. ## Running builds on Trusty From 21a2c1e3a53fd0903c05341ddcfc4ccce2c68062 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Thu, 1 Mar 2018 10:30:55 +0100 Subject: [PATCH 0240/2623] Make clear what our default build env is --- user/enterprise/trusty.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/trusty.md b/user/enterprise/trusty.md index 1c57a8044bb..c81330415de 100644 --- a/user/enterprise/trusty.md +++ b/user/enterprise/trusty.md @@ -36,4 +36,4 @@ This installer uses Docker's `aufs` storage driver. If you have any questions or ## Running builds on Trusty -To run builds on a worker with Trusty images, please add `dist: trusty` to your `.travis.yml`. If that key is not present in your project's `.travis.yml`, the build will routed to the Precise build environments instead. +To run builds on a worker with Trusty images, please add `dist: trusty` to your `.travis.yml`. If that key is not present in your project's `.travis.yml`, the build will routed to the default (Precise) build environments instead. From b6706d11f7c69486eecf8ccf91fc6c10f8a1302f Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Mon, 26 Feb 2018 10:55:56 +0100 Subject: [PATCH 0241/2623] Fix broken link --- user/enterprise/build-images.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/build-images.md b/user/enterprise/build-images.md index e12c9f0d52b..2ef0d5ca63f 100644 --- a/user/enterprise/build-images.md +++ b/user/enterprise/build-images.md @@ -69,7 +69,7 @@ In order to build other docker images, the Worker needs to be setup to support D export TRAVIS_WORKER_DOCKER_PRIVILEGED="true" ``` -You will then need to restart each Worker, you can find more information on this here: https://docs.travis-ci.com/user/enterprise/worker-cli-commands/#Stopping-and-Starting-the-Worker. +You will then need to restart each Worker, you can find more information on this here: [https://docs.travis-ci.com/user/enterprise/worker-cli-commands/#Stopping-and-Starting-the-Worker](https://docs.travis-ci.com/user/enterprise/worker-cli-commands/#Stopping-and-Starting-the-Worker). ### Updates to your .travis.yml files From 406020e93a81147e0577fed1b67577f41e0532e1 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Mon, 26 Feb 2018 16:05:03 +0100 Subject: [PATCH 0242/2623] Explain Docker in Docker builds for Trusty build images --- user/enterprise/build-images.md | 49 ++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/user/enterprise/build-images.md b/user/enterprise/build-images.md index 2ef0d5ca63f..365b6d7bc7e 100644 --- a/user/enterprise/build-images.md +++ b/user/enterprise/build-images.md @@ -63,16 +63,63 @@ you can run: ## Enabling Docker Builds +### Worker machine configuration + In order to build other docker images, the Worker needs to be setup to support Docker Builds. To get started, please add the following to `/etc/default/travis-worker` on all your Workers: ``` export TRAVIS_WORKER_DOCKER_PRIVILEGED="true" ``` -You will then need to restart each Worker, you can find more information on this here: [https://docs.travis-ci.com/user/enterprise/worker-cli-commands/#Stopping-and-Starting-the-Worker](https://docs.travis-ci.com/user/enterprise/worker-cli-commands/#Stopping-and-Starting-the-Worker). +#### Additional configuration for Trusty build images + +With Trusty build images a few additional steps are required. Since Docker-ce can't run on its own inside another Docker container, it'll connect to the Host's Docker daemon to execute the respective commands. + +> For non-AWS deployments, please make sure that the worker machine has a private IP address configured on one of its interfaces. + +On Amazon EC2 each machine has a private IP address by default. That address will be used to connect to the Docker daemon. + +To get the address, please run `ifconfig` in your terminal. For EC2 Virtual Machines, usually `eth0` interface is what we're looking for. + +Now the Docker daemon needs to listen to that address. Please open `/etc/default/docker`. In this file, you'll find the `DOCKER_OPTS` variable. This is read by Docker during service startup. In there please configure the additional host like this: + +``` +DOCKER_OPTS="-H tcp://172.31.7.199:4243 -H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock ..." +``` + +After that, both Docker and travis-worker have to be restarted. For Docker, please run: + +``` +$ sudo restart docker +``` + +For travis-worker, you can find the instructions [here](https://docs.travis-ci.com/user/enterprise/worker-cli-commands/#Stopping-and-Starting-the-Worker). + ### Updates to your .travis.yml files +#### Trusty build containers + +> Please note: This solution utilizes the Docker daemon from the host machine - any containers and images you pull and run through your build need to be cleaned up manually. + +Add the following to your `.travis.yml` configuration: + +``` +install: + - sudo apt-get update + - sudo apt-get install -y curl software-properties-common apt-transport-https ca-certificates + - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu trusty stable" + - sudo apt-get update + - sudo apt-get install -y docker-ce + - sudo docker -H :4243 pull ubuntu +script: + - sudo docker -H :4243 run ubuntu date + +``` + +#### Precise build containers (legacy) + Add the following to any `.travis.yml` files for repositories which would like to use Docker: ``` From 1ecdf5517fcf5bc8d32fde7f6f4958b1490a17c9 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Wed, 28 Feb 2018 10:35:57 +0100 Subject: [PATCH 0243/2623] Headline with a more meaningful title --- user/enterprise/build-images.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/build-images.md b/user/enterprise/build-images.md index 365b6d7bc7e..cb5d05d1d2e 100644 --- a/user/enterprise/build-images.md +++ b/user/enterprise/build-images.md @@ -71,7 +71,7 @@ In order to build other docker images, the Worker needs to be setup to support D export TRAVIS_WORKER_DOCKER_PRIVILEGED="true" ``` -#### Additional configuration for Trusty build images +#### Configuration for Docker Builds in Trusty Build Environments With Trusty build images a few additional steps are required. Since Docker-ce can't run on its own inside another Docker container, it'll connect to the Host's Docker daemon to execute the respective commands. From d0f23b1230be35edb2d5551799799fdaeeadef11 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Wed, 28 Feb 2018 10:36:21 +0100 Subject: [PATCH 0244/2623] Code formatting for docker-ce --- user/enterprise/build-images.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/build-images.md b/user/enterprise/build-images.md index cb5d05d1d2e..110ba1e8e38 100644 --- a/user/enterprise/build-images.md +++ b/user/enterprise/build-images.md @@ -73,7 +73,7 @@ In order to build other docker images, the Worker needs to be setup to support D #### Configuration for Docker Builds in Trusty Build Environments -With Trusty build images a few additional steps are required. Since Docker-ce can't run on its own inside another Docker container, it'll connect to the Host's Docker daemon to execute the respective commands. +With Trusty build images a few additional steps are required. Since `docker-ce` can't run on its own inside another Docker container, it'll connect to the Host's Docker daemon to execute the respective commands. > For non-AWS deployments, please make sure that the worker machine has a private IP address configured on one of its interfaces. From f572ec03ca5aea61fe5e0d4b1aee8e6ee333b291 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Wed, 28 Feb 2018 10:37:27 +0100 Subject: [PATCH 0245/2623] Improve wording for network interfaces --- user/enterprise/build-images.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/build-images.md b/user/enterprise/build-images.md index 110ba1e8e38..af1d44dea04 100644 --- a/user/enterprise/build-images.md +++ b/user/enterprise/build-images.md @@ -79,7 +79,7 @@ With Trusty build images a few additional steps are required. Since `docker-ce` On Amazon EC2 each machine has a private IP address by default. That address will be used to connect to the Docker daemon. -To get the address, please run `ifconfig` in your terminal. For EC2 Virtual Machines, usually `eth0` interface is what we're looking for. +To get the address, please run `ifconfig` in your terminal. For EC2 Virtual Machines, usually `eth0` interface is correct. Now the Docker daemon needs to listen to that address. Please open `/etc/default/docker`. In this file, you'll find the `DOCKER_OPTS` variable. This is read by Docker during service startup. In there please configure the additional host like this: From 585eb8be763d56919cd54e95ccdef2102c237c49 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Thu, 1 Mar 2018 10:46:10 +0100 Subject: [PATCH 0246/2623] add note about example IP address --- user/enterprise/build-images.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/build-images.md b/user/enterprise/build-images.md index af1d44dea04..da1cb130120 100644 --- a/user/enterprise/build-images.md +++ b/user/enterprise/build-images.md @@ -81,7 +81,7 @@ On Amazon EC2 each machine has a private IP address by default. That address wil To get the address, please run `ifconfig` in your terminal. For EC2 Virtual Machines, usually `eth0` interface is correct. -Now the Docker daemon needs to listen to that address. Please open `/etc/default/docker`. In this file, you'll find the `DOCKER_OPTS` variable. This is read by Docker during service startup. In there please configure the additional host like this: +Now the Docker daemon needs to listen to that address. Please open `/etc/default/docker`. In this file, you'll find the `DOCKER_OPTS` variable. This is read by Docker during service startup. In there please configure the additional host like this (We're using `172.31.7.199` as example here): ``` DOCKER_OPTS="-H tcp://172.31.7.199:4243 -H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock ..." From 19b112e606d6c19e25d5b98d37a34adbbf21717f Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Thu, 1 Mar 2018 15:41:37 +0100 Subject: [PATCH 0247/2623] Remove beta flags from Trusty page --- user/enterprise/trusty.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/user/enterprise/trusty.md b/user/enterprise/trusty.md index c81330415de..c7ae0d563a6 100644 --- a/user/enterprise/trusty.md +++ b/user/enterprise/trusty.md @@ -1,12 +1,9 @@ --- -title: Trusty Build Containers for Enterprise (beta) +title: Trusty Build Containers for Enterprise layout: en_enterprise --- -> Note: This is a BETA feature. If you have any questions, suggestions, or run into any trouble, please email [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com?subject=Trusty%20Beta). We look forward to your feedback! -{: .beta} - ## System Setup **Platform Requirements**: To use the Trusty build containers, the Travis CI installation must be at 2.1.9 or higher. Please be sure to [upgrade](/user/enterprise/upgrading/), if needed, before getting started with this feature. From c1b6d3385173e55d5e8621d836c2959125b4f02d Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Thu, 1 Mar 2018 16:21:52 +0000 Subject: [PATCH 0248/2623] We're not in beta here anymore --- _data/enterprise.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/enterprise.yml b/_data/enterprise.yml index 1ec7dbd72bf..ff4fdfb1a03 100644 --- a/_data/enterprise.yml +++ b/_data/enterprise.yml @@ -6,5 +6,5 @@ Custom Queues: "/user/enterprise/custom-queues/" Worker Configuration: "/user/enterprise/worker-configuration/" Worker Start & Debug Containers: "/user/enterprise/worker-cli-commands/" Platform Administration Tips: "/user/enterprise/platform-tips/" -Trusty Build Containers (BETA): "/user/enterprise/trusty/" +Trusty Build Containers: "/user/enterprise/trusty/" Operations manual: "/user/enterprise/operations-manual/" From 35a6ec57b4172e2aac7e1c17829b5894c5ce9f28 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Fri, 2 Mar 2018 11:15:29 +0100 Subject: [PATCH 0249/2623] Add strategies for `Ready state command canceled: context deadline exceeded` This error can be caused by two things: - Configuration mismatch in GitHub OAuth App - Hostname mismatch between server and license --- user/enterprise/operations-manual.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/user/enterprise/operations-manual.md b/user/enterprise/operations-manual.md index 7a6f5d65f41..01f7f645ff8 100644 --- a/user/enterprise/operations-manual.md +++ b/user/enterprise/operations-manual.md @@ -86,12 +86,26 @@ A source for the problem could be that the worker machine is not able to communi Here we're distinguishing between an AWS EC2 installation and an installation running on other hardware. For the former, security groups need to be configured per machine. To do so, please follow our installation instructions [here](/user/enterprise/installation/#Create-a-Travis-CI-Platform-Security-Group). If you're not using AWS EC2, please make sure that the ports listed [in the docs](/user/enterprise/installation/#Create-a-Travis-CI-Platform-Security-Group) are open in your firewall. -#### Docker Versions Mismatched +#### Docker Versions Mismatched This issue sometimes occurs after maintenance on workers installed before November 2017 or systems running a `docker version` before `17.06.2-ce`. When this happens, the `/var/log/upstart/travis-worker.log` file contains a line: `Error response from daemon:client and server don't have same version`. For this issue, we recommend [re-installing worker from scratch](/user/enterprise/installation/#Install-Travis-CI-Enterprise-Worker) on a fresh instance. Please note: the default build environment images will be pulled and you may need to apply customizations again as well. If none of the steps above lead to results for you, please follow the steps in the [Contact Support](#Contact-support) section below to move forward. +## Enterprise container start fails with `Ready state command canceled: context deadline exceeded` + +After a fresh installation or configuration change the Travis CI Enterprise container doesn't start and fails with the error `Ready state command canceled: context deadline exceeded` in the admin dashboard (`https://travis.example.com:8800/dashboard`). + +### Strategies + +#### GitHub OAuth app configuration + +The above mentioned error can be caused by a configuration mismatch in the GitHub OAuth Application. Please check that _both_ website and callback URL contain the Travis CI Enterprise's hostname. If you have discovered a mismatch here, please restart the Travis container from within the admin dashboard. + +#### Hostname does not match license's hostname + +Your Travis CI Enterprise license has a hostname field which contains the hostname of your installation. When the license's hostname does not match the actual hostname, the container does not start. If this is the case or you suspect that this might be likely, please [get in touch with us](mailto:enterprise@travis-ci.com?subject=License%20Hostname%20Change) and we'll help you to get back on track. + ## Contact support To get in touch with us, please write a message to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). It would be very helpful for Support if you could include the following: From 184463228ed3bcffac1a6b74a1be302b487c0f51 Mon Sep 17 00:00:00 2001 From: Carla Date: Mon, 5 Mar 2018 11:00:49 +0100 Subject: [PATCH 0250/2623] Update token mentions in triggering builds --- user/triggering-builds.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/user/triggering-builds.md b/user/triggering-builds.md index 06406af29ea..7416a1c28fc 100644 --- a/user/triggering-builds.md +++ b/user/triggering-builds.md @@ -8,16 +8,19 @@ layout: en Trigger Travis CI builds using the API V3 by sending a POST request to `/repo/{slug|id}/requests`: -1. Get an API token using the Travis CI [command line client](https://github.com/travis-ci/travis.rb#readme): +1. Get an API token from your Travis CI Profile page for [public repositories](https://travis-ci.org/profile) + or [private repositories](https://travis-ci.com/profile). You'll need the token to authenticate most of these + API requests. + + You can also use the Travis CI [command line client](https://github.com/travis-ci/travis.rb#readme) + to get your API token: ``` travis login --org travis token --org ``` - You'll need the token to make most API requests. - - > If you are using Travis CI with a private repository use `--pro` instead of + > If you are using Travis CI with a private repository, use `--pro` instead of `--org` in the previous commands, and use `https://api.travis-ci.com` in all API requests. 2. Send a request to the API. This example shell script sends a POST request to From 3cc26754a09ff8236641b8fcdad410fb852650db Mon Sep 17 00:00:00 2001 From: Carla Date: Mon, 5 Mar 2018 11:04:45 +0100 Subject: [PATCH 0251/2623] Update token mentions in debug docs --- user/running-build-in-debug-mode.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/user/running-build-in-debug-mode.md b/user/running-build-in-debug-mode.md index bdef0b3786c..692620e2b1a 100644 --- a/user/running-build-in-debug-mode.md +++ b/user/running-build-in-debug-mode.md @@ -28,8 +28,12 @@ For public repositories, an API call is required, in addition to the feature bei ### Restarting a job in debug mode via API -To restart a job in debug mode via API, send a `POST` request to the job's `debug` endpoint, -along with your [Travis CI API token](/user/triggering-builds/) in the `Authorization` header. +To restart a job in debug mode via API, send a `POST` request to the job's `debug` endpoint. +This request needs to be authenticated by adding your [Travis CI API token](/user/triggering-builds/) +to the `Authorization` header. You can find your API token in your Travis CI Profile page +for [public projects](https://travis-ci.org/profile) or [private projects](https://travis-ci.com/profile), +depending on the visibility of your repository. + As public repositories do not show the Debug button, this is the only way to restart builds in the debug mode for public repositories. From 0737e75baa51c863cbec6eac9fd46051d1ee3ae2 Mon Sep 17 00:00:00 2001 From: Carla Date: Mon, 5 Mar 2018 11:07:44 +0100 Subject: [PATCH 0252/2623] Add instruction to get api token from profile page --- slate/source/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/slate/source/index.md b/slate/source/index.md index 099cc23eb6d..a949d6c60ae 100644 --- a/slate/source/index.md +++ b/slate/source/index.md @@ -233,6 +233,8 @@ To authenticate against Travis CI, you need an API access token. You can retrieve a token by using a GitHub token to prove who you are. In the future, we are planning to add a proper OAuth handshake for third party applications. +It is also possible to get your API token from your Travis CI profile page for [public repositories](https://travis-ci.org/profile) or [private repositories](https://travis-ci.com/profile). + ## With a GitHub token ```http From 96cae97546a4dddb5d0622e75cd93493c44ca974 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 15 Feb 2018 12:09:30 +0100 Subject: [PATCH 0253/2623] Trivial command to update docs with new files --- slate/Rakefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/slate/Rakefile b/slate/Rakefile index d6af6474b1d..2a6046a6fc6 100644 --- a/slate/Rakefile +++ b/slate/Rakefile @@ -1,3 +1,8 @@ require 'middleman-gh-pages' task :default => [:build] + +# This should depend on build, but build isn't working +task :update_docs do + system("cp -r build/* ../api/") +end From e30712e1c5e893c82bad6fbb844877b6718e4be3 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 15 Feb 2018 12:09:53 +0100 Subject: [PATCH 0254/2623] How to update API docs --- README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/README.md b/README.md index 0555dcd8e20..88d91eae78f 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,31 @@ via POST), Puma is necessary. 1. Open [localhost:9292](http://localhost:9292/) in your browser. +### API V2 documentation + +API V2 (and 2.1) documentation is maintained in `slate/source`. To make changes to the API V2 docs: + +1. Install the requirements in `slate/Gemfile`: + + ``` + bundle install --binstubs + ``` + +2. Build the API documentation: + + ``` + bundle exec middleman build + ``` + +3. Copy the new html files to `/api/`: + + ``` + rake update_docs + ``` + +4. Commit the changes and push to your branch. + + ## License Distributed under the [MIT license](https://opensource.org/licenses/MIT); the same as other Travis CI projects. From 059bc8cc746db27bbf492ed48955e482f7d9f158 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 15 Feb 2018 12:12:44 +0100 Subject: [PATCH 0255/2623] Update deps --- slate/Gemfile.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/slate/Gemfile.lock b/slate/Gemfile.lock index 8dcf54dac1b..590aa96bd9f 100644 --- a/slate/Gemfile.lock +++ b/slate/Gemfile.lock @@ -12,7 +12,7 @@ GEM rack (>= 1.0.0) rack-test (>= 0.5.4) xpath (~> 2.0) - chunky_png (1.3.8) + chunky_png (1.3.10) coffee-script (2.4.1) coffee-script-source execjs @@ -35,7 +35,7 @@ GEM erubis (2.7.0) eventmachine (1.2.5) execjs (2.7.0) - ffi (1.9.18) + ffi (1.9.21) haml (5.0.4) temple (>= 0.8.0) tilt @@ -91,9 +91,9 @@ GEM mime-types-data (~> 3.2015) mime-types-data (3.2016.0521) mini_portile2 (2.3.0) - minitest (5.10.3) - multi_json (1.12.2) - nokogiri (1.8.1) + minitest (5.11.3) + multi_json (1.13.1) + nokogiri (1.8.2) mini_portile2 (~> 2.3.0) padrino-helpers (0.12.8.1) i18n (~> 0.6, >= 0.6.7) @@ -132,7 +132,7 @@ GEM thor (0.20.0) thread_safe (0.3.6) tilt (1.4.1) - tzinfo (1.2.4) + tzinfo (1.2.5) thread_safe (~> 0.1) uber (0.0.15) uglifier (2.7.2) From 760e8d3ac8573fef7d934e84440ab9f069eca653 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 15 Feb 2018 12:25:13 +0100 Subject: [PATCH 0256/2623] Update deps --- slate/Gemfile | 2 +- slate/Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/slate/Gemfile b/slate/Gemfile index b0126890811..ad61147dbec 100644 --- a/slate/Gemfile +++ b/slate/Gemfile @@ -23,6 +23,6 @@ platforms :mri_18 do gem "ruby18_source_location" end -gem "rake", "~> 10.2.0" +gem "rake" gem 'therubyracer', :platforms => :ruby diff --git a/slate/Gemfile.lock b/slate/Gemfile.lock index 590aa96bd9f..5d09c08b7a5 100644 --- a/slate/Gemfile.lock +++ b/slate/Gemfile.lock @@ -106,7 +106,7 @@ GEM rack rack-test (0.8.2) rack (>= 1.0, < 3) - rake (10.2.2) + rake (12.3.0) rb-fsevent (0.10.2) rb-inotify (0.9.10) ffi (>= 0.5.0, < 2) @@ -149,11 +149,11 @@ DEPENDENCIES middleman-gh-pages middleman-livereload (~> 3.3.0) middleman-syntax - rake (~> 10.2.0) + rake redcarpet ruby18_source_location therubyracer wdm (~> 0.1.0) BUNDLED WITH - 1.16.0 + 1.16.1 From 0f35515667d3d4b6734e69d5c075f2425022226f Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 15 Feb 2018 12:28:14 +0100 Subject: [PATCH 0257/2623] port dd5d5852 --- slate/source/index.md | 96 +++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/slate/source/index.md b/slate/source/index.md index 099cc23eb6d..dda54fc66ae 100644 --- a/slate/source/index.md +++ b/slate/source/index.md @@ -1,5 +1,5 @@ --- -title: Travis CI - API Reference +title: Travis CI - API V2 Reference language_tabs: - http @@ -456,7 +456,7 @@ A user might have access to multiple accounts. This is usually the account corre ### Attributes | Attribute | Description | -| ----------- | --------------------------------------------------- | +|:------------|:----------------------------------------------------| | id | user or organization id | | name | account name on GitHub | | login | account login on GitHub | @@ -471,7 +471,7 @@ The `subscribed` attribute is only available on Travis Pro. `GET /accounts` | Parameter | Default | Description | -| --------- | ------- | ------------------------------------------------------------------------- | +|:----------|:--------|:--------------------------------------------------------------------------| | all | false | whether or not to include accounts the user does not have admin access to | This request always needs to be authenticated. @@ -590,7 +590,7 @@ end ### Attributes | Attribute | Description | -| --------- | ----------------- | +|:----------|:------------------| | id | broadcast id | | message | broadcast message | @@ -661,7 +661,7 @@ end ### Attributes | Attribute | Description | -| ------------------- | ------------------------------------------------ | +|:--------------------|:-------------------------------------------------| | id | build id | | repository_id | repository id | | commit_id | commit id | @@ -683,7 +683,7 @@ Note that `duration` might not correspond to `finished_at - started_at` if the b `GET /builds` | Parameter | Default | Description | -| ------------- | ------- | ------------------------------------------------------------------------------------------ | +|:--------------|:--------|:-------------------------------------------------------------------------------------------| | ids | | list of build ids to fetch | | repository_id | | repository id the build belongs to | | slug | | repository slug the build belongs to | @@ -696,7 +696,7 @@ You have to supply either `ids`, `repository_id` or `slug`. `GET /repos/{repository.id}/builds` | Parameter | Default | Description | -| ------------ | ------- | ---------------------------------------------------------- | +|:-------------|:--------|:-----------------------------------------------------------| | number | | filter by build number | | after_number | | list build after a given build number (use for pagination) | | event_type | | limit build to given event type (`push` or `pull_request`) | @@ -704,7 +704,7 @@ You have to supply either `ids`, `repository_id` or `slug`. `GET /repos/{+repository.slug}/builds` | Parameter | Default | Description | -| ------------ | ------- | ---------------------------------------------------------- | +|:-------------|:--------|:-----------------------------------------------------------| | number | | filter by build number | | after_number | | list build after a given build number (use for pagination) | | event_type | | limit build to given event type (`push` or `pull_request`) | @@ -786,7 +786,7 @@ repository.delete_caches(branch: 'mm-ruby-2.1') ### Attributes | Attribute | Description | -| ------------- | ----------------------------------------- | +|:--------------|:------------------------------------------| | repository_id | id of the repository the cache belongs to | | size | compressed cache size in bytes | | slug | cache slug (generated from env) | @@ -800,7 +800,7 @@ repository.delete_caches(branch: 'mm-ruby-2.1') `GET /repos/{+repository.slug}/caches` | Parameter | Default | Description | -| --------- | ------- | ------------------------------------------------------------------- | +|:----------|:--------|:--------------------------------------------------------------------| | branch | | limit listed caches to those on given branch | | match | | limit listed caches to those with `slug` containing the given value | @@ -813,7 +813,7 @@ This request always needs to be authenticated. `DELETE /repos/{+repository.slug}/caches` | Parameter | Default | Description | -| --------- | ------- | --------------------------------------------------------- | +|:----------|:--------|:----------------------------------------------------------| | branch | | only delete caches on given branch | | match | | only delete caches with `slug` containing the given value | @@ -873,7 +873,7 @@ There is no API endpoint for resolving commits, however commit data might be inc ### Attributes | Attribute | Description | -| --------------- | ----------------------- | +|:----------------|:------------------------| | id | commit id | | sha | commit sha | | branch | branch the commit is on | @@ -928,14 +928,14 @@ This request always needs to be authenticated. `PUT /hooks` | Parameter | Default | Description | -| ------------ | ------- | --------------------------------------------- | +|:-------------|:--------|:----------------------------------------------| | hook[id] | | id of the hook/repository | | hook[active] | false | whether to turn hook on (true) or off (false) | `PUT /hooks/{hook.id}` | Parameter | Default | Description | -| ------------ | ------- | --------------------------------------------- | +|:-------------|:--------|:----------------------------------------------| | hook[active] | false | whether to turn hook on (true) or off (false) | This request always needs to be authenticated. @@ -965,21 +965,21 @@ end ### Attributes -| Attribute | Description | -| -------------- | ----------------------------------------------- | -| id | job id | -| build_id | build id | -| repository_id | repository id | -| commit_id | commit id | -| log_id | log id | -| number | job number | -| config | job config (secure values and ssh key removed) | -| state | job state | -| started_at | time the job was started | -| finished_at | time the job finished | -| duration | job duration | -| queue | job queue | -| allow_failure | whether or not job state influences build state | +| Attribute | Description | +|:--------------|:------------------------------------------------| +| id | job id | +| build_id | build id | +| repository_id | repository id | +| commit_id | commit id | +| log_id | log id | +| number | job number | +| config | job config (secure values and ssh key removed) | +| state | job state | +| started_at | time the job was started | +| finished_at | time the job finished | +| duration | job duration | +| queue | job queue | +| allow_failure | whether or not job state influences build state | ### Fetch Job @@ -990,7 +990,7 @@ end

| Parameter | Default | Description | -| --------- | ------- | ---------------------- | +|:----------|:--------|:-----------------------| | ids | | list of job ids | | state | | job state to filter by | | queue | | job queue to filter by | @@ -1046,7 +1046,7 @@ end ### Attributes | Attribute | Description | -| --------- | ----------- | +|:----------|:------------| | id | log id | | job_id | job id | | body | log body | @@ -1056,7 +1056,7 @@ end You can retrieve the chunked attributes instead of the normal attributes b adding the attribute `chunked=true` to the mime-type specified in the `Accept` header. | Attribute | Description | -| --------- | ----------- | +|:----------|:------------| | id | log id | | job_id | job id | | parts | log parts | @@ -1064,7 +1064,7 @@ You can retrieve the chunked attributes instead of the normal attributes b addin The `parts` will be an array of JSON objects with the following attributes: | Attribute | Description | -| --------- | ------------ | +|:----------|:-------------| | number | part number | | content | part content | @@ -1122,7 +1122,7 @@ end The permissions endpoint will return arrays of repository ids: | Key | ids for | -| ----------- | ----------------------------------------- | +|:------------|:------------------------------------------| | permissions | repositories the user has access to | | admin | repositories the user has admin access to | | pull | repositories the user has pull access to | @@ -1183,7 +1183,7 @@ puts repository.encrypt("example") ``` | Attribute | Description | -| ----------- | ------------------------------ | +|:------------|:-------------------------------| | key | public key | | fingerprint | fingerprint for the public key | @@ -1251,7 +1251,7 @@ end ### Attributes | Attribute | Description | -| ---------------------- | ----------------------------------- | +|:-----------------------|:------------------------------------| | id | repository id | | slug | repository slug | | description | description on github | @@ -1272,7 +1272,7 @@ end ### Find Repositories | Parameter | Default | Description | -| ---------- | ------- | ------------------------------------------------------------------------- | +|:-----------|:--------|:--------------------------------------------------------------------------| | ids | | list of repository ids to fetch, cannot be combined with other parameters | | member | | filter by user that has access to it (github login) | | owner_name | | filter by owner name (first segment of slug) | @@ -1342,7 +1342,7 @@ Requests can be used to see if and why a GitHub even has or has not triggered a ### Attributes | Attribute | Description | -| ------------------- | ------------------------------------------------------------- | +|:--------------------|:--------------------------------------------------------------| | id | request id | | commit_id | commit id | | repository_id | repository id | @@ -1369,7 +1369,7 @@ Requests can be used to see if and why a GitHub even has or has not triggered a `GET /requests` | Parameter | Default | Description | -| ------------- | ------- | ------------------------------------------------------------------------ | +|:--------------|:--------|:-------------------------------------------------------------------------| | repository_id | | repository id the requests belong to | | slug | | repository slug the requests belong to | | limit | 25 | maximum number of requests to return (cannot be larger than 100) | @@ -1423,7 +1423,7 @@ repo.settings.save ### Attributes | Attribute | Description | -| --------------------------- | ---------------------------------------------------------- | +|:----------------------------|:-----------------------------------------------------------| | builds_only_with_travis_yml | "builds only with .travis.yml" setting (`true` or `false`) | | build_pushes | "build pushes" setting (`true` or `false`) | | build_pull_requests | "build pull requests" setting (`true` or `false`) | @@ -1440,7 +1440,7 @@ This request always needs to be authenticated. `PATCH /repos/{repository.id}/settings` | Parameter | Default | Description | -| --------- | ------- | --------------------------------------------------------------------------------- | +|:----------|:--------|:----------------------------------------------------------------------------------| | settings | `{}` | Hash map of settings that should be updated and their new values (see Attributes) | This request always needs to be authenticated. @@ -1494,7 +1494,7 @@ repo.env_vars['foo'] = bar ### Attributes | Attribute | Description | -| ------------- | --------------------------------------------------------- | +|:--------------|:----------------------------------------------------------| | id | env var id | | repository_id | repository id | | name | env var name (exported) | @@ -1518,7 +1518,7 @@ This request always needs to be authenticated. `POST /repos/settings/env_vars?repository_id={repository.id}` | Parameter | Default | Description | -| -------------- | ------- | ---------------------------------------- | +|:---------------|:--------|:-----------------------------------------| | env_var | | Hash map of env var variable (see below) | | env_var.name | | Name of the new env var (string) | | env_var.value | | Value of the new env var (string) | @@ -1531,7 +1531,7 @@ This request always needs to be authenticated. `PATCH /repos/settings/env_vars/{env_var.id}` | Parameter | Default | Description | -| -------------- | ------------- | ---------------------------------------- | +|:---------------|:--------------|:-----------------------------------------| | env_var | | Hash map of env var variable (see below) | | env_var.name | current value | Name of the new env var (string) | | env_var.value | current value | Value of the new env var (string) | @@ -1585,7 +1585,7 @@ puts Travis::Pro::Repository.find('my/repo').ssh_key.description ### Attributes | Attribute | Description | -| ----------- | ----------------------------------------- | +|:------------|:------------------------------------------| | id | ssh key id (corresponds to repository id) | | description | key description | | fingerprint | key fingerprint | @@ -1601,7 +1601,7 @@ This request always needs to be authenticated. `PATCH /settings/ssh_key/#{ssh_key.id}` | Parameter | Default | Description | -| ------------------- | ---------------------- | ------------------------------------ | +|:--------------------|:-----------------------|:-------------------------------------| | ssh_key | | Hash map of ssh key data (see below) | | ssh_key.description | current value or empty | key description | | ssh_key.value | | private key (required) | @@ -1661,7 +1661,7 @@ Travis.user.sync ### Attributes | Attribute | Description | -| -------------- | ----------------------------------------------------- | +|:---------------|:------------------------------------------------------| | id | user id | | login | user login on github | | name | user name on github | @@ -1741,7 +1741,7 @@ end `POST /lint` | Parameter | Default | Description | -| --------- | ------- | ---------------------------- | +|:----------|:--------|:-----------------------------| | content | | content of the `.travis.yml` | `PUT /lint` From ccddcbb2af135c1273775280c2d74a3861f61e0d Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 15 Feb 2018 12:31:21 +0100 Subject: [PATCH 0258/2623] port 68d59e6 --- slate/source/index.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/slate/source/index.md b/slate/source/index.md index dda54fc66ae..7ca30a6307c 100644 --- a/slate/source/index.md +++ b/slate/source/index.md @@ -79,6 +79,10 @@ My::Repository.find('my/repo') Welcome to the Travis CI API documentation. This is the API used by the official Travis CI web interface, so everything the web ui is able to do can also be accomplished via the API. +
+ The first thing you will have to find out is the correct API endpoint to use. - **Travis CI for open source:** For open source projects tested on [travis-ci.org](https://travis-ci.org), use ****. @@ -119,14 +123,10 @@ client.get('/repos/sinatra/sinatra') # => {"repo"=>#} ``` - - When you write your own Travis CI client, please keep the following in mind: - Always set the **User-Agent** header. This header is not required right now, but will be in the near future. Assuming your client is called "My Client", and its current version is 1.0.0, a good value would be `MyClient/1.0.0`. For our command line client running on OS X 10.9 on Ruby 2.1.1, it might look like this: `Travis/1.6.8 (Mac OS X 10.9.2 like Darwin; Ruby 2.1.1; RubyGems 2.0.14) Faraday/0.8.9 Typhoeus/0.6.7`. -- Always set the **Accept** header to `application/vnd.travis-ci.2+json`. +- Always set the **Accept** header to `application/vnd.travis-ci.2+json` to make sure that you get results from the V2 API. Any existing client library should take care of these for you. From 946bed49990eaa0c3be7fbaa6a1130ec697f99ba Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 15 Feb 2018 14:04:48 +0100 Subject: [PATCH 0259/2623] Port 092e3c8170 --- slate/source/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/slate/source/index.md b/slate/source/index.md index 7ca30a6307c..b3a4a8bdc75 100644 --- a/slate/source/index.md +++ b/slate/source/index.md @@ -1830,6 +1830,8 @@ This has the potential of code injection, use with caution. Besides the official clients, there is a range of third party client available, amongst these: + +- **[PHP API Clients Travis Client](https://github.com/php-api-clients/travis)**: Asynchronous first PHP client library - **[PHP Travis Client](https://github.com/l3l0/php-travis-client)**: PHP client library - **[Travis Node.js](https://github.com/pwmckenna/node-travis-ci)**: Node.js client library - **[travis-api-wrapper](https://github.com/cmaujean/travis-api-wrapper)**: Asynchronous Node.js wrapper From 65604803dbdc523a9ec3ad52a34340663c487612 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 15 Feb 2018 14:15:14 +0100 Subject: [PATCH 0260/2623] Fixes #880 --- slate/source/index.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/slate/source/index.md b/slate/source/index.md index b3a4a8bdc75..449b9c36172 100644 --- a/slate/source/index.md +++ b/slate/source/index.md @@ -396,7 +396,7 @@ Some client libraries will automate this handshake for you. ``` -You can also trigger a full OAuth handshake between Travis CI and GitHub by opening `/auth/handshake` in a web browser. The endpoint takes an optional `redirect_to` query parameter, which takes a URL the web browser will end up on if the handshake is successful. +You can also trigger a full OAuth handshake between Travis CI and GitHub by opening `/auth/handshake` in a web browser. The endpoint takes an optional `redirect_uri` query parameter, which takes a URL the web browser will end up on if the handshake is successful. There is an alternative version of this that will try to run the handshake in a hidden iframe and using `window.postMessage` to hand the token to the website embedding the iframe. **This endpoint will only work for whitelisted websites.** @@ -732,7 +732,7 @@ This request always needs to be authenticated. ## Caches ```http -GET /repos/travis-pro/billing/builds HTTP/1.1 +GET /repos/travis-pro/billing/caches HTTP/1.1 User-Agent: MyClient/1.0.0 Accept: application/vnd.travis-ci.2+json Authorization: token YOUR TRAVIS ACCESS TOKEN @@ -977,7 +977,6 @@ end | state | job state | | started_at | time the job was started | | finished_at | time the job finished | -| duration | job duration | | queue | job queue | | allow_failure | whether or not job state influences build state | @@ -1013,7 +1012,7 @@ This request always needs to be authenticated. ## Logs ```http -GET /jobs/42/logs HTTP/1.1 +GET /jobs/42/log HTTP/1.1 User-Agent: MyClient/1.0.0 Accept: text/plain Host: api.travis-ci.org @@ -1053,7 +1052,7 @@ end ### Chunked Attributes -You can retrieve the chunked attributes instead of the normal attributes b adding the attribute `chunked=true` to the mime-type specified in the `Accept` header. +You can retrieve the chunked attributes instead of the normal attributes by adding the attribute `chunked=true` to the mime-type specified in the `Accept` header. | Attribute | Description | |:----------|:------------| @@ -1151,7 +1150,7 @@ HTTP/1.1 200 OK Content-Type: application/json { - "public_key": "-----BEGIN RSA PUBLIC KEY-----\\nMIGJAoGBAOcx131amMqIzm5+FbZz+DhIgSDbFzjKKpzaN5UWVCrLSc57z64xxTV6\\nkaOTZmjCWz6WpaPkFZY+czfL7lmuZ/Y6UNm0vupvdZ6t27SytFFGd1/RJlAe89tu\\nGcIrC1vtEvQu2frMLvHqFylnGd5Gy64qkQT4KRhMsfZctX4z5VzTAgMBAAE=\\n-----END RSA PUBLIC KEY-----\\n", + "key": "-----BEGIN RSA PUBLIC KEY-----\\nMIGJAoGBAOcx131amMqIzm5+FbZz+DhIgSDbFzjKKpzaN5UWVCrLSc57z64xxTV6\\nkaOTZmjCWz6WpaPkFZY+czfL7lmuZ/Y6UNm0vupvdZ6t27SytFFGd1/RJlAe89tu\\nGcIrC1vtEvQu2frMLvHqFylnGd5Gy64qkQT4KRhMsfZctX4z5VzTAgMBAAE=\\n-----END RSA PUBLIC KEY-----\\n", "fingerprint": "ef:39:56:6e:2a:09:a2:10:2e:b5:39:ac:3d:3e:e1:05" } ``` @@ -1337,7 +1336,7 @@ Travis::Repository.find('sinatra/sinatra').requests.each do |request| end ``` -Requests can be used to see if and why a GitHub even has or has not triggered a new build. +Requests can be used to see if and why a GitHub event has or has not triggered a new build. ### Attributes From 3d1acd7b55158ab3c24e8dc9573063efb8dfaa61 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Thu, 15 Feb 2018 14:16:40 +0100 Subject: [PATCH 0261/2623] Update the API docs with changes to slate.md --- api/index.html | 1406 ++++++++++++++---------------- api/javascripts/all.js | 4 +- api/javascripts/jquery.tocify.js | 2 +- api/javascripts/jquery_ui.js | 2 +- api/javascripts/lang_selector.js | 2 +- api/stylesheets/print.css | 2 +- api/stylesheets/screen.css | 2 +- api/stylesheets/syntax.css | 2 +- 8 files changed, 643 insertions(+), 779 deletions(-) diff --git a/api/index.html b/api/index.html index 07fa448a756..639e3579899 100644 --- a/api/index.html +++ b/api/index.html @@ -1,4 +1,3 @@ - @@ -10,10 +9,10 @@ Travis CI - API V2 Reference - - + + - + @@ -61,54 +48,45 @@
-

The Travis CI logo

+

- -

Overview

-
GET / HTTP/1.1
+
GET / HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Host: api.travis-ci.org
-
-
GET / HTTP/1.1
+
GET / HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Authorization: token "YOUR TRAVIS ACCESS TOKEN"
 Host: api.travis-ci.com
-
-
GET /api HTTP/1.1
+
GET /api HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Authorization: token "YOUR TRAVIS ACCESS TOKEN"
 Host: travis.example.com
-
-
$ travis raw /
-{"hello"=>"world"}
+
$ travis raw /
+{"hello"=>"world"}
 
-$ travis raw / --pro
-{"hello"=>"world"}
+$ travis raw / --pro
+{"hello"=>"world"}
 
-$ travis raw / --api-endpoint https://travis.example.com/api
-{"hello"=>"world"}
-
-
require 'travis'
+$ travis raw / --api-endpoint https://travis.example.com/api
+{"hello"=>"world"}
+
require 'travis'
 
 # talk to travis-ci.org via client object
 client = Travis::Client.new
@@ -135,39 +113,35 @@ 

Overview

My = Travis::Client::Namespaces.new('https://travis.example.com/api') My.access_token = 'YOUR TRAVIS ACCESS TOKEN' My::Repository.find('my/repo') -
- +

Welcome to the Travis CI API documentation. This is the API used by the official Travis CI web interface, so everything the web ui is able to do can also be accomplished via the API.

-

+

The first thing you will have to find out is the correct API endpoint to use.

Note that both Pro and Enterprise will require almost all API calls to be authenticated.

Making Requests

-
GET / HTTP/1.1
+
GET / HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {"hello":"world"}
-
-
$ travis raw /
+
$ travis raw /
 {"hello":"world"}
-
-
require 'travis'
+
require 'travis'
 
 # You usually don't want to fire API requests manually
 client = Travis::Client.new
@@ -175,24 +149,22 @@ 

Making Requests

client.get('/repos/sinatra/sinatra') # => {"repo"=>#<Travis::Client::Repository: sinatra/sinatra>} -
- +

When you write your own Travis CI client, please keep the following in mind:

    -
  • Always set the User-Agent header. This header is not required right now, but will be in the near future. Assuming your client is called “My Client”, and it’s current version is 1.0.0, a good value would be MyClient/1.0.0. For our command line client running on OS X 10.9 on Ruby 2.1.1, it might look like this: Travis/1.6.8 (Mac OS X 10.9.2 like Darwin; Ruby 2.1.1; RubyGems 2.0.14) Faraday/0.8.9 Typhoeus/0.6.7.
  • -
  • Always set the Accept header to application/vnd.travis-ci.2+json to make sure that you use get results from the V2 API
  • +
  • Always set the User-Agent header. This header is not required right now, but will be in the near future. Assuming your client is called “My Client”, and its current version is 1.0.0, a good value would be MyClient/1.0.0. For our command line client running on OS X 10.9 on Ruby 2.1.1, it might look like this: Travis/1.6.8 (Mac OS X 10.9.2 like Darwin; Ruby 2.1.1; RubyGems 2.0.14) Faraday/0.8.9 Typhoeus/0.6.7.
  • +
  • Always set the Accept header to application/vnd.travis-ci.2+json to make sure that you get results from the V2 API.

Any existing client library should take care of these for you.

External APIs

-
GET /config HTTP/1.1
+
GET /config HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -203,26 +175,24 @@ 

External APIs

"api_url": "https://api.github.com", "scopes": [ "read:org", "user:email", "repo_deployment", - "repo:status","public_repo", "write:repo_hook" + "repo:status", "write:repo_hook" ] } } } -
-
$ travis raw /config
-{"config"=>
-  {"host"=>"travis-ci.org",
-   "pusher"=>{"key"=>"5df8ac576dcccf4fd076"},
-   "github"=>
-    {"api_url"=>"https://api.github.com",
-     "scopes"=>
+
$ travis raw /config
+{"config"=>
+  {"host"=>"travis-ci.org",
+   "pusher"=>{"key"=>"5df8ac576dcccf4fd076"},
+   "github"=>
+    {"api_url"=>"https://api.github.com",
+     "scopes"=>
       ["read:org",
        "user:email",
        "repo_deployment",
        "repo:status",
        "write:repo_hook"]}}}
-
-
require 'travis'
+
require 'travis'
 client = Travis::Client.new
 client.config
 # => {"host"=>"travis-ci.org",
@@ -235,8 +205,7 @@ 

External APIs

# "repo_deployment", # "repo:status", # "write:repo_hook"]}} -
- +

Travis CI integrates with external services, some of which your client library might want to interface with directly. Most prominently, it uses GitHub as source for users, organizations and repositories, and Pusher for live streaming logs.

@@ -250,15 +219,13 @@

External APIs

Authentication

-
GET /users HTTP/1.1
+
GET /users HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Host: api.travis-ci.org
 Authorization: token "YOUR TRAVIS ACCESS TOKEN"
-
-
$ travis whoami -t "YOUR TRAVIS ACCESS TOKEN"
-
-
require 'travis'
+
$ travis whoami -t "YOUR TRAVIS ACCESS TOKEN"
+
require 'travis'
 
 # against the Travis namespace
 Travis.access_token = 'YOUR TRAVIS ACCESS TOKEN'
@@ -267,18 +234,17 @@ 

Authentication

# against a client object client = Travis::Client.new(access_token: 'YOUR TRAVIS ACCESS TOKEN') client.user -
- -

+

+

To authenticate against Travis CI, you need an API access token.

You can retrieve a token by using a GitHub token to prove who you are. In the future, we are planning to add a proper OAuth handshake for third party applications.

With a GitHub token

-
POST /auth/github HTTP/1.1
+
POST /auth/github HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Host: api.travis-ci.org
@@ -286,19 +252,16 @@ 

With a GitHub token

Content-Length: 37 {"github_token":"YOUR GITHUB TOKEN"} -
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {"access_token":"YOUR TRAVIS ACCESS TOKEN"}
-
-
$ travis login --github-token "YOUR GITHUB TOKEN"
-Successfully logged in!
+
$ travis login --github-token "YOUR GITHUB TOKEN"
+Successfully logged in!
 
-$ travis token
+$ travis token
 Your access token is YOUR TRAVIS ACCESS TOKEN
-
-
require 'travis'
+
require 'travis'
 
 # against the Travis namespace
 Travis.github_auth(token)
@@ -306,15 +269,14 @@ 

With a GitHub token

# against a client object client = Travis::Client.new client.github_auth(token) -
- +

If you have a GitHub token, you can use the GitHub authentication endpoint to exchange it for an access token. The Travis API server will not store the token or use it for anything else than verifying the user account.

Note that therefore the API cannot be used to create new user accounts. The user will have to log in at least once via the web interface before interfacing with the API by other means.

Creating a temporary GitHub token

-
POST /authorizations HTTP/1.1
+
POST /authorizations HTTP/1.1
 Host: api.github.com
 Content-Type: application/json
 Authorization: Basic ...
@@ -322,13 +284,11 @@ 

Creating a temporary GitHub token

{ "scopes": [ "read:org", "user:email", "repo_deployment", - "repo:status", - "public_repo", "write:repo_hook" + "repo:status", "write:repo_hook" ], "note": "temporary token to auth against travis" } -
-
HTTP/1.1 201 Created
+
HTTP/1.1 201 Created
 Content-Type: application/json
 
 {
@@ -336,14 +296,12 @@ 

Creating a temporary GitHub token

"url": "https://api.github.com/authorizations/1", "scopes": [ "read:org", "user:email", "repo_deployment", - "repo:status", - "public_repo", "write:repo_hook" + "repo:status", "write:repo_hook" ], "token": "YOUR GITHUB TOKEN", "note": "temporary token to auth against travis" } -
-
POST /auth/github HTTP/1.1
+
POST /auth/github HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Host: api.travis-ci.org
@@ -351,27 +309,23 @@ 

Creating a temporary GitHub token

Content-Length: 37 {"github_token":"YOUR GITHUB TOKEN"} -
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {"access_token":"YOUR TRAVIS ACCESS TOKEN"}
-
-
DELETE /authorizations/1 HTTP/1.1
+
DELETE /authorizations/1 HTTP/1.1
 Host: api.github.com
 Authorization: Basic ...
-
-
$ travis login --auto
-Successfully logged in!
+
$ travis login --auto
+Successfully logged in!
 
-$ travis token
+$ travis token
 Your access token is YOUR TRAVIS ACCESS TOKEN
-
-
require 'travis'
+
require 'travis'
 require 'travis/tools/github'
 
 # drop_token will make the token a temporary one
-github = Travis::Tools::GitHub.new(drop_token: true) do |g|
+github = Travis::Tools::Github.new(drop_token: true) do |g|
   g.ask_login    = -> { print("GitHub login:     "); gets }
   g.ask_password = -> { print("Password:         "); gets }
   g.ask_otp      = -> { print("Two-factor token: "); gets }
@@ -382,11 +336,10 @@ 

Creating a temporary GitHub token

end Travis.access_token # => "YOUR TRAVIS ACCESS TOKEN" -
- +

Since Travis CI will not store the GitHub token handed to it for authentication, it is possible to generate a temporary GitHub token and remove it again after the authentication handshake.

-

To create and delete the GitHub token, you can either use the GitHub web interface or automate it via the GitHub API.

+

To create and delete the GitHub token, you can either use the GitHub web interface or automate it via the GitHub API.

Make sure your GitHub token has the scopes required by Travis CI.

@@ -405,13 +358,12 @@

GitHub OAuth handshake

Triggering an OAuth handshake between GitHub and Travis CI:

-
<a href="https://api.travis-ci.com/auth/handshake">log in</a>
-
- +
<a href="https://api.travis-ci.com/auth/handshake">log in</a>
+

Running the OAuth handshake in an iframe:

-
<script>
+
<script>
   window.addEventListener("message", function(event) {
     console.log("received token: " + event.data.token);
   });
@@ -420,8 +372,7 @@ 

GitHub OAuth handshake

iframe.appendTo('body'); iframe.attr('src', "https://api.travis-ci.org/auth/post_message"); </script> -
- +

You can also trigger a full OAuth handshake between Travis CI and GitHub by opening /auth/handshake in a web browser. The endpoint takes an optional redirect_uri query parameter, which takes a URL the web browser will end up on if the handshake is successful.

There is an alternative version of this that will try to run the handshake in a hidden iframe and using window.postMessage to hand the token to the website embedding the iframe. This endpoint will only work for whitelisted websites.

@@ -429,13 +380,12 @@

GitHub OAuth handshake

Entities

Accounts

-
GET /accounts HTTP/1.1
+
GET /accounts HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Host: api.travis-ci.org
 Authorization: token "YOUR TRAVIS ACCESS TOKEN"
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -456,52 +406,49 @@ 

Accounts

} ] } -
-
$ travis accounts
+
$ travis accounts
 rkh (Konstantin Haase): subscribed, 167 repositories
 travis-ci (Travis CI): subscribed, 70 repositories
-
-
require 'travis'
+
require 'travis'
 Travis.access_token = 'YOUR TRAVIS ACCESS TOKEN'
 
 Travis.accounts.each do |account|
   puts "#{account.login} has #{account.repos_count}"
 end
-
- +

A user might have access to multiple accounts. This is usually the account corresponding to the user directly and one account per GitHub organization.

Attributes

- - + + - - + + - - + + - - + + - - + + - - + + - - + +
AttributeDescriptionAttributeDescription
iduser or organization ididuser or organization id
nameaccount name on GitHubnameaccount name on GitHub
loginaccount login on GitHubloginaccount login on GitHub
typeuser or organizationtypeuser or organization
repos_countnumber of repositoriesrepos_countnumber of repositories
subscribedwhether or not the account has a valid subscriptionsubscribedwhether or not the account has a valid subscription
@@ -513,27 +460,26 @@

List accounts

- - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
allfalsewhether or not to include accounts the user does not have admin access toallfalsewhether or not to include accounts the user does not have admin access to

This request always needs to be authenticated.

Branches

-
GET /repos/rails/rails/branches HTTP/1.1
+
GET /repos/rails/rails/branches HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -553,15 +499,13 @@ 

Branches

} ] } -
-
$ travis branches -r rails/rails
+
$ travis branches -r rails/rails
 v4.1.0:         #15184 created  Dont encourage aliases now that …
 master:         #15183 created  Dont abbreviate that which needs…
 4-1-0:          #15183 created  Dont encourage aliases now that …
 4-1-stable:     #15185 created  Merge branch '4-1-0' into 4-1-st…
 adequaterecord: #15158 passed   wrap the literal value before ha…
-
-
require 'travis'
+
require 'travis'
 
 repository = Travis::Repository.find('rails/rails')
 repository.branches
@@ -571,8 +515,7 @@ 

Branches

# "4-1-stable" => #<Travis::Client::Build: rails/rails#15185>, # "adequaterecord" => #<Travis::Client::Build: rails/rails#15158>, # "4-0-stable" => #<Travis::Client::Build: rails/rails#15143>} -
- +

The branches API can be used to get information about the latest build on a given branch.

Attributes

@@ -594,13 +537,12 @@

Show Branch

GET /repos/{+repository.slug}/branches/{branch}

Broadcasts

-
GET /broadcasts HTTP/1.1
+
GET /broadcasts HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Authorization: token YOUR TRAVIS ACCESS TOKEN
 Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -611,32 +553,29 @@ 

Broadcasts

} ] } -
-
$ travis raw /broadcasts
-{"broadcasts"=>[{"id"=>451, "message"=>"This is a broadcast!"}]}
-
-
require 'travis'
+
$ travis raw /broadcasts
+{"broadcasts"=>[{"id"=>451, "message"=>"This is a broadcast!"}]}
+
require 'travis'
 
 Travis::Broadcast.current.each do |broadcast|
   puts broadcast.message
 end
-
- +

Attributes

- - + + - - + + - - + +
AttributeDescriptionAttributeDescription
idbroadcast ididbroadcast id
messagebroadcast messagemessagebroadcast message
@@ -647,12 +586,11 @@

List Broadcasts

This request always needs to be authenticated.

Builds

-
GET /repos/sinatra/sinatra/builds HTTP/1.1
+
GET /repos/sinatra/sinatra/builds HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -676,17 +614,15 @@ 

Builds

"jobs": [ ], "commits": [ ] } -
-
$ travis history
+
$ travis history
 ...
-$ travis show 15 # show build #15
+$ travis show 15 # show build #15
 ...
-$ travis restart 15
+$ travis restart 15
 ...
-$ travis cancel 15
+$ travis cancel 15
 ...
-
-
require 'travis'
+
require 'travis'
 Travis.access_token = 'YOUR TRAVIS ACCESS TOKEN'
 
 repository = Travis::Repository.find('my/repo')
@@ -694,67 +630,66 @@ 

Builds

# restart all the builds build.restart end -
- +

Attributes

- - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + +
AttributeDescriptionAttributeDescription
idbuild ididbuild id
repository_idrepository idrepository_idrepository id
commit_idcommit idcommit_idcommit id
numberbuild numbernumberbuild number
pull_requesttrue or falsepull_requesttrue or false
pull_request_titlePR title if pull_request is truepull_request_titlePR title if pull_request is true
pull_request_numberPR number if pull_request is truepull_request_numberPR number if pull_request is true
configbuild config (secure values and ssh key removed)configbuild config (secure values and ssh key removed)
statebuild statestatebuild state
started_attime the build was startedstarted_attime the build was started
finished_attime the build finishedfinished_attime the build finished
durationbuild durationdurationbuild duration
job_idslist of job ids in the build matrixjob_idslist of job ids in the build matrix
@@ -766,40 +701,40 @@

List Builds

- - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
idslist of build ids to fetchidslist of build ids to fetch
repository_idrepository id the build belongs torepository_idrepository id the build belongs to
slugrepository slug the build belongs toslugrepository slug the build belongs to
numberfilter by build number, requires slug or repository_idnumberfilter by build number, requires slug or repository_id
after_numberlist build after a given build number (use for pagination), requires slug or repository_idafter_numberlist build after a given build number (use for pagination), requires slug or repository_id
event_typelimit build to given event type (push or pull_request)event_typelimit build to given event type (push or pull_request)
@@ -809,25 +744,25 @@

List Builds

- - - + + + - - - + + + - - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
numberfilter by build numbernumberfilter by build number
after_numberlist build after a given build number (use for pagination)after_numberlist build after a given build number (use for pagination)
event_typelimit build to given event type (push or pull_request)event_typelimit build to given event type (push or pull_request)
@@ -835,25 +770,25 @@

List Builds

- - - + + + - - - + + + - - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
numberfilter by build numbernumberfilter by build number
after_numberlist build after a given build number (use for pagination)after_numberlist build after a given build number (use for pagination)
event_typelimit build to given event type (push or pull_request)event_typelimit build to given event type (push or pull_request)
@@ -878,13 +813,12 @@

Restart Build

This request always needs to be authenticated.

Caches

-
GET /repos/travis-pro/billing/caches HTTP/1.1
+
GET /repos/travis-pro/billing/caches HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Authorization: token YOUR TRAVIS ACCESS TOKEN
 Host: api.travis-ci.com
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -898,8 +832,7 @@ 

Caches

} ] } -
-
$ travis cache -r travis-pro/billing
+
$ travis cache -r travis-pro/billing
 On branch master:
 cache--rvm-2.0.0--gemfile-Gemfile  last modified: 2014-03-06 11:19:49  size: 98.87 MiB
 
@@ -909,9 +842,8 @@ 

Caches

Overall size of above caches: 371.08 MiB -$ travis cache -r travis-pro/billing --delete --branch mm-ruby-2.1 -
-
require 'travis'
+$ travis cache -r travis-pro/billing --delete --branch mm-ruby-2.1
+
require 'travis'
 
 repository = Travis::Repository.find('travis-pro/billing')
 repository.caches.each do |cache|
@@ -921,35 +853,34 @@ 

Caches

# or in a single request repository.delete_caches(branch: 'mm-ruby-2.1') -
- +

Attributes

- - + + - - + + - - + + - - + + - - + + - - + +
AttributeDescriptionAttributeDescription
repository_idid of the repository the cache belongs torepository_idid of the repository the cache belongs to
sizecompressed cache size in bytessizecompressed cache size in bytes
slugcache slug (generated from env)slugcache slug (generated from env)
branchbranch the cache is forbranchbranch the cache is for
last_modifiedlast time the cache was updatedlast_modifiedlast time the cache was updated
@@ -961,20 +892,20 @@

List caches

- - - + + + - - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
branchlimit listed caches to those on given branchbranchlimit listed caches to those on given branch
matchlimit listed caches to those with slug containing the given valuematchlimit listed caches to those with slug containing the given value
@@ -988,32 +919,31 @@

Delete caches

- - - + + + - - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
branchonly delete caches on given branchbranchonly delete caches on given branch
matchonly delete caches with slug containing the given valuematchonly delete caches with slug containing the given value

This request always needs to be authenticated.

Commits

-
GET /repos/sinatra/sinatra/builds HTTP/1.1
+
GET /repos/sinatra/sinatra/builds HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -1024,7 +954,7 @@ 

Commits

"id": 1873023, "sha": "a18f211f6f921affd1ecd8c18691b40d9948aae5", "branch": "master", - "message": "Merge pull request #25 from henrikhodne/add-responses-to-documentation\n\nAdd responses to documentation", + "message": "Merge pull request #25 from henrikhodne/add-responses-to-documentation\n\nAdd responses to documentation", "committed_at": "2013-04-15T09:44:31Z", "author_name": "Henrik Hodne", "author_email": "me@henrikhodne.com", @@ -1034,74 +964,71 @@

Commits

} ] } -
-
$ travis history -r sinatra/sinatra
+
$ travis history -r sinatra/sinatra
 #784 failed:     master Merge pull request #861 from kant/patch-1
 #783 passed:     v1.4.5 v1.4.5
 #782 passed:     master v1.4.5
-
-
require 'travis'
+
require 'travis'
 
 repository = Travis::Repository.find('my/repo')
 repository.each_build do |build|
   puts build.commit.message
 end
-
- +

There is no API endpoint for resolving commits, however commit data might be included in other API responses, like builds or jobs.

Attributes

- - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + +
AttributeDescriptionAttributeDescription
idcommit ididcommit id
shacommit shashacommit sha
branchbranch the commit is onbranchbranch the commit is on
messagecommit messagemessagecommit message
committed_atcommit datecommitted_atcommit date
author_nameauthor nameauthor_nameauthor name
author_emailauthor emailauthor_emailauthor email
committer_namecommitter namecommitter_namecommitter name
committer_emailcommitter emailcommitter_emailcommitter email
compare_urllink to diff on GitHubcompare_urllink to diff on GitHub

Hooks

-
PUT /hooks HTTP/1.1
+
PUT /hooks HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Authorization: token YOUR TRAVIS ACCESS TOKEN
@@ -1114,14 +1041,11 @@ 

Hooks

"active": true } } -
-
$ travis enable -r my/repo
-
-
require 'travis'
+
$ travis enable -r my/repo
+
require 'travis'
 Travis.access_token = 'YOUR TRAVIS ACCESS TOKEN'
 Travis.hooks.each { |hook| hook.enable }
-
- +

Attributes

See repository.

@@ -1132,26 +1056,26 @@

List Hooks

This request always needs to be authenticated.

-

Enable/Disable Hook

+

Enable/Disable Hook

PUT /hooks

- - - + + + - - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
hook[id]id of the hook/repositoryhook[id]id of the hook/repository
hook[active]falsewhether to turn hook on (true) or off (false)hook[active]falsewhether to turn hook on (true) or off (false)
@@ -1159,92 +1083,89 @@

Enable/Disable Hook

- - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
hook[active]falsewhether to turn hook on (true) or off (false)hook[active]falsewhether to turn hook on (true) or off (false)

This request always needs to be authenticated.

Jobs

-
POST /jobs/42/restart HTTP/1.1
+
POST /jobs/42/restart HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Authorization: token YOUR TRAVIS ACCESS TOKEN
 Host: api.travis-ci.org
-
-
$ travis restart 1.2 -r my/repo
-
-
require 'travis'
+
$ travis restart 1.2 -r my/repo
+
require 'travis'
 Travis.access_token = 'YOUR TRAVIS ACCESS TOKEN'
 
 Travis.repos('my/repo').last_build.jobs.each do |job|
   job.restart if job.failed?
 end
-
- +

Attributes

- - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + +
AttributeDescriptionAttributeDescription
idjob ididjob id
build_idbuild idbuild_idbuild id
repository_idrepository idrepository_idrepository id
commit_idcommit idcommit_idcommit id
log_idlog idlog_idlog id
numberjob numbernumberjob number
configjob config (secure values and ssh key removed)configjob config (secure values and ssh key removed)
statejob statestatejob state
started_attime the job was startedstarted_attime the job was started
finished_attime the job finishedfinished_attime the job finished
queuejob queuequeuejob queue
allow_failurewhether or not job state influences build stateallow_failurewhether or not job state influences build state
@@ -1254,29 +1175,29 @@

Fetch Job

Fetch multiple jobs

-

+ - - - + + + - - - + + + - - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
idslist of job idsidslist of job ids
statejob state to filter bystatejob state to filter by
queuejob queue to filter byqueuejob queue to filter by
@@ -1296,20 +1217,17 @@

Restart Job

This request always needs to be authenticated.

Logs

-
GET /jobs/42/log HTTP/1.1
+
GET /jobs/42/log HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: text/plain
 Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type text/plain
 
 Using worker: ...
-
-
$ travis logs
+
$ travis logs
 ... logs ...
-
-
require 'travis'
+
require 'travis'
 
 rails = Travis::Repository.find('rails/rails')
 job   = rails.last_build.jobs.first
@@ -1318,27 +1236,26 @@ 

Logs

job.log.body do |part| print part end -
- +

Attributes

- - + + - - + + - - + + - - + +
AttributeDescriptionAttributeDescription
idlog ididlog id
job_idjob idjob_idjob id
bodylog bodybodylog body
@@ -1348,21 +1265,21 @@

Chunked Attributes

- - + + - - + + - - + + - - + +
AttributeDescriptionAttributeDescription
idlog ididlog id
job_idjob idjob_idjob id
partslog partspartslog parts
@@ -1370,17 +1287,17 @@

Chunked Attributes

- - + + - - + + - - + +
AttributeDescriptionAttributeDescription
numberpart numbernumberpart number
contentpart contentcontentpart content
@@ -1390,9 +1307,9 @@

Fetching a Log

Fetching Logs as plain text

-

+ -

GET /jobs/{job.id}/log

+

GET /jobs/{job.id}/logs

This might be necessary if the log has been archived, in which case it will result in a redirect.

@@ -1401,13 +1318,12 @@

Streaming Logs

To stream the logs, you will have to subscribe to the channel for the job the log belongs to on Pusher (channel is job-{job.id}) and listen for job:log events. The payload will have the same format as parts have in the chunked attributes API payloads.

Permissions

-
GET /users/permissions HTTP/1.1
+
GET /users/permissions HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Authorization: token YOUR TRAVIS ACCESS TOKEN
 Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -1416,41 +1332,37 @@ 

Permissions

"pull": [], "push": [3] } -
-
$ travis repos
-
-
-
require 'travis'
+
$ travis repos
+
require 'travis'
 Travis.access_token = 'YOUR TRAVIS ACCESS TOKEN'
 
 Travis.user.push_access.each do |repo|
   puts "has push access to #{repo.slug}"
 end
-
- +

The permissions endpoint will return arrays of repository ids:

- - + + - - + + - - + + - - + + - - + +
Keyids forKeyids for
permissionsrepositories the user has access topermissionsrepositories the user has access to
adminrepositories the user has admin access toadminrepositories the user has admin access to
pullrepositories the user has pull access topullrepositories the user has pull access to
pushrepositories the user has push access topushrepositories the user has push access to
@@ -1463,56 +1375,52 @@

Fetch Permissions

This request always needs to be authenticated.

Repository Keys

-
GET /repos/sinatra/sinatra/key HTTP/1.1
+
GET /repos/sinatra/sinatra/key HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Authorization: token YOUR TRAVIS ACCESS TOKEN
 Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
-  "key": "-----BEGIN RSA PUBLIC KEY-----\\nMIGJAoGBAOcx131amMqIzm5+FbZz+DhIgSDbFzjKKpzaN5UWVCrLSc57z64xxTV6\\nkaOTZmjCWz6WpaPkFZY+czfL7lmuZ/Y6UNm0vupvdZ6t27SytFFGd1/RJlAe89tu\\nGcIrC1vtEvQu2frMLvHqFylnGd5Gy64qkQT4KRhMsfZctX4z5VzTAgMBAAE=\\n-----END RSA PUBLIC KEY-----\\n",
+  "key": "-----BEGIN RSA PUBLIC KEY-----\\nMIGJAoGBAOcx131amMqIzm5+FbZz+DhIgSDbFzjKKpzaN5UWVCrLSc57z64xxTV6\\nkaOTZmjCWz6WpaPkFZY+czfL7lmuZ/Y6UNm0vupvdZ6t27SytFFGd1/RJlAe89tu\\nGcIrC1vtEvQu2frMLvHqFylnGd5Gy64qkQT4KRhMsfZctX4z5VzTAgMBAAE=\\n-----END RSA PUBLIC KEY-----\\n",
   "fingerprint": "ef:39:56:6e:2a:09:a2:10:2e:b5:39:ac:3d:3e:e1:05"
 }
-
-
$ travis pubkey -r travis-ci/travis-api
+
$ travis pubkey -r travis-ci/travis-api
 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCOmOkC6MYRH1w2ib3AIC00GNwmgr8ch3mNHZ16x6cvSMjc6cURZt9Hav6gz03P5+9e5Vw1ztm3hvPR+IJsyOV/CSsYf1Cgboj6ZJ7tr3xOJXcqcMVfiGiG7Km6/psRdn0jrjTpU/qcru8Wx3zbQEf5NuXQyMVHmnl8/5w0WPV/Uw==
 
-$ travis pubkey --pem -r travis-ci/travis-api
------BEGIN RSA PUBLIC KEY-----
+$ travis pubkey --pem -r travis-ci/travis-api
+-----BEGIN RSA PUBLIC KEY-----
 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCOmOkC6MYRH1w2ib3AIC00GNwm
 gr8ch3mNHZ16x6cvSMjc6cURZt9Hav6gz03P5+9e5Vw1ztm3hvPR+IJsyOV/CSsY
 f1Cgboj6ZJ7tr3xOJXcqcMVfiGiG7Km6/psRdn0jrjTpU/qcru8Wx3zbQEf5NuXQ
 yMVHmnl8/5w0WPV/UwIDAQAB
------END RSA PUBLIC KEY-----
+-----END RSA PUBLIC KEY-----
 
-$ travis pubkey --fingerprint -r travis-ci/travis-api
+$ travis pubkey --fingerprint -r travis-ci/travis-api
 99:66:93:03:41:0b:f1:f7:61:83:16:61:fa:47:c0:8f
-
-
require 'travis'
+
require 'travis'
 repo = Travis::Repository.find('travis-ci/travis-api')
 
 puts "SSH format:  ", repo.key.to_ssh
 puts "PEM format:  ", repo.key.to_s
 puts "Fingerprint: ", repo.key.fingerprint
 puts repository.encrypt("example")
-
- +
- - + + - - + + - - + +
AttributeDescriptionAttributeDescription
keypublic keykeypublic key
fingerprintfingerprint for the public keyfingerprintfingerprint for the public key
@@ -1535,13 +1443,12 @@

Generate a Public Key

This request always needs to be authenticated.

Repositories

-
GET /repos/sinatra/sinatra HTTP/1.1
+
GET /repos/sinatra/sinatra HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Authorization: token YOUR TRAVIS ACCESS TOKEN
 Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -1558,64 +1465,61 @@ 

Repositories

"active": "true" } } -
-
$ travis show -r travis-ci/travis-api
+
$ travis show -r travis-ci/travis-api
 ...
-
-
require 'travis'
+
require 'travis'
 repos = Travis::Repository.find_all(owner_name: 'sinatra')
 repos.each do |repo|
   puts repo.slug
 end
-
- +

Attributes

- - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + +
AttributeDescriptionAttributeDescription
idrepository ididrepository id
slugrepository slugslugrepository slug
descriptiondescription on githubdescriptiondescription on github
last_build_idbuild id of the last buildlast_build_idbuild id of the last build
last_build_numberbuild number of the last buildlast_build_numberbuild number of the last build
last_build_statebuild state of the last buildlast_build_statebuild state of the last build
last_build_durationbuild duration of the last buildlast_build_durationbuild duration of the last build
last_build_started_atbuild started at of the last buildlast_build_started_atbuild started at of the last build
last_build_finished_atbuild finished at of the last buildlast_build_finished_atbuild finished at of the last build
activerepository's active statusactiverepository’s active status
@@ -1629,53 +1533,52 @@

Find Repositories

- - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
idslist of repository ids to fetch, cannot be combined with other parametersidslist of repository ids to fetch, cannot be combined with other parameters
memberfilter by user that has access to it (github login)memberfilter by user that has access to it (github login)
owner_namefilter by owner name (first segment of slug)owner_namefilter by owner name (first segment of slug)
slugfilter by slugslugfilter by slug
searchfilter by search termsearchfilter by search term
activefalseif true, will only return repositories that are enabledactivefalseif true, will only return repositories that are enabled

If no parameters are given, a list or repositories with recent activity is returned.

Requests

-
GET /requests/6301283 HTTP/1.1
+
GET /requests/6301283 HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Authorization: token YOUR TRAVIS ACCESS TOKEN
 Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -1704,90 +1607,87 @@ 

Requests

"compare_url": "https://github.com/..." } } -
-
$ travis requests -r my/repo
+
$ travis requests -r my/repo
 ...
-
-
require 'travis'
+
require 'travis'
 
 Travis::Repository.find('sinatra/sinatra').requests.each do |request|
   puts "#{request.commit.sha}: #{request.result}"
 end
-
- +

Requests can be used to see if and why a GitHub event has or has not triggered a new build.

Attributes

- - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + +
AttributeDescriptionAttributeDescription
idrequest ididrequest id
commit_idcommit idcommit_idcommit id
repository_idrepository idrepository_idrepository id
created_atcreated atcreated_atcreated at
owner_idowner idowner_idowner id
owner_typeowner type ("User" or "Organization")owner_typeowner type ("User" or "Organization")
event_typeevent type ("push" or "pull_request")event_typeevent type ("push" or "pull_request")
base_commitbase commit for pull requestsbase_commitbase commit for pull requests
head_commithead commit for pull requestshead_commithead commit for pull requests
result"accepted", "rejected" or nullresult"accepted", "rejected" or null
messagehuman readable message explaining why event has been rejectedmessagehuman readable message explaining why event has been rejected
pull_requesttrue or falsepull_requesttrue or false
pull_request_numberpull request numberpull_request_numberpull request number
pull_request_titlepull request titlepull_request_titlepull request title
branchbranch commit is onbranchbranch commit is on
tagtag if commit has been taggedtagtag if commit has been tagged
@@ -1801,43 +1701,42 @@

List Requests

- - - + + + - - - + + + - - - + + + - - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
repository_idrepository id the requests belong torepository_idrepository id the requests belong to
slugrepository slug the requests belong toslugrepository slug the requests belong to
limit25maximum number of requests to return (cannot be larger than 100)limit25maximum number of requests to return (cannot be larger than 100)
older_thanlist requests before older_than (with older_than being a request id)older_thanlist requests before older_than (with older_than being a request id)

You have to either provide repository_id or slug.

-

Settings: General

-
GET /repos/82/settings HTTP/1.1
+

Settings: General

+
GET /repos/82/settings HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Authorization: token YOUR TRAVIS ACCESS TOKEN
 Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -1848,46 +1747,43 @@ 

Settings: General

"maximum_number_of_builds": 0 } } -
-
$ travis settings
+
$ travis settings
 Settings for travis-ci/travis-api:
 [-] builds_only_with_travis_yml    Only run builds with a .travis.yml
 [+] build_pushes                   Build pushes
 [+] build_pull_requests            Build pull requests
   0 maximum_number_of_builds       Maximum number of concurrent builds
 
-$ travis settings build_pull_requests --enable
-
-
require 'travis'
+$ travis settings build_pull_requests --enable
+
require 'travis'
 Travis.access_token = 'YOUR TRAVIS ACCESS TOKEN'
 repo = Travis::Repository.find('my/repo')
 repo.settings.build_pull_requests = false
 repo.settings.save
-
- +

Attributes

- - + + - - + + - - + + - - + + - - + +
AttributeDescriptionAttributeDescription
builds_only_with_travis_yml“builds only with .travis.yml” setting (true or false)builds_only_with_travis_yml“builds only with .travis.yml” setting (true or false)
build_pushes“build pushes” setting (true or false)build_pushes“build pushes” setting (true or false)
build_pull_requests“build pull requests” setting (true or false)build_pull_requests“build pull requests” setting (true or false)
maximum_number_of_builds“maximum number of concurrent builds” setting (integer)maximum_number_of_builds“maximum number of concurrent builds” setting (integer)
@@ -1903,28 +1799,27 @@

Update Settings

- - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
settings{}Hash map of settings that should be updated and their new values (see Attributes)settings{}Hash map of settings that should be updated and their new values (see Attributes)

This request always needs to be authenticated.

-

Settings: Environment Variables

-
GET /settings/env_vars?repository_id=124920 HTTP/1.1
+

Settings: Environment Variables

+
GET /settings/env_vars?repository_id=124920 HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Authorization: token YOUR TRAVIS ACCESS TOKEN
 Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -1944,89 +1839,86 @@ 

Settings: Environment Variables

} ] } -
-
$ travis env list
+
$ travis env list
 example=foobar
 secret_example=[secure]
-
-
require 'travis'
+
require 'travis'
 Travis.access_token  = 'YOUR TRAVIS ACCESS TOKEN'
 repo                 = Travis::Repository.find('my/repo')
-repo.env_vars['foo'] = bar
-
- +repo.env_vars['foo'] = bar +

Attributes

- - + + - - + + - - + + - - + + - - + + - - + +
AttributeDescriptionAttributeDescription
idenv var ididenv var id
repository_idrepository idrepository_idrepository id
nameenv var name (exported)nameenv var name (exported)
valueenv var value (exported, only included if public is true)valueenv var value (exported, only included if public is true)
publicwhether or not value is publicpublicwhether or not value is public

List Variables

-

GET /settings/env_vars?repository_id={repository.id}

+

GET /repos/settings/env_vars?repository_id={repository.id}

This request always needs to be authenticated.

Fetch Variable

-

GET /settings/env_vars/{env_var.id}?repository_id={repository.id}

+

GET /repos/settings/env_vars/{env_var.id}?repository_id={repository.id}

This request always needs to be authenticated.

Add Variable

-

POST /settings/env_vars?repository_id={repository.id}

+

POST /repos/settings/env_vars?repository_id={repository.id}

- - - + + + - - - + + + - - - + + + - - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
env_varHash map of env var variable (see below)env_varHash map of env var variable (see below)
env_var.nameName of the new env var (string)env_var.nameName of the new env var (string)
env_var.valueValue of the new env var (string)env_var.valueValue of the new env var (string)
env_var.publicfalsewhether or not to display the valueenv_var.publicfalsewhether or not to display the value
@@ -2034,34 +1926,34 @@

Add Variable

Update Variable

-

PATCH /settings/env_vars/{env_var.id}?repository_id={repository.id}

+

PATCH /repos/settings/env_vars/{env_var.id}

- - - + + + - - - + + + - - - + + + - - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
env_varHash map of env var variable (see below)env_varHash map of env var variable (see below)
env_var.namecurrent valueName of the new env var (string)env_var.namecurrent valueName of the new env var (string)
env_var.valuecurrent valueValue of the new env var (string)env_var.valuecurrent valueValue of the new env var (string)
env_var.publiccurrent valuewhether or not to display the valueenv_var.publiccurrent valuewhether or not to display the value
@@ -2069,22 +1961,21 @@

Update Variable

Delete Variable

-

DELETE /settings/env_vars/{env_var.id}?repository_id={repository.id}

+

DELETE /repos/settings/env_vars/{env_var.id}

This request always needs to be authenticated.

-

Settings: SSH Key

+

Settings: SSH Key

-

+
GET /settings/ssh_key/124920 HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Authorization: token YOUR TRAVIS ACCESS TOKEN
 Host: api.travis-ci.com
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -2093,34 +1984,31 @@ 

Settings: SSH Key

"fingerprint": "99:66:93:03:41:0b:f1:f7:61:83:16:61:fa:47:c0:8f" } } -
-
$ travis sshkey
+
$ travis sshkey
 No custom SSH key installed.
-
-
require 'travis/pro'
+
require 'travis/pro'
 Travis::Pro.access_token = 'YOUR TRAVIS ACCESS TOKEN'
 puts Travis::Pro::Repository.find('my/repo').ssh_key.description
-
- +

Attributes

- - + + - - + + - - + + - - + +
AttributeDescriptionAttributeDescription
idssh key id (corresponds to repository id)idssh key id (corresponds to repository id)
descriptionkey descriptiondescriptionkey description
fingerprintkey fingerprintfingerprintkey fingerprint
@@ -2136,25 +2024,25 @@

Update or Create Key

- - - + + + - - - + + + - - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
ssh_keyHash map of ssh key data (see below)ssh_keyHash map of ssh key data (see below)
ssh_key.descriptioncurrent value or emptykey descriptionssh_key.descriptioncurrent value or emptykey description
ssh_key.valueprivate key (required)ssh_key.valueprivate key (required)
@@ -2167,13 +2055,12 @@

Delete Key

This request always needs to be authenticated.

Users

-
GET /users/ HTTP/1.1
+
GET /users/ HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Authorization: token YOUR TRAVIS ACCESS TOKEN
 Host: api.travis-ci.org
-
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -2189,62 +2076,59 @@ 

Users

"created_at": "2011-03-30T16:25:21Z" } } -
-
$ travis whoami
+
$ travis whoami
 You are rkh (Konstantin Haase)
 
-$ travis sync
+$ travis sync
 synchronizing: ... done
-
-
require 'travis'
+
require 'travis'
 Travis.access_token = 'YOUR TRAVIS ACCESS TOKEN'
 puts Travis.user.name
 Travis.user.sync
-
- +

Attributes

- - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + +
AttributeDescriptionAttributeDescription
iduser ididuser id
loginuser login on githubloginuser login on github
nameuser name on githubnameuser name on github
emailprimary email address on githubemailprimary email address on github
gravatar_idavataridgravatar_idavatarid
is_syncingwhether or not user account is currently being syncedis_syncingwhether or not user account is currently being synced
synced_atlast synced atsynced_atlast synced at
correct_scopeswhether or not github token has the correct scopescorrect_scopeswhether or not github token has the correct scopes
channelspusher channels for this userchannelspusher channels for this user
@@ -2267,7 +2151,7 @@

Sync Users

Other Endpoints

Linting

-
PUT /lint/ HTTP/1.1
+
PUT /lint/ HTTP/1.1
 User-Agent: MyClient/1.0.0
 Accept: application/vnd.travis-ci.2+json
 Host: api.travis-ci.org
@@ -2275,8 +2159,7 @@ 

Linting

language: ruby jdk: default -
-
HTTP/1.1 200 OK
+
HTTP/1.1 200 OK
 Content-Type: application/json
 
 {
@@ -2289,12 +2172,10 @@ 

Linting

] } } -
-
$ travis lint example.yml
+
$ travis lint example.yml
 Warnings for example.yml:
 [x] dropping jdk section: specified jdk, but ruby does not include jruby
-
-
require 'travis'
+
require 'travis'
 
 content = <<-YAML
   language: ruby
@@ -2302,23 +2183,22 @@ 

Linting

YAML Travis.lint(content).warnings.each do |warning| - puts "%p: %s" % [warning.key, warning.message] + puts "%p: %s" % [warning.key, warning.message] end -
- +

POST /lint

- - - + + + - - - + + +
ParameterDefaultDescriptionParameterDefaultDescription
contentcontent of the .travis.ymlcontentcontent of the .travis.yml
@@ -2345,9 +2225,9 @@

Web Browsers

API requests using CORS:

-
<script>
-  // using XMLHttpRequest or XDomainRequest to send an API request
-  var req = window.XDomainRequest ? new XDomainRequest() : new XMLHttpRequest();
+
<script>
+  // using XMLHttpRequest or XDomainRequest to send an API request
+  var req = window.XDomainRequest ? new XDomainRequest() : new XMLHttpRequest();
 
   if(req) {
     req.open("GET", "https://api.travis-ci.org/", true);
@@ -2356,29 +2236,26 @@ 

Web Browsers

req.send(); } </script> -
- +

With jQuery:

-
<script>
+
<script>
 $.ajax({
   url: "https://api.travis-ci.org/",
   headers: { Accept: "application/vnd.travis-ci.2+json" },
   success: function() { alert("it worked!") }
 });
 </script>
-
- +

JSONP

-
<script>
+
<script>
   function jsonpCallback() { alert("it worked!") };
 </script>
 <script src="https://api.travis-ci.org/?callback=jsonpCallback"></script>
-
- +

When writing an in-browser client, you have to circumvent the browser’s same origin policy. Generally, we offer two different approaches for this: @@ -2420,25 +2297,12 @@

Third Party

  • TravisPy: Python library trying to closely mimic the official Ruby client
  • -
    - - - - http - - - - shell - - - - ruby - - - + http + shell + ruby
    diff --git a/api/javascripts/all.js b/api/javascripts/all.js index 78cd2243479..ca0e1c3e236 100644 --- a/api/javascripts/all.js +++ b/api/javascripts/all.js @@ -1,10 +1,10 @@ /*! jQuery UI - v1.10.4 - 2014-04-02 * http://jqueryui.com * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ -function activateLanguage(e){$("#lang-selector a").removeClass("active"),$("#lang-selector a[data-language-name='"+e+"']").addClass("active");for(var t=0;tr;r++)for(n in o[r])a=o[r][n],o[r].hasOwnProperty(n)&&a!==t&&(i[n]=e.isPlainObject(a)?e.isPlainObject(i[n])?e.widget.extend({},i[n],a):e.widget.extend({},a):a);return i},e.widget.bridge=function(i,n){var a=n.prototype.widgetFullName||i;e.fn[i]=function(o){var r="string"==typeof o,l=s.call(arguments,1),u=this;return o=!r&&l.length?e.widget.extend.apply(null,[o].concat(l)):o,r?this.each(function(){var s,n=e.data(this,a);return n?e.isFunction(n[o])&&"_"!==o.charAt(0)?(s=n[o].apply(n,l),s!==n&&s!==t?(u=s&&s.jquery?u.pushStack(s.get()):s,!1):t):e.error("no such method '"+o+"' for "+i+" widget instance"):e.error("cannot call methods on "+i+" prior to initialization; attempted to call method '"+o+"'")}):this.each(function(){var t=e.data(this,a);t?t.option(o||{})._init():e.data(this,a,new n(o,this))}),u}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{disabled:!1,create:null},_createWidget:function(t,s){s=e(s||this.defaultElement||this)[0],this.element=e(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),s!==this&&(e.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===s&&this.destroy()}}),this.document=e(s.style?s.ownerDocument:s.document||s),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(i,s){var n,a,o,r=i;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof i)if(r={},n=i.split("."),i=n.shift(),n.length){for(a=r[i]=e.widget.extend({},this.options[i]),o=0;n.length-1>o;o++)a[n[o]]=a[n[o]]||{},a=a[n[o]];if(i=n.pop(),1===arguments.length)return a[i]===t?null:a[i];a[i]=s}else{if(1===arguments.length)return this.options[i]===t?null:this.options[i];r[i]=s}return this._setOptions(r),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!t).attr("aria-disabled",t),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var a,o=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=a=e(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,a=this.widget()),e.each(n,function(n,r){function l(){return i||o.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof r?o[r]:r).apply(o,arguments):t}"string"!=typeof r&&(l.guid=r.guid=r.guid||l.guid||e.guid++);var u=n.match(/^(\w+)\s*(.*)$/),h=u[1]+o.eventNamespace,c=u[2];c?a.delegate(c,h,l):s.bind(h,l)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}})}(jQuery),/* jquery Tocify - v1.9.0 - 2013-10-01 +function activateLanguage(t){$("#lang-selector a").removeClass("active"),$("#lang-selector a[data-language-name='"+t+"']").addClass("active");for(var e=0;er;r++)for(n in a[r])o=a[r][n],a[r].hasOwnProperty(n)&&o!==e&&(i[n]=t.isPlainObject(o)?t.isPlainObject(i[n])?t.widget.extend({},i[n],o):t.widget.extend({},o):o);return i},t.widget.bridge=function(i,n){var o=n.prototype.widgetFullName||i;t.fn[i]=function(a){var r="string"==typeof a,l=s.call(arguments,1),u=this;return a=!r&&l.length?t.widget.extend.apply(null,[a].concat(l)):a,r?this.each(function(){var s,n=t.data(this,o);return n?t.isFunction(n[a])&&"_"!==a.charAt(0)?(s=n[a].apply(n,l),s!==n&&s!==e?(u=s&&s.jquery?u.pushStack(s.get()):s,!1):e):t.error("no such method '"+a+"' for "+i+" widget instance"):t.error("cannot call methods on "+i+" prior to initialization; attempted to call method '"+a+"'")}):this.each(function(){var e=t.data(this,o);e?e.option(a||{})._init():t.data(this,o,new n(a,this))}),u}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this.bindings=t(),this.hoverable=t(),this.focusable=t(),s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:t.noop,_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(t.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:t.noop,widget:function(){return this.element},option:function(i,s){var n,o,a,r=i;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof i)if(r={},n=i.split("."),i=n.shift(),n.length){for(o=r[i]=t.widget.extend({},this.options[i]),a=0;n.length-1>a;a++)o[n[a]]=o[n[a]]||{},o=o[n[a]];if(i=n.pop(),1===arguments.length)return o[i]===e?null:o[i];o[i]=s}else{if(1===arguments.length)return this.options[i]===e?null:this.options[i];r[i]=s}return this._setOptions(r),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return this.options[t]=e,"disabled"===t&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!e).attr("aria-disabled",e),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var o,a=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=o=t(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,o=this.widget()),t.each(n,function(n,r){function l(){return i||a.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof r?a[r]:r).apply(a,arguments):e}"string"!=typeof r&&(l.guid=r.guid=r.guid||l.guid||t.guid++);var u=n.match(/^(\w+)\s*(.*)$/),d=u[1]+a.eventNamespace,h=u[2];h?o.delegate(h,d,l):s.bind(d,l)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(e).undelegate(e)},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){t(e.currentTarget).addClass("ui-state-hover")},mouseleave:function(e){t(e.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){t(e.currentTarget).addClass("ui-state-focus")},focusout:function(e){t(e.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}})}(jQuery),/* jquery Tocify - v1.9.0 - 2013-10-01 * http://www.gregfranko.com/jquery.tocify.js/ * Copyright (c) 2013 Greg Franko; Licensed MIT */ -function(e){"use strict";e(window.jQuery,window,document)}(function(e,t,i){"use strict";var s="tocify",n="tocify-focus",a="tocify-hover",o="tocify-hide",r="tocify-header",l="."+r,u="tocify-subheader",h="."+u,c="tocify-item",d="."+c,g="tocify-extend-page",f="."+g;e.widget("toc.tocify",{version:"1.9.0",options:{context:"body",ignoreSelector:null,selectors:"h1, h2, h3",showAndHide:!0,showEffect:"slideDown",showEffectSpeed:"medium",hideEffect:"slideUp",hideEffectSpeed:"medium",smoothScroll:!0,smoothScrollSpeed:"medium",scrollTo:0,showAndHideOnScroll:!0,highlightOnScroll:!0,highlightOffset:40,theme:"bootstrap",extendPage:!0,extendPageOffset:100,history:!0,scrollHistory:!1,hashGenerator:"compact",highlightDefault:!0},_create:function(){var i=this;i.extendPageScroll=!0,i.items=[],i._generateToc(),i._addCSSClasses(),i.webkit=function(){for(var e in t)if(e&&-1!==e.toLowerCase().indexOf("webkit"))return!0;return!1}(),i._setEventHandlers(),e(t).load(function(){i._setActiveElement(!0),e("html, body").promise().done(function(){setTimeout(function(){i.extendPageScroll=!1},0)})})},_generateToc:function(){var t,i,n=this,a=n.options.ignoreSelector;return t=-1!==this.options.selectors.indexOf(",")?e(this.options.context).find(this.options.selectors.replace(/ /g,"").substr(0,this.options.selectors.indexOf(","))):e(this.options.context).find(this.options.selectors.replace(/ /g,"")),t.length?(n.element.addClass(s),t.each(function(t){e(this).is(a)||(i=e("
    diff --git a/_layouts/en_enterprise.html b/_layouts/en_enterprise.html index 5e55b0dae72..673d9aa5531 100644 --- a/_layouts/en_enterprise.html +++ b/_layouts/en_enterprise.html @@ -17,7 +17,15 @@

    {{ page.title }}

    {% endunless %} - {{ content }} + + {% unless page.no_toc %} +
    + {% include toc.html h_min=2 h_max=2 class="list-language" santize=true html=content %} +
    + {% endunless%} + + {% include anchor_headings.html html=content anchorClass="toc-anchor" anchorBody="#" %} + diff --git a/assets/javascripts/site.js b/assets/javascripts/site.js deleted file mode 100644 index 210935336d0..00000000000 --- a/assets/javascripts/site.js +++ /dev/null @@ -1,24 +0,0 @@ -$(function(){ - var cname = function(name) { - return name.replace(/[ \/<>]/g, '-'); - } - - var list; - if ( $("#toc").length ) { - list = $("