From c4d79caa70dd3fa300df2a666af241af3e0e56e0 Mon Sep 17 00:00:00 2001 From: Jason Hu Date: Tue, 2 Oct 2018 03:53:21 -0700 Subject: [PATCH 0001/1536] Add a note for travis-ci.com API switch --- user/deployment/pypi.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/user/deployment/pypi.md b/user/deployment/pypi.md index fbac9d49f67..d71419436da 100644 --- a/user/deployment/pypi.md +++ b/user/deployment/pypi.md @@ -25,6 +25,12 @@ However, this would expose your PyPI password to the world. We recommend you travis encrypt your-password-here --add deploy.password ``` +If you are using travis-ci.com not travis-ci.org, you need add `--com` argument to switch travis API endpoint: + +```bash +travis encrypt your-password-here --add deploy.password --com +``` + > Note that if your PyPI password contains [special characters](/user/encryption-keys#Note-on-escaping-certain-symbols) you need to escape them before encrypting your password. Some people have [reported difficulties](https://github.com/travis-ci/dpl/issues/377) connecting to PyPI with passwords containing anything except alphanumeric characters. ```yaml From e02c06c1dfe910cf3ec13598384c1b9b18490e91 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Tue, 4 Dec 2018 15:08:00 +0100 Subject: [PATCH 0002/1536] Add source/origin of traffic to firewall rules --- user/enterprise/installation.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/user/enterprise/installation.md b/user/enterprise/installation.md index 3fa7ca1a0c0..75283835c43 100644 --- a/user/enterprise/installation.md +++ b/user/enterprise/installation.md @@ -30,14 +30,14 @@ 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 each port in the table below: -| Port | Service | Description | -|:-----|:----------------|:-----------------------------------------------------------------------------| -| 8800 | Custom TCP Rule | This port is to access the admin dashboard for your Enterprise installation. | -| 5672 | Custom TCP Rule | For RabbitMQ Non-SSL. | -| 4567 | Custom TCP Rule | For RabbitMQ SSL. | -| 443 | HTTPS | Web application over HTTPS access. | -| 80 | HTTP | Web application access. | -| 22 | SSH | SSH access. | +| Port | Source | Service | Description | +|:-----|:--------------------------|:----------------|:-----------------------------------------------------------------------------| +| 8800 | Administrators' computers | Custom TCP Rule | This port is to access the admin dashboard for your Enterprise installation. | +| 5672 | Worker machine(s) | Custom TCP Rule | For RabbitMQ Non-SSL. | +| 4567 | Worker machine(s) | Custom TCP Rule | For RabbitMQ SSL. | +| 443 | Developers' computers | HTTPS | Web application over HTTPS access. | +| 80 | Developers' computers | HTTP | Web application access. | +| 22 | Administrators' computers | SSH | SSH access for machine maintenance | ### Install Travis CI Enterprise Platform @@ -71,9 +71,9 @@ 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 each port in the table below: -| Port | Service | Description | -|:-----|:--------|:------------| -| 22 | SSH | SSH access. | +| Port | Source | Service | Description | +|:-----|:--------------------------|:--------|:------------------------------------| +| 22 | Administrators' computers | SSH | SSH access for machine maintenance. | ## Install Travis CI Worker @@ -85,7 +85,7 @@ Travis CI Enterprise currently supports two different build environments, Trusty | Enterprise 2.1.9+ | [Precise (Legacy, 12.04)](/user/enterprise/precise/) | [Trusty (14.04)](/user/enterprise/trusty/) | | Enterprise 2.0+ | [Precise (Legacy, 12.04)](/user/enterprise/precise/) | -- | -After setting up a new instance for the worker, please follow the [Trusty (14.04)](/user/enterprise/trusty/) or [Precise (Legacy, 12.04)](/user/enterprise/precise/) guides for your Travis CI Enterprise version. +After setting up a new instance for the worker, please follow the [Trusty (14.04)](/user/enterprise/trusty/) or [Precise (Legacy, 12.04)](/user/enterprise/precise/) guides for your Travis CI Enterprise version. You can find the RabbitMQ password, which is needed in the installation, either in your Admin Dashboard --> "Settings" page, or in your own RabbitMQ installation for [high availability mode](/user/enterprise/high-availability/). From 39bdfe0c8d56bd944fcf27380d1b8a90e72e105c Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Tue, 4 Dec 2018 15:14:16 +0100 Subject: [PATCH 0003/1536] The platform machine needs to be able to talk to itself --- user/enterprise/installation.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/enterprise/installation.md b/user/enterprise/installation.md index 75283835c43..dd6d58ed643 100644 --- a/user/enterprise/installation.md +++ b/user/enterprise/installation.md @@ -30,11 +30,12 @@ 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 each port in the table below: -| Port | Source | Service | Description | +| Port | Source / Origin | Service | Description | |:-----|:--------------------------|:----------------|:-----------------------------------------------------------------------------| | 8800 | Administrators' computers | Custom TCP Rule | This port is to access the admin dashboard for your Enterprise installation. | | 5672 | Worker machine(s) | Custom TCP Rule | For RabbitMQ Non-SSL. | | 4567 | Worker machine(s) | Custom TCP Rule | For RabbitMQ SSL. | +| 443 | Platform machine | HTTPS | The platform machine needs to be able to talk to itself | | 443 | Developers' computers | HTTPS | Web application over HTTPS access. | | 80 | Developers' computers | HTTP | Web application access. | | 22 | Administrators' computers | SSH | SSH access for machine maintenance | From 238d4693665f008727dc9516ced5cca0af398a52 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Tue, 4 Dec 2018 15:14:28 +0100 Subject: [PATCH 0004/1536] Fix compatibility table --- user/enterprise/installation.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/user/enterprise/installation.md b/user/enterprise/installation.md index dd6d58ed643..d729dc4d642 100644 --- a/user/enterprise/installation.md +++ b/user/enterprise/installation.md @@ -80,11 +80,11 @@ each port in the table below: Travis CI Enterprise currently supports two different build environments, Trusty (Ubuntu 14.04) and Precise (Legacy, Ubuntu 12.04). Each version of Travis CI Enterprise expects a default version of `travis-worker`. Travis CI Enterprise will direct jobs to the default worker type, unless the behavior is overridden. However, different versions of Enterprise treat different worker versions as default: -| Travis CI Enterprise Version | Default Worker Version | Alternative Worker Versions | -| -- | -- | -- | -| Enterprise 2.2+ | [Trusty (14.04)](/user/enterprise/trusty/) | [Precise (Legacy, 12.04)](/user/enterprise/precise/) | -| Enterprise 2.1.9+ | [Precise (Legacy, 12.04)](/user/enterprise/precise/) | [Trusty (14.04)](/user/enterprise/trusty/) | -| Enterprise 2.0+ | [Precise (Legacy, 12.04)](/user/enterprise/precise/) | -- | +| Travis CI Enterprise Version | Default Worker Version | Alternative Worker Versions | +|:-----------------------------|:-----------------------------------------------------|:-----------------------------------------------------| +| Enterprise 2.2+ | [Trusty (14.04)](/user/enterprise/trusty/) | [Precise (Legacy, 12.04)](/user/enterprise/precise/) | +| Enterprise 2.1.9+ | [Precise (Legacy, 12.04)](/user/enterprise/precise/) | [Trusty (14.04)](/user/enterprise/trusty/) | +| Enterprise 2.0+ | [Precise (Legacy, 12.04)](/user/enterprise/precise/) | -- | After setting up a new instance for the worker, please follow the [Trusty (14.04)](/user/enterprise/trusty/) or [Precise (Legacy, 12.04)](/user/enterprise/precise/) guides for your Travis CI Enterprise version. From 8efa105b3bcde052b725a8b2e1aa18e0b5bc255a Mon Sep 17 00:00:00 2001 From: William Wong Date: Fri, 7 Dec 2018 09:52:13 -0800 Subject: [PATCH 0005/1536] Surface the `npm ci` alternative in the top table --- user/languages/javascript-with-nodejs.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/user/languages/javascript-with-nodejs.md b/user/languages/javascript-with-nodejs.md index 381c51e14e5..24cfee2d888 100644 --- a/user/languages/javascript-with-nodejs.md +++ b/user/languages/javascript-with-nodejs.md @@ -10,11 +10,13 @@ layout: en | JavaScript and Node.js | Default | |:--------------------------------------------|:------------------------------------------| -| [Default `install`](#dependency-management) | `npm install` | +| [Default `install`](#dependency-management) | `npm install` or `npm ci` | | [Default `script`](#default-build-script) | `npm test` | | [Matrix keys](#build-matrix) | `env`, `node_js` | | Support | [Travis CI](mailto:support@travis-ci.com) | +(If `package-lock.json` or `npm-shrinkwrap.json` exists and your npm version supports it, Travis CI will use `npm ci` instead of `npm install`.) + Minimal example: ```yaml From 569fe558eeac632c5f9b016fa867ac495b3b1581 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Wed, 20 Feb 2019 09:36:49 -0500 Subject: [PATCH 0006/1536] Enumerate valid GitHub Releases options --- user/deployment/releases.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/user/deployment/releases.md b/user/deployment/releases.md index 64813c09a44..ba9491ed272 100644 --- a/user/deployment/releases.md +++ b/user/deployment/releases.md @@ -98,7 +98,7 @@ The GitHub-generated tags are of the form `untagged-*`, where `*` is a random hex string. Notice that this tag is immediately available on GitHub, and thus will trigger a new Travis CI build, unless it is prevented by -other means; for instance, by +other means; for instance, by [blocklisting `/^untagged/`](/user/customizing-the-build/#safelisting-or-blocklisting-branches). ## Overwrite existing files on the release @@ -242,16 +242,15 @@ after_deploy: ## Advanced options -Options from `.travis.yml` are passed through to Octokit API's +The following ptions from `.travis.yml` are passed through to Octokit API's [#create_release](https://octokit.github.io/octokit.rb/Octokit/Client/Releases.html#create_release-instance_method) -and [#update_release](https://octokit.github.io/octokit.rb/Octokit/Client/Releases.html#update_release-instance_method) methods, -so you can use any valid Octokit option, -unless they are treated separately in this document. - -These include: +and [#update_release](https://octokit.github.io/octokit.rb/Octokit/Client/Releases.html#update_release-instance_method) methods. +* `tag_name` +* `target_commitish` * `name` * `body` +* `draft` (boolean) * `prerelease` (boolean) Note that formatting in `body` is [not preserved](https://github.com/travis-ci/dpl/issues/155). From 0d6ca64b6c80122ec44f6b0a537d172b72d31299 Mon Sep 17 00:00:00 2001 From: ssabrii <45571047+ssabrii@users.noreply.github.com> Date: Thu, 21 Mar 2019 17:01:19 -0400 Subject: [PATCH 0007/1536] Update troubleshooting guide Added info related to catchup meeting with `response_status=422 maximum_number_of_statuses` issue. --- user/enterprise/troubleshooting-guide.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index 65476283484..51292c4aa2f 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -176,3 +176,21 @@ $ travis console ``` It can happen that organizations are also stuck in the syncing state. Since an organization itself does not have a `is_syncing` flag, all users that do belong to it have to be successfully synced. + +## GitHub validation errors and ` response_status=422 maximum_number_of_statuses` messages observed in logs + +### The Problem + +On every commit made when a build runs, a commit status is created for a given SHA. Due to GitHub’s limitations at 1,000 statuses per SHA and context within a repository, if more than 1000 status are created this leads to a validation error. +This issue should no longer be present in GitHub Apps integrations but will be possible in Webhooks integrations. + +### Strategy + +Following the reports observed, the current workaround would be to have the user re-sync the account with GitHub to generate a new token and overcome the GitHub limitation. There are two options to do so in Enterprise: + +1) A user can sync via Web UI in profile page and clicking on `Sync account` + +2) A user can ssh into platform instance and run the command: +`travis sync_users —logins=` + +**Please note** if `—logins= ` is not provided this could trigger a sync on every user. From 9809e3c12f17b81d0f688abf12c1357f7ec96a2c Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Wed, 27 Mar 2019 11:45:25 -0400 Subject: [PATCH 0008/1536] Update user/enterprise/troubleshooting-guide.md Co-Authored-By: ssabrii <45571047+ssabrii@users.noreply.github.com> --- user/enterprise/troubleshooting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index 51292c4aa2f..6f103490be8 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -193,4 +193,4 @@ Following the reports observed, the current workaround would be to have the user 2) A user can ssh into platform instance and run the command: `travis sync_users —logins=` -**Please note** if `—logins= ` is not provided this could trigger a sync on every user. +**Please note** if `—logins= ` is not provided this triggers a sync on every user. Depending on the number of total users on your instance this can take a while and impact production operations From 4573ba2074d4b80ff9a706701e8130c649ba94c8 Mon Sep 17 00:00:00 2001 From: Jan Schulte Date: Wed, 27 Mar 2019 11:48:36 -0400 Subject: [PATCH 0009/1536] Update user/enterprise/troubleshooting-guide.md Co-Authored-By: ssabrii <45571047+ssabrii@users.noreply.github.com> --- user/enterprise/troubleshooting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index 58d0457b915..ee0779f0edb 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -186,7 +186,7 @@ This issue should no longer be present in GitHub Apps integrations but will be p ### Strategy -Following the reports observed, the current workaround would be to have the user re-sync the account with GitHub to generate a new token and overcome the GitHub limitation. There are two options to do so in Enterprise: +Following the reports observed, the current workaround is to have the user re-sync the account with GitHub to generate a new token and overcome the GitHub limitation. There are two options to do so in Enterprise: 1) A user can sync via Web UI in profile page and clicking on `Sync account` From b71ec730c106098d4b8e087014999def64c2bd06 Mon Sep 17 00:00:00 2001 From: Danish Khan Date: Mon, 8 Apr 2019 14:18:01 -0700 Subject: [PATCH 0010/1536] shorten title --- user/enterprise/troubleshooting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index ee0779f0edb..40b83d355b6 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -177,7 +177,7 @@ $ travis console It can happen that organizations are also stuck in the syncing state. Since an organization itself does not have a `is_syncing` flag, all users that do belong to it have to be successfully synced. -## GitHub validation errors and ` response_status=422 maximum_number_of_statuses` messages observed in logs +## Logs contain many GitHub API 422 errors ### The Problem From 65bb161be4c9858f2cc65aa6f7963f14c8ffb7d0 Mon Sep 17 00:00:00 2001 From: Phil Peble <45571088+philpeble@users.noreply.github.com> Date: Mon, 8 Apr 2019 14:19:23 -0700 Subject: [PATCH 0011/1536] Update user/enterprise/troubleshooting-guide.md Co-Authored-By: danishkhan --- user/enterprise/troubleshooting-guide.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index 40b83d355b6..db77bb2495c 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -186,7 +186,9 @@ This issue should no longer be present in GitHub Apps integrations but will be p ### Strategy -Following the reports observed, the current workaround is to have the user re-sync the account with GitHub to generate a new token and overcome the GitHub limitation. There are two options to do so in Enterprise: +The workaround for this issue is to manually re-sync the user account with GitHub. This will generate a fresh token for the user account that has not reached any GitHub API limits. + +There are two options listed below to initiate a sync between your Travis CI Enterprise instance and GitHub instance. 1) A user can sync via Web UI in profile page and clicking on `Sync account` From ba7bcaec8329f29c54dfd2b1faa262ea3c07564d Mon Sep 17 00:00:00 2001 From: Phil Peble <45571088+philpeble@users.noreply.github.com> Date: Mon, 8 Apr 2019 14:19:50 -0700 Subject: [PATCH 0012/1536] Update user/enterprise/troubleshooting-guide.md Co-Authored-By: danishkhan --- user/enterprise/troubleshooting-guide.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index db77bb2495c..768e308f34a 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -190,7 +190,13 @@ The workaround for this issue is to manually re-sync the user account with GitHu There are two options listed below to initiate a sync between your Travis CI Enterprise instance and GitHub instance. -1) A user can sync via Web UI in profile page and clicking on `Sync account` +#### User initiates a sync via their profile in web UI + +A user can sync their account with your GitHub instance via the web UI: + +1. User accesses the web UI by going to `https://` in their browser. +2. In the upper right corner of the page hover over the user icon and select 'Profile' from the dropdown menu. +3. In the upper right corner of the profile page click on 'Sync account'. 2) A user can ssh into platform instance and run the command: `travis sync_users —logins=` From d27c30569c6ecc2cf9cc5a54d7df98510c4b9650 Mon Sep 17 00:00:00 2001 From: Phil Peble <45571088+philpeble@users.noreply.github.com> Date: Mon, 8 Apr 2019 14:20:59 -0700 Subject: [PATCH 0013/1536] Update user/enterprise/troubleshooting-guide.md Co-Authored-By: danishkhan --- user/enterprise/troubleshooting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index 768e308f34a..2ed78172614 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -201,4 +201,4 @@ A user can sync their account with your GitHub instance via the web UI: 2) A user can ssh into platform instance and run the command: `travis sync_users —logins=` -**Please note** if `—logins= ` is not provided this triggers a sync on every user. Depending on the number of total users on your instance this can take a while and impact production operations +> If `—logins=` is not provided then this command will trigger a sync on every user. This could result in long runtimes and may impact production operations if you have a large number of total users on your Travis CI Enterprise instance. From 1c606ae813f4692488103d3e5fdb3e84b10ee804 Mon Sep 17 00:00:00 2001 From: Phil Peble <45571088+philpeble@users.noreply.github.com> Date: Mon, 8 Apr 2019 14:21:10 -0700 Subject: [PATCH 0014/1536] Update user/enterprise/troubleshooting-guide.md Co-Authored-By: danishkhan --- user/enterprise/troubleshooting-guide.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index 2ed78172614..7362d5314c2 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -198,7 +198,12 @@ A user can sync their account with your GitHub instance via the web UI: 2. In the upper right corner of the page hover over the user icon and select 'Profile' from the dropdown menu. 3. In the upper right corner of the profile page click on 'Sync account'. -2) A user can ssh into platform instance and run the command: +#### Administrator initiates sync via CLI + +An administrator can also initiate a sync on behalf of a user via the `travis` CLI tool on the platform machine: + +1. Open a ssh connection to the platform machine. +2. Initiate a sync by running `travis sync_users —logins=` `travis sync_users —logins=` > If `—logins=` is not provided then this command will trigger a sync on every user. This could result in long runtimes and may impact production operations if you have a large number of total users on your Travis CI Enterprise instance. From 9dd63f844f75560c648ef6b876e958518b858cdf Mon Sep 17 00:00:00 2001 From: Danish Khan Date: Mon, 8 Apr 2019 14:22:43 -0700 Subject: [PATCH 0015/1536] add comma --- user/enterprise/troubleshooting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index 7362d5314c2..422cb8eee2d 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -181,7 +181,7 @@ It can happen that organizations are also stuck in the syncing state. Since an o ### The Problem -On every commit made when a build runs, a commit status is created for a given SHA. Due to GitHub’s limitations at 1,000 statuses per SHA and context within a repository, if more than 1000 status are created this leads to a validation error. +On every commit made when a build runs, a commit status is created for a given SHA. Due to GitHub’s limitations at 1,000 statuses per SHA and context within a repository, if more than 1,000 status are created this leads to a validation error. This issue should no longer be present in GitHub Apps integrations but will be possible in Webhooks integrations. ### Strategy From 6f10a508a4246805124d9cb2ae941654143734e7 Mon Sep 17 00:00:00 2001 From: Danish Khan Date: Mon, 8 Apr 2019 14:23:19 -0700 Subject: [PATCH 0016/1536] add statuses --- user/enterprise/troubleshooting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index 422cb8eee2d..19d0fd770b4 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -181,7 +181,7 @@ It can happen that organizations are also stuck in the syncing state. Since an o ### The Problem -On every commit made when a build runs, a commit status is created for a given SHA. Due to GitHub’s limitations at 1,000 statuses per SHA and context within a repository, if more than 1,000 status are created this leads to a validation error. +On every commit made when a build runs, a commit status is created for a given SHA. Due to GitHub’s limitations at 1,000 statuses per SHA and context within a repository, if more than 1,000 statuses are created this leads to a validation error. This issue should no longer be present in GitHub Apps integrations but will be possible in Webhooks integrations. ### Strategy From de71a1ad482d18cee6d6ed8162126a6202d45ad8 Mon Sep 17 00:00:00 2001 From: Danish Khan Date: Mon, 8 Apr 2019 14:24:06 -0700 Subject: [PATCH 0017/1536] change possible to present --- user/enterprise/troubleshooting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index 19d0fd770b4..b7acc62b4d6 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -182,7 +182,7 @@ It can happen that organizations are also stuck in the syncing state. Since an o ### The Problem On every commit made when a build runs, a commit status is created for a given SHA. Due to GitHub’s limitations at 1,000 statuses per SHA and context within a repository, if more than 1,000 statuses are created this leads to a validation error. -This issue should no longer be present in GitHub Apps integrations but will be possible in Webhooks integrations. +This issue should no longer be present in GitHub Apps integrations but will be present in Webhooks integrations. ### Strategy From 911993e6427fabd3c6313ab7750f85ec97c3d424 Mon Sep 17 00:00:00 2001 From: Danish Khan Date: Mon, 8 Apr 2019 14:25:40 -0700 Subject: [PATCH 0018/1536] capitalize SSH --- user/enterprise/troubleshooting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index b7acc62b4d6..c6daa84b0d3 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -202,7 +202,7 @@ A user can sync their account with your GitHub instance via the web UI: An administrator can also initiate a sync on behalf of a user via the `travis` CLI tool on the platform machine: -1. Open a ssh connection to the platform machine. +1. Open a SSH connection to the platform machine. 2. Initiate a sync by running `travis sync_users —logins=` `travis sync_users —logins=` From d7f847d9d7741d5acd41733b7e59ea826950d16c Mon Sep 17 00:00:00 2001 From: Danish Khan Date: Mon, 8 Apr 2019 14:26:32 -0700 Subject: [PATCH 0019/1536] remove double sync user command --- user/enterprise/troubleshooting-guide.md | 1 - 1 file changed, 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index c6daa84b0d3..eaff1f9becc 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -204,6 +204,5 @@ An administrator can also initiate a sync on behalf of a user via the `travis` C 1. Open a SSH connection to the platform machine. 2. Initiate a sync by running `travis sync_users —logins=` -`travis sync_users —logins=` > If `—logins=` is not provided then this command will trigger a sync on every user. This could result in long runtimes and may impact production operations if you have a large number of total users on your Travis CI Enterprise instance. From 6ee1638eb20f1cb986695a1a63a562e7f958a8af Mon Sep 17 00:00:00 2001 From: Danish Khan Date: Mon, 8 Apr 2019 15:54:52 -0700 Subject: [PATCH 0020/1536] plaindocs suggestions --- user/enterprise/installation.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user/enterprise/installation.md b/user/enterprise/installation.md index d729dc4d642..09364d0bb38 100644 --- a/user/enterprise/installation.md +++ b/user/enterprise/installation.md @@ -32,9 +32,9 @@ each port in the table below: | Port | Source / Origin | Service | Description | |:-----|:--------------------------|:----------------|:-----------------------------------------------------------------------------| -| 8800 | Administrators' computers | Custom TCP Rule | This port is to access the admin dashboard for your Enterprise installation. | -| 5672 | Worker machine(s) | Custom TCP Rule | For RabbitMQ Non-SSL. | -| 4567 | Worker machine(s) | Custom TCP Rule | For RabbitMQ SSL. | +| 8800 | Administrators' computers | Custom TCP Rule | Enterprise Admin Dashboard. | +| 5672 | Worker machine(s) | Custom TCP Rule | RabbitMQ Non-SSL. | +| 4567 | Worker machine(s) | Custom TCP Rule | RabbitMQ SSL. | | 443 | Platform machine | HTTPS | The platform machine needs to be able to talk to itself | | 443 | Developers' computers | HTTPS | Web application over HTTPS access. | | 80 | Developers' computers | HTTP | Web application access. | From 3f1adf9fbd41f25aeacef7925357f17a1818e83b Mon Sep 17 00:00:00 2001 From: Andy Alt Date: Tue, 7 May 2019 10:28:14 -0500 Subject: [PATCH 0021/1536] environmental variables.md:add TRAVIS_COMPILER and TRAVIS_DIST --- user/environment-variables.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user/environment-variables.md b/user/environment-variables.md index 636d9aa3748..e918f4e61d0 100644 --- a/user/environment-variables.md +++ b/user/environment-variables.md @@ -194,7 +194,9 @@ to tag the build, or to run post-build deployments. - `TRAVIS_COMMIT_MESSAGE`: The commit subject and body, unwrapped. - `TRAVIS_COMMIT_RANGE`: The range of commits that were included in the push or pull request. (Note that this is empty for builds triggered by the initial commit of a new branch.) +- `TRAVIS_COMPILER`: Indicates the compiler used by the current job (e.g., `clang`, `gcc`). - `TRAVIS_DEBUG_MODE`: Set to `true` if the job is running in [debug mode](https://docs.travis-ci.com/user/running-build-in-debug-mode/) +- `TRAVIS_DIST`: Indicates the distribution the current job is running on. - `TRAVIS_EVENT_TYPE`: Indicates how the build was triggered. One of `push`, `pull_request`, `api`, `cron`. - `TRAVIS_JOB_ID`: The id of the current job that Travis CI uses internally. - `TRAVIS_JOB_NAME`: The [job name](https://docs.travis-ci.com/user/build-stages/#naming-your-jobs-within-build-stages) if it was specified, or `""`. From f094f6744a394f89d8875041716eb451acd77d9f Mon Sep 17 00:00:00 2001 From: Logan Kilpatrick Date: Wed, 8 May 2019 10:17:38 -0700 Subject: [PATCH 0022/1536] Update julia.md Updates for how to use a private julia repo as a dependency. --- user/languages/julia.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/user/languages/julia.md b/user/languages/julia.md index 556bd6209bc..b12644e3231 100644 --- a/user/languages/julia.md +++ b/user/languages/julia.md @@ -92,6 +92,17 @@ to manually install any dependencies that are not handled by `deps/build.jl`, it is possible to specify a custom dependency installation command as described in the [general build configuration](/user/customizing-the-build/) guide. +In a rare case, you may need to clone a private repo if it is a depenedancy of the repo you are trying to test. To add a private repo, check out the link here: [Private Dependencies](/user/private-dependencies/). Once you have the repo added, you will need to copy it to your julia folder and then run the default build script. Check out the script below to see how that is done: + +``` +script: + #- ls #Optional command. Just here to confirm the Dependency is in the folder you think it is. + #- pwd #Optional command. Just here so you can see where you are in the file system to make sure the path is correct below. + - julia --project --color=yes --check-bounds=yes -e 'using Pkg; Pkg.develop(PackageSpec(path="/home/travis/build/path_to_private_Dependency")); Pkg.instantiate()' + - julia --project --color=yes --check-bounds=yes -e 'using Pkg; Pkg.instantiate(); Pkg.build();' + ``` +Note: you will neeed to have the 'project.toml' file in your repo for these commands above to work. This can be found in your '~/.julia/enviroments/' folder. + ## Build Matrix For Julia projects, `env` and `julia` can be given as arrays From 59be115c1b5958daad1906dd65a49779b828177f Mon Sep 17 00:00:00 2001 From: cclauss Date: Sat, 11 May 2019 11:55:36 +0200 Subject: [PATCH 0023/1536] Python tests on multiple OSes: Fix pip on Windows Without this change, pip will fail with permission errors on Windows. --- user/languages/python.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/user/languages/python.md b/user/languages/python.md index f71129f0fd0..cf58401542e 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -194,7 +194,10 @@ matrix: - name: "Python 3.7.3 on Windows" os: windows # Windows 10.0.17134 N/A Build 17134 language: shell # 'language: python' is an error on Travis CI Windows - before_install: choco install python + before_install: + - choco install python + - python -m pip install --upgrade pip + - python3 --version ; pip3 --version ; sw_vers env: PATH=/c/Python37:/c/Python37/Scripts:$PATH install: pip3 install --upgrade pip # all three OSes agree about 'pip3' # 'python' points to Python 2.7 on macOS but points to Python 3.7 on Linux and Windows From a5a0b762e1def6fc70d47db46df7720cda13b4a8 Mon Sep 17 00:00:00 2001 From: cclauss Date: Sat, 11 May 2019 12:02:58 +0200 Subject: [PATCH 0024/1536] Update python.md --- user/languages/python.md | 1 - 1 file changed, 1 deletion(-) diff --git a/user/languages/python.md b/user/languages/python.md index cf58401542e..a3b52a025cc 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -197,7 +197,6 @@ matrix: before_install: - choco install python - python -m pip install --upgrade pip - - python3 --version ; pip3 --version ; sw_vers env: PATH=/c/Python37:/c/Python37/Scripts:$PATH install: pip3 install --upgrade pip # all three OSes agree about 'pip3' # 'python' points to Python 2.7 on macOS but points to Python 3.7 on Linux and Windows From 16e11c523f4774ae78c32a52fd9c131319c4d7ca Mon Sep 17 00:00:00 2001 From: Alan Poulain Date: Sat, 11 May 2019 18:53:34 +0200 Subject: [PATCH 0025/1536] Update deployment.md --- user/deployment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/deployment.md b/user/deployment.md index 73be2f268cd..ae56c2b687e 100644 --- a/user/deployment.md +++ b/user/deployment.md @@ -117,7 +117,7 @@ deploy: script: deploy.sh on: all_branches: true - condition: $TRAVIS_BRANCH =~ ^staging|production$ + condition: $TRAVIS_BRANCH =~ ^(staging|production)$ ``` {: data-file=".travis.yml"} From 8873165d885f10c278387238490a7ddf71400741 Mon Sep 17 00:00:00 2001 From: Fabrice Bellingard Date: Tue, 21 May 2019 17:27:06 +0200 Subject: [PATCH 0026/1536] Update documentation for Maven-based projects - The way to generate coverage has changed, new users should not be put on a wrong direction - Several users forget to specify the project key, so let's make it explicit in the doc --- user/sonarcloud.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/user/sonarcloud.md b/user/sonarcloud.md index 48519e50e04..4e17ab430d9 100644 --- a/user/sonarcloud.md +++ b/user/sonarcloud.md @@ -64,10 +64,14 @@ addons: secure: "*********" # encrypted value of your token script: # the following command line builds the project, runs the tests with coverage and then execute the SonarCloud analysis - - mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install sonar:sonar + - mvn clean verify sonar:sonar -Pcoverage -Dsonar.projectKey=myorg_myrepo ``` {: data-file=".travis.yml"} +2 important informations: +- the "coverage" profile activates the generation of the JaCoCo XML report +- "sonar.projectKey" can also be set as a property on the main POM file. Its value can be found on the right side of the project homepage on SonarCloud + Please take a look at the [live Maven-based example project](https://github.com/SonarSource/sq-com_example_java-maven-travis) to know more about this use case. ## Analysis of internal pull requests From 60bfc8bc9d1da9d5409225d58d8a597015cf4240 Mon Sep 17 00:00:00 2001 From: Samuel Bronson Date: Sun, 2 Jun 2019 17:56:26 -0400 Subject: [PATCH 0027/1536] Fix link to doc about github "machine users" There's some attempt at a redirect, but it's dropping the fragment from the URL. --- 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 64813c09a44..53a3650909e 100644 --- a/user/deployment/releases.md +++ b/user/deployment/releases.md @@ -137,7 +137,7 @@ deploy: ``` {: data-file=".travis.yml"} -**Warning:** the `public_repo` and `repo` scopes for GitHub oauth tokens grant write access to all of a user's (public) repositories. For security, it's ideal for `api_key` to have write access limited to only repositories where Travis deploys to GitHub releases. The suggested workaround is to create a [machine user](https://developer.github.com/guides/managing-deploy-keys/#machine-users) — a dummy GitHub account that is granted write access on a per repository basis. +**Warning:** the `public_repo` and `repo` scopes for GitHub oauth tokens grant write access to all of a user's (public) repositories. For security, it's ideal for `api_key` to have write access limited to only repositories where Travis deploys to GitHub releases. The suggested workaround is to create a [machine user](https://developer.github.com/v3/guides/managing-deploy-keys/#machine-users) — a dummy GitHub account that is granted write access on a per repository basis. ## Authentication with a Username and Password From 4b874c82b4e1d5aa7aca7d86356fc88a5be7c989 Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Tue, 4 Jun 2019 23:29:18 +0100 Subject: [PATCH 0028/1536] Document cabal variable for Haskell language --- user/languages/haskell.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/user/languages/haskell.md b/user/languages/haskell.md index cabec80b7e8..75e18796a19 100644 --- a/user/languages/haskell.md +++ b/user/languages/haskell.md @@ -57,6 +57,18 @@ By default Travis CI uses `cabal` to manage your project's dependencies: cabal install --only-dependencies --enable-tests ``` +### Specifying cabal-install verison + +You can specify the version of `cabal` used: + +```yaml +language: haskell +cabal: "2.4" +ghc: + - "8.6.4" +``` +{: data-file=".travis.yml"} + ### Multiple Packages in Subdirectories If you have multiple packages in subdirectories (each containing a `.cabal` file, From cf06a32c42a2104c1edd5a1a18e8102affc02c27 Mon Sep 17 00:00:00 2001 From: Zhengpeng Hou Date: Thu, 20 Jun 2019 13:33:14 +0800 Subject: [PATCH 0029/1536] Draft bionic document --- user/reference/bionic.md | 167 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 user/reference/bionic.md diff --git a/user/reference/bionic.md b/user/reference/bionic.md new file mode 100644 index 00000000000..caaf652c878 --- /dev/null +++ b/user/reference/bionic.md @@ -0,0 +1,167 @@ +--- +title: The Ubuntu 18.04 Build Environment +layout: en +--- + +## What This Guide Covers + +This guide provides an overview of the packages, tools and settings available in the Bionic environment. + +## Using Bionic + +To route your builds to Ubuntu 18.04 LTS, add the following to your `.travis.yml`: + +```yaml +dist: bionic +``` +{: data-file=".travis.yml"} + +Please note that Bionic is available on our hosted fully virtualized +infrastructure. If you are running an Enterprise installation, please reach out +to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com?subject=Try%20out%20Bionic) to see how you can use the Bionic Docker images. + +## Differences from the previous relealse images + +Travis CI Ubuntu 18.04 includes the following changes and improvements: + +### Third party apt-repositories removed + +While third party apt-repositories are used during the image provisioning, they are all removed from the Bionic build image. This has two benefits; a) reduced risk of unrelated interference and b) faster apt-get updates. + +To specify a third party apt-repository, you can [add the source with the apt addon](/user/installing-dependencies/#adding-apt-sources) and specify the packages. For example: + +```yaml +dist: bionic +group: dev +addons: + apt: + sources: + - ppa:chris-lea/redis-server + packages: + - redis-tools + - redis-server +``` +{: data-file=".travis.yml"} + +If you depend on these repositories in your build, you can use the following `source` line to get them back: + +| package | source | +|:---------------------|:-----------------------------| +| couchdb | `https://apache.bintray.com/couchdb-deb` | +| docker | `docker-bionic` | +| google-chrome-stable | `google-chrome` | +| git-lfs | `github-git-lfs-bionic` | +| git-ppa | `ppa:git-core/ppa` | +| haskell | `ppa:hvr/ghc` | +| mongodb | `mongodb-4.0-binoic` | +| pollinate | `ppa:pollinate/ppa` | +| redis | `ppa:chris-lea/redis-server` | +{: style="width: 80%" } + +### Services disabled by default + +On our Ubuntu 18.04 based infrastructure, to speed up boot time and improve performance we've disabled all services, including the ones that are started by default. +Add any services that you want to start by default to your `.travis.yml`: + + +```yaml +services: + - mysql + - redis +``` +{: data-file=".travis.yml"} + +## Environment common to all Ubuntu 18.04 images + +The following versions of Docker, version control software and compilers are present on all builds, along with more language specific software described in more detail in each language section. + + +### Version control + +| package | version | +|:--------|:---------| +| git | `2.22.0` | +| git-lfs | `2.7.2` | +| hg | `4.8` | +| svn | `1.9.7` | +{: style="width: 30%" } + +### Compilers and Build toolchain + +* clang and llvm 7 +* cmake 3.12.4 +* gcc 7.4.0 +* ccache 3.4.1 +* shellcheck 0.6.0 +* shfmt 2.6.3 + +### Docker + +* Docker 18.06.0-ce is installed +* docker-compose 1.23.1. + +## Ruby support + +* Pre-installed Rubies: `2.3.8`, `2.4.5`, `2.5.3` and `2.6.3`. +* The default ruby is `2.5.3p105`. +* Other ruby versions can be installed during build time. + +## Python support + +* Supported Python versions: `2.7`, `3.6` or higher. +* Pre-installed Python versions: `2.7.15`, `3.6.7`, and `3.7.1`. +* Python `2.7.15` will be used when no language version is explicitly set. + +If you're getting errors about PyPy `pypy is not installed; attempting download`, use one of the more recent python versions such as `pypy2.7-6.0` or `pypy3.5-6.0`. + +## JavaScript and Node.js support + +* For builds specifying `language: node_js`, `nvm` is automatically updated to the latest version at build time. For other builds, the stable version at image build time has been selected, which is 0.33.11. +* The following NodeJS versions are preinstalled: `11.0.0` and `8.12.0`. + +## Go support + +* Pre-installed Go: `1.11.1` + +* Other Go versions can be installed during build time by specifying the language versions with the `go:`-key. + +## JVM (Clojure, Groovy, Java, Scala) support + +* Pre-installed JVMs: `openjdk8`, `openjdk10`, and `openjdk11` on x86, default +is `openjdk8`. + +* Other JDKs, including Oracle's, can be acquired if available by specifying `jdk`. + +* The following table summarizes the Pre-installed JVM tooling versions: + +| package | version | +|:--------|:--------| +| gradle | 5.1.1 | +| maven | 3.6.0 | +| groovy | 2.4.5 | +{: style="width: 30%" } + +## PHP support + +* For dynamic runtime selection, `phpenv` is available. +* The following PHP versions are preinstalled: + +| alias | version | +| :----- | :------- | +| 7.1 | 7.1.30 | +| 7.2 | 7.2.10 | +| 7.3 | 7.3.6 | +{: style="width: 30%" } + +## Databases and services + +The following services and databases are preinstalled but but do not run by default. +To use one in your build, add it to the services key in your `travis.yml` : + +| service | version | +|:-----------|:---------------| +| mongodb | 4.0 | +| mysql | 5.7 | +| redis | 5.5 | +| postgresql | 9.3 9.4 9.5 9.6 10 | +{: style="width: 30%" } From 69b1309497f10eacb77e09818ce95e82aa56bade Mon Sep 17 00:00:00 2001 From: zhengphou <50313279+zhengphou@users.noreply.github.com> Date: Fri, 21 Jun 2019 17:42:41 +0800 Subject: [PATCH 0030/1536] Update user/reference/bionic.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/reference/bionic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index caaf652c878..fd4fc877d60 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -7,7 +7,7 @@ layout: en This guide provides an overview of the packages, tools and settings available in the Bionic environment. -## Using Bionic +## Using Ubuntu 18.04 (Bionic Beaver) To route your builds to Ubuntu 18.04 LTS, add the following to your `.travis.yml`: From 682cef57ca0880b3849c65854818c9a22cbcfa48 Mon Sep 17 00:00:00 2001 From: zhengphou <50313279+zhengphou@users.noreply.github.com> Date: Fri, 21 Jun 2019 17:43:11 +0800 Subject: [PATCH 0031/1536] Update user/reference/bionic.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/reference/bionic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index fd4fc877d60..3908725c793 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -9,7 +9,7 @@ This guide provides an overview of the packages, tools and settings available in ## Using Ubuntu 18.04 (Bionic Beaver) -To route your builds to Ubuntu 18.04 LTS, add the following to your `.travis.yml`: +To route your builds to Ubuntu 18.04 LTS, Bionic, add the following to your `.travis.yml`: ```yaml dist: bionic From 8899a5654230723cfefbfa062186ac1bbb74860c Mon Sep 17 00:00:00 2001 From: zhengphou <50313279+zhengphou@users.noreply.github.com> Date: Fri, 21 Jun 2019 17:43:38 +0800 Subject: [PATCH 0032/1536] Update user/reference/bionic.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/reference/bionic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index 3908725c793..89af2d1e1ea 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -20,7 +20,7 @@ Please note that Bionic is available on our hosted fully virtualized infrastructure. If you are running an Enterprise installation, please reach out to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com?subject=Try%20out%20Bionic) to see how you can use the Bionic Docker images. -## Differences from the previous relealse images +## Differences from the previous release images Travis CI Ubuntu 18.04 includes the following changes and improvements: From d2f259d236039225bbab63db0b93ec66492cf67a Mon Sep 17 00:00:00 2001 From: zhengphou <50313279+zhengphou@users.noreply.github.com> Date: Fri, 21 Jun 2019 17:43:44 +0800 Subject: [PATCH 0033/1536] Update user/reference/bionic.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/reference/bionic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index 89af2d1e1ea..bd4e3690142 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -60,7 +60,7 @@ If you depend on these repositories in your build, you can use the following `so ### Services disabled by default -On our Ubuntu 18.04 based infrastructure, to speed up boot time and improve performance we've disabled all services, including the ones that are started by default. +On the Ubuntu 18.04 based environment, to speed up boot time and improve performance we've disabled all services by default. Add any services that you want to start by default to your `.travis.yml`: From dca2cbeedbd0f94523aeca0f68656ad675362f83 Mon Sep 17 00:00:00 2001 From: zhengphou <50313279+zhengphou@users.noreply.github.com> Date: Fri, 21 Jun 2019 17:43:54 +0800 Subject: [PATCH 0034/1536] Update user/reference/bionic.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/reference/bionic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index bd4e3690142..014d0a5ebd8 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -73,7 +73,7 @@ services: ## Environment common to all Ubuntu 18.04 images -The following versions of Docker, version control software and compilers are present on all builds, along with more language specific software described in more detail in each language section. +The following versions of Docker, version control software and compilers are present on all Ubuntu 18.04 builds, along with more language specific software described in more detail in each language section. ### Version control From b7e85f19ac5dfd757741b332a72c552df0f82408 Mon Sep 17 00:00:00 2001 From: zhengphou <50313279+zhengphou@users.noreply.github.com> Date: Fri, 21 Jun 2019 17:44:17 +0800 Subject: [PATCH 0035/1536] Update user/reference/bionic.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/reference/bionic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index 014d0a5ebd8..3a279afbff2 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -22,7 +22,7 @@ to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com?subject=Try%20out% ## Differences from the previous release images -Travis CI Ubuntu 18.04 includes the following changes and improvements: +Travis CI Ubuntu 18.04, Bionic, includes the following changes and improvements: ### Third party apt-repositories removed From 6bd8687057e8155e29df16cad166a655dc34202f Mon Sep 17 00:00:00 2001 From: zhengphou <50313279+zhengphou@users.noreply.github.com> Date: Fri, 21 Jun 2019 17:44:26 +0800 Subject: [PATCH 0036/1536] Update user/reference/bionic.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/reference/bionic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index 3a279afbff2..76fba564973 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -61,7 +61,7 @@ If you depend on these repositories in your build, you can use the following `so ### Services disabled by default On the Ubuntu 18.04 based environment, to speed up boot time and improve performance we've disabled all services by default. -Add any services that you want to start by default to your `.travis.yml`: +Add any services that you want to start to your `.travis.yml`: ```yaml From fe368bf789ecfee904c0aee1b68907eae52b95ee Mon Sep 17 00:00:00 2001 From: zhengphou <50313279+zhengphou@users.noreply.github.com> Date: Fri, 21 Jun 2019 17:44:36 +0800 Subject: [PATCH 0037/1536] Update user/reference/bionic.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/reference/bionic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index 76fba564973..c59aebe2bd5 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -16,7 +16,7 @@ dist: bionic ``` {: data-file=".travis.yml"} -Please note that Bionic is available on our hosted fully virtualized +> Please note that Bionic is available at travis-ci.com and travis-ci.org, on the fully virtualized infrastructure. If you are running an Enterprise installation, please reach out to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com?subject=Try%20out%20Bionic) to see how you can use the Bionic Docker images. From de33fa57ed44d5433f31dc55b2de75a2ad3d4270 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 24 Jun 2019 15:59:39 -0400 Subject: [PATCH 0038/1536] Explain in more detail how GitHub Releases expects tags --- user/deployment/releases.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/user/deployment/releases.md b/user/deployment/releases.md index 64813c09a44..1544de17d26 100644 --- a/user/deployment/releases.md +++ b/user/deployment/releases.md @@ -60,8 +60,12 @@ This gives you an opportunity to examine and edit the draft release. ## Setting the tag at deployment time -GitHub Releases needs a tag at the deployment time. -While `on.tags: true` guarantees this, you can postpone setting the tag until +GitHub Releases needs the present commit to be tagged at the deployment time. +If you set `on.tags: true`, the commit is guaranteed to have a tag. + +Depending on the workflow, however, this is not desirable. + +In such cases, it is possible to postpone setting the tag until you have all the information you need. A natural place to do this is `before_deploy`. For example: From 2aa14bf992c212df90f3da182011fdabe8640296 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Tue, 25 Jun 2019 16:23:21 -0400 Subject: [PATCH 0039/1536] Add workspaces documentation --- user/using-workspaces.md | 152 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 user/using-workspaces.md diff --git a/user/using-workspaces.md b/user/using-workspaces.md new file mode 100644 index 00000000000..67000a40fc4 --- /dev/null +++ b/user/using-workspaces.md @@ -0,0 +1,152 @@ +--- +title: Using Workspaces (Beta) +layout: en +--- + +# Workspaces (Beta) + +> Workspaces are currently in beta testing, and may change without a prior +> notice. +{: .beta} + +Workspaces allow jobs _within_ a build to share files. +They are useful when you want to use build artifacts from a previous job; +for example, you might create a cache that can be used in multiple jobs later. + +While any build can theoretically use workspaces, they are most useful when +there is a clear timeline of when they are used. +For this reason, we recommend using workspaces when you use +[build stages](/user/build-stages). + +Roughly speaking, you create a workspace in one stage, then use it in +subsequent stages. + +## Configuration + +A minimal workspace configuration looks like this: + +```yaml +jobs: + include: + - stage: warm_cache + script: + - echo "foo" > foo.txt + workspaces: + create: + name: ws1 + paths: + - foo.txt + - stage: use_cache + workspaces: + use: ws1 + script: + - cat foo.txt || true +``` +{: data-file=".travis.yml"} + +Each workspace has a unique name within a build. +It is specified by the `name` key when it is created with +`workspaces.create`, and by the value when it is used with +`workspaces.use`. + +In the example above, the workspace named `ws1` is created by the only +job in the `warm_cache` stage. +The workspace is subsequently consumed in the `use_cache` stage. + +## Example configurations + +### Using multiple workspaces in a build + +You can use multiple workspaces in a build. + + +```yaml +script: + - ./build $TRAVIS_OS_NAME +jobs: + include: + - stage: Build binaries + os: linux + workspaces: + create: + name: linux-binaries + - os: osx + workspaces: + create: + name: osx-binaries + - stage: Deploy + language: minimal + workspaces: + use: + - linux-binaries + - osx-binaries + git: + clone: false + script: + - ./create_archive.sh + deploy: + provider: script + script: ./upload.sh +``` +{: data-file=".travis.yml"} + +In this example: + 1. we run two jobs in the "Build binaries" stage, + each producing uploading binaries. + 1. in the subsequent "Deploy" stage, we fetch the workspaces + produced by the jobs in the previous stage, and deploy it + using a custom script. + +## Workspaces and concurrency +Note that workspaces work best if there is not race condition in +uploading them. +Since there is no guarantee in the execution order of jobs within a build +stage, it is a good idea to assign different workspace names to jobs within +a build stage. + +## Workspace names must be pre-determined +Due to technical reasons, workspace names will be escaped for shell. +In other words, given: + +```yaml +workspaces: + create: + name: $TRAVIS_OS_NAME + paths: … +``` +{: data-file=".travis.yml"} + +it will have to be consumed by + +```yaml +workspaces: + use: $TRAVIS_OS_NAME +``` +{: data-file=".travis.yml"} + +and not by + +```yaml +workspaces: + use: linux +``` +{: data-file=".travis.yml"} + +even if the consumer is running on a Linux VM. + +## How workspaces differ from caches + +It is worth reiterating that the workspaces are meant for sharing files +within a build. +For files that you want to share across builds, use +[caches](/user/caching). + +### Workspaces and caches are considered independently + +It is possible to include a single file in the cache and workspaces. + +## How restarting a portion of a build affects workspaces +Note that workspaces are built and consumed by jobs in a builld. +If you restart parts of the build in some arbitrary order, workspaces may +interfere in subtle and unexpected ways. +If you suspect such interference, we advise you to restart the entire build. From 4cfc518a5c1b197e6d48f2606641b7d50ad25889 Mon Sep 17 00:00:00 2001 From: Zhengpeng Hou Date: Wed, 26 Jun 2019 19:53:41 +0800 Subject: [PATCH 0040/1536] refresh relevant pages to pick up bionic's availability --- _data/snippets.yml | 4 ++++ _includes/c11-cpp11-and-beyond-and-toolchains.md | 3 +++ _includes/sidebar.html | 1 + index.html | 1 + user/customizing-the-build.md | 2 +- user/database-setup.md | 10 +++++----- user/gui-and-headless-browsers.md | 2 +- user/installing-dependencies.md | 10 ++++++++-- user/languages/java.md | 1 + user/languages/minimal-and-generic.md | 2 +- user/languages/python.md | 2 +- user/reference/overview.md | 5 +++-- 12 files changed, 30 insertions(+), 13 deletions(-) diff --git a/_data/snippets.yml b/_data/snippets.yml index b716aa1a8a9..84291895eb2 100644 --- a/_data/snippets.yml +++ b/_data/snippets.yml @@ -29,6 +29,7 @@ all_note: | > * [Precise](/user/reference/precise/) > * [Trusty](/user/reference/trusty/) > * [Xenial](/user/reference/xenial/) + > * [Bionic](/user/reference/bionic/) > * [macOS](/user/reference/osx/) > * [Windows](/user/reference/windows/) unix_note: | @@ -37,6 +38,7 @@ unix_note: | > * [Precise](/user/reference/precise/) > * [Trusty](/user/reference/trusty/) > * [Xenial](/user/reference/xenial/) + > * [Bionic](/user/reference/bionic/ > * [macOS](/user/reference/osx/) linux_note: | > Language versions and other build-environment specific @@ -44,12 +46,14 @@ linux_note: | > * [Precise](/user/reference/precise/) > * [Trusty](/user/reference/trusty/) > * [Xenial](/user/reference/xenial/) + > * [Bionic](/user/reference/bionic/) linux_windows_note: | > Language versions and other build-environment specific > information are in our reference pages: > * [Precise](/user/reference/precise/) > * [Trusty](/user/reference/trusty/) > * [Xenial](/user/reference/xenial/) + > * [Bionic](/user/reference/bionic/) > * [Windows](/user/reference/windows/) concurrent_jobs: | The maximum number of concurrent jobs depends on the total system load, but diff --git a/_includes/c11-cpp11-and-beyond-and-toolchains.md b/_includes/c11-cpp11-and-beyond-and-toolchains.md index 386bb951e8d..e4977c08738 100644 --- a/_includes/c11-cpp11-and-beyond-and-toolchains.md +++ b/_includes/c11-cpp11-and-beyond-and-toolchains.md @@ -7,6 +7,7 @@ If your project requires tools compatible with C11, C++11, or a more recent lang * [Precise](/user/reference/precise) ships with GCC 4.6.3 * [Trusty](/user/reference/trusty) ships with GCC 4.8.2 * [Xenial](/user/reference/xenial) ships with GCC 5.4.0 +* [Bionic](/user/reference/bionic) ships with GCC 7.4.0 Note that [GCC support for ISO C11 reached a similar level of completeness as ISO C99 in 4.9](https://gcc.gnu.org/wiki/C11Status) and that C++11 is feature-complete in 5.1 (the C++ language support was feature-complete in 4.8.1 but the standard library didn't support all C++11 features until [later](https://gcc.gnu.org/gcc-5/changes.html#libstdcxx), in particular [support for `` does not exist until 4.9](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53631)). @@ -102,6 +103,7 @@ before_install: * [Precise](/user/reference/precise) ships with Clang 3.4 * [Trusty](/user/reference/trusty) ships with Clang 3.5.0 * [Xenial](/user/reference/xenial) ships with Clang 7 +* [Bionic](/user/reference/bionic) ships with Clang 7 Note that [C++11 support is complete starting from Clang 3.3](http://clang.llvm.org/cxx_status.html). @@ -207,6 +209,7 @@ You can find the `clang` version shipped by Xcode [here](https://trac.macports.o * [Precise](/user/reference/precise) ships with CMake 2.8.7 * [Trusty](/user/reference/trusty) ships with CMake 3.9.2 * [Xenial](/user/reference/xenial) ships with CMake 3.12.4 +* [Bionic](/user/reference/bionic) ships with CMake 3.12.4 You can upgrade cmake to 3.2.3 on Precise from the `george-edison55-precise-backports` source (note that the `cmake-data` package contains dependencies which Aptitude does not automatically resolve), c.f. diff --git a/_includes/sidebar.html b/_includes/sidebar.html index 28d792a9393..1e7c4f1d65a 100644 --- a/_includes/sidebar.html +++ b/_includes/sidebar.html @@ -82,6 +82,7 @@

CI Environment Reference

  • Precise CI Environment Reference
  • Trusty CI Environment
  • Xenial CI Environment
  • +
  • Bionic CI Environment
  • macOS CI Environment Reference
  • Windows CI Environment Reference
  • Building on Multiple Operating Systems
  • diff --git a/index.html b/index.html index dacbd53a0d9..057e4b43a20 100644 --- a/index.html +++ b/index.html @@ -46,6 +46,7 @@

    Deployment Guides

    Common Questions

    • What repository providers can I use?
    • +
    • Can I use Ubuntu 18.04 Bionic for my builds?
    • Can I use Ubuntu Xenial for my builds?
    • How do I change the notification email address?
    • What IP addresses do the builds use?
    • diff --git a/user/customizing-the-build.md b/user/customizing-the-build.md index f175890b83f..aa8ef574362 100644 --- a/user/customizing-the-build.md +++ b/user/customizing-the-build.md @@ -131,7 +131,7 @@ Deploy keys are not currently supported by LFS, so you should use a GitHub OAuth ### Linux -[Git LFS](https://git-lfs.github.com/) is supported by default on our Ubuntu Trusty and Xenial images. +[Git LFS](https://git-lfs.github.com/) is supported by default on our Ubuntu Trusty, Xenial and Bionic images. ### macOS diff --git a/user/database-setup.md b/user/database-setup.md index 73472fc940a..da809d439f5 100644 --- a/user/database-setup.md +++ b/user/database-setup.md @@ -3,7 +3,7 @@ title: Setting up Databases and Services layout: en redirect_from: - - /user/using-postgresql/ + - /user/using-postgresql/ --- This guide covers setting up the most popular databases and other services in the Travis CI environment. @@ -55,9 +55,9 @@ and a blank password. > `root` user does. -| | Ubuntu Precise | Ubuntu Trusty | Ubuntu Xenial | -|:------|:---------------|:--------------|:--------------| -| MySQL | 5.5.x | 5.6.x | 5.7.x | +| | Ubuntu Precise | Ubuntu Trusty | Ubuntu Xenial | Ubuntu Bionic | +|:------|:---------------|:--------------|:--------------|:--------------| +| MySQL | 5.5.x | 5.6.x | 5.7.x | 5.7.x | You can also [install MySQL 5.7](#mysql-57) on Ubuntu Trusty. @@ -102,7 +102,7 @@ before_install: ### MySQL 5.7 -MySQL 5.7 is the default on the Xenial image. +MySQL 5.7 is the default on the Xenial and Bionic image. On Trusty, you can install MySQL 5.7 by adding the following lines to your `.travis.yml`: diff --git a/user/gui-and-headless-browsers.md b/user/gui-and-headless-browsers.md index cb7027eb9ef..b190486efee 100644 --- a/user/gui-and-headless-browsers.md +++ b/user/gui-and-headless-browsers.md @@ -60,7 +60,7 @@ or Google Chrome (with the [addon](/user/chrome), on Linux Trusty or macOS). ### Using `services:` -> This only works on Ubuntu 16.04 (Xenial) i.e. with `dist: xenial` +> This only works on Ubuntu 16.04 (Xenial) and later on releases i.e. with `dist: xenial` or `dist: bionic` The following will start xvfb and set the right values for the `DISPLAY` environment variable: diff --git a/user/installing-dependencies.md b/user/installing-dependencies.md index 48a9df8cc66..8206de2dd9a 100644 --- a/user/installing-dependencies.md +++ b/user/installing-dependencies.md @@ -10,7 +10,7 @@ redirect_from: ## Installing Packages on Standard Infrastructure -To install Ubuntu packages that are not included in the standard [precise](/user/reference/precise/), [trusty](/user/reference/trusty/), or [xenial](/user/reference/xenial/) distribution, use apt-get in the `before_install` step of your `.travis.yml`: +To install Ubuntu packages that are not included in the standard [precise](/user/reference/precise/), [trusty](/user/reference/trusty/), [xenial](/user/reference/xenial/), or [bionic](/user/reference/bionic/) distribution, use apt-get in the `before_install` step of your `.travis.yml`: ```yaml before_install: @@ -144,11 +144,17 @@ addons: ### Installing Snap Packages with the Snaps Addon -You can install [snap](http://snapcraft.io/) packages using our Xenial images: +You can install [snap](http://snapcraft.io/) packages using our Xenial or +Bionic images: ```yaml dist: xenial ``` +or + +```yaml +dist: bionic +``` {: data-file=".travis.yml"} The Ubuntu Snap store offers many packages directly maintained by upstream diff --git a/user/languages/java.md b/user/languages/java.md index 6b9ce1661a6..576e374ac32 100644 --- a/user/languages/java.md +++ b/user/languages/java.md @@ -181,6 +181,7 @@ details. The list of available JVMs for different dists are at + * [JDKs installed for **Bionic**](/user/reference/bionic/#jvm-clojure-groovy-java-scala-images) * [JDKs installed for **Xenial**](/user/reference/xenial/#jvm-clojure-groovy-java-scala-images) * [JDKs installed for **Trusty**](/user/reference/trusty/#jvm-clojure-groovy-java-scala-images) * [JDKs installed for **Precise**](/user/reference/precise/#jvm-clojure-groovy-java-scala-vm-images) diff --git a/user/languages/minimal-and-generic.md b/user/languages/minimal-and-generic.md index 8e084d737f2..3bb10af243b 100644 --- a/user/languages/minimal-and-generic.md +++ b/user/languages/minimal-and-generic.md @@ -6,7 +6,7 @@ layout: en ## What This Guide Covers -Travis CI supports many popular programming languages, but can never hope to support them all. `language: minimal` and `language: generic` are images available in Ubuntu Xenial `dist: xenial`and Ubuntu Trusty `dist:trusty`, that are not tailored to any particular programming language. As their names suggest, one is optimized be faster and use less disk space, the other to have more languages and services available. +Travis CI supports many popular programming languages, but can never hope to support them all. `language: minimal` and `language: generic` are images available in Ubuntu Bionic `dist: bionic`, Ubuntu Xenial `dist: xenial`and Ubuntu Trusty `dist:trusty`, that are not tailored to any particular programming language. As their names suggest, one is optimized be faster and use less disk space, the other to have more languages and services available. > Note that `language: minimal` is not the same as omitting the `language` key, if you do that the default language is set to Ruby. diff --git a/user/languages/python.md b/user/languages/python.md index f71129f0fd0..11c39c3629d 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -62,7 +62,7 @@ script: ### Python 3.7 and higher -You'll need to add `dist: xenial` to your `.travis.yml` file to use Python 3.7 and higher. +You'll need to add `dist: xenial` or `dist: bionic` to your `.travis.yml` file to use Python 3.7 and higher. For example: diff --git a/user/reference/overview.md b/user/reference/overview.md index 5f093c424d6..23d12606987 100644 --- a/user/reference/overview.md +++ b/user/reference/overview.md @@ -19,6 +19,7 @@ Each build runs in one of the following virtual environments. A sudo enabled, full virtual machine per build, that runs Linux, one of +* [Ubuntu Bionic 18.04](/user/reference/bionic/) * [Ubuntu Xenial 16.04](/user/reference/xenial/) * [Ubuntu Trusty 14.04](/user/reference/trusty/) **default** * [Ubuntu Precise 12.04](/user/reference/precise/) @@ -35,12 +36,12 @@ A [Windows](/user/reference/windows/) environment running Windows Server, versio The following table summarizes the differences across virtual environments and operating systems: -| | Ubuntu Linux ([Xenial](/user/reference/xenial/) , [Trusty](/user/reference/trusty/), [Precise](/user/reference/precise/)) | [macOS](/user/reference/osx/) | [Windows](/user/reference/windows) | +| | Ubuntu Linux ([Bionic](/user/reference/bionic/), [Xenial](/user/reference/xenial/) , [Trusty](/user/reference/trusty/), [Precise](/user/reference/precise/)) | [macOS](/user/reference/osx/) | [Windows](/user/reference/windows) | |:---------------------|:--------------------------------------------------------------------------------------------------------------------------|:------------------------------|:-----------------------------------| | Name | Ubuntu | macOS | Windows | | Status | Current | Current | Early release | | Infrastructure | Virtual machine on GCE | Virtual machine | Virtual machine on GCE | -| `.travis.yml` | `dist: xenial` or `dist: trusty` or `dist: precise` | `os: osx` | `os: windows` | +| `.travis.yml` |`dist: bionic` or `dist: xenial` or `dist: trusty` or `dist: precise` | `os: osx` | `os: windows` | | Allows `sudo` | Yes | Yes | No | | Approx boot time | 20-50s | 60-90s | 60-120s | | File system | EXT4 | HFS+ | NTFS | From 1a3c18f717761ff585f0e2d6182711d361a506f3 Mon Sep 17 00:00:00 2001 From: Christopher Chavez Date: Sat, 11 May 2019 00:54:22 -0500 Subject: [PATCH 0041/1536] minimal-and-generic.md: minor grammatical fix --- user/languages/minimal-and-generic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/minimal-and-generic.md b/user/languages/minimal-and-generic.md index 8e084d737f2..e1d548a1ae6 100644 --- a/user/languages/minimal-and-generic.md +++ b/user/languages/minimal-and-generic.md @@ -6,7 +6,7 @@ layout: en ## What This Guide Covers -Travis CI supports many popular programming languages, but can never hope to support them all. `language: minimal` and `language: generic` are images available in Ubuntu Xenial `dist: xenial`and Ubuntu Trusty `dist:trusty`, that are not tailored to any particular programming language. As their names suggest, one is optimized be faster and use less disk space, the other to have more languages and services available. +Travis CI supports many popular programming languages, but can never hope to support them all. `language: minimal` and `language: generic` are images available in Ubuntu Xenial `dist: xenial`and Ubuntu Trusty `dist:trusty`, that are not tailored to any particular programming language. As their names suggest, one is optimized to be faster and use less disk space, the other to have more languages and services available. > Note that `language: minimal` is not the same as omitting the `language` key, if you do that the default language is set to Ruby. From 469dc547dbacbc3904fc5be926f3e1761c112391 Mon Sep 17 00:00:00 2001 From: Alexandr Date: Tue, 2 Jul 2019 00:33:40 +0300 Subject: [PATCH 0042/1536] Added code to run RabbitMQ on Ubuntu Xenial Solution was offered by @BanzaiMan on https://travis-ci.community/t/rabbitmq-on-xenial/1827/2. Testing on my own project confirmed that solution works well. --- user/database-setup.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/user/database-setup.md b/user/database-setup.md index 73472fc940a..5039e075ddf 100644 --- a/user/database-setup.md +++ b/user/database-setup.md @@ -357,7 +357,7 @@ before_script: ## RabbitMQ -RabbitMQ requires `setuid` flags, so you can only run RabbitMQ on macOS or Ubuntu Trusty infrastructure. +RabbitMQ requires `setuid` flags, so you can only run RabbitMQ as a service on macOS or Ubuntu Trusty infrastructure. Start RabbitMQ in your `.travis.yml`: @@ -375,6 +375,14 @@ RabbitMQ uses the default configuration: You can set up more vhosts and roles in the `before_script` section of your `.travis.yml`. +RabbitMQ [can be launched](https://docs.travis-ci.com/user/reference/xenial/#third-party-apt-repositories-removed) on Ubuntu Xenial using the APT addon in `.travis.yml`: +```yaml +addons: + apt: + packages: + - rabbitmq-server +``` + ## Riak > Riak is only available in the [Ubuntu Trusty environment](/user/reference/trusty/). From 42f3446f4bec7ed80e982dff67a6b45c80396412 Mon Sep 17 00:00:00 2001 From: Dilyan Damyanov Date: Tue, 2 Jul 2019 16:59:41 +0100 Subject: [PATCH 0043/1536] Fix typo in section about using the pro version --- user/encryption-keys.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/encryption-keys.md b/user/encryption-keys.md index 14d07f146f1..e1416c971a2 100644 --- a/user/encryption-keys.md +++ b/user/encryption-keys.md @@ -36,10 +36,10 @@ Then, you can use `encrypt` command to encrypt data (This example assumes you ar travis encrypt SOMEVAR="secretvalue" ``` -Or, if you are using [travis-ci.com](https://travis-ci.com), you will need to add `--com` to the CLI: +Or, if you are using [travis-ci.com](https://travis-ci.com), you will need to add `--pro` to the CLI: ```bash -travis encrypt --com SOMEVAR="secretvalue" +travis encrypt --pro SOMEVAR="secretvalue" ``` This will output a string looking something like: From a14acdb05043742f9ca8942aff6a905b801813b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastien=20G=C3=A9rard?= Date: Tue, 2 Jul 2019 23:26:36 +0200 Subject: [PATCH 0044/1536] Update default ubuntu image to xenial Default image recently got switched from trusty to xenial --- user/reference/overview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/reference/overview.md b/user/reference/overview.md index 5f093c424d6..082272b5585 100644 --- a/user/reference/overview.md +++ b/user/reference/overview.md @@ -19,8 +19,8 @@ Each build runs in one of the following virtual environments. A sudo enabled, full virtual machine per build, that runs Linux, one of -* [Ubuntu Xenial 16.04](/user/reference/xenial/) -* [Ubuntu Trusty 14.04](/user/reference/trusty/) **default** +* [Ubuntu Xenial 16.04](/user/reference/xenial/) **default** +* [Ubuntu Trusty 14.04](/user/reference/trusty/) * [Ubuntu Precise 12.04](/user/reference/precise/) ### macOS From 248d11e674a063d97176ee1b0fcb3f672cad8fc5 Mon Sep 17 00:00:00 2001 From: Zhengpeng Hou Date: Fri, 5 Jul 2019 13:10:59 +0800 Subject: [PATCH 0045/1536] update for xcode11 beta image --- _data/xcodes.yml | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/_data/xcodes.yml b/_data/xcodes.yml index 81115a95365..05aaec781e6 100644 --- a/_data/xcodes.yml +++ b/_data/xcodes.yml @@ -1,4 +1,45 @@ osx_images: + - image: xcode11 + xcode: "11.0" + osx_version: "10.14" + xcode_full_version: "11.0" + xcode_build_version: "11M362v" + image_publish_date: 2019-07-05 + sdks: + - iphoneos13.0 + - iphonesimulator13.0 + - macosx10.15 + - appletvos13.0 + - appletvsimulator13.0 + - watchos6.0 + - watchsimulator6.0 + simulators: + - iOS 10.3 + - iOS 11.0 + - iOS 11.1 + - iOS 11.2 + - iOS 11.3 + - iOS 11.4 + - iOS 12.0 + - iOS 12.1 + - iOS 13.0 + - tvOS 10.2 + - tvOS 11.0 + - tvOS 11.1 + - tvOS 11.2 + - tvOS 11.3 + - tvOS 11.4 + - tvOS 12.0 + - tvOS 12.1 + - tvOS 13.0 + - watchOS 3.2 + - watchOS 4.0 + - watchOS 4.1 + - watchOS 4.2 + - watchOS 5.0 + - watchOS 5.1 + - watchOS 6.0 + jdk: "12.0.1" - image: xcode10.2 xcode: "10.2" osx_version: "10.14" From c99ef16afb33166d9bd94e74959860cc962f2cbf Mon Sep 17 00:00:00 2001 From: Ana Rosas Date: Fri, 5 Jul 2019 15:33:16 -0500 Subject: [PATCH 0046/1536] npm default caching --- user/languages/javascript-with-nodejs.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/user/languages/javascript-with-nodejs.md b/user/languages/javascript-with-nodejs.md index 3d46cfb5230..05e5a997125 100644 --- a/user/languages/javascript-with-nodejs.md +++ b/user/languages/javascript-with-nodejs.md @@ -135,7 +135,14 @@ as specified in your lock file. #### Caching with `npm` -You can cache your dependencies with +`npm` is now cached by default, in case you want to disbale it, please add the following to your `.travis.yml`: + +```yaml +cache: + npm: false +``` + +To explicitly cache your dependecies: ```yaml cache: npm From 8318cb56c5005c47466f2e09ef3e485f496d8c3a Mon Sep 17 00:00:00 2001 From: anarosas Date: Fri, 5 Jul 2019 15:39:17 -0500 Subject: [PATCH 0047/1536] Update Caching dependencies and Directories page --- user/caching.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/user/caching.md b/user/caching.md index a3cdb1d7bee..d96600d3425 100644 --- a/user/caching.md +++ b/user/caching.md @@ -135,7 +135,16 @@ podfile: path/to/Podfile ### npm cache -For caching with `npm`, use: +> Please note that npm is now cached by default on Travis CI + +To disable npm caching, use: + +```yaml +cache: + npm: false +``` + +To explicitly cache `npm`, use: ```yaml language: node_js From 6fecd44a10a166fdf552b291ad55db7029a00ccd Mon Sep 17 00:00:00 2001 From: Aliabbas Merchant Date: Sun, 7 Jul 2019 10:13:39 +0530 Subject: [PATCH 0048/1536] Remove repetitive word --- user/deployment/heroku.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/deployment/heroku.md b/user/deployment/heroku.md index 4339b22533a..b0d5cc6a7c4 100644 --- a/user/deployment/heroku.md +++ b/user/deployment/heroku.md @@ -24,7 +24,7 @@ If you have both the [Heroku](https://devcenter.heroku.com/articles/heroku-cli) travis encrypt $(heroku auth:token) --add deploy.api_key ``` -`travis` command defaults to using [travis-ci.org](https://travis-ci.org) as the API endpoint. If your build runs on on [travis-ci.com](https://travis-ci.com) (even if your repository is public), add `--pro` flag to override this: +`travis` command defaults to using [travis-ci.org](https://travis-ci.org) as the API endpoint. If your build runs on [travis-ci.com](https://travis-ci.com) (even if your repository is public), add `--pro` flag to override this: ```bash travis encrypt $(heroku auth:token) --add deploy.api_key --pro From 77f88f22be6f201f7f6595553ac5a69c2ae5d06d Mon Sep 17 00:00:00 2001 From: Daniel Kraus Date: Mon, 8 Jul 2019 10:23:31 +0200 Subject: [PATCH 0049/1536] Add section on accessing full SCM history (#2361) --- user/sonarcloud.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/user/sonarcloud.md b/user/sonarcloud.md index 48519e50e04..1708f2d63e7 100644 --- a/user/sonarcloud.md +++ b/user/sonarcloud.md @@ -86,6 +86,15 @@ Future versions of this add-on will provide the following features: - Support for external pull requests. +## Accessing full SCM history + +Travis CI uses [shallow clone](https://docs.travis-ci.com/user/customizing-the-build/#git-clone-depth) to speed up build times, but a truncated SCM history may cause issues when SonarCloud computes blame data. To avoid this, you can access the full SCM history with: + +```yaml +git: + depth: false +``` + ## Deprecated features If you are a long-time SonarCloud user, you might have the following entries in your `.travis.yml` file: From d2922c4f7d1a7b2e1e24d4c6b7c698e57b5e4774 Mon Sep 17 00:00:00 2001 From: Torkel Rogstad Date: Mon, 8 Jul 2019 10:27:06 +0200 Subject: [PATCH 0050/1536] Fix missing negation in regex example (#2370) --- user/conditions-v1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/conditions-v1.md b/user/conditions-v1.md index 7f759e8795b..daba248209c 100644 --- a/user/conditions-v1.md +++ b/user/conditions-v1.md @@ -376,7 +376,7 @@ Do not build on forks: fork = false ``` -Build only when the commit message matches against the given regular expression: +Build only when the commit message doesn't match against the given regular expression: ``` commit_message !~ /(no-deploy|wip)/ From 4ef058dbb84fff9bf2d107eeba69ebf27a1cf4be Mon Sep 17 00:00:00 2001 From: Kolja Zuelsdorf Date: Mon, 8 Jul 2019 10:28:06 +0200 Subject: [PATCH 0051/1536] Added note about how the repo slug is built up. (#2331) --- 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 b3ef38cb1c0..1aa5ae2f3aa 100644 --- a/user/deployment/pages.md +++ b/user/deployment/pages.md @@ -45,7 +45,7 @@ or via [encrypted variables in * `local_dir`: Directory to push to GitHub Pages, defaults to current directory. Can be specified as an absolute path or a relative path from the current directory. -* `repo`: Repo slug, defaults to current repo. +* `repo`: Repo slug, defaults to current repo. **Note:** The slug consists of username and repo name and is formatted like `user/repo-name`. * `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 From 23b6db3b05dc625dc7866dbc06fd6cdb8c7f811e Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Mon, 8 Jul 2019 11:21:34 +0200 Subject: [PATCH 0052/1536] Note before action! --- user/enterprise/troubleshooting-guide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index eaff1f9becc..2c5e38ee53a 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -202,7 +202,7 @@ A user can sync their account with your GitHub instance via the web UI: An administrator can also initiate a sync on behalf of a user via the `travis` CLI tool on the platform machine: +> If `—logins=` is not provided then this command will trigger a sync on every user. This could result in long runtimes and may impact production operations if you have a large number of total users on your Travis CI Enterprise instance. + 1. Open a SSH connection to the platform machine. 2. Initiate a sync by running `travis sync_users —logins=` - -> If `—logins=` is not provided then this command will trigger a sync on every user. This could result in long runtimes and may impact production operations if you have a large number of total users on your Travis CI Enterprise instance. From 910357da425e0e09322891bb1ee59ca63c3f20fd Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Mon, 8 Jul 2019 11:26:44 +0200 Subject: [PATCH 0053/1536] Update user/enterprise/troubleshooting-guide.md --- user/enterprise/troubleshooting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index 2c5e38ee53a..8852a5999d0 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -200,7 +200,7 @@ A user can sync their account with your GitHub instance via the web UI: #### Administrator initiates sync via CLI -An administrator can also initiate a sync on behalf of a user via the `travis` CLI tool on the platform machine: +An administrator can also initiate a sync on behalf of someone else via the `travis` CLI tool on the platform machine: > If `—logins=` is not provided then this command will trigger a sync on every user. This could result in long runtimes and may impact production operations if you have a large number of total users on your Travis CI Enterprise instance. From 3c7ebd22139ac8f02e7c7518b636c656c7834ac3 Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Mon, 8 Jul 2019 11:26:55 +0200 Subject: [PATCH 0054/1536] Update user/enterprise/troubleshooting-guide.md --- user/enterprise/troubleshooting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index 8852a5999d0..65fb4c086ca 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -194,7 +194,7 @@ There are two options listed below to initiate a sync between your Travis CI Ent A user can sync their account with your GitHub instance via the web UI: -1. User accesses the web UI by going to `https://` in their browser. +1. Open `https://`. 2. In the upper right corner of the page hover over the user icon and select 'Profile' from the dropdown menu. 3. In the upper right corner of the profile page click on 'Sync account'. From 04989c17cc9b035c1f5c1b0bda678238a53e6a7b Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Mon, 8 Jul 2019 11:27:08 +0200 Subject: [PATCH 0055/1536] Update user/enterprise/troubleshooting-guide.md --- user/enterprise/troubleshooting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index 65fb4c086ca..5925d86a5cd 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -190,7 +190,7 @@ The workaround for this issue is to manually re-sync the user account with GitHu There are two options listed below to initiate a sync between your Travis CI Enterprise instance and GitHub instance. -#### User initiates a sync via their profile in web UI +#### Sync account from Travis CI web interface A user can sync their account with your GitHub instance via the web UI: From 1d1a7e73fb5fc7914d4e4a52e52d47c4fa3eea40 Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Mon, 8 Jul 2019 11:27:20 +0200 Subject: [PATCH 0056/1536] Update user/enterprise/troubleshooting-guide.md --- user/enterprise/troubleshooting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index 5925d86a5cd..a534a5a51f4 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -198,7 +198,7 @@ A user can sync their account with your GitHub instance via the web UI: 2. In the upper right corner of the page hover over the user icon and select 'Profile' from the dropdown menu. 3. In the upper right corner of the profile page click on 'Sync account'. -#### Administrator initiates sync via CLI +#### Sync from the CLI with administrator privileges``` An administrator can also initiate a sync on behalf of someone else via the `travis` CLI tool on the platform machine: From f967696c4d973d2ad74115b10834973efabf26bf Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Mon, 8 Jul 2019 11:27:30 +0200 Subject: [PATCH 0057/1536] Update user/enterprise/troubleshooting-guide.md --- user/enterprise/troubleshooting-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index a534a5a51f4..4bc402c7082 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -192,7 +192,7 @@ There are two options listed below to initiate a sync between your Travis CI Ent #### Sync account from Travis CI web interface -A user can sync their account with your GitHub instance via the web UI: +To sync your account with your GitHub instance: 1. Open `https://`. 2. In the upper right corner of the page hover over the user icon and select 'Profile' from the dropdown menu. From 97402c524a63230ce3302a65033ed2705fd0802e Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Mon, 8 Jul 2019 14:30:29 +0200 Subject: [PATCH 0058/1536] Update releases.md --- user/deployment/releases.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/user/deployment/releases.md b/user/deployment/releases.md index 53a3650909e..f00759c1c33 100644 --- a/user/deployment/releases.md +++ b/user/deployment/releases.md @@ -255,3 +255,8 @@ These include: * `prerelease` (boolean) Note that formatting in `body` is [not preserved](https://github.com/travis-ci/dpl/issues/155). + +## Troubleshooting Git Submodules + +GitHub Releases executes a number of git commands during deployment. For this reason, it is important that the working directory is set to the one for which the release will be created, which generally isn't a problem, but if you clone another repository during the build or use submodules, it is worth double checking. + From c7706b9f438d8ef6a9496bc52819a5521619a664 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Mon, 8 Jul 2019 14:56:50 +0200 Subject: [PATCH 0059/1536] Update Ruby --- .ruby-version | 2 +- .travis.yml | 2 +- Gemfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.ruby-version b/.ruby-version index 35cee72dcbf..ec1cf33c3f6 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.4.3 +2.6.3 diff --git a/.travis.yml b/.travis.yml index bcb3631cb3a..46b511c71a2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,7 +37,7 @@ notifications: webhooks: https://docs.travis-ci.com/update_webhook_payload_doc install: - - rvm use 2.4.3 --install + - rvm use 2.6.3 --install - gem install bundler -v '< 2' - bundle install --deployment - sudo apt-get install libcurl4-openssl-dev # required to avoid SSL errors diff --git a/Gemfile b/Gemfile index 4260ed81228..11fb721ed5b 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -ruby '2.4.3' +ruby '2.6.3' gem 'faraday' gem 'html-proofer', '~> 3.0' From 53a42de1335bd7b7e67b37d20b322e43f0aa3867 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Mon, 8 Jul 2019 15:09:04 +0200 Subject: [PATCH 0060/1536] Bump --- .ruby-version | 2 +- Gemfile | 4 +--- Gemfile.lock | 6 ++---- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/.ruby-version b/.ruby-version index ec1cf33c3f6..4560fb912c0 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.6.3 +ruby-2.6.3 diff --git a/Gemfile b/Gemfile index 11fb721ed5b..245c548af7d 100644 --- a/Gemfile +++ b/Gemfile @@ -27,9 +27,7 @@ gem "middleman-syntax" gem 'middleman-gh-pages' # Live-reloading plugin -gem "middleman-livereload", "~> 3.3.0" - -gem 'redcarpet' +gem "middleman-livereload" # Cross-templating language block fix for Ruby 1.8 platforms :mri_18 do diff --git a/Gemfile.lock b/Gemfile.lock index e306965dfcc..1fcee878b36 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -180,7 +180,6 @@ GEM rb-inotify (0.9.10) ffi (>= 0.5.0, < 2) rdiscount (2.2.0.1) - redcarpet (3.4.0) ref (2.0.0) rouge (2.2.1) rubocop (0.57.2) @@ -237,7 +236,7 @@ DEPENDENCIES jekyll-redirect-from middleman middleman-gh-pages - middleman-livereload (~> 3.3.0) + middleman-livereload middleman-syntax pry puma @@ -245,13 +244,12 @@ DEPENDENCIES rack-ssl-enforcer rake rdiscount (>= 2.2.0.1) - redcarpet rubocop ruby18_source_location therubyracer RUBY VERSION - ruby 2.4.3p205 + ruby 2.6.3p62 BUNDLED WITH 1.17.3 From 7ca7bcb51a68ce593622ef29942abb906ac59e18 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Mon, 8 Jul 2019 15:12:23 +0200 Subject: [PATCH 0061/1536] Probably with a current ruby we can get rid of this? --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 46b511c71a2..cb711f7a118 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,7 +38,6 @@ notifications: https://docs.travis-ci.com/update_webhook_payload_doc install: - rvm use 2.6.3 --install - - gem install bundler -v '< 2' - bundle install --deployment - sudo apt-get install libcurl4-openssl-dev # required to avoid SSL errors script: From 6cd483e8fefe759a6ca4fb060823475534f81ddb Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Mon, 8 Jul 2019 15:17:05 +0200 Subject: [PATCH 0062/1536] We need this --- Gemfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Gemfile b/Gemfile index 245c548af7d..f67f00dc168 100644 --- a/Gemfile +++ b/Gemfile @@ -29,6 +29,9 @@ gem 'middleman-gh-pages' # Live-reloading plugin gem "middleman-livereload" +# Needed for Slate / middleman +gem 'redcarpet' + # Cross-templating language block fix for Ruby 1.8 platforms :mri_18 do gem "ruby18_source_location" From f4e534e5969148d1a204f7334c283a1c451676f3 Mon Sep 17 00:00:00 2001 From: Samuel Wright Date: Mon, 8 Jul 2019 15:22:02 +0200 Subject: [PATCH 0063/1536] Update lock --- Gemfile.lock | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Gemfile.lock b/Gemfile.lock index 1fcee878b36..801345753f0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -180,6 +180,7 @@ GEM rb-inotify (0.9.10) ffi (>= 0.5.0, < 2) rdiscount (2.2.0.1) + redcarpet (3.4.0) ref (2.0.0) rouge (2.2.1) rubocop (0.57.2) @@ -244,6 +245,7 @@ DEPENDENCIES rack-ssl-enforcer rake rdiscount (>= 2.2.0.1) + redcarpet rubocop ruby18_source_location therubyracer From f8839352c9ec96214c57f35ea28743459c4c074b Mon Sep 17 00:00:00 2001 From: Fabrice Bellingard Date: Mon, 8 Jul 2019 16:26:43 +0200 Subject: [PATCH 0064/1536] Apply feedback Co-Authored-By: Pezi777 <52408528+Pezi777@users.noreply.github.com> --- user/sonarcloud.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/sonarcloud.md b/user/sonarcloud.md index 4e17ab430d9..eccb2a5198e 100644 --- a/user/sonarcloud.md +++ b/user/sonarcloud.md @@ -68,7 +68,7 @@ script: ``` {: data-file=".travis.yml"} -2 important informations: +> Please note the following: - the "coverage" profile activates the generation of the JaCoCo XML report - "sonar.projectKey" can also be set as a property on the main POM file. Its value can be found on the right side of the project homepage on SonarCloud From 116108310193cfc7da3b2da37600852890cc28bb Mon Sep 17 00:00:00 2001 From: Plaindocs Date: Mon, 8 Jul 2019 17:11:03 +0200 Subject: [PATCH 0065/1536] Add Kramdown and Notes (#2403) * Add Kramdown and Notes * Update STYLE.md --- STYLE.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/STYLE.md b/STYLE.md index cc891eddf91..2df480c6e02 100644 --- a/STYLE.md +++ b/STYLE.md @@ -12,6 +12,8 @@ We'll be using a subset (TBD) of the full [list of checks][checks]. [checks]: https://github.com/coala/bear-docs/blob/master/docs/MarkdownBear.rst#settings "MarkdownBear checks" +We use Kramdown, with [GFM](https://guides.github.com/features/mastering-markdown/#GitHub-flavored-markdown) codeblocks, and a few Kramdown related exceptions introduced with `{: }` such as class names for specific formatting of columns and notes. + ### Headings For historical reasons, the top level heading in Jekyll markdown files is level 2 (##) not level 1 (#). @@ -49,7 +51,11 @@ All pages have tables of contents generated automatically from H2 and H3 To remove the TOC from a page add `no_toc: true` to the frontmatter. -### Beta features +### Note, warnings and blocks + +We use the blockquote symbol `>` for general purpose notes and warnings. + +#### Beta features Mark all beta features with a specially formatted note. Both the `> BETA` and the `{: .beta}` are required. @@ -57,7 +63,7 @@ the `{: .beta}` are required. > BETA Awesome new feature that might not be enabled and is subject to change. {: .beta} -### Alpha features +#### Alpha features Mark all alpha features with a specially formatted note. Both the `> ALPHA` and the `{: alpha}` are required. From 5110298623983fca6e5f84ac2ab80dad477446c7 Mon Sep 17 00:00:00 2001 From: zhengphou <50313279+zhengphou@users.noreply.github.com> Date: Tue, 9 Jul 2019 07:14:21 +0800 Subject: [PATCH 0066/1536] Not mentioning enterprise --- user/reference/bionic.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index c59aebe2bd5..3fa1e70ddbf 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -13,12 +13,11 @@ To route your builds to Ubuntu 18.04 LTS, Bionic, add the following to your `.tr ```yaml dist: bionic +group: dev ``` {: data-file=".travis.yml"} -> Please note that Bionic is available at travis-ci.com and travis-ci.org, on the fully virtualized -infrastructure. If you are running an Enterprise installation, please reach out -to [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com?subject=Try%20out%20Bionic) to see how you can use the Bionic Docker images. +> Please note that Bionic support is newly being built, to use it, **dev** is needed. ## Differences from the previous release images From 3c7cdc9eaff701a12970428bf873c0d81baf9696 Mon Sep 17 00:00:00 2001 From: zhengphou <50313279+zhengphou@users.noreply.github.com> Date: Tue, 9 Jul 2019 19:45:14 +0800 Subject: [PATCH 0067/1536] Update bionic.md --- user/reference/bionic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index 3fa1e70ddbf..1f3bdc1fb84 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -17,7 +17,7 @@ group: dev ``` {: data-file=".travis.yml"} -> Please note that Bionic support is newly being built, to use it, **dev** is needed. +> Please note that tag **dev** is needed to use the image. ## Differences from the previous release images From 5809aba428f1104046804021873560ee526d8b1b Mon Sep 17 00:00:00 2001 From: Ana Rosas Date: Tue, 9 Jul 2019 12:03:39 -0500 Subject: [PATCH 0068/1536] Fix typo Co-Authored-By: Plaindocs --- user/languages/javascript-with-nodejs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/languages/javascript-with-nodejs.md b/user/languages/javascript-with-nodejs.md index 05e5a997125..2286307114e 100644 --- a/user/languages/javascript-with-nodejs.md +++ b/user/languages/javascript-with-nodejs.md @@ -135,14 +135,14 @@ as specified in your lock file. #### Caching with `npm` -`npm` is now cached by default, in case you want to disbale it, please add the following to your `.travis.yml`: +`npm` is now cached by default, in case you want to disable it, please add the following to your `.travis.yml`: ```yaml cache: npm: false ``` -To explicitly cache your dependecies: +To explicitly cache your dependencies: ```yaml cache: npm From bd7da81fd9f4dae271a026b6123d82fc73528174 Mon Sep 17 00:00:00 2001 From: Ana Rosas Date: Tue, 9 Jul 2019 12:17:58 -0500 Subject: [PATCH 0069/1536] Specify when npm caching was set as default --- user/caching.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/caching.md b/user/caching.md index d96600d3425..8d2ec51e893 100644 --- a/user/caching.md +++ b/user/caching.md @@ -135,7 +135,7 @@ podfile: path/to/Podfile ### npm cache -> Please note that npm is now cached by default on Travis CI +> Please note that as of July 2019, npm is cached by default on Travis CI To disable npm caching, use: From fb00a944b59b662b349b9ba19a5b91463668a830 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 10 Jul 2019 08:04:09 +0200 Subject: [PATCH 0070/1536] Update user/using-workspaces.md --- user/using-workspaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/using-workspaces.md b/user/using-workspaces.md index 67000a40fc4..acbed91fd7d 100644 --- a/user/using-workspaces.md +++ b/user/using-workspaces.md @@ -98,7 +98,7 @@ In this example: using a custom script. ## Workspaces and concurrency -Note that workspaces work best if there is not race condition in +Note that workspaces work best if there is no race condition set while uploading them. Since there is no guarantee in the execution order of jobs within a build stage, it is a good idea to assign different workspace names to jobs within From 73b296dfa283ca5d0f6d3806905f19bace6347ab Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 10 Jul 2019 08:04:19 +0200 Subject: [PATCH 0071/1536] Update user/using-workspaces.md --- user/using-workspaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/using-workspaces.md b/user/using-workspaces.md index acbed91fd7d..e0a03737e41 100644 --- a/user/using-workspaces.md +++ b/user/using-workspaces.md @@ -138,7 +138,7 @@ even if the consumer is running on a Linux VM. It is worth reiterating that the workspaces are meant for sharing files within a build. -For files that you want to share across builds, use +For files you want to share across builds, use [caches](/user/caching). ### Workspaces and caches are considered independently From a6ff65bb535fbbe602c5c138f4ec1c66179bdc8b Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 10 Jul 2019 08:04:28 +0200 Subject: [PATCH 0072/1536] Update user/using-workspaces.md --- user/using-workspaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/using-workspaces.md b/user/using-workspaces.md index e0a03737e41..ef583e95c6c 100644 --- a/user/using-workspaces.md +++ b/user/using-workspaces.md @@ -146,7 +146,7 @@ For files you want to share across builds, use It is possible to include a single file in the cache and workspaces. ## How restarting a portion of a build affects workspaces -Note that workspaces are built and consumed by jobs in a builld. +Note that workspaces are built and consumed by jobs in a build. If you restart parts of the build in some arbitrary order, workspaces may interfere in subtle and unexpected ways. If you suspect such interference, we advise you to restart the entire build. From 6ebbe48d8ad531eb7897c48f516055f1c42c2850 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 10 Jul 2019 08:05:11 +0200 Subject: [PATCH 0073/1536] Update user/using-workspaces.md Co-Authored-By: Plaindocs --- user/using-workspaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/using-workspaces.md b/user/using-workspaces.md index ef583e95c6c..9c3b960cdcf 100644 --- a/user/using-workspaces.md +++ b/user/using-workspaces.md @@ -137,7 +137,7 @@ even if the consumer is running on a Linux VM. ## How workspaces differ from caches It is worth reiterating that the workspaces are meant for sharing files -within a build. +within the same build. For files you want to share across builds, use [caches](/user/caching). From 156cdf67a07bffc6620b5d92eea92611f377efa7 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 10 Jul 2019 08:11:12 +0200 Subject: [PATCH 0074/1536] Update bionic.md --- user/reference/bionic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index 1f3bdc1fb84..2f29efbb96c 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -17,7 +17,7 @@ group: dev ``` {: data-file=".travis.yml"} -> Please note that tag **dev** is needed to use the image. +> Please note that tag `dev` is needed to use the image. ## Differences from the previous release images From 9e48d8cd0effd38a4c526f7f44d31591ac82a323 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 10 Jul 2019 08:13:37 +0200 Subject: [PATCH 0075/1536] Update user/using-workspaces.md --- user/using-workspaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/using-workspaces.md b/user/using-workspaces.md index 9c3b960cdcf..91620ac54d5 100644 --- a/user/using-workspaces.md +++ b/user/using-workspaces.md @@ -11,7 +11,7 @@ layout: en Workspaces allow jobs _within_ a build to share files. They are useful when you want to use build artifacts from a previous job; -for example, you might create a cache that can be used in multiple jobs later. +for example, you create a cache that can be used in multiple jobs later. While any build can theoretically use workspaces, they are most useful when there is a clear timeline of when they are used. From ac4ea6e811810463f20e439f207cab956ef97131 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 10 Jul 2019 08:14:10 +0200 Subject: [PATCH 0076/1536] Update user/using-workspaces.md --- user/using-workspaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/using-workspaces.md b/user/using-workspaces.md index 91620ac54d5..cee2682b413 100644 --- a/user/using-workspaces.md +++ b/user/using-workspaces.md @@ -18,7 +18,7 @@ there is a clear timeline of when they are used. For this reason, we recommend using workspaces when you use [build stages](/user/build-stages). -Roughly speaking, you create a workspace in one stage, then use it in +> Note that it is best to create a workspace in one stage and then use it in subsequent stages. ## Configuration From 20ae6b372f6e2fefc9c1d9f3bda14dff0ca54ab5 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 10 Jul 2019 08:57:13 +0200 Subject: [PATCH 0077/1536] Update using-workspaces.md --- user/using-workspaces.md | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/user/using-workspaces.md b/user/using-workspaces.md index cee2682b413..2803a681461 100644 --- a/user/using-workspaces.md +++ b/user/using-workspaces.md @@ -13,10 +13,7 @@ Workspaces allow jobs _within_ a build to share files. They are useful when you want to use build artifacts from a previous job; for example, you create a cache that can be used in multiple jobs later. -While any build can theoretically use workspaces, they are most useful when -there is a clear timeline of when they are used. -For this reason, we recommend using workspaces when you use -[build stages](/user/build-stages). +So you can clearly see when a workspace is created and used, we recommend using workspaces with [build stages](/user/build-stages), as shown in the following [examples](user/using-workspaces#Workspace examples). > Note that it is best to create a workspace in one stage and then use it in subsequent stages. @@ -53,9 +50,9 @@ In the example above, the workspace named `ws1` is created by the only job in the `warm_cache` stage. The workspace is subsequently consumed in the `use_cache` stage. -## Example configurations +## Workspace examples -### Using multiple workspaces in a build +### Multiple workspaces example You can use multiple workspaces in a build. @@ -145,8 +142,4 @@ For files you want to share across builds, use It is possible to include a single file in the cache and workspaces. -## How restarting a portion of a build affects workspaces -Note that workspaces are built and consumed by jobs in a build. -If you restart parts of the build in some arbitrary order, workspaces may -interfere in subtle and unexpected ways. -If you suspect such interference, we advise you to restart the entire build. +> If you restart some builds within a job, and your workspace isn't working like you expect it to, try restarting the the entire build. From 5cec19aa7567fc7bdfac312c7783c0dd9d7eece8 Mon Sep 17 00:00:00 2001 From: Roberto Aloi Date: Wed, 10 Jul 2019 09:38:54 +0200 Subject: [PATCH 0078/1536] Update coveralls.md --- user/coveralls.md | 1 + 1 file changed, 1 insertion(+) diff --git a/user/coveralls.md b/user/coveralls.md index 84cdc00d973..84fc9456abb 100644 --- a/user/coveralls.md +++ b/user/coveralls.md @@ -68,6 +68,7 @@ Coveralls have documentation for many other programming languages: - [C / C++](https://docs.coveralls.io/c) - [D](https://docs.coveralls.io/d) - [Elixir](https://docs.coveralls.io/elixir) +- [Erlang](https://docs.coveralls.io/erlang) - [Fortran](https://docs.coveralls.io/fortran) - [Go](https://docs.coveralls.io/go) - [Haskell](https://docs.coveralls.io/haskell) From 3082f7cf540159fe5a2a14e823fba59efffd4465 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Wed, 10 Jul 2019 08:55:03 -0400 Subject: [PATCH 0079/1536] Explain how to obtain pub key on travis-ci.com And bring it up to date with API V3 --- user/encryption-keys.md | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/user/encryption-keys.md b/user/encryption-keys.md index e1416c971a2..3fcaa8e2e25 100644 --- a/user/encryption-keys.md +++ b/user/encryption-keys.md @@ -12,7 +12,36 @@ 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 (not even the encrypter, or "owner" of the `foo/bar` repository!). +Travis CI uses asymmetric cryptography. For each registered repository, Travis CI generates an RSA keypair. + +### Obtaining the public key + +Travis CI keeps the private key private, but makes the repository's public key available to those who have access to the repository. + +#### Repositories on travis-ci.org using older API + +For all repositories on [travis-ci.org](https://travis-ci.org), you can obtain the public key anoymously using the older API 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!). + +#### Repositories on travis-ci.com and travis-ci.org using API V3 + +Repositories (both public and private) on [travis-ci.com](https://travis-ci.com) requires an authorized user's API token to obtain the public key. + + 1. The travis-ci.com API token is found on your [account page](https://travis-ci.com/account/preferences). + 1. Send a `GET` request to https://api.travis-ci.com/v3/repo/OWNER%2fREPO/key_pair/generated along with the authorization header. + + curl -H "Authorization: token **TOKEN**" \ + https://api.travis-ci.com/v3/repo/OWNER%2fREPO/key_pair/generated + +Note that the repository name above is URL-encoded with `%2f`. + +This method also works with repositories on [travis-ci.org](https://travis-ci.org). +Obtain the API key from the [account page on travis-ci.org](https://travis-ci.org/account/preferences), and send +the request to `api.travis-ci.org`: + + curl -H "Authorization: token **TOKEN**" \ + https://api.travis-ci.org/v3/repo/OWNER%2fREPO/key_pair/generated ## Usage From ef696f72ee93ff32bc10ef9304d5a1cca2af7df3 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Thu, 11 Jul 2019 07:59:08 -0400 Subject: [PATCH 0080/1536] Apply suggestions from code review Co-Authored-By: Pezi777 <52408528+Pezi777@users.noreply.github.com> --- user/encryption-keys.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/user/encryption-keys.md b/user/encryption-keys.md index 3fcaa8e2e25..37931f5ec9a 100644 --- a/user/encryption-keys.md +++ b/user/encryption-keys.md @@ -20,28 +20,34 @@ Travis CI keeps the private key private, but makes the repository's public key a #### Repositories on travis-ci.org using older API -For all repositories on [travis-ci.org](https://travis-ci.org), you can obtain the public key anoymously using the older API at `https://api.travis-ci.org/repos/foo/bar/key`. +For all repositories on [travis-ci.org](https://travis-ci.org), you can obtain the public key anonymously using the older API 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!). #### Repositories on travis-ci.com and travis-ci.org using API V3 -Repositories (both public and private) on [travis-ci.com](https://travis-ci.com) requires an authorized user's API token to obtain the public key. +Repositories (both public and private) on [travis-ci.com](https://travis-ci.com) require an authorized user's API token to obtain the public key. 1. The travis-ci.com API token is found on your [account page](https://travis-ci.com/account/preferences). 1. Send a `GET` request to https://api.travis-ci.com/v3/repo/OWNER%2fREPO/key_pair/generated along with the authorization header. + ```curl curl -H "Authorization: token **TOKEN**" \ https://api.travis-ci.com/v3/repo/OWNER%2fREPO/key_pair/generated + ``` -Note that the repository name above is URL-encoded with `%2f`. + ```markdown + > Note that the repository name above is URL-encoded with `%2f`. + ``` -This method also works with repositories on [travis-ci.org](https://travis-ci.org). +This method also works for repositories on [travis-ci.org](https://travis-ci.org). Obtain the API key from the [account page on travis-ci.org](https://travis-ci.org/account/preferences), and send the request to `api.travis-ci.org`: + ```curl curl -H "Authorization: token **TOKEN**" \ https://api.travis-ci.org/v3/repo/OWNER%2fREPO/key_pair/generated + ``` ## Usage From eee16b0235d04e38a0e6635f62f0c60487cbacf5 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Thu, 11 Jul 2019 08:16:04 -0400 Subject: [PATCH 0081/1536] Fix teletype typesetting ``` does not work here. --- user/encryption-keys.md | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/user/encryption-keys.md b/user/encryption-keys.md index 37931f5ec9a..11caf5d686e 100644 --- a/user/encryption-keys.md +++ b/user/encryption-keys.md @@ -12,16 +12,16 @@ 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 uses asymmetric cryptography. For each registered repository, Travis CI generates an RSA keypair. ### Obtaining the public key -Travis CI keeps the private key private, but makes the repository's public key available to those who have access to the repository. +Travis CI keeps the private key private, but makes the repository's public key available to those who have access to the repository. #### Repositories on travis-ci.org using older API For all repositories on [travis-ci.org](https://travis-ci.org), you can obtain the public key anonymously using the older API 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!). #### Repositories on travis-ci.com and travis-ci.org using API V3 @@ -30,24 +30,18 @@ Repositories (both public and private) on [travis-ci.com](https://travis-ci.com) 1. The travis-ci.com API token is found on your [account page](https://travis-ci.com/account/preferences). 1. Send a `GET` request to https://api.travis-ci.com/v3/repo/OWNER%2fREPO/key_pair/generated along with the authorization header. - - ```curl + curl -H "Authorization: token **TOKEN**" \ https://api.travis-ci.com/v3/repo/OWNER%2fREPO/key_pair/generated - ``` - ```markdown - > Note that the repository name above is URL-encoded with `%2f`. - ``` - + > Note that the repository name above is URL-encoded with `%2f`. + This method also works for repositories on [travis-ci.org](https://travis-ci.org). Obtain the API key from the [account page on travis-ci.org](https://travis-ci.org/account/preferences), and send the request to `api.travis-ci.org`: - ```curl curl -H "Authorization: token **TOKEN**" \ https://api.travis-ci.org/v3/repo/OWNER%2fREPO/key_pair/generated - ``` ## Usage From 247ad085853a5c109f89166378bc30bd82efab51 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Thu, 11 Jul 2019 09:26:38 -0400 Subject: [PATCH 0082/1536] Use table to sort confusing bits Instead of a wall of text, use a table to visually break up the flow and present information in a more concise way. --- user/encryption-keys.md | 94 +++++++++++++++++++++++++++++------------ 1 file changed, 67 insertions(+), 27 deletions(-) diff --git a/user/encryption-keys.md b/user/encryption-keys.md index 11caf5d686e..29ff1196fb6 100644 --- a/user/encryption-keys.md +++ b/user/encryption-keys.md @@ -13,35 +13,75 @@ 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. - -### Obtaining the public key - Travis CI keeps the private key private, but makes the repository's public key available to those who have access to the repository. -#### Repositories on travis-ci.org using older API - -For all repositories on [travis-ci.org](https://travis-ci.org), you can obtain the public key anonymously using the older API 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!). - -#### Repositories on travis-ci.com and travis-ci.org using API V3 - -Repositories (both public and private) on [travis-ci.com](https://travis-ci.com) require an authorized user's API token to obtain the public key. - - 1. The travis-ci.com API token is found on your [account page](https://travis-ci.com/account/preferences). - 1. Send a `GET` request to https://api.travis-ci.com/v3/repo/OWNER%2fREPO/key_pair/generated along with the authorization header. - - curl -H "Authorization: token **TOKEN**" \ - https://api.travis-ci.com/v3/repo/OWNER%2fREPO/key_pair/generated - - > Note that the repository name above is URL-encoded with `%2f`. - -This method also works for repositories on [travis-ci.org](https://travis-ci.org). -Obtain the API key from the [account page on travis-ci.org](https://travis-ci.org/account/preferences), and send -the request to `api.travis-ci.org`: - - curl -H "Authorization: token **TOKEN**" \ - https://api.travis-ci.org/v3/repo/OWNER%2fREPO/key_pair/generated +Once the public key is available, anyone (including those without push access to +your repository) can encrypt data which can only be decrypted by Travis CI, +using the corresponding private key. + +### Obtaining the public keys + +The method to obtain the public key depends on where the target repository +exists, and the API version you are using. + +Furthermore, the request may require authorization via the `Authorization: token` +header depending on the repository's location and visibility, as well as +the API version used. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Authorization header requirement
      repository visibility and locationAPI serverAPI v1API v3
      /repos/OWNER/REPO/key/v3/repo/OWNER%2fREPO/key_pair/generated
      .orghttps://api.travis-ci.orgnoyes
      public on .comhttps://api.travis-ci.comyes
      yes
      private on .comhttps://api.travis-ci.comyes
      yes
      + +> Notice that API v3 endpoints above show the repository name with `%2f`. + +If the `Authorization: token` header is required, you can obtain the token by +visiting the account page: +- [travis-ci.org](https://travis-ci.org/account/preferences) +- [travis-ci.com](https://travis-ci.com/account/preferences) + +### Examples + +Here are some examples of `curl` commands to obtain the public key. + +1. A public repository on travis-ci.org using API v1 + + curl https://api.travis-ci.org/repos/travis-ci/travis-build/key + +1. A public repository on travis-ci.org using API v3 + + curl -H "Authorization: token **TOKEN**" https://api.travis-ci.org/v3/repo/travis-ci%2ftravis-build/key_pair/generated + +1. A private repository on travis-ci.com using API v3 + + curl -H "Authorization: token **TOKEN**" https://api.travis-ci.com/v3/repo/OWNER%2fREPO/key_pair/generated ## Usage From 7e233892837768f9cf8dae8d9ff6755f1955cc9d Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Thu, 11 Jul 2019 10:09:18 -0400 Subject: [PATCH 0083/1536] Update user/encryption-keys.md Co-Authored-By: Pezi777 <52408528+Pezi777@users.noreply.github.com> --- 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 29ff1196fb6..b638abb3129 100644 --- a/user/encryption-keys.md +++ b/user/encryption-keys.md @@ -31,7 +31,7 @@ the API version used. - + From c2b52e37338b7e149f58805ba7c7a570ae5d4d7c Mon Sep 17 00:00:00 2001 From: John Vandenberg Date: Sun, 14 Jul 2019 11:31:56 +0700 Subject: [PATCH 0084/1536] Update job-lifecycle.md: use install: skip Closes https://github.com/travis-ci/docs-travis-ci-com/issues/2422 --- user/job-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/job-lifecycle.md b/user/job-lifecycle.md index 2cad234bb04..09ed2c9f1d2 100644 --- a/user/job-lifecycle.md +++ b/user/job-lifecycle.md @@ -70,7 +70,7 @@ You can also use `apt-get` or `snap` to [install dependencies](/user/installing- Skip the installation step entirely by adding the following to your `.travis.yml`: ```yaml -install: true +install: skip ``` {: data-file=".travis.yml"} From 72181ef90412c2c7c02c5febbf6c329f2932904f Mon Sep 17 00:00:00 2001 From: Benjamin Bach Date: Mon, 15 Jul 2019 14:49:47 +0200 Subject: [PATCH 0085/1536] MOZ_HEADLESS=1 should be set as a global env I don't think it's best practice, even though there is just one variable, to define it as a test matrix entry. --- user/gui-and-headless-browsers.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/gui-and-headless-browsers.md b/user/gui-and-headless-browsers.md index cb7027eb9ef..6c17ffa9cba 100644 --- a/user/gui-and-headless-browsers.md +++ b/user/gui-and-headless-browsers.md @@ -195,7 +195,8 @@ Headless mode can be enabled using the `MOZ_HEADLESS` ```yaml env: - - MOZ_HEADLESS=1 + global: + - MOZ_HEADLESS=1 addons: firefox: latest ``` From 6d2fd1484f2f22d43f7889111850cb1db5e459f0 Mon Sep 17 00:00:00 2001 From: cclauss Date: Mon, 15 Jul 2019 16:15:09 +0200 Subject: [PATCH 0086/1536] Python 3 is now the default, not legacy Python https://github.com/travis-ci/travis-build/pull/1678 --- user/reference/xenial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/xenial.md b/user/reference/xenial.md index ed5faa9218a..1012971df18 100644 --- a/user/reference/xenial.md +++ b/user/reference/xenial.md @@ -109,7 +109,7 @@ The following versions of Docker, version control software and compilers are pre * Supported Python versions: `2.7`, `3.4` or higher. * Pre-installed Python versions: `2.7.15`, `3.6.7`, and `3.7.1`. -* Python `2.7.15` will be used when no language version is explicitly set. +* Python `3.6.7` will be used when no language version is explicitly set. If you're getting errors about PyPy `pypy is not installed; attempting download`, use one of the more recent python versions such as `pypy2.7-6.0` or `pypy3.5-6.0`. From dd8457bb5d7fa97b1940a2f810ea5aa1a8638c5e Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Mon, 15 Jul 2019 14:20:58 -0400 Subject: [PATCH 0087/1536] Fix cache configuration documentation --- user/caching.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/caching.md b/user/caching.md index 8d2ec51e893..38809462f9d 100644 --- a/user/caching.md +++ b/user/caching.md @@ -113,8 +113,8 @@ them both: ```yaml language: objective-c cache: - - bundler - - cocoapods + bundler: true + cocoapods: true ``` {: data-file=".travis.yml"} From 85fc376cb971f6536ab2423a4647381a81f0234d Mon Sep 17 00:00:00 2001 From: zhengphou <50313279+zhengphou@users.noreply.github.com> Date: Tue, 16 Jul 2019 13:38:48 +0800 Subject: [PATCH 0088/1536] drop the tag of dev --- user/reference/bionic.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index 2f29efbb96c..3d46face253 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -13,11 +13,9 @@ To route your builds to Ubuntu 18.04 LTS, Bionic, add the following to your `.tr ```yaml dist: bionic -group: dev ``` {: data-file=".travis.yml"} -> Please note that tag `dev` is needed to use the image. ## Differences from the previous release images @@ -31,7 +29,6 @@ To specify a third party apt-repository, you can [add the source with the apt ad ```yaml dist: bionic -group: dev addons: apt: sources: From 5ea02449ced06f20623928dee205d96d08b77000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20de=20Ant=C3=B3n?= Date: Tue, 16 Jul 2019 16:14:20 +0200 Subject: [PATCH 0089/1536] Add automatic open source to travis-ci.com beta instructions (#2401) * add automatic beta instructions * fix numbered list with image in between --- .../sign-up-for-the-beta-to-migrate.png | Bin 0 -> 108638 bytes user/migrate/open-source-on-travis-ci-com.md | 9 +++++++-- .../open-source-repository-migration.md | 16 ++++++++-------- 3 files changed, 15 insertions(+), 10 deletions(-) create mode 100644 images/migrate/sign-up-for-the-beta-to-migrate.png diff --git a/images/migrate/sign-up-for-the-beta-to-migrate.png b/images/migrate/sign-up-for-the-beta-to-migrate.png new file mode 100644 index 0000000000000000000000000000000000000000..469e8a8d43dff0eae49af729cc96f115135ea693 GIT binary patch literal 108638 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 SVv7uL9k+KqT5Ws!+J6DOFe;h= literal 0 HcmV?d00001 diff --git a/user/migrate/open-source-on-travis-ci-com.md b/user/migrate/open-source-on-travis-ci-com.md index 4f3a3c60f64..71d4c8d2f58 100644 --- a/user/migrate/open-source-on-travis-ci-com.md +++ b/user/migrate/open-source-on-travis-ci-com.md @@ -45,9 +45,13 @@ However, you can be included in the closed beta testing to start migrating your 1. To have any public repository migrated over, it must be first activated on [travis-ci.com] using GitHub Apps. - 1. Send us an email to [support@travis-ci.com with the subject "Open Source Migration Beta Testing"](mailto:support@travis-ci.com?subject=Open%20Source%20Migration%20Beta%20Testing) + 2. Head over to [travis-ci.org] and in [your account page](https://travis-ci.org/account/repositories), subscribe to be part of the beta to migrate your Open Source repositories. - 1. Check out what the beta testing includes on this [open source to travis-ci.com migration guide](/user/migrate/open-source-repository-migration). + ![Select "Sign up for the beta" in your account page and add organizations](/images/migrate/sign-up-for-the-beta-to-migrate.png) + + 3. Once your account is ready to migrate, you'll receive a confirmation email. + + 4. Check out what the beta testing includes on this [open source to travis-ci.com migration guide](/user/migrate/open-source-repository-migration). ## Existing Private Repositories on `travis-ci.com` @@ -63,3 +67,4 @@ If you have any questions, please email please contact [support@travis-ci.com](m [travis-ci.com]: https://www.travis-ci.com +[travis-ci.org]: https://www.travis-ci.org diff --git a/user/migrate/open-source-repository-migration.md b/user/migrate/open-source-repository-migration.md index 5a0638fa09a..318fd6b93a4 100644 --- a/user/migrate/open-source-repository-migration.md +++ b/user/migrate/open-source-repository-migration.md @@ -8,7 +8,7 @@ On May 2nd, 2018 Travis CI announced that open source projects will be [joining This document explains how to migrate your repositories, and answers some common questions about the migration. -> Hi there! If you'd like to become a beta tester, send us an email to [support@travis-ci.com with the subject "Open Source Migration Beta Testing"](mailto:support@travis-ci.com?subject=Open%20Source%20Migration%20Beta%20Testing) - we'll be there to send you further details! +> Hi there! If you'd like to become a beta tester, please sign in at [travis-ci.org] and in [your account page](https://travis-ci.org/account/repositories), sign up to migrate your Open Source repositories. ## What information will be transferred to travis-ci.com? @@ -24,7 +24,7 @@ When a repository is migrated, the following information will be transferred to The following information will not be transferred to travis-ci.com when a repository is migrated. -* Previous build history - your builds from before the migration to travis-ci.com will remain on travis-ci.org until the complete build- history migration (sometime in Q2 2019) +* Previous build history - your builds from before the migration to travis-ci.com will remain on travis-ci.org until the complete build- history migration (sometime in early Q3 2019) * Caches - they will be re-created automatically on the first build on travis-ci.com ## Do I need to make any other changes? @@ -70,7 +70,7 @@ We'll enqueue these build requests and the builds will be created in travis-ci.c If you are already using GitHub Apps for your account in travis-ci.com, you need to access your installation settings and grant access to the repositories you'd like to migrate. Otherwise: -1. Log in to [https://travis-ci.com](https://travis-ci.com) and access your profile (or your organization's) at [https://travis-ci.com/profile](https://travis-ci.com/profile) +1. Log in to [https://travis-ci.com] and access your profile (or your organization's) at [https://travis-ci.com/profile](https://travis-ci.com/profile) 2. If you aren't using the new GitHub Apps integration already, activate it for your account ![Activate GitHub Apps](/user/images/oss-migration/gapps-activate.png) @@ -123,11 +123,7 @@ If you'd like to automate your migration process, it's also possible to migrate Travis CI will now start receiving the GitHub events for migrated open source repository in travis-ci.com. Any new builds and requests will start appearing in the travis-ci.com site. -The project page of a migrated repository in travis-ci.com will start showing the following message: - - ![Note for migrated repository](/user/images/oss-migration/migrated-warning.png) - -Then, when going back to travis-ci.org, the migrated repository will still appear in your repository list with a direct link to access the project in travis-ci.com: +The project page of a migrated repository in travis-ci.org will start showing that it has been migrated and then, the migrated repository will still appear in your repository list with a direct link to access the project in travis-ci.com: ![Migrated repository in travis-ci.org](/user/images/oss-migration/migrated-repo-org.png) @@ -138,3 +134,7 @@ Since the repository in travis-ci.org is now in read-only mode, the settings pag ## Support and feedback If you have any further questions or comments on our Beta migration process or need help, please let us know at [support@travis-ci.com](mailto:support@travis-ci.com?subject=Migration%20Beta%20Testing%20Feedback). We have a dedicated team working on this project that will be glad to assist you. + + +[travis-ci.com]: https://www.travis-ci.com +[travis-ci.org]: https://www.travis-ci.org From fd2ebf9e10d6726166c14e2b172100a0ab566b97 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 17 Jul 2019 06:20:36 +0200 Subject: [PATCH 0090/1536] Update privacy-shield-framework.md --- legal/privacy-shield-framework.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/legal/privacy-shield-framework.md b/legal/privacy-shield-framework.md index d42d69aef27..cd432f51327 100644 --- a/legal/privacy-shield-framework.md +++ b/legal/privacy-shield-framework.md @@ -6,9 +6,7 @@ no_toc: true --- -## Effective for Idera, Inc. and its subsidiaries on April 23, 2018. - -Modified and Effective on April 1, 2019 +## Modified and Effective for Idera, Inc. and its subsidiaries on April 1, 2019 Idera, Inc. together with its United States subsidiaries, Assembla, Inc., AquaFold, Inc., CodeGear LLC, Embarcadero Technologies, Inc., Lansa, Inc., Precise Software Solutions, Inc., Ranorex, From f435e7238f876928cca3ee7e02bd4ce3d1ff5a4b Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 17 Jul 2019 10:06:46 +0200 Subject: [PATCH 0091/1536] Update enterprise.md --- user/enterprise.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/user/enterprise.md b/user/enterprise.md index e50ef0775d2..7e0e3ed00bd 100644 --- a/user/enterprise.md +++ b/user/enterprise.md @@ -12,7 +12,7 @@ Travis CI Enterprise is built to integrate with GitHub Enterprise. Using OAuth for authentication, we sync your users permissions to make sure they only have access to the repositories you want them to have access to. This allows you to use LDAP or SAML to manage your users access. Travis CI Enterprise also -integrates with GitHub.com, allowing you greater control over your security, and +integrates with GitHub.com, allowing you greater control over your security and to scale out your build infrastructure as needed. ## Why choose Enterprise over travis-ci.com? @@ -32,7 +32,7 @@ being deployed inside your firewall, you have full ownership and control of your data, helping to make it possible to meet the security requirements of your company. * **Customizable images:** We provide a range of build environment images, -covering an extensive set of languages, updated with the current dependences +covering an extensive set of languages, updated with the current dependencies each community is using. If you or your team need specific changes, they are easily customizable, which can then be deployed for use by your team. * **Hosted on your infrastructure:** Travis CI Enterprise supports the cloud @@ -43,10 +43,10 @@ capacity as needed. If it’s a busy week before a production release, all you need to do is to start up some more capacity and let your team test to their hearts content. * **High availability:** Your continuous integration system is just as critical - as your GitHub Enterprise. Travis CI Enterprise can run in a multi node setup + as your GitHub Enterprise. Travis CI Enterprise can run in a multi-node setup behind a load balancer, providing safety from hardware failures. -Travis CI Enterprise brings both flexibility to your CI/CD process, and gives +Travis CI Enterprise brings both flexibility to your CI/CD process and gives your entire team visibility and control over the build process. And of course if anyone has any questions, our Enterprise-specific support team is here to help you out. @@ -58,7 +58,7 @@ ci.com](https://enterprise.travis-ci.com/). Your trial license will be fully- featured so you can get a good picture of how Enterprise will work for your team. -If you're interested in getting started, let us know at [sales@travis-ci.com](mailto:sales@travis-ci.com). We'd love to figure out Travis CI Enterprise can support +If you're interested in getting started, let us know at [sales@travis-ci.com](mailto:sales@travis-ci.com). We'd love to figure out how Travis CI Enterprise can support your development workflow best. Or, if you'd like to talk more about support, and onboarding, please email us at [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). Our team looks forward to hearing from you! From a2f819c70cd8a3175f6fb54a234311bb672fde21 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 17 Jul 2019 13:07:35 +0200 Subject: [PATCH 0092/1536] Improves enterprise page language --- user/enterprise.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/user/enterprise.md b/user/enterprise.md index e50ef0775d2..7e0e3ed00bd 100644 --- a/user/enterprise.md +++ b/user/enterprise.md @@ -12,7 +12,7 @@ Travis CI Enterprise is built to integrate with GitHub Enterprise. Using OAuth for authentication, we sync your users permissions to make sure they only have access to the repositories you want them to have access to. This allows you to use LDAP or SAML to manage your users access. Travis CI Enterprise also -integrates with GitHub.com, allowing you greater control over your security, and +integrates with GitHub.com, allowing you greater control over your security and to scale out your build infrastructure as needed. ## Why choose Enterprise over travis-ci.com? @@ -32,7 +32,7 @@ being deployed inside your firewall, you have full ownership and control of your data, helping to make it possible to meet the security requirements of your company. * **Customizable images:** We provide a range of build environment images, -covering an extensive set of languages, updated with the current dependences +covering an extensive set of languages, updated with the current dependencies each community is using. If you or your team need specific changes, they are easily customizable, which can then be deployed for use by your team. * **Hosted on your infrastructure:** Travis CI Enterprise supports the cloud @@ -43,10 +43,10 @@ capacity as needed. If it’s a busy week before a production release, all you need to do is to start up some more capacity and let your team test to their hearts content. * **High availability:** Your continuous integration system is just as critical - as your GitHub Enterprise. Travis CI Enterprise can run in a multi node setup + as your GitHub Enterprise. Travis CI Enterprise can run in a multi-node setup behind a load balancer, providing safety from hardware failures. -Travis CI Enterprise brings both flexibility to your CI/CD process, and gives +Travis CI Enterprise brings both flexibility to your CI/CD process and gives your entire team visibility and control over the build process. And of course if anyone has any questions, our Enterprise-specific support team is here to help you out. @@ -58,7 +58,7 @@ ci.com](https://enterprise.travis-ci.com/). Your trial license will be fully- featured so you can get a good picture of how Enterprise will work for your team. -If you're interested in getting started, let us know at [sales@travis-ci.com](mailto:sales@travis-ci.com). We'd love to figure out Travis CI Enterprise can support +If you're interested in getting started, let us know at [sales@travis-ci.com](mailto:sales@travis-ci.com). We'd love to figure out how Travis CI Enterprise can support your development workflow best. Or, if you'd like to talk more about support, and onboarding, please email us at [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). Our team looks forward to hearing from you! From a63f7dcf82ee6fe794ac5cb80d339a417ea20e63 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 17 Jul 2019 14:25:28 +0200 Subject: [PATCH 0093/1536] fix grammar and commas on setting up enterprise page --- user/enterprise/setting-up-travis-ci-enterprise.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/user/enterprise/setting-up-travis-ci-enterprise.md b/user/enterprise/setting-up-travis-ci-enterprise.md index de37b7d2812..a421301b1d1 100644 --- a/user/enterprise/setting-up-travis-ci-enterprise.md +++ b/user/enterprise/setting-up-travis-ci-enterprise.md @@ -8,7 +8,7 @@ redirect_from: --- -Travis CI Enterprise works with your GitHub.com or GitHub Enterprise setup. +> Travis CI Enterprise works with your GitHub.com or GitHub Enterprise setup. ## Prerequisites @@ -39,7 +39,7 @@ For [high availability (HA)](/user/enterprise/high-availability/) configurations * [RabbitMQ](https://www.rabbitmq.com/) * [Postgres](https://www.postgresql.org/) -You can also try services like [compose.com](https://compose.com/) if you would like these services hosted outside your organization. +You can also try services like [compose.com](https://compose.com/), if you would like these services hosted outside your organization. ## 1. Setting up Enterprise Platform virtual machine @@ -51,7 +51,7 @@ Ubuntu 16.04 LTS or later as the underlying operating system. 1. *On your virtual machine management platform*, create a Travis CI Platform Security Group. - If you're setting up your AMI for the first time you need to create + 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 each port in the table below: @@ -84,7 +84,7 @@ installation's hostname, port 8800) to complete the setup: 1. Optionally, configure Email, Metrics and Caches. 1. Copy the *RabbitMQ password* for the Worker setup. -> If you have decided to use a self-signed certificate there may be additional configuration steps required. Please see our page on [SSL Certificate Management](/user/enterprise/ssl-certificate-management) for more information. +> If you have decided to use a self-signed certificate, there may be additional configuration steps required. Please see our page on [SSL Certificate Management](/user/enterprise/ssl-certificate-management) for more information. ## 2. Setting up the Enterprise Worker virtual machine @@ -97,7 +97,7 @@ Make sure you have already [set up the Enterprise Platform](/user/enterprise/set 1. *On your virtual machine management platform*, create a Travis CI Worker Security Group - If you're setting up your AMI for the first time you will need to create + 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 each port in the table below: @@ -112,7 +112,7 @@ Make sure you have already [set up the Enterprise Platform](/user/enterprise/set $ sudo bash /tmp/installer.sh --travis_enterprise_host="" --travis_enterprise_security_token="" ``` -### Installing workers behind a web proxy +### Installing Workers behind a web proxy If you are behind a web proxy and Docker fails to download the image(s), when you run the worker installation script, edit `/etc/default/docker` and set your proxy there. Then rerun the installation script. From 97cb949f0b2d3584ee09bd5cc76dadfadf69da99 Mon Sep 17 00:00:00 2001 From: Petra Herbst Date: Wed, 17 Jul 2019 15:17:45 +0200 Subject: [PATCH 0094/1536] language review of Enterprise docs done --- user/enterprise/build-images.md | 18 +++-- user/enterprise/custom-queues.md | 18 ++--- user/enterprise/high-availability.md | 19 ++--- user/enterprise/platform-tips.md | 69 +++++++++---------- user/enterprise/ssl-certificate-management.md | 68 ++++++++++-------- user/enterprise/troubleshooting-guide.md | 46 +++++++------ user/enterprise/trusty.md | 12 ++-- user/enterprise/upgrading.md | 20 +++--- user/enterprise/worker-cli-commands.md | 14 ++-- user/enterprise/worker-configuration.md | 24 +++---- user/enterprise/xenial.md | 2 +- 11 files changed, 161 insertions(+), 149 deletions(-) diff --git a/user/enterprise/build-images.md b/user/enterprise/build-images.md index b5e8c413fc3..5cf67df013f 100644 --- a/user/enterprise/build-images.md +++ b/user/enterprise/build-images.md @@ -9,7 +9,7 @@ development process and improve the build environment and performance. -## Customizing build images +## Customizing Build Images After pulling the build images from [quay.io](https://quay.io/organization/travisci) either through @@ -17,12 +17,12 @@ After pulling the build images from they've been re-tagged to `travis:[language]`. Once this configuration is in place, you can fully customize these images according to your needs. -**Note**: you'll need to re-apply your customizations after +> Note that 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. +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 we use on travis-ci.com. 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: @@ -81,7 +81,9 @@ We accomplish this by adding another configuration option to `/etc/default/travi export TRAVIS_WORKER_DOCKER_BINDS='/var/run/docker.sock:/var/run/docker.sock' ``` -With this option we tell `travis-worker` to make the host's Docker socket available inside the build containers. Please restart travis-worker after you have saved the configuration file. +With this option we tell `travis-worker` to make the host's Docker socket available inside the build containers. + +> Please restart travis-worker after you have saved the configuration file. #### Restart travis-worker @@ -92,10 +94,12 @@ To restart travis-worker, you can find the instructions [here](/user/enterprise/ #### Trusty build containers -Once the worker machine is [configured properly](/user/enterprise/build-images/#worker-machine-configuration), you can use Docker as usual in your build. Please note that on an Enterprise installation you don't need to add `services: docker` to the `.travis.yml`. +Once the worker machine is [configured properly](/user/enterprise/build-images/#worker-machine-configuration), you can use Docker as usual in your build. + +> Please note that on an Enterprise installation you don't need to add `services: docker` to the `.travis.yml`. Since you're using the host's Docker daemon, all images and containers used in your build are stored on the host machine. To free up disk space, we recommend using the `--rm` flag when you use Docker run in your build. -To avoid race conditions when multiple builds start to remove containers and images at the same time we recommend to clean them up manually on the machine directly while no build is running. +To avoid race conditions when multiple builds start to remove containers and images at the same time, we recommend to clean them up manually on the machine directly while no build is running. #### Precise build containers (legacy) @@ -127,4 +131,4 @@ For example, if you want to create a new repository and test out Docker support, ## Contact Enterprise Support -{{ site.data.snippets.contact_enterprise_support }} \ No newline at end of file +{{ site.data.snippets.contact_enterprise_support }} diff --git a/user/enterprise/custom-queues.md b/user/enterprise/custom-queues.md index a22fd3994ca..3b5eab71d38 100644 --- a/user/enterprise/custom-queues.md +++ b/user/enterprise/custom-queues.md @@ -5,28 +5,28 @@ 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. 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) +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) ## Enable Queues on the Platform -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: +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 ``` -The new settings will take effect immediately, but job routing will remain the same until new queues are defined. +> 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 -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`. +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. 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 + - `owner` - either an org or a user - `slug` - a repository, in the form: `org/repo` or `user/repo` @@ -47,7 +47,7 @@ production: ``` {: data-file="config/travis.yml"} -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. +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 @@ -73,7 +73,7 @@ production: ``` {: data-file="config/travis.yml"} -For this 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 @@ -82,11 +82,11 @@ language: ruby ``` {: data-file=".travis.yml"} -Building [`travis-ci/docs-travis-ci.com`](https://github.com/travis-ci/docs-travis-ci-com) repo, however, does not require any special configuration. +Building the [`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 -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: +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 ``` diff --git a/user/enterprise/high-availability.md b/user/enterprise/high-availability.md index 67f5c75156b..6b70b4fda98 100644 --- a/user/enterprise/high-availability.md +++ b/user/enterprise/high-availability.md @@ -10,7 +10,7 @@ If you're interested, or might be interested, in running Travis CI Enterprise in ## Overview of Installation -The platform installation is similar to the standard [Enterprise installation](/user/enterprise/setting-up-travis-ci-enterprise/#1-setting-up-enterprise-platform-virtual-machine), and the [worker installation](#installing-the-worker-in-high-availability-mode) is identical. However, there are some additional [system prerequisites](/user/enterprise/high-availability/), which mean that to install in HA mode, you will need the following: +The platform installation is similar to the standard [Enterprise installation](/user/enterprise/setting-up-travis-ci-enterprise/#1-setting-up-enterprise-platform-virtual-machine), and the [worker installation](#installing-the-worker-in-high-availability-mode) is identical. However, there are some additional [system prerequisites](/user/enterprise/high-availability/), which means that to install in HA mode, you will need the following: * 3+ **16 gigs of RAM, 8 CPUs, 40GB HDD**, i.e. `c4.2xlarge` with a 40GB HDD. - 2+ for the VMs running the Platform, and 1+ for the VMs running the Worker * [Redis](https://redis.io/), [RabbitMQ](https://www.rabbitmq.com/), and [Postgres](https://www.postgresql.org/) instances @@ -22,29 +22,30 @@ and [Postgres](https://www.postgresql.org/) instances HA is configured entirely on the Enterprise platform instance, but installing an HA platform is quite similar to installing a standard platform. The steps for HA are as follows. 1. Contact [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com?subject=HA%20Installation) to have your Enterprise license configured for HA mode. -1. Setup your [platform instance per the standard installation steps](/user/enterprise/setting-up-travis-ci-enterprise/#1-setting-up-enterprise-platform-virtual-machine) +1. Set up your [platform instance using the standard installation steps](/user/enterprise/setting-up-travis-ci-enterprise/#1-setting-up-enterprise-platform-virtual-machine) 1. Sign into your Admin Dashboard (at `https://:8800`) - 1. Go to "Settings" and click "Enable HA" - 1. Paste in the urls where you have [Postgres](https://www.postgresql.org/), [Redis](https://redis.io/), and [RabbitMQ](https://www.rabbitmq.com/) hosted. The connection strings should be in the format of: + 1. Go to 'Settings' and click 'Enable HA'. + 1. Paste in the URLs where you have [Postgres](https://www.postgresql.org/), [Redis](https://redis.io/), and [RabbitMQ](https://www.rabbitmq.com/) hosted. The connection strings should be in the format of: ``` postgres://user:password@url:port redis://user:password@url:port amqps://user:password@url:port ``` 1. Optional: Upload a RabbitMQ Client Certificate (`.crt`). This allows RabbitMQ to use TLS. - 1. Scroll down to the bottom of the page, "Save" and restart + 1. Scroll down to the bottom of the page. + 1. Click 'Save' and restart. -Once your first platform instance is fulling configured, you should be able to see the UI and request a build -- your build will only run correctly though if a worker is installed. Try out your new platform, and [please let us know](mailto:enterprise@travis-ci.com?subject=HA%20Troubleshooting) if you have questions. +Once your first platform instance is fully configured, you should be able to see the UI and request a build - your build will only run correctly, if a worker is installed. Try out your new platform, and [please let us know](mailto:enterprise@travis-ci.com?subject=HA%20Troubleshooting) if you have questions. ### Adding More Platform Installations -We recommend at least two Platform containers for HA mode, and you can install more Enterprise containers in the same way you [installed](/user/enterprise/setting-up-travis-ci-enterprise/#1-setting-up-enterprise-platform-virtual-machine) the first. +We recommend at least two Platform containers for HA mode and you can install more Enterprise containers in the same way you [installed](/user/enterprise/setting-up-travis-ci-enterprise/#1-setting-up-enterprise-platform-virtual-machine) the first. -Once your second platform is installed, it will also need its HA settings configured. Go to the Admin Dashboard for your new platform container at `https://:8800` to complete this the same way as [the first platform installation](#installing-the-platform-in-high-availability-mode) +Once your second platform is installed, it will also need its HA settings configured. Go to the Admin Dashboard for your new platform container at `https://:8800` to configure these as you did for [the first platform installation](#installing-the-platform-in-high-availability-mode). ## Installing the Worker in High Availability Mode -The worker installation works the same as for non-HA installations, as does the build environment compatibility defaults per Enterprise version. Check out the [docs for which version of Enterprise handle different OS's](/user/enterprise/setting-up-travis-ci-enterprise/#2-setting-up-the-enterprise-worker-virtual-machine) and other information regarding installation. You will need to retrieve your RabbitMQ password from your own installation, rather than from the Travis CI Enterprise Admin Dashboard. +The worker installation works the same as for non-HA installations, as do the build environment compatibility defaults per Enterprise version. Check out the [docs for which version of Enterprise handle different OS's](/user/enterprise/setting-up-travis-ci-enterprise/#2-setting-up-the-enterprise-worker-virtual-machine) and other information regarding installation. You will need to retrieve your RabbitMQ password from your own installation, rather than from the Travis CI Enterprise Admin Dashboard. ## Contact Enterprise Support diff --git a/user/enterprise/platform-tips.md b/user/enterprise/platform-tips.md index f807944f3e6..5534777f33d 100644 --- a/user/enterprise/platform-tips.md +++ b/user/enterprise/platform-tips.md @@ -8,7 +8,7 @@ This page collects FAQs and day-to-day Enterprise Platform maintenance scripts and tools. Please connect to your Platform machine via SSH before getting started. -## Inspecting logs and running services +## Inspecting Logs and Running Services ### Platform logs @@ -39,7 +39,7 @@ Platform. `travis console`: This will get you into a Ruby IRB session on the Platform. -## Cancel or Reset Stuck Jobs +## Cancelling or Resetting Stuck Jobs Occasionally, jobs can get stuck in a `queued` state on the worker. To cancel or reset a large number of jobs, please execute the following steps: @@ -53,16 +53,16 @@ $ travis console >> stuck_jobs.each(&:reset!) ``` -## Clear Redis Archive Queue (for releases < 2.1.7) +## Clearing Redis Archive Queue (for releases < 2.1.7) -In releases of Enterprise before 2.1.7 jobs where enqueued in the archive queue -for log aggregation. This feature however is only available for the hosted -versions of Travis CI so far. +In releases of Enterprise before 2.1.7, jobs where enqueued in the archive queue +for log aggregation. Currently, this feature is available only for the hosted +versions of Travis CI. -This results in the queue growing bigger and bigger, but not getting working +This results in the queue growing bigger and bigger, but not getting worked off. Because of that, Redis' memory consumption increases over the time and can -lead to decreased performance of the whole platform. The solution to this is -rather simple, the `archive` queue has to be cleared to free system resources. +lead to decreased performance of the whole platform. The solution is to clear the `archive` queue to free system resources. + To clear it, please execute the following commands: ``` @@ -71,9 +71,9 @@ $ travis console >> Sidekiq::Queue.new('archive').clear ``` -## Reset the RabbitMQ certificate +## Resetting the RabbitMQ Certificate -After an upgrade of Replicated 2.8.0 to a newer version occasionally the service +After an upgrade of Replicated 2.8.0 to a newer version, occasionally the service restarts with the following error: ``` @@ -98,12 +98,9 @@ $ sudo rm -r /etc/travis/ssl/rabbitmq.cert ``` After this, do a full reboot of the system and everything should start again properly. -## View Sidekiq queue statistics +## Viewing Sidekiq Queue Statistics -In the past there have been reported cases where the system became unresponsive, -it took long until jobs where worked off or weren't picked up at all. We found -out that oftentimes full Sidekiq queues played a part in this. To get some -insight about it helps to get some basics statistics in the Ruby console: +In the past there have been reported cases where the system became unresponsive. It took quite a while until jobs where worked off or they weren't picked up at all. We found out that often full Sidekiq queues played a part in this. To get some insight, it helps to retrieve some basics statistics in the Ruby console: ``` $ travis console @@ -129,7 +126,7 @@ insight about it helps to get some basics statistics in the Ruby console: "user_sync"=>0} ``` -## Uninstall Travis CI Enterprise +## Uninstalling 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 @@ -177,15 +174,15 @@ On the worker machine, you need to run this command to remove travis-worker: $ sudo apt-get autoremove travis-worker ``` -Additionally, please the following command to clean up all Docker build images: +Additionally, please use the following command to clean up all Docker build images: ``` $ sudo docker images | grep travis | awk '{print $3}' | xargs sudo docker rmi -f ``` -## Find out maximum available concurrency +## Finding out about the Maximum Available Concurrency -To find out how much concurrency is available in your Travis CI Enterprise setup, connect to your platform machine via ssh and run: +To find out how much concurrency is available in your Travis CI Enterprise setup, connect to your platform machine via SSH and run: ``` $ travis bash @@ -194,9 +191,9 @@ root@te-main:/# rabbitmqctl list_consumers -p travis | grep builds.trusty | wc - The number that's returned here is equal to the maximum number of concurrent jobs that are available. To adjust concurrency, please follow the instructions [here](/user/enterprise/worker-configuration/#configuring-the-number-of-concurrent-jobs) for each worker machine. -## Find out how many worker machines are connected +## Finding out how Many Worker Machines are Connected -If you wish to find out how many worker machines are currently connected, please connect to your platform machine via ssh and follow these steps: +If you wish to find out how many worker machines are currently connected, please connect to your platform machine via SSH and follow these steps: ``` $ travis bash @@ -205,7 +202,7 @@ root@te-main:/# rabbitmqctl list_consumers -p travis | grep amq.gen- | wc -l If you need to boot more worker machines, please see our docs about [installing new worker machines](/user/enterprise/setting-up-travis-ci-enterprise/#2-setting-up-the-enterprise-worker-virtual-machine). -## Integrate Travis CI Enterprise into your monitoring +## Integrating Travis CI Enterprise into Your Monitoring To check if your Travis CI Enterprise installation is up and running, query the `/api/uptime` endpoint of your instance. @@ -213,7 +210,7 @@ To check if your Travis CI Enterprise installation is up and running, query the $ curl -H "Authorization: token XXXXX" https:///api/uptime ``` -If everything is up and running, it answers with a `HTTP 200 OK`, or in case of failure with a `HTTP 500 Internal Server Error`. +If everything is up and running, it answers with a `HTTP 200 OK`, or in case of failure with an `HTTP 500 Internal Server Error`. ## Configuring Backups @@ -231,30 +228,30 @@ Without the encryption key you cannot access the information in your production To make a backup, please follow these steps: -1. Open a ssh connection to the platform machine. +1. Open an SSH connection to the platform machine. 2. Open a bash session with `root` privileges on the Travis CI container by running `travis bash`. 3. Run the following command to obtain the key: `grep -A1 encryption: /usr/local/travis/etc/travis/config/travis.yml`. 4. Create a backup of the value returned by the previous 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 +### Creating a backup of the data directories The data directories are located on the platform machine and are mounted into the Travis CI container. In these directories you'll find files from RabbitMQ, Postgres, Slanger, Redis, and also log files from the various 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. +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 a compressed archive from this folder. After this has finished, copy this file off the machine to a secure location. -## Migrating from GitHub services to webhooks +## Migrating from GitHub Services to Webhooks Travis CI Enterprise initially used GitHub Services to connect your repositories with GitHub.com (or GitHub Enterprise). As of January 31st, 2019 [services have been disabled on github.com](https://developer.github.com/changes/2019-01-29-life-after-github-services/). Services will also be disabled on GitHub Enterprise starting with GitHub Enterprise v2.17.0. -Starting with [Travis CI Enterprise v2.2.5](https://enterprise-changelog.travis-ci.com/release-2-2-5-77988) all repositories that are activated use [webhooks](https://developer.github.com/webhooks/) to connect and manage communication with GitHub.com/GitHub Enterprise. +Starting with [Travis CI Enterprise v2.2.5](https://enterprise-changelog.travis-ci.com/release-2-2-5-77988), all repositories that are activated use [webhooks](https://developer.github.com/webhooks/) to connect and manage communication with GitHub.com/GitHub Enterprise. -Repositories that were activated prior to Travis CI Enterprise v2.2.5 may need to be updated. +> Repositories that were activated prior to Travis CI Enterprise v2.2.5 may need to be updated. -Starting with Travis CI Enterprise v2.2.8, a migration tool to automatically update repositories is available. The migration tool will update repositories that are using the deprecated GitHub services to instead use webhooks. +Starting with Travis CI Enterprise v2.2.8, a migration tool to automatically update repositories is available. The migration tool will update repositories that are using the deprecated GitHub services instead of webhooks. -To perform an automatic migration please follow these steps: +To perform an automatic migration, please follow these steps: -1. Open a ssh connection to the platform machine. +1. Open an SSH connection to the platform machine. 2. Run the following command: ``` @@ -263,9 +260,9 @@ travis bash -c ". /etc/profile; cd /usr/local/travis-api && ENV=production bundl This will search for all active repositories that are still using GitHub Services and migrate them to use webhooks instead. -You can provide a year argument (e.g. `2017`) in the above command to only migrate repositories activated on Travis CI Enterprise during that year. +You can provide a year argument (e.g. `2017`) in the above command to only migrate repositories activated on Travis CI Enterprise during that year. -If you have a large number of repositories activated on your Travis CI Enterprise installation, please run the migration several times, breaking it down per year. For example: +If you have a large number of repositories activated on your Travis CI Enterprise installation, please run the migration several times, breaking it down per year. For example: ``` travis bash -c ". /etc/profile; cd /usr/local/travis-api && ENV=production bundle exec ./bin/migrate-hooks 2019" @@ -273,7 +270,7 @@ travis bash -c ". /etc/profile; cd /usr/local/travis-api && ENV=production bundl travis bash -c ". /etc/profile; cd /usr/local/travis-api && ENV=production bundle exec ./bin/migrate-hooks 2017" ``` -You should see no behavior change with your repositories after the migration is complete. +You should not experience any behavior change with your repositories after the migration is complete. ## Contact Enterprise Support diff --git a/user/enterprise/ssl-certificate-management.md b/user/enterprise/ssl-certificate-management.md index b0a8d7f8929..97958d9e7f6 100644 --- a/user/enterprise/ssl-certificate-management.md +++ b/user/enterprise/ssl-certificate-management.md @@ -5,45 +5,47 @@ layout: en_enterprise This page contains information relating to SSL certificates and their use in Travis CI Enterprise. -By default, Travis CI Enterprise verifies SSL for all traffic between internal platform components, RabbitMQ, and Github.com/Github Enterprise. SSL verification helps ensure that traffic is delivered securely. It is **strongly recommended** that you configure your installation with a valid certificate from a trusted authority. +By default, Travis CI Enterprise verifies SSL for all traffic between internal platform components, RabbitMQ, and Github.com/Github Enterprise. SSL verification helps to ensure that traffic is delivered securely. -If you have questions about a specific section or have an issue that is not covered then please contact us at [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com) for assistance. +> It is **strongly recommended** that you configure your installation with a valid certificate from a trusted authority. -## Using Self-signed Certificates +If you have questions about a specific section or have an issue that is not covered, please contact us at [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com) for assistance. + +## Using Self-Signed Certificates We strongly recommend that you use a valid certificate from a trusted certificate authority when configuring your installation. That said, we recognize that there are various scenarios in which using a self-signed certificate might make more sense for your organization. > In all cases of using self-signed certificates you must [disable SSL certificate validation](#disabling-ssl-verification) in your settings. This can be done after installation is complete. -> After installation you can upload a certificate at any time via the [admin dashboard](#how-to-add-or-update-certificates-after-installation). +> After installation you can upload a certificate at any time via the [Admin Dashboard](#how-to-add-or-update-certificates-after-installation). #### Using a trial license -If you are using a trial license to evaluate Travis CI Enterprise might not make sense to use a trusted certificate. For this scenario we offer the ability to use self-signed certificates that are generated by Travis CI Enterprise itself. +If you are using a trial license to evaluate Travis CI Enterprise, it might not make sense to use a trusted certificate. For this scenario we offer the ability to use self-signed certificates that are generated by Travis CI Enterprise itself. -To do this you can select the "Use Self-Signed Cert" option when prompted to provide a custom SSL certificate during installation. +To do this, you can select the 'Use Self-Signed Cert' option when prompted to provide a custom SSL certificate during installation. #### Organizations with an internally managed certificate authority -Some organizations manage their own internal certificate authority. An internal authority may or may use a root certificate provided by a [trusted root authority](https://en.wikipedia.org/wiki/Certificate_authority). +Some organizations manage their own internal certificate authority. An internal authority may use a root certificate provided by a [trusted root authority](https://en.wikipedia.org/wiki/Certificate_authority). #### Without a root certificate from a trusted certificate authority -If your internal certificate authority is not using a root certificate provided by a trusted certificate authority then any certificates produced are considered to be 'untrusted' by most tools and browsers, same as a self-signed certificate. +If your internal certificate authority is not using a root certificate provided by a trusted certificate authority, any certificates produced are considered to be 'untrusted' by most tools and browsers, same as a self-signed certificate. Certificates created by an internal certificate authority can be uploaded during installation in the same way as any other certificate. -Please be aware that you will also need to be sure to follow the [instructions on disabling SSL verification](#disabling-ssl-verification) below in order to use Travis CI Enterprise. +> Please be aware that you will also need to follow the [instructions on disabling SSL verification](#disabling-ssl-verification) below in order to use Travis CI Enterprise. #### With a root certificate from a trusted certificate authority -If your organization's internal certificate authority does use a root certificate purchased from a trusted certificate authority then the above will not apply. You will not need to disable SSL verification and can proceed as if you are using a certificate directly from a trusted certificate authority. +If your organization's internal certificate authority does use a root certificate purchased from a trusted certificate authority, the above will not apply. You will not need to disable SSL verification and can proceed as if you are using a certificate directly from a trusted certificate authority. > In some cases it may be necessary to include the intermediate certificate chain in the settings in order for SSL verification to work correctly. The reasons for this can vary depending on your internal setup and your root certificate provider. Please see the section below on [how to set intermediate certificate chains](#using-intermediate-certificate-chains) for instructions. ### Disabling SSL Verification -> SSL verification helps ensure that all traffic between Travis CI Enterprise components is protected. Disabling SSL verification has serious implications! +> SSL verification helps to ensure that all traffic between Travis CI Enterprise components is protected. Disabling SSL verification has serious implications! To disable SSL verification in Travis CI Enterprise: @@ -51,13 +53,17 @@ To disable SSL verification in Travis CI Enterprise: 2. Click on 'Settings' in the topmost menu. 3. Click 'Advanced Settings' in the left menu (or scroll down). 4. Check the box for 'Disable SSL cert verification'. -5. Click 'Save' at the bottom of the page. Please note that this will require a restart of Travis CI Enterprise in order to take affect and may cause brief downtime. +5. Click 'Save' at the bottom of the page. + +> Please note that this will require a restart of Travis CI Enterprise in order to take affect and may cause brief downtime. -This will remove SSL verification checks with internal traffic between Travis CI components. This will also cause all repository hooks created on Github to turn off SSL verification for traffic coming to Travis CI. Please note that this setting will only apply to hooks created _after_ the setting was enabled. +This will remove SSL verification checks with internal traffic between Travis CI components. This will also cause all repository hooks created on Github to turn off SSL verification for traffic coming to Travis CI. -## How to add or update certificates after installation +> Please note that this setting will only apply to hooks created _after_ the setting was enabled. -You can add or update certificates via the admin dashboard at any time after installation. +## Adding or Updating Certificates after Installation + +You can add or update certificates via the Admin Dashboard at any time after installation. To upload your certificates: @@ -66,15 +72,17 @@ To upload your certificates: 3. Click 'TLS Key & Cert' in the left menu (or scroll down). 4. Select the appropriate option depending on the location of your certificate files. 5. Enter the paths or select the files to upload. -6. Click 'Save' at the bottom of the page. Please note that this will require a restart of Travis CI Enterprise in order to take affect and may cause brief downtime. +6. Click 'Save' at the bottom of the page. -> A valid x509 certificate and private key files are required. The certificate and key must be in PEM format. The key must be unencrypted. +> Please note that this will require a restart of Travis CI Enterprise in order to take affect and may cause brief downtime. + +> A valid x509 certificate and private key files are required. The certificate and key must be in PEM format. The key must be unencrypted. ## Using Intermediate Certificate Chains In some cases it may be required to provide the [intermediate certificate chain](https://support.dnsimple.com/articles/what-is-ssl-certificate-chain/) for your desired certificate. Reasons for this can vary depending on your internal setup and your root certificate provider. -If you have uploaded a valid certificate but are still seeing unexpected issues related to SSL verification errors then you can set your intermediate cert chain in the settings. +If you have uploaded a valid certificate but are still seeing unexpected issues related to SSL verification errors, you can set your intermediate certificate chain in the settings. To add your certificate chain: @@ -82,9 +90,11 @@ To add your certificate chain: 2. Click on 'Settings' in the topmost menu. 3. Click 'Advanced Settings' in the left menu (or scroll down). 4. Copy and paste your certificate chain into the text box labeled 'Custom Certificate Authority (CA) Bundle'. -5. Click 'Save' at the bottom of the page. Please note that this will require a restart of Travis CI Enterprise in order to take affect and may cause brief downtime. +5. Click 'Save' at the bottom of the page. + +> Please note that this will require a restart of Travis CI Enterprise in order to take affect and may cause a brief downtime. -Upon restart you can then verify whether SSL verification is now working. If you are still experiencing trouble even after setting the chain then please contact us at [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com) for assistance. +Upon restart you can then verify whether SSL verification is now working. If you are still experiencing trouble even after setting the chain, please contact us at [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com) for assistance. ## Using a Let's Encrypt SSL Certificate @@ -99,9 +109,9 @@ What you will need: ### Installing certbot -We will be using [certbot](https://certbot.eff.org/#ubuntutrusty-other) to obtain a SSL certificate from Let's Encrypt. To install certbot: +We will be using [certbot](https://certbot.eff.org/#ubuntutrusty-other) to obtain an SSL certificate from Let's Encrypt. To install certbot: -1. Open a ssh connection to the platform machine. +1. Open an SSH connection to the platform machine. 2. Add the certbot personal package archive: ```bash sudo add-apt-repository ppa:certbot/certbot @@ -127,7 +137,7 @@ The certbot tool offers multiple ways to obtain a certificate. We'll pick the 't To generate your certificate: -1. Open a ssh connection to the platform machine. +1. Open an SSH connection to the platform machine. 2. Stop your Travis CI Enterprise: ```bash replicatedctl app stop @@ -136,7 +146,7 @@ To generate your certificate: ```bash sudo certbot certonly ``` -4. At the prompt select option `1` to `Spin up a temporary webserver`: +4. Add the prompt select option `1` to `Spin up a temporary webserver`: ```bash How would you like to authenticate with the ACME CA? ------------------------------------------------------------------------------- @@ -192,7 +202,7 @@ To generate your certificate: replicatedctl app start ``` -Your certificate is now generated and saved on your Travis CI Enterprise platform machine, however you must take additional steps to configure your Travis CI Enterprise instance to use the new certificate. Please see the [Using a Let's Encrypt certificate](#using-a-lets-encrypt-certificate) section for instructions. +Your certificate is now generated and saved on your Travis CI Enterprise platform machine. However, you must take additional steps to configure your Travis CI Enterprise instance to use the new certificate. Please see the [Using a Let's Encrypt certificate](#using-a-lets-encrypt-certificate) section for instructions. ### Using a Let's Encrypt certificate @@ -210,7 +220,7 @@ To use your generated certificate in your Travis CI Enterprise instance: - SSL Certificate Filename: `/etc/letsencrypt/live//fullchain.pem` ``` 6. Click 'Save' at the bottom of the page. -7. Open a ssh connection to the platform machine. +7. Open an SSH connection to the platform machine. 8. Stop your Travis CI Enterprise instance: ```bash replicatedctl app stop @@ -228,7 +238,7 @@ Let's Encrypt certificates are short-lived and ***expire after 90 days.*** Becau To manually renew your certificate for another 90 days: -1. Open a ssh connection to the platform machine. +1. Open an SSH connection to the platform machine. 2. Stop your Travis CI Enterprise instance: ```bash replicatedctl app stop @@ -290,6 +300,4 @@ You can avoid manual renewals by using a cron job to automate the certbot renewa ``` {: data-file="/etc/crontab"} -> This process will introduce a small amount of downtime while the certificates are renewed. - -We recommend that you communicate with your users before each renewal so they are aware that their builds will temporarily be stopped until the certificate is renewed. +> This process will introduce a small amount of downtime while the certificates are renewed. We recommend that you communicate with your users before each renewal so they are aware that their builds will temporarily be stopped until the certificate is renewed. diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index 58af648bf88..ae5961ead70 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -5,7 +5,7 @@ redirect_from: - /user/enterprise/operations-manual/ --- -This document provides guidelines and suggestions for troubleshooting your Travis CI Enterprise installation. Each topic contains a common problem and strategies for solving it. If you have questions about a specific scenario or have an issue that is not covered then please contact us at [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com) for assistance. +This document provides guidelines and suggestions for troubleshooting your Travis CI Enterprise installation. Each topic contains a common problem and strategies for solving it. If you have questions about a specific scenario or have an issue that is not covered, please contact us at [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com) for assistance. Throughout this document we'll be using the following terms to refer to the two components of your Travis CI Enterprise installation: @@ -14,7 +14,7 @@ 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. Please contact us at [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com) if you require support for your HA setup. -## Builds are not starting +## Builds Are not Starting ### The problem @@ -22,13 +22,13 @@ In the Travis CI Web UI you see no builds are starting. The builds either have n ### Strategies -There are a few different potential approaches which may help get builds running again. Please try each one in order. +There are a few different potential approaches which may help to get builds running again. Please try each one in order. #### Connection to RabbitMQ was lost -The Enterprise Platform uses RabbitMQ to communicate with worker machine(s) in order to process builds. In certain circumstances it is possible for the worker machine(s) to lose connection with RabbitMQ and therefore become unable to process builds successfully. This is a known problem and we're working to deliver a permanent solution. +The Enterprise Platform uses RabbitMQ to communicate with worker machine(s) in order to process builds. In certain circumstances it is possible for the worker machine(s) to lose connection with RabbitMQ and therefore become unable to process builds successfully. This is a known problem and we're working on it to deliver a permanent solution. -In the meantime, to return everything back to a normal working state you can manually restart the worker machine(s). This can be done by connecting to the worker(s) via `ssh` and running the following command: +In the meantime, to return everything back to a normal working state, you can restart the worker machine(s) manually. This can be done by connecting to the worker(s) via `ssh` and running the following command: ```bash $ sudo shutdown -r 0 @@ -38,7 +38,7 @@ This will immediately restart the machine. The program that processes worker bui #### Configuration Issues -Please check if the worker machine has all relevant configuration in order. To do so, please use ssh to login to the worker machine(s) and open `/etc/default/travis-enterprise`. This is the main configuration file `travis-worker` uses to connect to the platform machine. +Please check if the worker machine has all relevant configurations in order. To do so, please use SSH to log into the worker machine(s) and open `/etc/default/travis-enterprise`. This is the main configuration file `travis-worker` uses to connect to the platform machine. Here is an example: @@ -53,7 +53,7 @@ export TRAVIS_ENTERPRISE_SECURITY_TOKEN="abc12345" # export TRAVIS_WORKER_DOCKER_PRIVILEGED="true" ``` -The relevant variables 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. The `travis-worker` process uses this domain to reach the platform machine. The value of the latter needs to match the `RabbitMQ Password` found at `https://:8800/settings`. +The relevant variables are `TRAVIS_ENTERPRISE_HOST` and `TRAVIS_ENTERPRISE_SECURITY_TOKEN`. The former needs to contain the primary domain you use to access the Travis CI Enterprise Web UI. The `travis-worker` process uses this domain to reach the platform machine. The value of the latter needs to match the `RabbitMQ Password` found at `https://:8800/settings`. If you have made changes to this file, please run the following so they take effect: @@ -75,32 +75,34 @@ To verify that webhook payloads are being successfully delivered by Github: 1. Go to the repository in Github from which you expected a build to be triggered. 2. Click on 'Settings' in the top menu. -3. To view webhooks set up for this repository click on 'Hooks'. -4. Find the webhook created for your Travis CI Enterprise domain and click 'Edit' -5. Scroll to the bottom of the page to the section labeled 'Recent Deliveries' +3. To view webhooks set up for this repository, click on 'Hooks'. +4. Find the webhook created for your Travis CI Enterprise domain and click 'Edit'. +5. Scroll to the bottom of the page to the section labeled 'Recent Deliveries'. -All recent payload attempts to Travis CI Enterprise should be present. If any have failed with a message such as 'Peer certificate cannot be authenticated with given CA certificates' then the root cause is most likely your SSL Certificate setup on your installation. +All recent payload attempts to Travis CI Enterprise should be present. If any have failed with a message such as 'Peer certificate cannot be authenticated with given CA certificates', the root cause is most likely your SSL Certificate setup on your installation. -Depending on your configuration there may be multiple ways to solve this problem. Our page on [SSL Certificate Management](/user/enterprise/ssl-certificate-management) contains instructions for the various setups available in Travis CI Enterprise. +Depending on your configuration, there may be multiple ways to solve this problem. Our page on [SSL Certificate Management](/user/enterprise/ssl-certificate-management) contains instructions for the various setups available in Travis CI Enterprise. #### Docker Version Mismatch -This issue sometimes occurs after maintenance on workers that were originally installed before November 2017 or on systems running a `docker version` before `17.06.2-ce`. When this happens, the `/var/log/upstart/travis-worker.log` file will contain the following line: `Error response from daemon:client and server don't have same version`. For this issue, we recommend [re-installing each worker from scratch](/user/enterprise/setting-up-travis-ci-enterprise/#2-setting-up-the-enterprise-worker-virtual-machine) 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 that were originally installed before November 2017 or on systems running a `docker version` before `17.06.2-ce`. When this happens, the `/var/log/upstart/travis-worker.log` file will contain the following line: `Error response from daemon:client and server don't have same version`. For this issue, we recommend [re-installing each worker from scratch](/user/enterprise/setting-up-travis-ci-enterprise/#2-setting-up-the-enterprise-worker-virtual-machine) on a fresh instance. + +> Please note that the default build environment images will be pulled and you may need to apply customizations again as well. #### You are running Enterprise v2.2 or higher -By default the Enterprise Platform v2.2 or higher will attempt to route builds to the `builds.trusty` queue. This could lead to build issues if you are not running a Trusty worker to process those builds or if you are targeting a different distribution (e.g. `xenial`). +By default, the Enterprise Platform v2.2 or higher will attempt to route builds to the `builds.trusty` queue. This could lead to build issues, if you are not running a Trusty worker to process those builds or if you are targeting a different distribution (e.g. `xenial`). To address this, either: - Ensure that you have installed a Trusty worker on a new virtual machine instance: [Trusty installation guide](/user/enterprise/trusty/) -- Override the default queuing behavior to specify a new queue. To override the default queue you must access the Admin Dashboard at `https://:8800/settings#override_default_dist_enable` and toggle the "Override Default Build Environment" button. This will allow you to specify the new default based on your needs and the workers that you have available. +- Override the default queuing behavior to specify a new queue. To override the default queue you must access the Admin Dashboard at `https://:8800/settings#override_default_dist_enable` and toggle the 'Override Default Build Environment' button. This will allow you to specify the new default based on your needs and the workers that you have available. -## Enterprise container fails to start due to 'context deadline exceeded' error +## Enterprise Container Fails to Start due to 'context deadline exceeded' Error ### The problem -After a fresh installation or configuration change the Enterprise container doesn't start and the following error is visible in the admin dashboard found at `https://:8800/dashboard`: +After a fresh installation or configuration change the Enterprise container doesn't start and the following error is visible in the Admin Dashboard found at `https://:8800/dashboard`: ``` Ready state command canceled: context deadline exceeded @@ -110,10 +112,10 @@ Ready state command canceled: context deadline exceeded #### GitHub OAuth app configuration -The above mentioned error can be caused by a configuration mismatch in [the GitHub OAuth Application](/user/enterprise/setting-up-travis-ci-enterprise/#prerequisites). 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. +The above mentioned error can be caused by a configuration mismatch in [the GitHub OAuth Application](/user/enterprise/setting-up-travis-ci-enterprise/#prerequisites). 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. -## travis-worker on Ubuntu 16.04 does not start +## travis-worker on Ubuntu 16.04 Does not Start ### The problem @@ -134,7 +136,7 @@ $ mkdir -p /var/tmp/travis-run.d/ $ chown -R travis:travis /var/tmp/travis-run.d/ ``` -## Builds fail with curl certificate errors +## Builds Fail with Curl Certificate Errors ### The problem @@ -150,7 +152,7 @@ This can have various causes, including an automatic nvm update or a caching err This error is most likely caused by a self-signed certificate. During the build, the worker container attempts to fetch different files from the platform machine. If the server was originally provisioned with a self-signed certificate, curl doesn't trust this certificate and therefore fails. While we're working on resolving this in a permanent way, currently the only solution is to install a certificate issued by a trusted Certificate Authority (CA). This can be a free Let's Encrypt certificate or any other trusted CA of your choice. We have a section in our [SSL Certificate Management](/user/enterprise/ssl-certificate-management/#using-a-lets-encrypt-ssl-certificate) page that walks you through the installation process using Let's Encrypt as an example. -## User accounts are stuck in syncing state +## User Accounts are Stuck in Syncing State ### The problem @@ -166,7 +168,7 @@ travis_production=> select count(*) from users where is_syncing=true; ### Strategy -Log into the platform machine via ssh. You can reset the `is_syncing` flag for user accounts that are stuck by running: +Log into the platform machine via SSH. You can reset the `is_syncing` flag for user accounts that are stuck by running: ```bash $ travis console diff --git a/user/enterprise/trusty.md b/user/enterprise/trusty.md index 3c80ef84a8c..c57daf1f92e 100644 --- a/user/enterprise/trusty.md +++ b/user/enterprise/trusty.md @@ -10,7 +10,7 @@ layout: en_enterprise **Worker Requirements**: -We recommend using a machine with 8 vCPUs and 15 GiB of memory and at least 40 GiB of disk space. If you're using AWS that will be their c4.2xlarge instance type. Also, you'll want to run Ubuntu 16.04 or later. Port 22 must be open for SSH during installation and operation. +We recommend using a machine with 8 vCPUs and 15 GB of memory and at least 40 GB of disk space. If you're using AWS, this will be their c4.2xlarge instance type. Also, you'll want to run Ubuntu 16.04 or later. Port 22 must be open for SSH during installation and operation. > _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. @@ -35,11 +35,11 @@ The Travis CI Enterprise 2.1 series has the [Precise [Legacy]](/user/enterprise/ ### Enabling the Trusty Beta Feature Flag -1. SSH into the platform machine -2. Run `travis console` +1. SSH into the platform machine. +2. Run `travis console`. 3. Then run `Travis::Features.enable_for_all(:template_selection); Travis::Features.enable_for_all(:multi_os)` -4. Type in `exit` to leave the console -5. Disconnect from the Travis Enterprise platform machine +4. Type in `exit` to leave the console. +5. Disconnect from the Travis Enterprise platform machine. ### Installation (Travis CI Enterprise 2.1.9+) @@ -57,7 +57,7 @@ This installer uses Docker's `aufs` storage driver. If you have any questions or ### Running builds on Trusty on Travis CI Enterprise 2.1.9+ -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. +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 be routed to the default (Precise) build environments instead. ## Restarting `travis-worker` diff --git a/user/enterprise/upgrading.md b/user/enterprise/upgrading.md index 6299df2f83b..799d749929c 100644 --- a/user/enterprise/upgrading.md +++ b/user/enterprise/upgrading.md @@ -6,16 +6,16 @@ layout: en_enterprise ## Backups -Before upgrading, we **strongly recommend** taking a snapshot of `/etc/travis` +> Before upgrading, we **strongly recommend** taking a snapshot 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/ ``` -See [restoring from backups](#restoring-from-backups) if you have any questions about the steps or want to do a restore. +See [restoring from backups](#restoring-from-backups), if you have any questions about the steps or want to do a restore. -### Encryption key +### 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. @@ -23,8 +23,8 @@ Without the encryption key you cannot access the information in your production 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. +1. Open an 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 `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. ## Updating your Travis CI Enterprise Platform @@ -79,16 +79,16 @@ $ sudo apt-get install travis-worker ## Restoring from Backups -If the rare event something goes wrong and/or you'd like to restore from a back-up, please use the following steps: +In the rare event something goes wrong and/or you'd like to restore from a backup, please use the following steps: 1. Boot up a replacement machine with a fresh install of Ubuntu 14.04. -1. Follow the directions in the [Installation Guide](/user/enterprise/installation). If you cannot find this, let us know at [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com) -1. Setup your Travis CI instance filling out the settings as needed. Fill in the RabbitMQ password and Travis Encryption Key that you saved. Save the settings and start up the Travis container. +1. Follow the directions in the [Installation Guide](/user/enterprise/installation). If you cannot find this, let us know at [enterprise@travis-ci.com](mailto:enterprise@travis-ci.com). +1. Set up your Travis CI instance filling out the settings as needed. Fill in the RabbitMQ password and Travis Encryption Key that you saved. Save the settings and start up the Travis container. 1. Stop the Travis CI container in the Replicated dashboard. 1. As a superuser (to preserve user permissions), unzip the Travis backup you made and copy the directories to the appropriate places (`/var/travis` and `/etc/travis`). -1. Start Travis CI via the Replicated dashboard +1. Start Travis CI via the Replicated dashboard. -Note, that this does still put you on the latest version of Travis CI Enterprise. Rolling back strategies will need to be coordinated with the Travis CI team as it requires changing licenses back to the legacy release channel. +> Note, that this does still put you on the latest version of Travis CI Enterprise. Rolling back strategies will need to be coordinated with the Travis CI team as it requires changing licenses back to the legacy release channel. ## Contact Enterprise Support diff --git a/user/enterprise/worker-cli-commands.md b/user/enterprise/worker-cli-commands.md index ee6a1e7d7d8..2574a4ce743 100644 --- a/user/enterprise/worker-cli-commands.md +++ b/user/enterprise/worker-cli-commands.md @@ -27,7 +27,7 @@ $ sudo systemctl stop travis-worker ### With Ubuntu 14.04 as host operating system The Travis CI Worker is installed as an upstart service. The following -commands can be used to check the status of the service, and to start or +commands can be used to check the status of the service and to start or stop it. ```sh @@ -45,20 +45,20 @@ $ sudo start travis-worker travis-worker start/running, process 16339 ``` -When the worker gets stopped with `sudo stop travis-worker` it gets shut +When the worker is stopped with `sudo stop travis-worker`, it is shut down with a `KILL` signal. This stops all currently running build jobs and will enqueue them when the worker starts again. If you'd like to wait until some or all jobs are being worked off successfully, you can issue a `SIGINT` instead. This together with a `sleep` ensures that -either at least some or all active jobs can finish (depending on how -long your queue is). After `sleep` finished the worker has to be -shutdown via `sudo stop travis-worker`. +either some or all active jobs can finish (depending on how +long your queue is). After `sleep` finished, the worker has to be +shut down via `sudo stop travis-worker`. ## Example Worker Stop and Start -travis-worker behaves differently based on the signals it receives. For instance a `SIGINT` drains the queue, it gives travis-worker enough time to work off all jobs which are still in progress but it doesn't accept any new ones anymore. +travis-worker behaves differently based on the signals it receives. For instance, a `SIGINT` drains the queue, it gives travis-worker enough time to work off all jobs which are still in progress, but it doesn't accept any new ones. -`SIGKILL` on the other hand shuts down travis-worker immediately and cancels all currently running jobs. If you start the worker again afterwards, all previously enqueued and running jobs are re-queued again so they'll get worked off as usual. +`SIGKILL` on the other hand shuts down travis-worker immediately and cancels all currently running jobs. If you start the worker again afterwards, all previously enqueued and running jobs are re-queued again so they'll be worked off as usual. ### With Ubuntu 16.04 as host operating system diff --git a/user/enterprise/worker-configuration.md b/user/enterprise/worker-configuration.md index 354d2f9bb92..1753db2d4dd 100644 --- a/user/enterprise/worker-configuration.md +++ b/user/enterprise/worker-configuration.md @@ -37,14 +37,14 @@ export TRAVIS_ENTERPRISE_SECURITY_TOKEN="super-secret-password" The following options can be customized in `/etc/default/travis-worker`. It is recommended to have all Workers use the same config. -By default Jobs can run for a maximum of 50 minutes. You can increase or +By default, jobs can run for a maximum of 50 minutes. You can increase or decrease this using the following setting: ```sh export TRAVIS_WORKER_HARD_TIMEOUT="50m" ``` -If no log output has been received over 10mins the job is cancelled as +If no log output has been received for more than 10mins, the job is cancelled as it is assumed the job stalled. You can customize this timeout using the following setting: @@ -58,7 +58,7 @@ The number of concurrent jobs run by the worker and the number of CPUs allowed for a job to use are configured with the `TRAVIS_WORKER_POOL_SIZE` and `TRAVIS_WORKER_DOCKER_CPUS` environment variables, respectively. Each Job requires a minimum of 2 CPUs, and by -default, each Worker runs 2 Jobs. The product of +default, each Worker runs 2 jobs. The product of `TRAVIS_WORKER_POOL_SIZE * TRAVIS_WORKER_POOL_SIZE` cannot exceed the number of CPUs the worker machine has, otherwise jobs will error and requeue. @@ -78,7 +78,7 @@ following setting: export TRAVIS_WORKER_DOCKER_CPUS=2 ``` -To completely disable this setting have the value set to 0. Then +To completely disable this setting, set the value to 0. Then resources will be used as needed, which means a single job can for example use all CPU cores. @@ -100,7 +100,7 @@ export TRAVIS_WORKER_HOSTNAME="" ## Disable SSL Verification Messages -The Platform comes setup with a self signed SSL certificate, this option +The Platform comes set up with a self-signed SSL certificate. This option allows the Worker to talk to the Platform via SSL but ignore the verification warnings. @@ -110,7 +110,7 @@ export TRAVIS_WORKER_BUILD_API_INSECURE_SKIP_VERIFY="false" ## Enabling S3 Dependency Caching -If you would like to setup S3 dependency caching for your builds, you +If you would like to set up S3 dependency caching for your builds, you can use the following example config: ```sh @@ -127,8 +127,8 @@ export TRAVIS_WORKER_BUILD_CACHE_TYPE="s3" ## Configuring Jobs' Allowed Memory Usage The Worker comes configured with the RAM defaulted to 4G. If you want to -change it you can add the following. To completely disable it have the -value set to 0. +change it, you can add the following. To completely disable it, set the +value to 0. ```sh export TRAVIS_WORKER_DOCKER_MEMORY=4G @@ -146,7 +146,7 @@ is 4.5MB. The setting is measured in bytes, so to get 40MB you need export TRAVIS_WORKER_MAX_LOG_LENGTH=40000000 ``` -## Mounting volumes across worker jobs on Enterprise +## Mounting Volumes across Worker Jobs on Enterprise You can use [Docker bind mounts](https://docs.docker.com/storage/bind-mounts/) when the worker launches the container of a job. This lets you share files or directories @@ -171,7 +171,7 @@ If you're using Travis CI Enterprise behind an HTTP(S) proxy, we've got you cove #### Ubuntu 16.04+ -Connect to your worker machine via ssh and run: +Connect to your worker machine via SSH and run: ``` $ sudo docker images | grep worker @@ -180,7 +180,7 @@ travisci/worker v4.6.1 ef7a3419050c 17 hours #### Ubuntu 14.04 -Connect to your worker machine via ssh and run: +Connect to your worker machine via SSH and run: ``` $ travis-worker -v @@ -210,7 +210,7 @@ Environment variable | Available as: `TRAVIS_WORKER_DOCKER_NO_PROXY` | `NO_PROXY`, `no_proxy` `TRAVIS_WORKER_DOCKER_FTP_PROXY` | `FTP_PROXY`, `ftp_proxy` -Please note, that all `apt-get` commands by default respect `TRAVIS_WORKER_DOCKER_HTTP_PROXY` and `TRAVIS_WORKER_DOCKER_HTTPS_PROXY` which means that all package installs will go via the HTTP Proxy as well. If you don't want this to happen, please whitelist your apt package mirror by adding it to TRAVIS_WORKER_DOCKER_NO_PROXY` like this: +> Please note, that all `apt-get` commands by default respect `TRAVIS_WORKER_DOCKER_HTTP_PROXY` and `TRAVIS_WORKER_DOCKER_HTTPS_PROXY` which means that all package installs will go via the HTTP Proxy as well. If you don't want this to happen, please whitelist your apt package mirror by adding it to TRAVIS_WORKER_DOCKER_NO_PROXY` like this: ``` export TRAVIS_WORKER_DOCKER_NO_PROXY='.ubuntu.com,packagecloud.io,.postgresql.org' diff --git a/user/enterprise/xenial.md b/user/enterprise/xenial.md index b86ec3e2b7c..132196cd254 100644 --- a/user/enterprise/xenial.md +++ b/user/enterprise/xenial.md @@ -10,7 +10,7 @@ layout: en_enterprise **Worker Requirements**: -We recommend using a machine with 8 vCPUs and 15 GiB of memory and at least 40 GiB of disk space. If you're using AWS that will be their c4.2xlarge instance type. Also, you'll want to run Ubuntu 16.04 or later. Port 22 must be open for SSH during installation and operation. +We recommend using a machine with 8 vCPUs and 15 GiB of memory and at least 40 GiB of disk space. If you're using AWS, that will be their c4.2xlarge instance type. Also, you'll want to run Ubuntu 16.04 or later. Port 22 must be open for SSH during installation and operation. > _Trusty and Xenial build containers must be on different instances_. To run both Trusty and Xenial builds, at least two worker instances are required. From 14e0b7ef10eb1910db6e262a46205f7dd74de5ce Mon Sep 17 00:00:00 2001 From: Petra Date: Wed, 17 Jul 2019 15:41:21 +0200 Subject: [PATCH 0095/1536] language review of xenial.md --- user/enterprise/xenial.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/enterprise/xenial.md b/user/enterprise/xenial.md index 132196cd254..96cf62652f8 100644 --- a/user/enterprise/xenial.md +++ b/user/enterprise/xenial.md @@ -10,7 +10,7 @@ layout: en_enterprise **Worker Requirements**: -We recommend using a machine with 8 vCPUs and 15 GiB of memory and at least 40 GiB of disk space. If you're using AWS, that will be their c4.2xlarge instance type. Also, you'll want to run Ubuntu 16.04 or later. Port 22 must be open for SSH during installation and operation. +We recommend using a machine with 8 vCPUs and 15 GB of memory and at least 40 GB of disk space. If you're using AWS, that will be their c4.2xlarge instance type. Also, you'll want to run Ubuntu 16.04 or later. Port 22 must be open for SSH during installation and operation. > _Trusty and Xenial build containers must be on different instances_. To run both Trusty and Xenial builds, at least two worker instances are required. @@ -37,7 +37,7 @@ $ sudo systemctl restart travis-worker Worker configuration changes are applied on start. -## Running builds in the Xenial build environment +## Running Builds in the Xenial Build Environment To run a project's builds in the new Xenial build environment, please add a `dist: xenial` to your `.travis.yml` file. From 6321b96efd2f29111cbf7a05bf23402a0c02780d Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Thu, 18 Jul 2019 10:53:50 -0400 Subject: [PATCH 0096/1536] Fix anchor --- user/using-workspaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/using-workspaces.md b/user/using-workspaces.md index 2803a681461..151c6cab99f 100644 --- a/user/using-workspaces.md +++ b/user/using-workspaces.md @@ -13,7 +13,7 @@ Workspaces allow jobs _within_ a build to share files. They are useful when you want to use build artifacts from a previous job; for example, you create a cache that can be used in multiple jobs later. -So you can clearly see when a workspace is created and used, we recommend using workspaces with [build stages](/user/build-stages), as shown in the following [examples](user/using-workspaces#Workspace examples). +So you can clearly see when a workspace is created and used, we recommend using workspaces with [build stages](/user/build-stages), as shown in the following [examples](#workspace-examples). > Note that it is best to create a workspace in one stage and then use it in subsequent stages. From be309ab4b1f5952e507a19cb8e4fa45d79fc49aa Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 19 Jul 2019 10:37:15 +0200 Subject: [PATCH 0097/1536] Update for-beginners.md --- user/for-beginners.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/user/for-beginners.md b/user/for-beginners.md index 6c06496e8ca..26a110af67b 100644 --- a/user/for-beginners.md +++ b/user/for-beginners.md @@ -7,10 +7,10 @@ layout: en Welcome to Travis CI! This page provides some contexts and terminologies used -throughout the platform and documentation, which might be helpful if you are new +throughout the platform and documentation, which might be helpful, if you are new here or new to Continuous Integration (CI). -## What is Continuous Integration (CI)? +## What Is Continuous Integration (CI)? Continuous Integration is the practice of merging in small code changes frequently - rather than merging in a large change at the end of a development @@ -22,19 +22,19 @@ process by automatically building and testing code changes, providing immediate feedback on the success of the change. Travis CI can also automate other parts of your development process by managing deployments and notifications. -## CI builds and automation: building, testing, deploying +## CI Builds and Automation: Building, Testing, Deploying -When you run a build, Travis CI clones your GitHub repository into a brand new +When you run a build, Travis CI clones your GitHub repository into a brand-new virtual environment, and carries out a series of tasks to build and test your -code. If one or more of those tasks fails, the build is considered +code. If one or more of those tasks fail, the build is considered [*broken*](#breaking-the-build). If none of the tasks fail, the build is -considered [*passed*](#breaking-the-build), and Travis CI can deploy your code -to a web server, or application host. +considered [*passed*](#breaking-the-build) and Travis CI can deploy your code +to a web server or application host. CI builds can also automate other parts of your delivery workflow. This means you can have jobs depend on each other with [Build Stages](/user/build-stages/), -setup [notifications](/user/notifications/), prepare -[deployments](/user/deployment/) after builds, and many other tasks. +set up [notifications](/user/notifications/), prepare +[deployments](/user/deployment/) after builds and many other tasks. ## Builds, Jobs, Stages and Phases @@ -45,17 +45,17 @@ In the Travis CI documentation, some common words have specific meanings: which comes before the optional `deploy` phase. * *job* - an automated process that clones your repository into a virtual environment and then carries out a series of *phases* such as compiling your - code, running tests, etc. A job fails if the return code of the `script` *phase* - is non zero. + code, running tests, etc. A job fails, if the return code of the `script` *phase* + is non-zero. * *build* - a group of *jobs*. For example, a build might have two *jobs*, each of which tests a project with a different version of a programming language. A *build* finishes when all of its jobs are finished. -* *stage* - a group of *jobs* that run in parallel as part of sequential build +* *stage* - a group of *jobs* that run in parallel as part of a sequential build process composed of multiple [stages](/user/build-stages/). ## Breaking the Build -The build is considered *broken* when one or more of its jobs completes with a +The build is considered *broken*, when one or more of its jobs complete with a state that is not *passed*: * *errored* - a command in the `before_install`, `install`, or `before_script` @@ -67,15 +67,15 @@ state that is not *passed*: Our [Common Builds Problems](/user/common-build-problems/) page is a good place to start troubleshooting why your build is broken. -## Infrastructure and environment notes +## Infrastructure and Environment Notes Travis CI offers a few different infrastructure environments, so you can select the setup that suits your project best: * *Ubuntu Linux* - these Linux Ubuntu environments run inside full virtual machines, provide plenty of computational resources, and support the use of `sudo`, `setuid`, and `setgid`. -* *macOS* - uses one of several versions of the macOS operating system. This environment is useful for building projects that require the macOS software, such as projects written in Swift. It is not a requirement to use the macOS environment if you develop on a macOS machine. +* *macOS* - uses one of several versions of the macOS operating system. This environment is useful for building projects that require the macOS software, such as projects written in Swift. It is not a requirement to use the macOS environment, if you develop on a macOS machine. -More details are on our environments are available in our [CI Environment](/user/ci-environment/) documentation. +More details on our environments are available in our [CI Environment](/user/ci-environment/) documentation. Now that you've read the basics, head over to our [Tutorial](/user/tutorial/) for details on setting up your first build! From 4ef4b6750ab99b6014fd73121fbf69631faa55b9 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 19 Jul 2019 11:10:38 +0200 Subject: [PATCH 0098/1536] Update for-beginners.md --- user/for-beginners.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/for-beginners.md b/user/for-beginners.md index 26a110af67b..14a16d0a3c4 100644 --- a/user/for-beginners.md +++ b/user/for-beginners.md @@ -73,7 +73,8 @@ Travis CI offers a few different infrastructure environments, so you can select the setup that suits your project best: * *Ubuntu Linux* - these Linux Ubuntu environments run inside full virtual machines, provide plenty of computational resources, and support the use of `sudo`, `setuid`, and `setgid`. -* *macOS* - uses one of several versions of the macOS operating system. This environment is useful for building projects that require the macOS software, such as projects written in Swift. It is not a requirement to use the macOS environment, if you develop on a macOS machine. +* *macOS* - uses one of several versions of the macOS operating system. This environment is useful for building projects that require the macOS software, such as projects written in Swift. It is not a requirement to use the macOS environment, if you develop on a macOS machine. Here you can find more details on the [macOS Build Environment](/user/reference/osx/). +* *Windows* - currently only Windows Server version 1803 is supported. If you want to know more about it, see the [Windows Build Environment](/user/reference/windows/). More details on our environments are available in our [CI Environment](/user/ci-environment/) documentation. From 9c6a82916967c5a57110bfb39d2180a00c9c1929 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 19 Jul 2019 11:32:52 +0200 Subject: [PATCH 0099/1536] Created the new file linux.md to aggregate the different Linux distributions --- user/reference/linux | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 user/reference/linux diff --git a/user/reference/linux b/user/reference/linux new file mode 100644 index 00000000000..50a1b4b9175 --- /dev/null +++ b/user/reference/linux @@ -0,0 +1,20 @@ +--- +title: The Ubuntu Linux Build Environments +layout: en + +redirect_from: + - +--- + +### Overview + +This page gives an overview of the different Ubuntu Linux distributions you can use as your CI environment. + +You can choose one of the following distributions: + +* [Ubuntu Bionic 18.04](/user/reference/bionic/) +* [Ubuntu Xenial 16.04](/user/reference/xenial/) +* [Ubuntu Trusty 14.04](/user/reference/trusty/) **default** +* [Ubuntu Precise 12.04](/user/reference/precise/) + + From 3fcd85cdf3f1d22e48aad2e49cfa3bbbddc132ec Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 19 Jul 2019 11:39:46 +0200 Subject: [PATCH 0100/1536] Update user/for-beginners.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/for-beginners.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/for-beginners.md b/user/for-beginners.md index 14a16d0a3c4..8f2657e9d6e 100644 --- a/user/for-beginners.md +++ b/user/for-beginners.md @@ -74,7 +74,7 @@ the setup that suits your project best: * *Ubuntu Linux* - these Linux Ubuntu environments run inside full virtual machines, provide plenty of computational resources, and support the use of `sudo`, `setuid`, and `setgid`. * *macOS* - uses one of several versions of the macOS operating system. This environment is useful for building projects that require the macOS software, such as projects written in Swift. It is not a requirement to use the macOS environment, if you develop on a macOS machine. Here you can find more details on the [macOS Build Environment](/user/reference/osx/). -* *Windows* - currently only Windows Server version 1803 is supported. If you want to know more about it, see the [Windows Build Environment](/user/reference/windows/). +* *Windows* - currently Windows Server version 1803 is supported. If you want to know more about it, see the [Windows Build Environment](/user/reference/windows/). More details on our environments are available in our [CI Environment](/user/ci-environment/) documentation. From 857fc6c380959c2e77c8f60d1ed2e2d5729edd09 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 19 Jul 2019 11:40:12 +0200 Subject: [PATCH 0101/1536] Update user/for-beginners.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/for-beginners.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/for-beginners.md b/user/for-beginners.md index 8f2657e9d6e..9ba5c176ef2 100644 --- a/user/for-beginners.md +++ b/user/for-beginners.md @@ -76,7 +76,7 @@ the setup that suits your project best: * *macOS* - uses one of several versions of the macOS operating system. This environment is useful for building projects that require the macOS software, such as projects written in Swift. It is not a requirement to use the macOS environment, if you develop on a macOS machine. Here you can find more details on the [macOS Build Environment](/user/reference/osx/). * *Windows* - currently Windows Server version 1803 is supported. If you want to know more about it, see the [Windows Build Environment](/user/reference/windows/). -More details on our environments are available in our [CI Environment](/user/ci-environment/) documentation. +More details on our build environments are available in our [CI Environment](/user/ci-environment/) documentation. Now that you've read the basics, head over to our [Tutorial](/user/tutorial/) for details on setting up your first build! From d1f11e3e69be70859ed0b7f0150d2b49928e18d6 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 19 Jul 2019 12:14:01 +0200 Subject: [PATCH 0102/1536] Altered sidebar.html for new Linux section replaced the 4 available Linux distributions by one Ubuntu Linux link --- _includes/sidebar.html | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/_includes/sidebar.html b/_includes/sidebar.html index 1e7c4f1d65a..4d114b30144 100644 --- a/_includes/sidebar.html +++ b/_includes/sidebar.html @@ -79,10 +79,7 @@

      Deployments and Uploads

      CI Environment Reference

      • Overview
      • -
      • Precise CI Environment Reference
      • -
      • Trusty CI Environment
      • -
      • Xenial CI Environment
      • -
      • Bionic CI Environment
      • +
      • Ubuntu Linux CI Environment References
      • macOS CI Environment Reference
      • Windows CI Environment Reference
      • Building on Multiple Operating Systems
      • From a792bd71c1b3e667b06717c98320e65af8fcf0a7 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 19 Jul 2019 17:37:37 +0200 Subject: [PATCH 0103/1536] Link to Linux overview page added --- user/for-beginners.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/for-beginners.md b/user/for-beginners.md index 9ba5c176ef2..9fbe4d1944d 100644 --- a/user/for-beginners.md +++ b/user/for-beginners.md @@ -72,7 +72,7 @@ to start troubleshooting why your build is broken. Travis CI offers a few different infrastructure environments, so you can select the setup that suits your project best: -* *Ubuntu Linux* - these Linux Ubuntu environments run inside full virtual machines, provide plenty of computational resources, and support the use of `sudo`, `setuid`, and `setgid`. +* *Ubuntu Linux* - these Linux Ubuntu environments run inside full virtual machines, provide plenty of computational resources, and support the use of `sudo`, `setuid`, and `setgid`. For more information on the available Ubuntu Linux Build Environments, see [here](/user/reference/linux/). * *macOS* - uses one of several versions of the macOS operating system. This environment is useful for building projects that require the macOS software, such as projects written in Swift. It is not a requirement to use the macOS environment, if you develop on a macOS machine. Here you can find more details on the [macOS Build Environment](/user/reference/osx/). * *Windows* - currently Windows Server version 1803 is supported. If you want to know more about it, see the [Windows Build Environment](/user/reference/windows/). From b8e209e0c904ecd171256fa63288b54de079bd81 Mon Sep 17 00:00:00 2001 From: Nicholas Ruiz <5566593+nick-ruiz@users.noreply.github.com> Date: Fri, 19 Jul 2019 23:27:00 -0700 Subject: [PATCH 0104/1536] Fixed typo --- 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 aa8ef574362..b97252d6f4c 100644 --- a/user/customizing-the-build.md +++ b/user/customizing-the-build.md @@ -568,7 +568,7 @@ before_install: ``` {: data-file=".travis.yml"} -You can also insall a custom PHP version in a Node.js build like this: +You can also install a custom PHP version in a Node.js build like this: ```yaml language: node_js From faa16dabdc747428fbe51f224029cfdbfd9e0e9d Mon Sep 17 00:00:00 2001 From: rusty-snake Date: Sun, 21 Jul 2019 07:57:57 +0000 Subject: [PATCH 0105/1536] Fix link in user/languages/rust.md --- user/languages/rust.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/rust.md b/user/languages/rust.md index 6dd4ec4622c..6ce162df590 100644 --- a/user/languages/rust.md +++ b/user/languages/rust.md @@ -49,7 +49,7 @@ rust: Travis CI also supports all three Rust [release channels][channels]: `stable`, `beta`, and `nightly`. -[channels]: https://doc.rust-lang.org/book/first-edition/release-channels.html +[channels]: https://doc.rust-lang.org/book/appendix-07-nightly-rust.html#choo-choo-release-channels-and-riding-the-trains The Rust team appreciates testing against the `beta` and `nightly` channels, even if you are only targeting `stable`. A full configuration looks like this: From 89add5adbe2ea8a0793b30b0d4268e38f25c2279 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Tue, 23 Jul 2019 11:08:38 +0200 Subject: [PATCH 0106/1536] language review of Travis CI tutorial --- user/tutorial.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/user/tutorial.md b/user/tutorial.md index 25fb2494ce5..870c3380e25 100644 --- a/user/tutorial.md +++ b/user/tutorial.md @@ -41,11 +41,11 @@ To start using Travis CI, make sure you have: The defaults for Ruby projects are `bundle install` to [install dependencies](/user/job-lifecycle/#customizing-the-installation-phase), and `rake` to build the project. -5. Add the `.travis.yml` file to git, commit and push, to trigger a Travis CI build: +5. Add the `.travis.yml` file to git, commit and push to trigger a Travis CI build: > Travis only runs builds on the commits you push *after* you've added a `.travis.yml` file. -6. Check the build status page to see if your build [passes or fails](/user/job-lifecycle/#breaking-the-build), according to the return status of the build command by visiting the [Travis CI](https://travis-ci.com/auth) and selecting your repository. +6. Check the build status page to see if your build [passes or fails](/user/job-lifecycle/#breaking-the-build) according to the return status of the build command by visiting [Travis CI](https://travis-ci.com/auth) and selecting your repository. ## Selecting a different programming language @@ -77,7 +77,7 @@ language: php ``` {: data-file=".travis.yml"} -If you have tests that need to run on macOS, or your project uses Swift or +If you have tests that need to run on macOS or your project uses Swift or Objective-C, use our macOS environment: ```yaml @@ -85,8 +85,8 @@ os: osx ``` {: data-file=".travis.yml"} -> You do *not* necessarily need to use macOS if you develop on a Mac. -> macOS is required only if you need Swift, Objective-C or other +> You do *not* necessarily need to use macOS, if you develop on a Mac. +> macOS is required only, if you need Swift, Objective-C or other > macOS-specific software. Travis CI supports many [programming languages](/user/languages/). From ad86e556a82a9b16541c268df3e1a83adcec1937 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Tue, 23 Jul 2019 16:08:36 +0200 Subject: [PATCH 0107/1536] renaming deis to hephy --- user/deployment/deis.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/user/deployment/deis.md b/user/deployment/deis.md index a00e657a284..74c4cf8727b 100644 --- a/user/deployment/deis.md +++ b/user/deployment/deis.md @@ -1,10 +1,10 @@ --- -title: Deis Deployment +title: Hephy Deployment layout: en --- -Travis CI supports uploading to [Deis](http://deis.io/). +Travis CI supports uploading to Hephy. A minimal configuration is: @@ -34,9 +34,9 @@ You can also have the `travis` tool set up everything for you: $ travis setup deis ``` -Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. +> Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. -### Conditional releases +### Conditional Releases You can deploy only when certain conditions are met. See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). @@ -50,7 +50,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 triggering a deployment. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. From 2f2dee829465312e862c43ab537ef62dd24b07a0 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Tue, 23 Jul 2019 16:13:00 +0200 Subject: [PATCH 0108/1536] changed deis to hephy in the deployments overview --- _data/deployments.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/deployments.yml b/_data/deployments.yml index 669a8a31404..979e5101c4d 100644 --- a/_data/deployments.yml +++ b/_data/deployments.yml @@ -15,7 +15,6 @@ Chef Supermarket: "/user/deployment/chefsupermarket/" Cloud 66: "/user/deployment/cloud66/" CloudFoundry: "/user/deployment/cloudfoundry/" Cargo: "/user/deployment/cargo/" -Deis: "/user/deployment/deis/" Engine Yard: "/user/deployment/engineyard/" GitHub Pages: "/user/deployment/pages/" GitHub Releases: "/user/deployment/releases/" @@ -23,6 +22,7 @@ Google App Engine: "/user/deployment/google-app-engine/" Google Cloud Storage: "/user/deployment/gcs/" Google Firebase: "/user/deployment/firebase/" Hackage: "/user/deployment/hackage/" +Hephy: "/user/deployment/deis/" Heroku: "/user/deployment/heroku/" Launchpad: "/user/deployment/launchpad/" npm: "/user/deployment/npm/" From 68996e8501042d544978d64a33fab6fe36279aab Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Tue, 23 Jul 2019 17:11:53 +0200 Subject: [PATCH 0109/1536] changed deis controller names etc. to hephy --- user/deployment/deis.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/user/deployment/deis.md b/user/deployment/deis.md index 74c4cf8727b..51b9fd2b8ec 100644 --- a/user/deployment/deis.md +++ b/user/deployment/deis.md @@ -10,10 +10,10 @@ A minimal configuration is: ```yaml deploy: - provider: deis - controller: deis.deisapps.com - username: "Deis User Name" - password: "Deis Password" + provider: hephy + controller: hephy.hephyapps.com + username: "Hephy User Name" + password: "Hephy Password" app: App_name cli_version: vX.Y.Z # e.g. v2.7.0 being the latest at this time ``` @@ -23,7 +23,7 @@ It is recommended that you encrypt your password. Assuming you have the Travis CI command line client installed, you can do it like this: ```bash -$ travis encrypt "YOUR DEIS PASSWORD" --add deploy.password +$ travis encrypt "YOUR HEPHY PASSWORD" --add deploy.password ``` You will be prompted to enter your api key on the command line. @@ -31,7 +31,7 @@ You will be prompted to enter your api key on the command line. You can also have the `travis` tool set up everything for you: ```bash -$ travis setup deis +$ travis setup hephy ``` > Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. From 8b8ab2004f19416628d522ff41ec705a4faed22b Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 24 Jul 2019 11:14:41 +0200 Subject: [PATCH 0110/1536] added file extension -md --- user/reference/{linux => linux.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename user/reference/{linux => linux.md} (100%) diff --git a/user/reference/linux b/user/reference/linux.md similarity index 100% rename from user/reference/linux rename to user/reference/linux.md From 68c3050884ebf160c63dcf7702b0b0a027fe8901 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 24 Jul 2019 11:30:47 +0200 Subject: [PATCH 0111/1536] Update user/reference/linux.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/reference/linux.md | 1 - 1 file changed, 1 deletion(-) diff --git a/user/reference/linux.md b/user/reference/linux.md index 50a1b4b9175..d5fb7348014 100644 --- a/user/reference/linux.md +++ b/user/reference/linux.md @@ -2,7 +2,6 @@ title: The Ubuntu Linux Build Environments layout: en -redirect_from: - --- From e7d8a57003f1b1cb9bb22e1c2cc1aef93080b261 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 24 Jul 2019 14:56:31 +0200 Subject: [PATCH 0112/1536] new file transifex.md created details need to be checked --- user/deployment/transifex.md | 65 ++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 user/deployment/transifex.md diff --git a/user/deployment/transifex.md b/user/deployment/transifex.md new file mode 100644 index 00000000000..c7a3c8c3893 --- /dev/null +++ b/user/deployment/transifex.md @@ -0,0 +1,65 @@ +--- +title: Transifex Deployment +layout: en + +--- + +Travis CI supports uploading to [Transifex](https://www.transifex.com/). + +A minimal configuration is: + +```yaml +deploy: + provider: transifex + controller: transifex.transifexapps.com + username: "Transifex User Name" + password: "Transifex Password" + app: App_name + cli_version: vX.Y.Z # e.g. v2.7.0 being the latest at this time +``` +{: data-file=".travis.yml"} + +It is recommended that you encrypt your password. +Assuming you have the Travis CI command line client installed, you can do it like this: + +```bash +$ travis encrypt "YOUR TRANSIFEX PASSWORD" --add deploy.password +``` + +You will be prompted to enter your api key on the command line. + +You can also have the `travis` tool set up everything for you: + +```bash +$ travis setup transifex +``` + +Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. + +### Conditional Releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +### Note on `.gitignore` + +As this deployment strategy relies on `git`, be mindful that the deployment will +honor `.gitignore`. + +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 + +Sometimes you want to run commands before or after triggering a deployment. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. + +```yaml + before_deploy: "echo 'ready?'" + deploy: + .. + after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} From 41b139df2a3c1266eba0e5c36a7f11b67f7bfef2 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 24 Jul 2019 15:32:34 +0200 Subject: [PATCH 0113/1536] added Transifex to the list of supported providers --- _data/deployments.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/_data/deployments.yml b/_data/deployments.yml index 669a8a31404..49ec7a76ee2 100644 --- a/_data/deployments.yml +++ b/_data/deployments.yml @@ -37,3 +37,4 @@ Script: "/user/deployment/script/" Snap Store: "/user/deployment/snaps/" Surge.sh: "/user/deployment/surge/" TestFairy: "/user/deployment/testfairy/" +Transifex: "/user/deployment/transifex/" From cafca3ec756e780ca477a18c20e70f42d2dceb66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20de=20Ant=C3=B3n?= Date: Thu, 25 Jul 2019 10:21:53 +0200 Subject: [PATCH 0114/1536] remove trailing - --- user/reference/linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/linux.md b/user/reference/linux.md index d5fb7348014..6bf93437ffa 100644 --- a/user/reference/linux.md +++ b/user/reference/linux.md @@ -2,7 +2,7 @@ title: The Ubuntu Linux Build Environments layout: en - - + --- ### Overview From 1dbc4d67837261f9d64cf58e96563f4782795df1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20de=20Ant=C3=B3n?= Date: Thu, 25 Jul 2019 10:22:29 +0200 Subject: [PATCH 0115/1536] remove extra line --- user/reference/linux.md | 1 - 1 file changed, 1 deletion(-) diff --git a/user/reference/linux.md b/user/reference/linux.md index 6bf93437ffa..a3a27b969d2 100644 --- a/user/reference/linux.md +++ b/user/reference/linux.md @@ -1,7 +1,6 @@ --- title: The Ubuntu Linux Build Environments layout: en - --- From e0067045fb38d3605a880fd4bcdf46b5ac22d567 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Thu, 25 Jul 2019 14:38:37 +0200 Subject: [PATCH 0116/1536] added links to windows and mac environments --- user/reference/linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/linux.md b/user/reference/linux.md index a3a27b969d2..4fc59a83963 100644 --- a/user/reference/linux.md +++ b/user/reference/linux.md @@ -15,4 +15,4 @@ You can choose one of the following distributions: * [Ubuntu Trusty 14.04](/user/reference/trusty/) **default** * [Ubuntu Precise 12.04](/user/reference/precise/) - +Travis CI also supports the [Windows Build Environment](/user/reference/windows/) and [macOS Build Environment](/user/reference/osx/). From 1857e6356297e60afca40301842082b9be1a5eab Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Thu, 25 Jul 2019 14:47:49 +0200 Subject: [PATCH 0117/1536] Adapted link in user/for-beginners.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/for-beginners.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/for-beginners.md b/user/for-beginners.md index 9fbe4d1944d..58c89c80504 100644 --- a/user/for-beginners.md +++ b/user/for-beginners.md @@ -72,7 +72,7 @@ to start troubleshooting why your build is broken. Travis CI offers a few different infrastructure environments, so you can select the setup that suits your project best: -* *Ubuntu Linux* - these Linux Ubuntu environments run inside full virtual machines, provide plenty of computational resources, and support the use of `sudo`, `setuid`, and `setgid`. For more information on the available Ubuntu Linux Build Environments, see [here](/user/reference/linux/). +* *Ubuntu Linux* - these Linux Ubuntu environments run inside full virtual machines, provide plenty of computational resources, and support the use of `sudo`, `setuid`, and `setgid`. Check out more information on the [Ubuntu Linux Build Environment](/user/reference/linux/). * *macOS* - uses one of several versions of the macOS operating system. This environment is useful for building projects that require the macOS software, such as projects written in Swift. It is not a requirement to use the macOS environment, if you develop on a macOS machine. Here you can find more details on the [macOS Build Environment](/user/reference/osx/). * *Windows* - currently Windows Server version 1803 is supported. If you want to know more about it, see the [Windows Build Environment](/user/reference/windows/). From f802afcd07fbf2514198ae143d9f00aa1c13585a Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Thu, 25 Jul 2019 16:12:01 +0200 Subject: [PATCH 0118/1536] renamed markdown file from deis.md to hephy.md --- _data/deployments.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/deployments.yml b/_data/deployments.yml index 979e5101c4d..54c931b4592 100644 --- a/_data/deployments.yml +++ b/_data/deployments.yml @@ -22,7 +22,7 @@ Google App Engine: "/user/deployment/google-app-engine/" Google Cloud Storage: "/user/deployment/gcs/" Google Firebase: "/user/deployment/firebase/" Hackage: "/user/deployment/hackage/" -Hephy: "/user/deployment/deis/" +Hephy: "/user/deployment/hephy/" Heroku: "/user/deployment/heroku/" Launchpad: "/user/deployment/launchpad/" npm: "/user/deployment/npm/" From e10cf59a2ebef806acb1b03a2ad09383c2436acd Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Thu, 25 Jul 2019 16:12:32 +0200 Subject: [PATCH 0119/1536] Renamed deis.md to hephy.md --- user/deployment/{deis.md => hephy.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename user/deployment/{deis.md => hephy.md} (100%) diff --git a/user/deployment/deis.md b/user/deployment/hephy.md similarity index 100% rename from user/deployment/deis.md rename to user/deployment/hephy.md From 475245c1d6b8d7a283ca31b40a582cc74bef6428 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 26 Jul 2019 11:17:15 +0200 Subject: [PATCH 0120/1536] adding more details to the Linux overview page --- user/reference/linux.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/user/reference/linux.md b/user/reference/linux.md index 4fc59a83963..c84fa6e4e57 100644 --- a/user/reference/linux.md +++ b/user/reference/linux.md @@ -4,7 +4,7 @@ layout: en --- -### Overview +## Overview This page gives an overview of the different Ubuntu Linux distributions you can use as your CI environment. @@ -15,4 +15,21 @@ You can choose one of the following distributions: * [Ubuntu Trusty 14.04](/user/reference/trusty/) **default** * [Ubuntu Precise 12.04](/user/reference/precise/) +## Using Ubuntu Linux distributions + +To use our Ubuntu Linux build infrastructure, you can choose between the distributions above. + +## Default + +We use Ubuntu Trusty 14.04 as default. You find more about packages, tools and settings in [Ubuntu Trusty 14.04](/user/reference/trusty/). + +## Using Trusty + +To use Ubuntu Trusty, add the following to your `.travis.yml`. + +```yaml +dist: trusty +``` +{: data-file=".travis.yml"} + Travis CI also supports the [Windows Build Environment](/user/reference/windows/) and [macOS Build Environment](/user/reference/osx/). From 37d5a6b81b7a84945d02ead2a98ea5420d75da04 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 26 Jul 2019 11:26:17 +0200 Subject: [PATCH 0121/1536] added link to linux overview page --- user/reference/precise.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user/reference/precise.md b/user/reference/precise.md index b66d8778606..f8006fcca71 100644 --- a/user/reference/precise.md +++ b/user/reference/precise.md @@ -387,3 +387,7 @@ Recent 1.7.x version (usually the most recent) - bundler - rake + +## Other Ubuntu Linux Build Environments + +You can have a look at the [Ubuntu Linux overview page]() for the different Ubuntu Linux build environments you can use. From c8d7230d5124c4ec6d2765b90e9973e597a6dc92 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 26 Jul 2019 11:27:15 +0200 Subject: [PATCH 0122/1536] added link to linux overview page --- user/reference/bionic.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index 3d46face253..a9059c23e75 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -161,3 +161,7 @@ To use one in your build, add it to the services key in your `travis.yml` : | redis | 5.5 | | postgresql | 9.3 9.4 9.5 9.6 10 | {: style="width: 30%" } + +## Other Ubuntu Linux Build Environments + +You can have a look at the [Ubuntu Linux overview page]() for the different Ubuntu Linux build environments you can use. From df3ea47474192992940d0a4b01f78854786b0d5f Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 26 Jul 2019 11:27:55 +0200 Subject: [PATCH 0123/1536] added link to linux overview page --- user/reference/trusty.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user/reference/trusty.md b/user/reference/trusty.md index 8d49e20bd30..846c6384f1d 100644 --- a/user/reference/trusty.md +++ b/user/reference/trusty.md @@ -371,3 +371,7 @@ secondary groups given above in `usermod`. In the build log, relevant software versions (including the available language versions) are shown in the "Build system information" section. + +## Other Ubuntu Linux Build Environments + +You can have a look at the [Ubuntu Linux overview page]() for the different Ubuntu Linux build environments you can use. From 2eac020cfb6cbb217575cecff8df8c8c4095e6e1 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 26 Jul 2019 11:28:33 +0200 Subject: [PATCH 0124/1536] added link to linux overview page --- user/reference/xenial.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user/reference/xenial.md b/user/reference/xenial.md index 1012971df18..50ce4dffd6c 100644 --- a/user/reference/xenial.md +++ b/user/reference/xenial.md @@ -164,3 +164,7 @@ To use one in your build, add it to the services key in your `travis.yml` : | redis | 5.5 | | postgresql | 9.4 9.5 9.6 10 | {: style="width: 30%" } + +## Other Ubuntu Linux Build Environments + +You can have a look at the [Ubuntu Linux overview page]() for the different Ubuntu Linux build environments you can use. From 8e679c1f10d131b2ba30dfac5f2b723f98bba9f0 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 26 Jul 2019 15:04:30 +0200 Subject: [PATCH 0125/1536] Update job-lifecycle.md --- user/job-lifecycle.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/user/job-lifecycle.md b/user/job-lifecycle.md index 09ed2c9f1d2..110f874b6b4 100644 --- a/user/job-lifecycle.md +++ b/user/job-lifecycle.md @@ -9,7 +9,7 @@ Travis CI provides a default build environment and a default set of phases for e Keep reading to see how you can customize any phase in this process, via your `.travis.yml`. -## The job lifecycle +## The Job Lifecycle A job on Travis CI is made up of two main parts: @@ -36,7 +36,7 @@ The complete job lifecycle, including three optional deployment phases and after 1. OPTIONAL `after_deploy` 1. `after_script` -A *build* can be composed of many jobs. +> A *build* can be composed of many jobs. ## Customizing the Installation Phase @@ -50,7 +50,7 @@ install: ./install-dependencies.sh ``` {: data-file=".travis.yml"} -> When using custom scripts they should be executable (for example, using `chmod +x`) and contain a valid shebang line such as `/usr/bin/env sh`, `/usr/bin/env ruby`, or `/usr/bin/env python`. +> When using custom scripts, they should be executable (for example, using `chmod +x`) and contain a valid shebang line such as `/usr/bin/env sh`, `/usr/bin/env ruby`, or `/usr/bin/env python`. You can also provide multiple steps, for instance to install both ruby and node dependencies: @@ -94,7 +94,7 @@ script: ``` {: data-file=".travis.yml"} -When one of the build commands returns a non-zero exit code, the Travis CI build runs the subsequent commands as well, and accumulates the build result. +When one of the build commands returns a non-zero exit code, the Travis CI build runs the subsequent commands as well and accumulates the build result. In the example above, if `bundle exec rake build` returns an exit code of 1, the following command `bundle exec rake builddoc` is still run, but the build will result in a failure. @@ -134,7 +134,7 @@ if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then fi ``` -Note the `set -ev` at the top. The `-e` flag causes the script to exit as soon as one command returns a non-zero exit code. This can be handy if you want whatever script you have to exit early. It also helps in complex installation scripts where one failed command wouldn't otherwise cause the installation to fail. +> Note the `set -ev` at the top. The `-e` flag causes the script to exit as soon as one command returns a non-zero exit code. This can be handy if you want whatever script you have to exit early. It also helps in complex installation scripts where one failed command wouldn't otherwise cause the installation to fail. The `-v` flag makes the shell print all lines in the script before executing them, which helps identify which steps failed. @@ -157,7 +157,7 @@ When overriding these steps, do not use `exit` shell built-in command. Doing so will run the risk of terminating the build process without giving Travis a chance to perform subsequent tasks. -Using `exit` inside a custom script which will be invoked from during a build is fine. +> Using `exit` inside a custom script which will be invoked from during a build is fine. ## Breaking the Build @@ -175,7 +175,7 @@ However, if one of these stages times out, the build is marked as **failed**. An optional phase in the job lifecycle is deployment. This phase is defined by using one of our continuous deployment providers to deploy code to Heroku, Amazon, or a different supported platform. -The deploy steps are skipped if the build is broken. +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 @@ -189,6 +189,8 @@ deploy: You can run commands before a deploy by using the `before_deploy` phase. A non-zero exit code in this phase will mark the build as **errored**. -If there are any steps you'd like to run after the deployment, you can use the `after_deploy` phase. Note that `after_deploy` does not affect the status of the build. +If there are any steps you'd like to run after the deployment, you can use the `after_deploy` phase. -Note that `before_deploy` and `after_deploy` are run before and after every deploy provider, so will run multiple times if there are multiple providers. +> Note that `after_deploy` does not affect the status of the build. + +> Note that `before_deploy` and `after_deploy` are run before and after every deploy provider, so they will run multiple times, if there are multiple providers. From d97d4e76dabb68d44d3550dd818637786769fa68 Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Fri, 26 Jul 2019 12:06:16 -0400 Subject: [PATCH 0126/1536] Add a note about MySQL being EOL on Trusty (#2448) * Add a note about MySQL being EOL on Trusty * MySQL on Trusty EOL notice switcheroo --- user/database-setup.md | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/user/database-setup.md b/user/database-setup.md index 14b05ab0cee..e5a078d0aef 100644 --- a/user/database-setup.md +++ b/user/database-setup.md @@ -102,30 +102,9 @@ before_install: ### MySQL 5.7 -MySQL 5.7 is the default on the Xenial and Bionic image. -On Trusty, you can install MySQL 5.7 by adding the following lines to your `.travis.yml`: +MySQL 5.7 is the default on the Xenial (`dist: xenial`) and Bionic (`dist: bionic`) images. - -```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 mysql_upgrade -u root -pnew_password - - sudo service mysql restart -``` -{: data-file=".travis.yml"} +> Since July 21st 2019, MySQL 5.7 is not supported on Ubuntu Trusty (14.04) anymore. See [MySQL Product Support EOL Announcements](https://www.mysql.com/support/eol-notice.html) and [this post](https://forums.mysql.com/read.php?11,677237,677268#msg-677268) in the MySQL Forums. ## PostgreSQL From 197f6812a94e596c24e4f290103ce55c818572e2 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sat, 27 Jul 2019 16:31:01 +0200 Subject: [PATCH 0127/1536] Ubuntu Xenial 16.04 is now the default distro https://blog.travis-ci.com/2019-04-15-xenial-default-build-environment @MariadeAnton http://releases.ubuntu.com --- user/reference/overview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/reference/overview.md b/user/reference/overview.md index cd7ef1e6d00..dbe1f3e0258 100644 --- a/user/reference/overview.md +++ b/user/reference/overview.md @@ -20,8 +20,8 @@ Each build runs in one of the following virtual environments. A sudo enabled, full virtual machine per build, that runs Linux, one of: * [Ubuntu Bionic 18.04](/user/reference/bionic/) -* [Ubuntu Xenial 16.04](/user/reference/xenial/) -* [Ubuntu Trusty 14.04](/user/reference/trusty/) **default** +* [Ubuntu Xenial 16.04](/user/reference/xenial/) **default** +* [Ubuntu Trusty 14.04](/user/reference/trusty/) * [Ubuntu Precise 12.04](/user/reference/precise/) ### macOS From 690c4cf71e5ea0165353e74658e27413087296c1 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Mon, 29 Jul 2019 15:12:55 +0200 Subject: [PATCH 0128/1536] language review of build-stages.md --- user/build-stages.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/user/build-stages.md b/user/build-stages.md index bbc9eea4996..9268b7b5d7f 100644 --- a/user/build-stages.md +++ b/user/build-stages.md @@ -6,7 +6,7 @@ layout: en -## What are Build Stages? +## What Are Build Stages? Build stages is a way to group jobs, and run jobs in each stage in parallel, but run one stage after another sequentially. @@ -19,14 +19,14 @@ various runtime (Ruby or Node.js) versions in [parallel](/user/customizing-the-b And you want to release your gem or package **only** if all tests have passed and completed successfully. Build stages make this possible. -Of course, there are a lot more, and a lot more complicated use cases than this +Of course, there are a lot more and a lot more complicated use cases than this one. You can, for example, also use build stages to warm up dependency caches in a single job on a first stage, then use the cache on several jobs on a second stage. Or, you could generate a Docker image and push it first, then test it on several jobs in parallel. Or, you could run unit tests, deploy to staging, run smoke tests and only then deploy to production. -## How do Build Stages work? +## How Do Build Stages Work? The concept of build stages is powerful and flexible, yet simple and approachable: @@ -34,22 +34,22 @@ approachable: Stages group jobs that run in parallel and different stages run sequentially. A stage is a group of jobs that are allowed to run in parallel. However, each -one of the stages runs one after another, and will only proceed if all jobs in +one of the stages runs one after another and will only proceed, if all jobs in the previous stage have passed successfully. If one job fails in one stage, all other jobs on the same stage will still complete, but all jobs in subsequent -stages will be canceled, and the build fails. +stages will be canceled and the build fails. -You can configure as many jobs per stage as you need, and you can have as many +You can configure as many jobs per stage as you need and you can have as many stages as your delivery process requires. -In the following example, we are running two jobs on the first stage, called -test, and then run a single third job on the second stage, called deploy: +In the following example, we are running two jobs on the first stage called +test, and then run a single third job on the second stage called deploy: ![Example screencast](/images/stages/stages.gif) -## How to define Build Stages? +## How to Define Build Stages? -Here’s how you’d set up the build configuration for this in your .travis.yml +Here’s how you’d set up the build configuration for this in your `.travis.yml` file: ```yaml @@ -64,12 +64,12 @@ jobs: ``` {: data-file=".travis.yml"} -This configuration creates the build from the screencast above. I.e. it creates +This configuration creates the build from the screencast above. I.e., it creates a build with three jobs, two of which start in parallel in the first stage (named `test`), while the third job on the second stage (named `deploy`) starts only after the test stage completes successfully. -## Naming your Build Stages +## Naming Your Build Stages Stages are identified by their names, which are composed of names and emojis. The first letter of a stage name is automatically capitalized for @@ -78,13 +78,13 @@ aesthetical reasons, so you don't have to deal with uppercase strings in your Also, you do not have to specify the name on every single job (as shown in the example above). The default stage is `test`. Jobs that do not have a stage -name are assigned to the previous stage name if one exists, or the default -stage name if there is no previous stage name. This means that if you set the +name are assigned to the previous stage name, if one exists or the default +stage name, if there is no previous stage name. This means that if you set the stage name on the first job of each stage, the build will work as expected. -For example the following config is equivalent to the one above, but also adds a +For example, the following config is equivalent to the one above, but also adds a second deploy job to the `deploy` stage that deploys to a different target. As -you can see you only need to specify the stage name once: +you can see, you only need to specify the stage name once: ```yaml jobs: @@ -97,7 +97,7 @@ jobs: ``` {: data-file=".travis.yml"} -### Naming your Jobs within Build Stages +### Naming Your Jobs within Build Stages You can also name specific jobs within build stages. We recommend unique job names, but do not enforce it (though this may change in the future). Jobs defined in the `jobs.include` @@ -138,7 +138,7 @@ jobs: ``` {: data-file=".travis.yml"} -This will run two jobs on Ruby 2.3 and 2.4 respectively first, and assign these +This will run two jobs on Ruby 2.3 and 2.4 respectively first and assign these to the default stage test. The third job on the deploy stage starts only after the test stage has completed successfully. @@ -193,16 +193,16 @@ jobs: ``` {: data-file=".travis.yml"} -Travis CI does not set or overwrite any of your scripts, and most languages +Travis CI does not set or overwrite any of your scripts and most languages have a [default test script](/user/languages/ruby/#default-build-script) defined. So in many use cases you might want to overwrite the `script` step by specifying the keyword `skip` or `ignore`, in other cases you might want to overwrite other steps, such as the `install` step that runs by default on several languages. -## Data persistence between stages and jobs +## Data Persistence between Stages and Jobs -It is important to note that jobs do not share storage, as each job runs in a fresh VM or container. +> It is important to note that jobs do not share storage, as each job runs in a fresh VM or container. If your jobs need to share files (e.g., using build artifacts from the "Test" stage for deployment in the subsequent "Deploy" stage), you need to use an external storage mechanism such as S3 and a remote `scp` server. @@ -301,6 +301,6 @@ This example uses YAML aliases to define steps. It has 3 build stages: * Two jobs that run tests against Ruby 2.2 and 2.3 * One job that deploys to staging -* Three jobs that runs test against staging +* Three jobs that run test against staging You can find more [details here](/user/build-stages/using-yaml-aliases/). From b087a8591f2818b5457da5e52ff9c5119b010322 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Mon, 29 Jul 2019 15:32:59 +0200 Subject: [PATCH 0129/1536] Update custom-queues.md --- 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 3b5eab71d38..bdd645853ac 100644 --- a/user/enterprise/custom-queues.md +++ b/user/enterprise/custom-queues.md @@ -11,7 +11,7 @@ There are two [feature flags](#enable-queues-on-the-platform) required for custo ## Enable Queues on the Platform -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: +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 ``` From c911f0b78ce5576aab5b2fccb81b8c7dca7bd7d7 Mon Sep 17 00:00:00 2001 From: Zhengpeng Hou Date: Mon, 29 Jul 2019 22:32:02 +0800 Subject: [PATCH 0130/1536] correct the right verions of JDK being preinstalled --- user/reference/bionic.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index c59aebe2bd5..36afeda9eb0 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -127,8 +127,8 @@ If you're getting errors about PyPy `pypy is not installed; attempting download` ## JVM (Clojure, Groovy, Java, Scala) support -* Pre-installed JVMs: `openjdk8`, `openjdk10`, and `openjdk11` on x86, default -is `openjdk8`. +* Pre-installed JVMs: `openjdk10`, and `openjdk11` on x86, default +is `openjdk11`. * Other JDKs, including Oracle's, can be acquired if available by specifying `jdk`. From 1ae7193e012cce15a86fc7873aeebc13288f3017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20de=20Ant=C3=B3n?= Date: Tue, 30 Jul 2019 10:54:00 +0200 Subject: [PATCH 0131/1536] Limit environment variables to builds against a specific branch (#2455) * update initial text on which encryption method one should use tested different branches behaviour with travis-encrypt at https://travis-ci.com/MariadeAnton/hola/builds/120703775#L426 the encrypted env vars are shared accross branches when using travis encrypt * reorder so that travis encrypt goes first and repo settings last * update env vars image and include line about limiting env var to a specif branch * explain how the limit env vars to a specific branch works * update ssh key settings screenshot --- images/2019-07-settings-env-vars.png | Bin 0 -> 157107 bytes images/2019-07-settings-ssh-key.png | Bin 0 -> 27170 bytes images/settings-env-vars.png | Bin 46219 -> 0 bytes images/settings-ssh-key.png | Bin 30546 -> 0 bytes user/environment-variables.md | 13 ++++++------- user/private-dependencies.md | 2 +- 6 files changed, 7 insertions(+), 8 deletions(-) create mode 100644 images/2019-07-settings-env-vars.png create mode 100644 images/2019-07-settings-ssh-key.png delete mode 100644 images/settings-env-vars.png delete mode 100644 images/settings-ssh-key.png diff --git a/images/2019-07-settings-env-vars.png b/images/2019-07-settings-env-vars.png new file mode 100644 index 0000000000000000000000000000000000000000..f1ac195781ac4547b53441e88b73b8217e4b85c1 GIT binary patch literal 157107 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

        Gh_8e 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

        <{9 diff --git a/images/settings-ssh-key.png b/images/settings-ssh-key.png deleted file mode 100644 index 9b7be7056b9a58c303223865f5a75ecf3f0e10e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30546 zcmV*AKySZ^P)4Tx09XmFd3jh(-}nDMcWk)L^E}TQHP7AVd7eYJ+dOMlh)QWtq)CIQq`^BW z4I+{fN-Bhql2n9wDYpKn+JEn0^7V@* z1Ay4UZXe%hau~#y0l?6cBcoyf!1h78NPJ8r1=g zCkI0SaOwb15lEz{008KXpjhLrMF#e*FJz!a`$VzP3I>uq6aWnK{5K zE6iJYNQ5N?6CiF5_pz~sm>J@0K`^2}csMZD%o$>e{uDXd5atrFL;Tg3WMm03F90Z- z*brxfKUka;1<{s1iWn4Q?(_${L`69Kv5yK454EAp4`>IqKhV#78|V8)8#_Wd^Z^y@ zA7o+juMda-!60aOv11Yb`rTs!NFWLX06!r6N3uP_b*m>FwvHeXd;sB4C;IO= z;#RL8h=cNtztZ1hWr6=zZ`{_15bze>Aq>Nf(Zy(CtYE7Tze*T&jK=mjL56KVamF|! zoEgppC$%jBWaxD${6>MG|01)5eSR>yDA|5+8_BHk~b_)9pxPUiXR{lh~ zCnzOq+k?NBt-%zu_B$(nFk|6hVOs|y4!u^v5HUK?f9N}g9m5S|G0HF!1B@PwO$AD~ zvq$kd_OEaM=5jml+j%IJ zp?E;y0M7pyzl0b#|A1jcEP)lUh9C$Yp+i^@E<^wkLu3#oL>eW~|R=TX;CcTqo}o~2%+VWN?s(V=mo38pzrQ$o{3(@*n) zW|@|jR+v_U)}A(q_7H6eZ8Pm1+G*NV0y9CHU`X&H#1e7|=LtQ8XM|-sIy!MWeL4@i z7`j}#db(S5lXO4mS?J~H&FOvVlj+Oo+v&&XKQd4=h%p#2>}E)0C}L=3c)+m8NX;nD zXvj!nJjhtac!lu^<2NQ2CPgM&rZA=)rUs_FO!LfmW^ra?W?$ws=4$3!%rh)#77-Rh z7BWjJOASju%PcF7Rf5%=HJCM<^&i$@)+IJ(Hf1&!wgk2^wr;j5b~L*yql}C$*%#+2_!ZX2(;+5ug;7#JK<{jew#>dZR$`{FZitiTRB0oF7K7TNO z0snRW1pyWTU4bBh0)ZO>?*!Qd4Fp34O9cA_mxOqQ%!Fcv&I%0+tqDsAI}4`>Ule{R zLL;Is;xAGl(krqgDj;etx?i+WbV7_;OkFHctXOP7?7O&xxT|=Ec!&7B1gC_#M508a z#0yC}Nj=HEl2wwAq;OK|QXx_mQX|qRX%*=}=`!gDGAJ2UnIM@8nb95C9U42rcU0|o zB1@1pkd2dVl%1Aim$Q;fk?WBAC@(7SA%8-CK>nA4ibAMDjly$9Wz>h_(i74n=~d~y))&$D)vwi`GmtU}Hn?E$k*Gk7BDN8~8)_OJFzhix8<`qq84VjV z8#^198c&)Cn*^9Nnk<>Bm?oL_m|@K<%}$s-G3PTUo7bB!S*TeYu;{ZSSUOskTE4cD zwu-XqvPM~3Sf8|hVIyV}Zqs24Y|U*?+P<`tu-j{Q)gEVWXJ2Oj)zr%ndi{l>0 z2FDdAqEnvJb7x8CSm$0B1{W`vdYA96My~m;Q*QEZ2iykTx!r@@J3a6oE*`ZW-#m>y z3q5DORJ_u?#&=2VO4xOGH}~$)-Q9Z__K^0pdSks^y&JsONw%aa(l;M-pK_livLU&c z{N7jJx4?J7PscCcZ_Z!GKi_{oKqug2z(Sy2U{T;=kYP}1(C1*Y;L70dA+{msLpDQQ zLobF=g?Wcv31Z8Q?SE4nj=6>gq~VkKjb z#7@WQ#+AkWhiDVk(!kQkWyG?J<-FyY<=-oO zE5=UipKhw;tIV$ac_!%0)3c^$+pEN@imGwdan)~YTxtf+sh_K_<*v=H-8dh9eyYx) zuCHFLzP^FCA+HhD7~8mT!Rx}vKSuv_Hpw=fy~utsyBRdcHov>%eQCVKvZc3Gy|wAG z*yZvzmbR>Rqxt}HycuwFrgu;8^ILAW9`)Jx4fk92-??pa`__QLz>PaPcdp&lynE%I`n`@p)xq{5 zm7%u#D)-xlRfpRjs6FT$(HQ9()gHY*rZ;x;q0z(JkIWwpKDK#0I_^CF^oiG#si(eA z=bwc>`#cdhvG)AX3+#)mmy9oqCV3~TUP-;WIHfw(J#92S^xEu`^fiei|HSjK9qly{CN43{->cOx24(7QJ*)zt*WmM{B->}w-&#SUoY8^+UWXa`Rm1I*yd&=DT=hU z7eK=nH&STs{?Ny0(0Q<`5UWyg%1nfwJs z8l}*k!zwbWIcifH7)>E94Q)rAP~CLBO8pLlQR2MerZKyToT-tSyLqTZvSoqQdFv}S zLvY1^vfp&1cj9y2;iBbg=H}w=;}PMR6I`0-zx6f_zi0^a1SN;pM9czlEZ$-11<;MlXoBTJsgq} zotl(({=&|GRGZWZmsLY8|FQ>H(h)8-16@W>yN&jIFNiN?QZ71+`$t=C+`;y7d|K$ z$sf%f%Y2ynDCzOuasMaoPc5HmO-MiIe1U%P@#Xkr_p6$z%<1sg_A^RvSl=wqw!hss zr#<&;zGva^JK}rP``*PvA9Oyf!Z{PVB)T;5Ip>Scmk-M&Uk$!4e9KvpT^aoD_x;z8 z6RRStmwsyh>|e878(z0rAKEb8==r7gt8r6cGjDVAzw+-vS4#hhQ5Et(&ML)rfPD<| zpUFMPYsyz6KqVL;bVo!+G*|4qguCRmKl~Hr&naS*{C4)L2&yKk-Bo|9v8)BO2|66Q zqI$CW8U{v08$)NK-Nr#Ck*0BG2h7tfvMh703apE5%4|>DowcuaIOllIsn+?tORa0I zTdjMo$2rd$uj*ZAcUSJI@Gc{j`kW#c`R4g$_$LR%1x5x12m6G0hB}AYgqubXBX#zw zN9~N3kCBcQj}wU(OyJ$eoyd{IzMu5~%R%O3rbA4JnNpZj;nw8{OFC-?>rwVhxY@|& z%HcUCm@Ad1a-4X=Cg1a9U_oqQN>N^MMM=Y{&eDOh$K^8>%ay1z%x8tGl&TGDoX+{x z#-GoutEg{kxY_vV!u&rQ7nz#HE@`&dwfbF7Y|Cq}?da+pyE5OkehuHvc%AcxV2|`o z>Rr;0HPA3vC-xYo z7#SJkjqjOcn_8LCnGKugS=d=JS&ms1T6@^=*-Y7w(vU4hHK6 z{|e~|O$jp%rwt#8D308|@yXDzP~!Wxvw_$pae) z$CB$09X{-yqLfNVolCoQq%wVfhR0EjOwP=etnuuQoZ@2%xgL4C$Hh-DomkI*dvdJc zMqy)7NpV_9^eIxQU710-Qia%Q&Pu`=-T}fLue+B9 z>4&23zj)v{@?gyE;r!#YCsI$JPMmz2E)j8 zt;W8AHCYJm5^fbw#2>>?P)SkkqZ*_ZppK=!4{N9tnpd=Xv}XutLLlJ*ojP3&Jrn&Q z`p*o03=@nFjDt+3OnuBo%(q!ASVmagSYNY6u&uKn;}GMx%^A$a$koB^%|qbn;tk>B z&N)pP4LTYftu`%s4x#{s8R7dcmdx3lh(o&sLvUG=-ac{Br&00*!-C z2Y(H<3ag92M*8gSicQ4S%7;5siD?hgNf|#f3$s;np64Dt zu6g3i$)>`+#hRyROJ9{=J6(Auy(+rKzm`--YVf&mlz|9^W#5 zoxmPJPWXg7A#5+gA~G&oF6JvPC;n4nK(a(CNLp8hMdtmEe%Z5fhvdB#3>77n7?i&6 zoKYTCxvAQsR;7MiG@ z`i9N8?I(L`2Qf#Y6WKYR%;t~0wwyip`opD=Q@@1#FxfOB9$(CZM@ z(A=;&`0lINyB@tO=4PCDd~U*zMBk)`2Z#sT4#^y@O65;0P3O+2$P~$H%uzYkm*;%^ zUH;($uENe@w~~$0>T;WkjmoC8q-u_uvDy=Ljt#6AIGYrk?OPHrH@3gMB6BsV`)Q9! zZ*RZLz{b5>_iIKP9!@;bn|L*OX9hplxH$MF`Nyk2{G;INr-mo6Y=93)z?H8DtRe4V zAQ`e=2d;y0@Cl(o#1TWp2T4I{kOAa9iV3BG@Hm!<@v7 zUX~BvvL~Ezu-- zL+X+A;tpzAX*oOjM1^|A7dx4ityOYWN7dOiJT+^yKI-V`=ITuws1kDx=Zy_bs>~2` zvPHj@ly#oXirpUjyN=3ERW3}fDQ;gq0zF^ta)De~lkStPeaHM=16~FB1-}XP4_l0g ziu@UMB!)S*I$kN^cA`hprvqupyoWBQ*rd)KIh4VDv@Odnd*RrTJb~j^^Ic9Z73LI6 zl=PSSl!J=OO1(3aRR?PX&-I-Tu4iayzF_dr{fq9+Z(E{UH`+2gSUO9)_^+Pn7Pwx~ z!+tZXcfBv9|M7t4o$|YDgAPNr_kTPfj%1DwKcstP{`l~C+mpA?m?w0e`@BehSwDIE z)$6IBuUTfq-)PL5zIC1>&4(_;ygTsz@ZymV=^u}N%2>+yoc1MU`QX=m-=bGSzWe;} zTy^|uwx+YLxFPn7Ym-3XKiYq%((k7Lfe4QuCpR~j#R0(Q1F&&ob91d~b918_78~%L z(i8go{~U@o<$t0xjPN88bx){lYxsXQ{||_;wCox7m|*|_Uh_#rK~#7F?AAdM000aE zAp4hgDfaOo1t~lL08#(|Gz$Pgvj6}z3jhGk0szn~007Mb06?<<05l5#K(hb<&@2D| z%>n?>EC2vB3jkoESpWdX-kC->acp_~>)ZEzW0-v=d*1GN$iiXE!f_6V<;htziL=?` z*a^zwr^z^ei117lJdSmq7wi~1=9qwqK+m8tLD+JPk)I=MBB98LNWzi`Er^<>So&=> zCAED|OVw^#yx5jP{Z6G%QGHcix>@R<+qbS5OlFC^uhCRhR$(yK*&=AR77@3%)RHw+ zRyVn#Q!gUw)GycTb;UK^fot2b@m7<`SY2CFU1e+;6mc%XU@#aA29sH+tD?AQ`DCjb z#Iu3F!$6)s*&2APOt9M|*%-US*R*4iuMB1`=|ng$xp3h^e}Dg*Z@y`og!IV>W-u5G z29sG?f+C?nFckKWg%cvqB@ic910@`qeVJA2R$hc?Ge`z{JAZ9ER`gZor_2I@MHJOz zk3FVSf{gFjv4hxP27|$1Fqx$Zu0*c!^IIe?hwGJm{ZxNoJ&eo33 z)^>YPn8ISLb3(Gz4dS@*c3FqJrqBl9H0HuCA$KT4bEug+6y=t}c$_ zNM^!xUt5m;W@BJYPF-Jr|JSb`Gy1 z#YGGWM&Z;*4B;e+&}dhCTfL>JvEA;MhQQK0YPWVawj}SGEu4KMEaEiyXlg3bqH#>HZoOX3uhY`Xc3bWR@z#23{R% z31~4G3`T8j?SnJO(t~rC4$jTZ>x12e*NV*Ycff{9H-iU3*3qQMDAA|en1ZS7?=l!s zZnY6SLBB~49w=+~VT!~^n{-#- z;?w3>N{;CC8D_Sqn6HjilUc}Ctyh_UxoKa9eV0Mq1M;WD;cF_ku8@eQ0Nw)%Hn>YVF1v&8zgSjoUtSV}t3Pi@0wl~os+vAs4RGI4K3gApfVGTmzg+wkG7stfF5G27~c{0vqBO3xmznIBhtX%w*UAos63T#_^0< z?(3gBP0cA{EZY9YNwShze!qY5;>CS^eI&c%x)fWsY_Z$z_uO;O@#DvHR%TJ@+f-l! zL` z_(th&bk&tAIZ$Y=fGA*FLMb%cI0D9)_u7pno4P=RT&t&_ei~~dE1AV$Fc`%OY=~eS z>8mBZs$zA_yBxcIM~rF@kf{!ANV`}2PI4L;leo8c?liTUBb#>|dF*eTM7zuig+lY^ z&nMFA=9_OWC@8ot#k_g*Zn)tF(pkE6DM@@lXjU^BjpTHh@yxy5Qdj4ZMQB9 zwRb{Ya@c4^tWgaVRW$h#&K}WTT`ZdfmPey5vmjOkibtzsDcRx7cgL#BtVp+M>SFpa zv;3d2-Z)i5)#Mkcs2IEhrM^*_#VHL>pJpP03_gV!3)sJWA=McmmILPG&CLhonGg{&Cg+}gbLDOKnYj4J`1wEMB!7#qNm;IGse)=N|ESyz(~c8HuwQ5!R_0^=z5>NJSZ*JOih;)UKEvsIUgjC7~`cmgr*~q3N zr1SBiJ?o6?_Ib}?9CyKOPWu`F+S6^{jT!uYuu;2dk@Wd?=mqyU|4(C%lkWzo*k^|nbS+2hIYZ6 zf#9as_FKuAcy9ZWo+XEqnr!^{dmmn%8vH1_TD}svYLr-g~7Hx7$q&h}ow^W|egWrap4-e1t2mE!b15^c0hA zBnB&L)v26H3&R>9#&dNt3(}_`!#X>e1>v;(aIDHX%2E$fmRWT8kgg&of|F$>UOg?c z1CqUQ_?l)NOw|y<0D?!zo4&fq9Yt8%OGAQs(NU=NkW~PT!C){}D6l?)ak!^?*|HTY zmK6=0PG+R8SoVEUsrL%aFijO4^Ul=guP`dG5LANZxH8$Sg`^z~0=TaB7TF1AwQ+0Jm%*5yT3_EwrpHGQi0n zA={*#q7(}$QPd?Ig11yuL?nBe1sPGMU{;Q$Rsf~6@{oj4W z6Z`eMULg;}7d)MP<;Cm&D~R!l@n;rn|K9%`e0xk7mtHUWjy-VKrf+q42Eylg5fjer z=!L1EBb$Hlt;-mPLl2||9|%ixl0Mb0PG*gdk3*E}mRoM2WtPMTAAE4zZMVVQpZ)A- zLqkKk63ybWmsuk0g_Aiw{oYtAlRH3fxAaFUtznE~M%Xw_gIOpQj64H2BPFM#>WIw3ZKs>)qj`t6SzfZxMynGT*31gi~Z~Fmj>mX>fOgl$76e)n0XRO z$wh9;nZM%)@@5w>zC2jFZ{Z8WTvA*ltn&wwlIYZN(;YjCyT-k#Gt|#?#l559wS}$U z{l(^{b3`PC+x{SU9d2D=>vxKs!^Flh_yY%->fBB;Cv;@}1)e`*{O7>_z{dR_k4tls zyL8hivyL1&QdCs5V8MdxQdle&X?)wZZPLi1MT>|*I2=al96o$lQd*#~az$oAfdEZ1 zi;8WOwG3;L5pX(>G=rUw+UZi6TGRlL2n|Az1Co$bfV>}24_V4A5CJBbAzR1N{>gvG zs^?}I6pt~|`TKfs^3-*JDANz`5Alk0z%gJ?ovaj=cXL+ZuzZ zM~RpD?KufKpoIh$3jLTq)=PGD3^Upo<~Z z%QtL(P_L*4s4Ql)2^L@qikjZLCB{af#sQta4R4*M0)i{>+>C%0;^P_$IzaJEy@Su% zv9uh?f5*}}XEp>gr?SLgZ7u;*-v|_;kQw6AHTVU@^T{9BiNN0)3jfeBFDeAdpm?l$ zDJ+OiaU4e?TeO7Ir9*5qhO!t82IFoe<`@2yP;PknWrMD8{vv5`!TiGVmy;s}h2(Z& zYIIS-PYcpI#O#g&$t*cV!TgMw=XHEr-gYN2=DV(czOcNt@aFa3kOm7aUthNADdVPP z*RTEB&Ch@37jJxfUh_AI%@dn+<(nqV3hKUgeO+Psrl-p5zVZ{xw^E<_+Rf=5dH<2V z^548Y@A~Jza_jE5iCPRDeV7c=O}otUcswK`b=?#c78b&rL>fU5W<3R-E&^$CC3jho zkH(QUnI+$_E89mACWw&{n_e-62;ld@T{_i9T@AqLIkR;*0j0Z!xa@*1yfdR}sADWn zCPPBZk;?C>><(W+W+BiMO?>u_rDazBJC?3-TIJ@&%t#wJBq~S&Gw=hH!lHDl$s=G@ zpccQOYbXqP_pbITjnOQE6vx`IVFUbrj=Ibu_E;MX27|G1;X?9;YsRhxZ+x@hjc>qp z?^%q|+b}YH*B3rKj)9ARSlz5_sYPaiR3g99NE8*(j^q&Kbty=hd#RY#v(G+D^0acg zpaayvETWn%DrOnYqH?s=WQ5QPsXx?yucij5U&zr{7|Keh6e10{ED+FAZ2Ep)O=dx) z1ga-!cdUxc%74d(jTuiLLvoL)H_nTwVj1vTPo;WUD>IlHtWRMmp2p8VXChUTWTJY3^G2 z?=OEv(dL&HtB6lHYOCt;hgHc{yK5quO_4O~^+VG{> zyM9sS?xNTKJu8_7I2?}WQye&OAjf|?nkH^Dl~OxXK>njNFrt9qGgoA6|Fy0tg12UL zg>*UsL8nE7VxW(wB|^jX)do8LWbPP7I6M5kTp3kitIWjt1x%nlKn0CT-6(s<62yR! z%3=DHI2HwJ)*j$mRZkHPxTu|MLt^}smpjL$#93rP9Dc!6ya6>Vy8Ay1i z<5hOM9Zn!J7z{>M1cSjl?zrO@GsO+-K7aiypU=VTO|N{(b@bhAWfo07$t*xb@!(j% zGZu(M;|V0ULcRSgX>yaJq=5r4Xau!pOV&yZKd5p9$FCffd zFc`T(AP^uw4nsmsH{Ep8jW^ynt=E65{OmtH^VyubUT64n;YU!ekbMN?P-7^M)!ftsvn9|cb#RKFAW(C27{5W zghHW@W)|{9CbM#uSdF&dLu7nX2Vl$Uxc(7eFdFlFhdE0Xo!-u1Fc|s8UuO>n2AIss zNn(xFRh5RS$~q^)(*y&-&mgKay=73u3q9bo4syz0UrDVb2&GPRxQ?f${(B)<*$=Knwsd z|03(;It1`!L!u%;JQXi)764FH5s}Y>W&wa^p;-XH=2)4jS(*g^XqIMa7651#n)PP@ zXx3Uwvos3;(5yGmEC6sU&C)CYIE7|qreP z1S)m&vF&N|;;-JMiw(>yA|fLCfy`>zlH;raF{V;N%_L!52+jbQwp8LGfZ^fe?s@>d z+0)fn@-4;W?7SU2K&~~Bwhn+cVGpJUWX+~+YJ>f>xHXoi25yh_85RxT=1NK4jsjw| zc5&fy12c<=h={&Avy8$&gz>SIcmujQlq%aE;=U$-2UIB4HcD~#mt!S+h4<^RO#&vQ z=<48>+uZ&@Yp<4B!%_Z~kA0hUjjQwZxb*F*s}0O7A|fLC?#!Ab^t=W)0noN(PYyjk zsL_{mRqbuovAeF;)$@8RdkKuM*JEC_>oEU6*fL8(OsO>QKOco?_uF}0^~$M>4a}@x zK}1BvZ?l%00Q9pS?i%RrUOvQ80Zo6msa%hJX4dO^w;Ir&b03+Nwh6$r#=3M?5bw+q zu5G&7z|8s;L_|dVHY=?XP-ZKoxSCwu@{Bph)!LBiT>;p?Cn@EeOLZ}JnOP++b#7eF zoX_WKm*@YPQv{K7hBlFtUoCc+a{kqgyn9AFc}Q{PtW$NW%gv-%hi{*hb7rttK2X@e~^2f z{2I#n>#z1l9U3|?3(w{t1?uPjj4F6S$KPJn+dQ}P|F!pkvx1n(&h8aDe^!3_DF`r&<$ERl&=(E22`zj{m}O7K{lRcVKTqT7%=%NVsjcES zCDi;(=&?Kt9DEDtA3OxBbQ1ce9MDhd#`=g^j2MO+Q%&eQUxxj`_??rQTowHR^>RYK z+w~NS5No4fd)^;BzeOS1igKW}tkoB#WzKh?WZHXcrF564CR1FzW0045)qkRoR{ylL z*GZ(#`O!D!=0isH^u!qD&1RuGMII*qiuW=Eib~~gIT1P3dgF0sJmA z&zqCUctJjB{W}mp?}T)B`6Jp$?sd@fRH0=~YYvtgnd-U<`o2iV`;NhO=F=b8AKA@#*&Obt%A1`dy9-KhWeqU!!)c zlb;W>BGlEqUpdhc1%CK3gD~qesP|ti(Dm1L?|@u)}D3;vk)KnvVD7L zTUNhSkFu3j?UFsrdK;CbFbnB{f~4I2dpP?*(Zku}2L{X+v-#9oQvb-%Rjp@R^XY6( z-rw%`o9I!+^Ji}1muj5ByP)HgN%`d9TiCGQ;@$io4ztJw-JRzjR(}lYaxk&Eq&@7U zFAwy{&2tN8k)6UU@-CM`JSgyonEdB!)aUBt?q{vX{(oVXkHW0ZZ=VLU;N7K#pZxsX zPN6R#{rk_m?tc%n#4wC~Q*gF!q^E|p#(hI&o4FX%yjfd2i9p0lJ#V;F(W>T?euXcM zalH$x8!LPSg|*s))A(ckG|Z2^e6fqGA%E1%VVgSZ)@xlk%$l|;(RIl)SIMT4_51iB zkJac&Bp5ecQy|rJEQotAI`=@N{J3O>XKK-Wy{c<`JR$lWYfWyu6u35IC1dyV*#ZauMoEz?`6^yiJAw8Vnz)W>4gg&==6WVZit)2h{4l^%fZ|sg*hMO&BO& z_BOU!TEaZUExv2zEW9{J?Xl5YUfbL~| z$%TR;4ZknM{}l1_m=;)T`Kl6yDkplMxGXmi;{76X9BSm%V7%hkSIeMARDFVKXj z*jQpv5T8hv^sFM-FVf)31ns&U)UlT3W)4-!tkTvr@`RLX+ph~9hmIw_Fo znp_RG>W6~Xt!56Zm9R>?6JVC$&m}HVTn8bVl_>u$6Z^~lUq^p=m=!iqMiq$BGCpdou0)~Z+a z9L+Hbo5ZObxv14k%=}{13wy3B!Ys#}xIL()T15@>Gq0;>=3;6ZGm?D0d1W5*d1>Y? z*-ox1E`)FhchhW;XJ$n^4zWh`2keMFH_X)W0m3Xehh+%QtOKJCjUIKHT0-UKt!e2( zG~KvuJc!kEJvM21%k<4R6d46 z)ztZTLe&Wl81P3nXWXvEw*>X3?OaY)sHmssm8zco2GC8c`vQqt`drFrLB57*ne4^& zc$+`czKX1)v;pIX`FfO5pC6>EdcA5EDMKzEiEIB*i1KNwnXINa37s`4q%V146rGiW ztdN2JxL&OpeEj;t#evhjk%E-exqBO=XM`>(0RLz(9iM zE`tgr%e8unbrES=F7?o3cyiZBhggFKhv`ps&{c^+fkR`hbcfwI@Lso ztzI+g91Uh9>E_0M!ib@_bq>^M0VlP{eLQb54L&yPH`bL$_(|#5?VyLM&+(ggdFCsj zqdx0Gn@FR2BFxg(qIgdEpcr(-I3T9L6Kf7n!CflOSy(T~{4e>v({!~UNC%`4%sVJy z#2^l{bA&IHIT)roHDQ^Vr(m7%2D7j`pv7znU%-89Hx@7-pelTa;1EjZ_1P_Mn7gme zRuhINic_13Kx+|x

        6jCJ%=k%hL8?eN`CNZ{mPYx%)%$T|8QMeEqv7NQyu`ZHCOOY<5 z1}cfh3TR*eV}Sz~_ZCh>iC4(V0W^Rxq^Xc*c+g#g90NM zGPzDJ!3JTi<*J_K3%10dr1p!1hAeX_nB652D~ivVP*XwML4%c&L?s;M2NN3}LfRr^ zPhyrBXGnE|d*e_Ekhg@Bvbr*z6s0U^4%)@1>m-uIHA%D%L7v99;@rx_+$@Pd7ffDU z2O*mEZx<~*G~ClyhFS1|J-s<1?mXh9JN7Cx)ET>l5;}y3%~rc-=h`uxGwXC4r-j4E?V5y}>MWvaSYW9RgmX zB35^NZB35`fTgfMbGP|Br-?0y(g7({pWLVjx7tTIFjfq<+A!vTcbJ9UVWDC5JPQ$W z%%hrIIT0*CRHwD^rgUDN-K@dar!h;+N;F{;=|69GP1O;c&Bg$2BF_QUVHX?IKZ)@@ zgXx}>Kc3Yn!_$S+;{&)#<|VOD)KX0875O9Yi~nhGdzMy#X~<+RGFsf5P$il+?j}oF zqBo8WAs|i=82Bxm)G}G7bv!t#feCY@f)jy_K4>X4EA2}r6#1DxcDKn!a72+*hFe5B zsla-M#Ez1Aa*x%Z#Y(jTHAAWumvKPzGJ}%YFE$H?j2=S{v!r50@d?*2yyXarD&d%q zIRsxqzemj>UQ#I!IGDID@b6?>A`(u@>dJKz+mvdKXcxQJNs&a?B-1+F;q>Jx@G^fc zn7p_SVs6&2dzeLOp8{Xthbr#pA}qiiIlwFf4AQ=bV1o#=LaB58jDGU`rvWE)q;q9D z`Wn`uwds9holy~MTHfo*VOF{+o;8p`MS(63lwm z0ub)5bOvqQJq!HwK21R)LTio`;5XQP0?fkk3-}3m9KcL<66a1diQyZ04^`!aNh z(b{-=oyBdjOFGio;Z8A_H)#M;<(tbUMZ@93Mf%7&BOqy5eDnY7oC+QOmt!b_Efgr=|B!=s~ASMYXC3U^%q)c-} zyZ9`fM3T8CiPnKWWG8Z%<mb4`;ilo9_9^hMz$`@TnDI~sd%!%2O=WEod6uG? zbl;JN1ZvpFyrr&qcWHUXTuic$vx8q9Z*oMPPA;!kTVvUaugE%Ia?9P2twRUs$X8eh z@6Cc#k7#WUEg^e>pLl}cd77SK7H)s>*V^!dU{>Eu!T}%Ne`LN4*TUmME{^#V=-{NY zLxQCRPjKKEah=tRQTqA@mWtPfF3@+IHkFs+%C^}G$VrAr?Cmn5mg4SQ0<*-vFtaD= zfJE}SPBUI)V9uzIaJaLkpRMkQ) zJXjcjgp)#DZ#qeY==ke)v1^?qOPr>}HF<$qM-3RbcxWj1=Yq+L>);+{?O_&bKSpto zBmoS?xr#EpV-b72mNicCO;WDb?hkIY@PS$zuL~z>;nCymSv*-DEEg??_s^~#rn7N1 z6Jbg}xec;>(#B{u@6-z5!o1eqhFPIf>zVsvmYS-Z=$%22mxPRUupc&f_U_HcUjJz$ z7yz*om__HxU<24pp^auLoyYb?{0Pwu9O?%XX7{OA<|(%h8)tQe=h}}Zy%Ii0XOUp- z^sUvKrzwY7xPCz0ehaSWz{$vmz${>LuJ$k*G*e-W%p*3!n+F>n^Yz&wOL23#ve?my zdnA{T`+QypP2<@cOA#tLqvd~Ew2IvQ^;XEDT6^@=tLBp_vnSMrFf9WL1czn4q@~Vc zmTf*hbOzQIe`I}KvW&)9^?uyFF}aMq!z_#1sS?*aPxH}zU0j(udB)Gu%|oX(lrCv* z20o3OwPG|~x3@T8OO`ZQUlO5+?_*QV+ivS&Dqrx>a_8;`Re+Qqy?9#k;|fU-r~SZkK{gkcd?ZvjmeDRZFH4Acey`6Vqrg>^=^sHgb~L z9e;svuR9pqqL?I{l+=|BK$NnmIWODAu5=Rf0#O0vu1OBF@Zv?b@d(oAu|s5~%%5)w zTDA`EVU|PtXqJ&U)cxcT=s}zT!LR<%*uP!rC9*#M@O;eBvj7pTw%4(}91s}c?k#E;9H~-Pt z$omP4FiR*VCR%=Fl*Z=YCHTY!F|c9YP#`x`9(V+rDu&FCovBkX9RR zbs>%x&R-nRX|=)g!bdgQVqMTB_pz5uOD9)_we(FQh(qiP@~f2f6HPDr0g-r;5y4CE zyvIU!%VH-D&?P?8ttHKHO>oY)1bCUzoNjS|JVYT6Mo=C}Us9pCXq*F9@C%aIov4Hz zw$9-kvv;$tcILSNu7ZxXC=fZ5_>J`x)I-sJUDVVymwYQzw@X1L$i#{Tw(<=GlNVJ> zt`e5Eeu#`^nU{7`*?R8FjZ3^?q7d^My^s=eA`{t)=jAjt}wCbY^WD~iZLZ!{S1666 z!ZuwGAeD;mli0u3T3%+3&|kZVOx?9`^As=$tw;wc%$o?a#>**^=QvL9)AUX#g^;^e?U8t83t57mzk{$ZuR>XP?U8Uk zzkP6`L5ZxBw~8J^?ozy~kksTw)e=<#!}DyXM3y!o_EX)@!#U2aNt^$FKtlRg5JR%< zeRWV=&$s8`!2%%!2oAv+T!U+Z1W53~b#M>v!6Cuj-F=YY5Zv9}1A`OXcF6blw%)$o zs`sjP|JbVCnyNF?=bpB6y3g&?_j7xiZ54I!QOFajwH(Hng(PY5XF(oOT}@iAUm-DE z?XCz`URUH?)dYc_QvIFJHsbfeK54A z7nThnO?kXB3Z$w(ciB#-&g%X9-5ly2Mrv(7EOsa!0N|4BI1JQO2v8;kLke1lzJB>x z35q@o!?K8ifkY!g-oPHmAD8HAG8cdQF9KecB?!tNpl+b;TxLgqmVj6c77N}^w?Z_@ zBmn*ZKFiwbqW$-4)~YM17UgoUV)MJ+ms9N>S1|$ZE!31Nex=Md$p!B^>ljglh3nMlv zo5z#A!d>I+2BHAm=p(z=dB3xn1}9RZ{}t~l?NbFXT>g=B709MWO0?hBxh8Ngn|?)+ zIa9$Iu=~2`;`m#)PLB!yr7?BOfg$4+yleDrK%Ta;v$|M;)5*9?F z;kS(rE$_FL8E1BD2}cw8s%onCBGTT5y=GV(V9M*)R|aoX#A92gAzcs*T2+45h1fdY zwaXlyg={7vr;k!9F9)@&-IoHTya(5w2FwdU!ZRi@rxlvALVz}o76W; zlJ}fkFX+I!&E0l9k^tfs-wI>X&Z5g4N&{QQ8e4zN4mLa)rX{08zsEha=|cfjq@ zIW|!JvG`&OErXQg9b*~zjewKWz$4ykwnI3Bnfm9(WPJ_>owK?PLryZRBTQdq@@mv? zB{~we8sJrRrX_ZtWhn*3N%^|@Hi!1;%kD`AgUBWyoX3Tibftq<&xc@!CbPt2ATse-H`vDBhO* zS!MK<<{HTatCjJ+O&%7zY` z2Qa$(zN^%eme|V$^>3}Px^2_N|0VHHUR7d=FFxl>402kFX{Mi619p} zfB5Ad2!;p~^QyU$g$0M1ax66vx=J5%BYyO|;ts!pq$doTL_JsuUY9>rN(_nhCtlRI zQOtOh#cD;d1cJWkj=sj`%U#hOKvXJOe%qbFHrg$(<8@}$8Cpl^>;Q;tk~$L{liZ+`?ob=x$@G+N+xr@w=PBAtw&H>@86pey8vJaX7U}4z-R{&bSK)kC zX!Yaa{oOj}jn>BY_lI{Ezi-+S_nf(B&R{n4`AjVS0NE=wX`cqLm7slgqV4SeJ!6gw zCsNYzaN~_U=I{W2udegX!NNbU(cs%H_^a%{gt^i8*tA?zA_S$@Bw2 zS3732JyA!C#CM4(tSl>xU_A%?y&P{^ebX+?k9WMaYXN%a%#&mQRJ)2Fdk) zo~vyPO&eZL%v77#5PYqE#pP_qMEjxN&gSy^(UWS$PE{8aeP4uM#){7HA*l}>y$dJb zxqNkRwLgy zFsC9NFMk;TlI20jbjG*YWBf^P;AE!yvSGk)AuZcl z=_n=k5oKE337Jt0luFsS&(d6uS{$F+|6Rrif7EWdXjj;e-QfZ~dAg~XC0P0ipIK*f z6$;A53roLL@$rC+y2pMfl6c%q7xvyt zxQGn64~y$1)E>_tz$aO^XR*q*_*zWM@Og$JPtgHz7w~FZ*fxps_T`Y{K{I=L6(u0F zLb<_n;u6mRHN>C|&+-tQ$m+xSNvn|4&_nkcs`#drmI(hz+#eA=9v#Weh)&cTdlf0(zQ8AZM)PGP=dyP`pDY?M%7>|(zdAZhwzy+7TR7>_ zd_3AD8+3s0`ZM=!_I+p3P=8)8X5U-JgMGxlkgJn1L6fq&rL_nX76eJc>Edo}~8r6=mztIY_jV z7=TTqr&!4I5R=XTP2B#CDAh>1HqGr9=o%SkpJ*zhr&?t8F+21CZCwOXZ@-o*`r(mM z$NAbn9xgP8N_Y=|&A((aR*5V!rC5~<_AOfbV6UgV<*XOq%p*IrdQhsZ?>^h*M!^J7 z7C*vVPH$ySe;fYEOwmgV#70)1%kXY|nmI539Yt)f>gGlbrO5bOqzr6MEi&&n3kp^F z0w74L!iQyW2tYptezhgy0FCGeN6}3D;vtt@YP^h32yW@P2S1peKHF}zz^I}FTGk=R za!IoP(ngDUqd{=9Q~{*^6B63-~AtD~cj?jwirTP-*v ztvY})d?JfzrvtnRV;CZYJ@Qpz9Gn5O>z;PB@K29NLw%gS)YVgVVYWZfGQ^O9gd-fk zz+h0J;C@&cILfL7v)(3xOu6*_tJ3nY5{lt4$BQmU_dvMbt|qyF_j-mZxcrn zmlKD9jH~u!Yz5nzO*ZxT2sa?617KAr&pU4v@LRIZ(ll)s(5-omLO1)$BP-Ok$^*6( zT}>j=N`M>aXe8+^g-E)^s_!p9uSL;k{p0$^FP81gq+e?0*WXM34IG9H%rZr@v%9?l zIQ86t_GUjBbTcHBWJkZ%2%Ul@Kl&g=EQ_@62b}XZ=S_tgA-o^;KB*Y@!bQrsl_Hizj^Pr*3R~g^Bz8{>6>X8LI9;5VggByU zNigjyU7ONb22~SFxh)%WRVl-Z4eUvAOPwMMGeixg4}z7l!ozA9&TVo#_d@C zAU@yeiKsG0Kv#V8R;xk$T$fej_d3bM5Q|zS!2@mV_qe8K8n2UIlLAd|5~SVcTu59G zdJ|h!ltiSg=9a+Z0&>MqX^%`Vhut6Y^xvVdP&Tlm$c%)`XkT+5SxBVL)&LD-53iz( zadX|B8oNK`hB#1QK8o*;)_?c7IY%5`0*`$rjIm3YMcaaFD?z6WNG(fw^k~ES`hxjF zH*$Y={>QbQ-c_p4SjRjj3;G`nRy!B8a>q6HmM072wY4RD%{7j)tXiB*c*; zn}IFkfRYOYZ?j-nkUE4zAO4LMW2V7~Fz|fUoGLV5zotosSU%^PQ7};R&sS){58W2d zAK9xmy5*!#NsQSf>H32>$y|?o3ceAYazR77JtDZsWZtNvboap8&f?LO_f;O0Z>*J9 z30k6-G;Z|`8loz0aa~UPh4*XL>H~EN4uAGuO$NMT0uYZ1?b4r&hIJd9vz-k7_?4$s zx%H7BHx=-E8O6>v2f;{H^p{By_j6pcPo#&}I(c%J*RWg~XAk&H`cUdj7+TQ3d2&Ze zPYU{w_X0pj;??9#xI%W?n}LiK(V=}s6+>JT{~S>PabZQww237vwWv=(b*?9MNCfML z4JS!GBG!ZGFZs<|=PGYk&!)!*?^0rPlb%eDU-BCF-tdOEEt0|eW&_|mM6zIkc6akP zkt|ZT5zHxZwlPV4*iP7h{Nsn|@)o>VWB#^?>U}3>koqeUy@N+6p zOm$^f_{jc^jObf3UHmjHe+CA!L|C~{kAIa5YxuXCaY((7`9>>?Cu*U!R(uu0*od8i z1FDFc-<4;a0ukBBq{1%SXdp>K@7&wW#7Q9@!bVV?qp3};rrI%vUh*C5Ck5B+{PW*S z8c?t5n7*OLK(eQiRoaQ&`zE`aQ^ud4GVe2=z8xPQS5#D(C40Go9g*af6Uc-F88Z(O z1Z77=rj-)SMI!X^9ZqA0&~o4#sR!0N$+2!fAUJ6lv&xo<2^JV`;?xNb{y}BFQiide-EmmH z_Upf3$MOs7na}j?LT78{aGNs^Mvi!u$61q;rK-}Y##Mo_lRJPV1qha13KagcRcy#K z!DWoqNL3!u=nxEtnQhUM@`e@@cln-=#KAtUb2Dke!JgR$Q0@$a z(=QCW$~<_VZ5bb_=)%j>Be-HyQPj}vk%G?DC$Xdz%+}q&9(O<+Sng9y3&w-NNwp0o zPikE2{~*(C|0pWsK(h(ZJdZqPlGjM8#pLp5ug8f7xqcM@i_bzygDw+G8u#cUdKrRu zyq|1-^rXav{RN3OURJdC5{NC0D#rTex!}i1QTYGCf+%d>v|i8hhZ9ZMjXZbZR{h?P zf83&vgVo>}$I1rrDynT#>5P9gntjO%2=pZnU3rRT#3skX1{O`|WHGF_D0vv-!FD8# zo=GI=FM;iVMuPfEbzyt0VzABI+0DDZ-!@=L36-+6&nmqpc!0jr6?brX8f%YfSy~zh zu$IoX`#pH5#%%c@^-I`d4_>eEwrBr&>u%n$=U!)kNCLGq9gR_zG#aYKn=JBty1q^~ z$v6UhwF4#%BnrX z*dCe5KY#ux6DGweRCA`--$dzwl6SQFB79G8&}ar7j9Hl^+}k?z=GZ@gnef7HJcLLi z;^t(8;V_EB^El&iS~CKNaBk=_5i|9>wp4!IBLrNm6bg{iC1~MmF>L8}fWENW>2u^= z`u+;rdP6axFJk76dWe-z!~nOvdpL<_?yvApMkO>Kr+@SFg~aQ}h)?m|LWDJcyb#t;Kd~f>CQMB(|zQ<@c?>ipSwy2wPTJ{LL z7vCHh(X^3cAfFqGtBAT@9i=f?q@|^`xSoT#Q;N7AvDVtu!q%}wx^<297unIN;yo+F z<>ucE0M$(nU96-?8!3^6p@9R3X^(`!w~1Ei#|XzJ4|y-_l0aSE-B;`f%;YeoHp~_VTg@DNuRa?i_U2>+?>y5Q+SeYMXz*T+74Lp5l>9mNUc!xPg z%)s;JdCQL{*?PwpW;$G2%j#SjqN#G#q4YMGz_YX^Z+77pZ9cJSK=9X}K$9o<+)ZuS(eWQLXL zTyY&`U2E=m`8T_5R%#Ww(-@#JN6y9G-t>^`Q?9M$SkMn-qe12_pV zbVWo<6g7(T^DePR0r{srCv5tJCO!kd>Wo!|YBKSv7Unk?;i74Me;}2UkE~nElp^$E z-R8E6=a{9iDIh@GRqL!h7lQ2q6(H=PLt#Y0O2@#vF?nR>Jot(5&IYrY4y>mecBr^ zC{P}8N!*}~^E?Nh^f18&1(aIw4$Cljyc{xyWJbxPwFvX@EXpKsN1r zu8S@>gzCf=hiYWK!*UJSa;V#y%j;dK$&j^Taep@KGEXG>W`9JV={vY!H`(9qWYK<- z)j9?woZig0A8XV4_*<=E>%wjqtWDY^89vRcz~??|y(Ij;1lilp;%YJNrT&B-tH%U; zNmk9&kv?_Ziun*GSw=k}!(-}s*#J;r%^>Pk4WeS%?SmUim4bFj4dG5Pj}CKxxsvv+ zWEdOJ-^ZArdDwU-b~gOjeL99yAAb-Cr}COL-;Y54ef>|)5f2oVm>mBey|VXx3}is{ z@2|~spw^Dt-2={S0K1I|)?Dj{$MIZtrw6Z9XXQ~k{FJ^@1eO;l`UJ@O(GF9H7Wxo@ zZN;Nb;0L78H^Cu09L<=ORw*B30(qym1S(XO*ZrYjW_nDKsd8F$2{bpob?#Lf&<^Nb zU2<@)tXZBw*H9?-nVd&P;dqryvZ)d!=frDHUligE_pb8P4UONH@XKSmzuD1IRPbU| z38x034|0QQ-$t08cFv+tR?=jy4jdbUO8h`=?r{VQ4d>T%10%E4Q?pq8iy0y8@hbM?0wM?9tLZBTIUQYEM&3LSEfnp5{QcHBcBI139Ng?+Uw1wV&Td zmnqP>{e7izQUE`@9a94UTaXg5fBmBpMVFDtT4Os>;-}o~ld?8;RhC}KFRPObG@vC~ z?(mX+Af^z>UhV4&ttm|{oRA-~)nXRrucwUg-hR^4oahZ`OP6GLBkj6}C^kUgrp=eg z-g=s!h5Usyn+Wf%kF?P`+)va`{g?$mFFw#Tj$U&UzDd5V`8YQ4aV43sGumit+8#4z zTMk-DCq+XQzD?zk1B6yteSW{gMt_?r&r!7i8Kj+$jJ_Qr19#+)2e^9^lLiOrA^KG# za%o8)`EtCPB*lGO^o!kCtP-vW!#qh61(nM7H6Dxi!IDmT$L;>QeqNG%#^P)iiqI-a z-g%zCxtH~C_7XD(=&l+LuVDD^q11$t%h4X%1-!`%5B(x!x`k^WoTYjF_-QGzx23kmhX^jIWoa#KrHA zd=Yc>@&ct-C}y0VLz$+5jt39Y5n3oAP8g`ejn1wu81ub-J@^?RrzzYxV&-I_L&ZO3J;krOa$_-KA7LZ?z4Oa%;3%27wz z7Il1B$Bz4vsakvA);dRxi%lG4RtC;`H2t$HuBem1t0O!?vhJ#ZKI(PrJObY9++*v) zNt4rywWVZ^2i@-3D{D(`87A#^vRmYI)e=CfraQJMSLiAl$!)B&<2vTt@RDN!P;R#o z?gih+`P}$(ZsE(t>xZCa$z{`w?pK=%Z=TtI&mbd>u-J_GSf91_6*yX*qvOHs+kNU7 zDc5Te)QR> zfZeHfQu=nafxD@u&!$w#mjvYvJ{`LM?=H3;f<0~omB^J z+_;eTN=v55N_)_hp__6#W3y&#FN>VKV{@|f0pI4=mheJm-$gsE4%Y%6SDtqT4QWJ z>0}QZYY#%*VVZh3HAv|Gi= z%H~7RmGj!IG~ZoOx!&@j!2Z#Szmh6X%Q?EY*<7{Rb!NN)i^>nQWDeI$sN>Jad?<-v zZCm51cCB!5o0EUzY!WAdkoWf!b}f2ElO}d_Y&(%ZnD{KE7HmbWdxm$f#}#+i@QHYM zFuS`n)2A+j1L|@1*S@$(Y$2>pYuO{ejj>`b8fgs+)Xyop%d}D3d!YXVo%lVgU`W4(tlU3_-9#%v$K7sH&2c|8T(@XDNojhqn^ z@q}V$(H<7%+YlNU(I9N23azQL(h<&ayZtt9j<*}xcg6rJ8&ZS|Zvk^OGNmH>2CI4Z z9BVn$-S1j3VilSzNahwACQ1AN1L;d;TrtcL>wWeTeLrE1=5eN}3+alQ3SsArhY={J zu(uXo4POxK?nQu+a*o;$l&BQz@V9KQYD$y)p42!h33;7v?n=})M3?OrV9G80T}pcn z*XSEZPr)l~vlqSyo(3;;#hIc?KGm@_C`Nu!G0O z#-a5q76jNEdPeaS5q{I&an+W5QUOaZkvp&Vu=shby&t?U4-%09*n!!Z-b97%81U@? zLs7Ahibn#RPe>XW{ICcBhNFNX6_StuX~r zD)Lim8UjoMK10Rt`VVSsWStqem?1h(FTD?XGj<3ijs6__&A)%vjn^lzN>psl1?(+)rMT63kAl<6djayEbW+CEwVRTS9_foH##|faehQUCVtkK z(M*9g8?D_k$ciaIaJvsNl?j5MzU*bnRg|$=75`L+J3-tcJ%Jc zM;w)$VtGdwD)pMlDdQ+9<)i%%nrX+24yDCS$W5B|;Z{N8Gkfo5bvP35xx={yX$e$3 z-NQL^o{;})3XrtDZ~OBqK#JY9<=leN0NJ^fdfv+M7P}|$aV+5@c>XYXAlMZgA601Y zcBVuE=GWz>h+aV^^Q2OY7_Bm~r{;MQ>eM0%8O47Pia38HaeDbYRM-ahkv|+3aI!xHFEKkf*M$fA}Q9ycVenf*! z{;4H7X}ZgvO>&aobK#aRy5Q%*6qBR*7Cn(ui)Pb4SH5XMBaMbeM1i?4xSVx+Kh zm-Bt=1EONyE_3l}@wU*&$q>EDd2T0SPwc zsvH3K)v!6-Jpy+!2oD=#qg5V+0HnW@{jVQ*9(eyahiA+Ebq{|X!@rYw_7MPf=#$|M zJ^&y>CIUXS`UwD3&PRbtVMp)H9rOV!&j0{RCvu3o>py(!{h(n8jHd^A2YEy@0O1 zZWPdP1+X*o!Q<)vlr!<>(TCOZW)GaFF28 zwYjEG9Up>vr0XYJl}Ze){c^k$qtc$L-zDd8QzZqg4N^i}ObNoe%;JshsGRq#6g`bp zTg}!olJfXyDJ9!V%u}S4U%I`ot8Ft@!?@v#J{wp1NS21W{ii0Ea@*y1w_I(rk*XiI zV*jRPTb=$06Tb9eaj{9qn_b7}2|6->0PxT^!b>vl+L|sivz`ebEbmYz3NgQ8gVdn6 zCRItU4D}dA>Euh2~1)D9{YCrek$k9svTKAag1T+~1DFcOR;L8t|S zJuO`*barP%$gSQ`omifrxU^9qdrmePu!tyO57GOjk z3?c>a@+TR)0@e;9LGdX6SFqYSOlToMEI?}7(62Lqty3Rx5CQOif(7pb5&!o+hAjf% z{y*#4_Wy|{n*O~BNZ1GeqgDQEtpC&I{I3m-|5uG}SpQNA;15p_T-Wl5$?3-m_i$`X zZ~!m~8mbn6Y3|vG?eqPAr`G=-t9A5W#n3`31pujk$HKpr{9k1ONB`rHO8cjo|9;^8 zf0mEA2h1D7)=bmaFn0|L6pByhDIl;2N|_~{gk2U4mswT(@DGR3!uzkNPtWZ(%s#L@ z&)$9o4zT714@>-~f!O~PM8W-A9-pDc`7(q-pDa3`YCx3Y(&BrZVSQP;GcgPWwpi`$i=lz2!OfL4jyzE zvi*S!21|#Bq0s-r*I{HWB8}t3mLzQB#G42aUKHVTU#8^vTX+g{nlXKX?p9e2+0gjF zknkbXg;xvV63zxXN^WsYv<+tYF$rn)i=ItQ7NfMh=Y#Lzx_8qp9*vV#h=x91Vc|bn z4QHdaKN7;r+Wh7YKoflq38zXkc1B~j#}2!$hrE(0I6X;H!SX$w{ztk&TN#t3T^5Yl zkvZ7My@T;N(%&+>uir`jlk5D{AMS1z#H!Il)Ppy>I$e4#G2EEStasa*G1Ia~rG@pq zO$G8T9x%nk6a20%M~30%lxBB7ntUJiQR)?}UPLaaeR}a|j5ZaQjz=-bxhP|KW~9X3 zyvM4nFstlLX*1Dx;^FNunx!_LVs2wkL|);l%0A&Ja_dO@nzz4(B%A&-hW_`) z3r-95aKpNND+{C$_>hHD_zHyMT={Rw0kDvqybyGZbra1vY0XBOp~8%E)Bk$5bX&;A zD-m{Bg^mz6B%Q?j)ey>{Hido;s9D-Qe;7-)^HDDG(h_{$@$hHge-hY4-O3+h^X)KE zXggU_wG>A!rt32D0r`}nQtm=exd>dF=07U^ZR|9<&$>gCAB+Ub{uv9$`TGns1^h=T zd~VhiurqGHugo}SnBk4q$M|Jqny&P4S#Z#pS%1RUYIDJwTEEZ!%46~3p@0Rmh#uWw zksgBqlFd5_L_H|P`B;LN8HWi*49*7h$>)P2O+CR7x~P6xePa%3Bc+r1i`xc z;#;!HDZyq3kt}M#unnh0FIP!l31`V?wsNH=cf~)kTqRT9zsywKMvLVMXerlt8&f>W zL85%`qJv2~nPkR;Kp%r55;((V=UtXrygy@}pb0#e=|Ohi2FgMGYTdaquHxKh0kO)G zkQ{llAI|=vgewfHd|{?K?(JC&mUJSTDwb=ex^zSu_|Sd~J}uMb5)}t14{COQ8MBi9 zW;sDsTNwX_wUJ$=>Wq`I;vKqtTz zB|ipipMi>ni+K##4@Z;ShNQh`0`ZbNYmZUL5Gp>#1-gv^@f*M57h^f#?l*d@ zt5ex8exs^peRKeXgBzlS)?Jz!pSJ zQE?Am#YH4-l3U^LPGCE?JTZF#SmPsvMZo>Qe+VFH8XM+!|L&3PW5J^0S9UGBBNOW9 ze8xL)e^AIF#pa6%5Tlto78S=oD6mKAY#$^9bn0Exl8@C_dqRWRdf;kcQeJr~DoHoi sK#md_LoO6pG%fre_uc*%?*0Vsx@ag6SjRUA3%~)=lJXMeVtU{H8;EOntpET3 diff --git a/user/environment-variables.md b/user/environment-variables.md index 016b56cb1d9..1e265909ad4 100644 --- a/user/environment-variables.md +++ b/user/environment-variables.md @@ -7,14 +7,13 @@ layout: en A common way to customize the build process is to define environment variables, which can be accessed from any stage in your build process. - The best way to define an environment variable depends on what type of information it will contain, and when you need to change it: -- if it does *not* contain sensitive information, might be different for different branches and should be available to forks -- [add it to your .travis.yml](#defining-public-variables-in-travisyml) -- if it *does* contain sensitive information, and might be different for different branches -- [encrypt it and add it to your .travis.yml](#defining-encrypted-variables-in-travisyml) -- if it *does* contain sensitive information, but is the same for all branches -- [add it to your Repository Settings](#defining-variables-in-repository-settings) +- if it does *not* contain sensitive information and should be available to forks -- [add it to your .travis.yml](#defining-public-variables-in-travisyml) +- if it *does* contain sensitive information, and is the same for all branches -- [encrypt it and add it to your .travis.yml](#defining-encrypted-variables-in-travisyml) +- if it *does* contain sensitive information, and might be different for different branches -- [add it to your Repository Settings](#defining-variables-in-repository-settings) -## Defining public variables in .travis.yml +## Defining Public Variables in .travis.yml Public variables defined in `.travis.yml` are tied to a certain commit. Changing them requires a new commit, restarting an old build uses the old values. They are also available automatically on forks of the repository. @@ -125,10 +124,10 @@ The encryption scheme is explained in more detail in [Encryption keys](/user/enc {{ 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. +To define variables in Repository Settings, make sure you're logged in, navigate to the repository in question, choose "Settings" from the "More options" menu, and click on "Add new variable" in the "Environment Variables" section. Restrict the environment variable to a specific branch by selecting which branch it should be available to.

        - Screenshot of environment variables in settings + Screenshot of environment variables in settings
        Environment Variables in the Repository Settings
        diff --git a/user/private-dependencies.md b/user/private-dependencies.md index 50fbd9ebdd7..be2b0f79232 100644 --- a/user/private-dependencies.md +++ b/user/private-dependencies.md @@ -53,7 +53,7 @@ This way, a single key can access multiple repositories. To limit the list of re ### Using an existing key -[ ![Adding an SSH key via the web interface.](/images/settings-ssh-key.png) ](/images/settings-ssh-key.png){:.small}{:.right} +[ ![Adding an SSH key via the web interface.](/images/2019-07-settings-ssh-key.png) ](/images/2019-07-settings-ssh-key.png){:.small}{:.right} Assumptions: From 964e3e3463c2d4de72724908a283c78542dd14a8 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Tue, 30 Jul 2019 14:11:25 +0200 Subject: [PATCH 0132/1536] Language review of common-build-problem.md --- user/common-build-problems.md | 105 ++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 49 deletions(-) diff --git a/user/common-build-problems.md b/user/common-build-problems.md index 999183f1b23..e70cbabbb69 100644 --- a/user/common-build-problems.md +++ b/user/common-build-problems.md @@ -14,34 +14,35 @@ redirect_from: A very common cause when a test is suddenly breaking without any major code changes involved is a change in upstream dependencies. -This can be a Ubuntu package or any of your project's language dependencies, +This can be an Ubuntu package or any of your project's language dependencies, like RubyGems, NPM packages, Pip, Composer, etc. -To find out if this is the case, restart a build that used to be green, the last -known working one, for instance. If that build suddenly fails too, there's a -good chance, that a dependency was updated and is causing the breakage. +To find out if this is the case: +* Restart a build that used to be green, the last known working one, for instance. +If that build suddenly fails too, there's a good chance, that a dependency was +updated and is causing the breakage. -Make sure to check the list of dependencies in the build log, usually output -including versions, and see if there's anything that's changed. +* Check the list of dependencies in the build log, usually output +including versions and see, if there's anything that's changed. Sometimes, this can also be caused by an indirect dependency that was updated. -After figuring out which dependency was updated, lock it to the last known +* After figuring out which dependency was updated, lock it to the last known version. -Additionally, we update our build environment regularly, which brings in newer +* Additionally, we update our build environment regularly, which brings in newer versions of languages and the running services. ## My build script is killed without any error -Sometimes, you'll see a build script being causing an error, and the message in +Sometimes, you'll see a build script causing an error and the message in the log will be something like `Killed`. This is usually caused by the script or one of the programs it runs exhausting the memory available in the build sandbox, which is currently 3GB. Plus, there are two cores available, bursted. -Depending on the tool in use, this can be cause by a few things: +Depending on the tool in use, this can be caused by a few things: - Ruby test suite consuming too much memory - Tests running in parallel using too many processes or threads (e.g. using the @@ -49,10 +50,14 @@ Depending on the tool in use, this can be cause by a few things: - g++ needing too much memory to compile files, for instance with a lot of templates included. +### Parallel processes + For parallel processes running at the same time, try to reduce the number. More than two to four processes should be fine, beyond that, resources are likely to be exhausted. +### Ruby processes + With Ruby processes, check the memory consumption on your local machine, it's likely to show similar causes. It can be caused by memory leaks or by custom settings for the garbage collector, for instance to delay a sweep for as long as @@ -62,7 +67,7 @@ possible. Dialing these numbers down should help. One possible cause for builds failing unexpectedly can be calling `set -e` (also known as `set errexit`), either *directly in* your `.travis.yml`, or `source`ing a script which does. This causes any error causing a non-zero return status in your script to stop and fail the build immediately. -Note that using `set -e` in external scripts does not cause this problem, as the `errexit` is effective only in the external script. +> Note that using `set -e` in external scripts does not cause this problem, as the `errexit` is effective only in the external script. See also [Complex Build Steps](/user/customizing-the-build/#implementing-complex-build-steps). @@ -70,9 +75,11 @@ See also [Complex Build Steps](/user/customizing-the-build/#implementing-complex If your build is failing due to unexpected segmentation faults in the language interpreter, this may be caused by corrupt or invalid caches of your extension codes (gems, modules, etc). This can happen with any interpreted language, such as Ruby, Python, PHP, Node.js, etc. -Fix the problem by clearing the cache or removing the cache key from your .travis.yml (you can add it back in a subsequent commit). +Fix the problem by +* clearing the cache or +* removing the cache key from your .travis.yml (you can add it back in a subsequent commit). -## Ruby: RSpec returns 0 even though the build failed +## **Ruby**: RSpec returns 0 even though the build failed In some scenarios, when running `rake rspec` or even rspec directly, the command returns 0 even though the build failed. This is commonly due to some RubyGem @@ -98,9 +105,9 @@ end If your project is using the [Code Climate integration](/user/code-climate/) or Simplecov, this issue can also come up with the 0.8 branch of Simplecov. The fix -is downgrade to the last 0.7 release until the issue is fixed. +is to downgrade to the last 0.7 release until the issue is fixed. -## Capybara: I'm getting errors about elements not being found +## **Capybara**: I'm getting errors about elements not being found In scenarios that involve JavaScript, you can occasionally see errors that indicate that an element is missing, a button, a link, or some other resource @@ -128,7 +135,7 @@ If you're still seeing timeouts after increasing it initially, set it to something much higher for one test run. Should the error still persist, there's possibly a deeper issue on the page, for instance compiling the assets. -## Ruby: Installing the debugger_ruby-core-source library fails +## **Ruby**: Installing the debugger_ruby-core-source library fails This Ruby library unfortunately has a history of breaking with even patchlevel releases of Ruby. It's commonly a dependency of libraries like linecache or @@ -151,7 +158,7 @@ end bundler_args: --without development debug ``` -## Ruby: tests frozen and cancelled after 10 minute log silence +## **Ruby**: Tests frozen and cancelled after 10 minute log silence In some cases, the use of the `timecop` gem can result in seemingly sporadic "freezing" due to issues with ordering calls of `Timecop.return`, @@ -167,11 +174,11 @@ RSpec.configure do |c| end ``` -## Mac: macOS Mavericks (10.9) Code Signing Errors +## **Mac**: macOS Mavericks (10.9) Code Signing Errors -With Mavericks, quite a lot has changed in terms of code signing and the keychain application. +With Mavericks quite a lot has changed in terms of code signing and the keychain application. -Signs of issues can be errors messages stating that an identity can't be found and that "User +Signs of issues can be error messages stating that an identity can't be found and that "User interaction is not allowed." The keychain must be marked as the default keychain, must be unlocked explicitly and the build needs to make sure that the keychain isn't locked before the critical point in the build is reached. The following set of commands takes care @@ -188,11 +195,11 @@ security unlock-keychain -p travis $KEY_CHAIN security set-keychain-settings -t 3600 -u $KEY_CHAIN ``` -## Mac: macOS Sierra (10.12) Code Signing Errors +## **Mac**: macOS Sierra (10.12) Code Signing Errors With the introduction of macOS Sierra (10.12) on our infrastructure, we've seen build jobs that were hanging at the codesigning step of the build process. Here's some information on how to recognize this issue and fix it. -Your build is running on macOS Sierra (10.12) if the `osx_image` in your .travis.yml file is `xcode8.3` or higher. See [the macOS Build Environment documentation](https://docs.travis-ci.com/user/reference/osx/) to know which macOS version is associated with each image. +Your build is running on macOS Sierra (10.12), if the `osx_image` in your .travis.yml file is `xcode8.3` or higher. See [the macOS Build Environment documentation](https://docs.travis-ci.com/user/reference/osx/) to know which macOS version is associated with each image. The following lines in your build log possibly indicate an occurrence of this issue: @@ -299,7 +306,7 @@ import_certificate( You can also have more details in [this GitHub issue](https://github.com/travis-ci/travis-ci/issues/6791) starting at [this comment](https://github.com/travis-ci/travis-ci/issues/6791#issuecomment-261071904). -## Mac: Errors running CocoaPods +## **Mac**: Errors running CocoaPods CocoaPods usage can fail for a few reasons currently. @@ -340,7 +347,7 @@ rvm: 1.9.3 ``` {: data-file=".travis.yml"} -## System: Required language pack isn't installed +## **System**: Required language pack isn't installed The Travis CI build environments currently have only the en_US language pack installed. If you get an error similar to : "Error: unsupported locale @@ -355,10 +362,10 @@ before_install: ``` {: data-file=".travis.yml"} -The above addition will reinstall the en_US language pack, as well as the de_DE +The above addition will reinstall the en_US language pack as well as the de_DE language pack. -If you are running on the container-base infrastructure and don't have access +If you are running on the container-based infrastructure and don't have access to the `sudo` command, install locales [using the APT addon](/user/installing-dependencies/#installing-packages-with-the-apt-addon): ```yaml @@ -370,7 +377,7 @@ addons: ``` {: data-file=".travis.yml"} -## Linux: apt fails to install package with 404 error +## **Linux**: apt fails to install package with 404 error This is often caused by old package database and can be fixed by adding the following to `.travis.yml`: @@ -380,19 +387,19 @@ before_install: ``` {: data-file=".travis.yml"} -## Travis CI does not Preserve State Between Builds +## Travis CI does not preserve the state between builds Travis CI uses virtual machine snapshotting to make sure no state is preserved between -builds. If you modify CI environment by writing something to a data store, creating +builds. If you modify the CI environment by writing something to a data store, creating files or installing a package via apt, it does not affect subsequent builds. ## SSH is not working as expected Travis CI runs all commands over SSH in isolated virtual machines. Commands that -modify SSH session state are "sticky" and persist throughout the build. For example, +modify SSH session states are "sticky" and persist throughout the build. For example, if you `cd` into a directory, all subsequent commands are run from that directory. -## Git Submodules are not updated correctly +## Git submodules are not updated correctly Travis CI automatically initializes and updates submodules when there's a `.gitmodules` file in the root of the repository. @@ -404,7 +411,7 @@ git: ``` {: data-file=".travis.yml"} -If your project requires specific options for your Git submodules which Travis CI +If your project requires specific options for your Git submodules, which Travis CI does not support out of the box, turn off the automatic integration and use the `before_install` hook to initializes and update them. @@ -434,7 +441,7 @@ Otherwise, Travis CI builders won't be able to clone your project because they d ## My builds are timing out -Builds can unfortunately time out, either during installation of dependencies, or during the build itself, for instance because of a command that's taking a longer amount of time to run while not producing any output. +Builds can unfortunately time out, either during installation of dependencies or during the build itself, for instance because of a command that's taking a longer amount of time to run while not producing any output. Our builds have a global timeout and a timeout that's based on the output. If no output is received from a build for 10 minutes, it's assumed to have stalled for unknown reasons and is subsequently killed. @@ -459,8 +466,8 @@ bundler_args: --retry 5 #### travis_retry -For commands which do not have a built in retry feature, use the `travis_retry` -function to retry it up three times if the return code is non-zero: +For commands which do not have a built-in retry feature, use the `travis_retry` +function to retry it up to three times, if the return code is non-zero: ```bash install: travis_retry pip install myawesomepackage @@ -469,7 +476,7 @@ 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` does not work in the `deploy` step of the build, although it +> Note that `travis_retry` does not work in the `deploy` step of the build, although it does work in the [other steps](/user/job-lifecycle/). @@ -489,16 +496,16 @@ If you have a command that doesn't produce output for more than 10 minutes, you spawns a process running `mvn install`. `travis_wait` then writes a short line to the build log every minute for 20 minutes, extending the amount of time your command has to finish. -If you expect the command to take more than 20 minutes, prefix the command with `travis_wait n` where `n` is the number of minutes extend the waiting time by. +If you expect the command to take more than 20 minutes, prefix the command with `travis_wait n` where `n` is the number of minutes by which the waiting time is extended. -Continuing the example above, to extend the wait time to 30 minutes: +Continuing the example above to extend the waiting time to 30 minutes: ```yaml install: travis_wait 30 mvn install ``` {: data-file=".travis.yml"} -We recommend careful use of `travis_wait`, as overusing it can extend your build time when there could be a deeper underlying issue. When in doubt, [file a ticket](https://github.com/travis-ci/travis-ci/issues/new) or [email us](mailto:support@travis-ci.com) first to see if something could be improved about this particular command first. +> We recommend to carefully use `travis_wait`, as overusing it can extend your build time when there could be a deeper underlying issue. When in doubt, [file a ticket](https://github.com/travis-ci/travis-ci/issues/new) or [email us](mailto:support@travis-ci.com) first to see if something could be improved about this particular command first. #### Limitations of `travis_wait` @@ -509,14 +516,14 @@ If the command you pass to `travis_wait` does not persist, then `travis_wait` do ## Running builds in debug mode In private repositories and those public repositories for which the feature is enabled, -it is possible to run builds and jobs in the debug mode. +it is possible to run builds and jobs in debug mode. Using this feature, you can interact with the live VM where your builds run. For more information, please consult [the debug VM documentation](/user/running-build-in-debug-mode/). -## Log Length exceeded +## Log length exceeded -The log for each build is limited to approximately 4 Megabytes. When it reaches that length the build is terminated and you'll see the following message at the end of your build log: +The log for each build is limited to approximately 4 MB. When it reaches that length, the build is terminated and you'll see the following message at the end of your build log: ``` The log length has exceeded the limit of 4 Megabytes (this usually means that test suite is raising the same exception over and over). @@ -524,10 +531,10 @@ The log length has exceeded the limit of 4 Megabytes (this usually means that te The build has been terminated. ``` -## FTP/SMTP/other protocol does not work +## FTP/SMTP/other protocol do not work Some protocols such as FTP and SMTP are not directly supported due to the -infrastructure requirements in place for security and fair usage. Using +infrastructure requirements in place for security and fair usage. Using alternate stateless protocols such as HTTPS is best, but tunneling is also known to work, such as by using SFTP in the specific case of FTP, or a VPN connection for a wide variety of protocols, e.g.: @@ -550,7 +557,7 @@ The build request events that Travis CI receives are listed in your repository's ![More Options dropdown menu, choosing Requests](/images/common-build-problems/repository-requests-page.png) -Whenever your build has been processed you'll see the message: **"Build created successfully"**. +Whenever your build has been processed, you'll see the message: **"Build created successfully"**. If a build hasn't been triggered for your commit, these are the possible build request messages: @@ -569,17 +576,17 @@ Approximate available disk space is listed in the [build environment overview](/ The best way to find out what is available on your specific image is to run `df -h` as part of your build script. If you need a bit more space in your Ubuntu builds, we recommend using `language: minimal`, which will route you to a base image with less tools and languages preinstalled. This image has approximately ~24GB of free space. -## Uploading Artifacts to Sonatype +## Uploading artifacts to sonatype When publishing via the `nexus-staging-maven-plugin` to Sonatype OSS Repository, IP addresses used by TravisCI change due to our [NAT layer](https://blog.travis-ci.com/2018-07-23-the-tale-of-ftp-at-travis-ci). To get around this, please use a `stagingProfileId` as [explained in this document](https://travis-ci.community/t/sonatype-deployment-problems/1353/2?u=mzk). -## Travis CLI does not recognize my valid Github Token +## Travis CLI does not recognize my valid Github token When using the [Travis CLI tool](https://github.com/travis-ci/travis.rb#readme) to interact with the Travis CI platform, if you receive an `insufficient_oauth_permissions` error or similar, please ensure the Github Token supplied via `--github-token` has **repo** scope as [explained in this document](https://developer.github.com/apps/building-oauth-apps/understanding-scopes-for-oauth-apps/). -## Duplicate/Unknown Job shows up in my build +## Duplicate/Unknown job shows up in my build -When specifying stages, users often unknowingly add an implicit Job to the list of Jobs in a Stage using YAML that is otherwise syntactically correct. +When specifying stages, users often unknowingly add an implicit job to the list of jobs in a stage using YAML that is otherwise syntactically correct. ``` yaml language: c From d973ab7ef7d3e182e097b0d8663134b350045117 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 31 Jul 2019 10:42:28 +0200 Subject: [PATCH 0133/1536] Update user/build-stages.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/build-stages.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/build-stages.md b/user/build-stages.md index 9268b7b5d7f..3eacb884cb3 100644 --- a/user/build-stages.md +++ b/user/build-stages.md @@ -19,7 +19,7 @@ various runtime (Ruby or Node.js) versions in [parallel](/user/customizing-the-b And you want to release your gem or package **only** if all tests have passed and completed successfully. Build stages make this possible. -Of course, there are a lot more and a lot more complicated use cases than this +Of course, there are a lot more and a lot more elaborated use cases than this one. You can, for example, also use build stages to warm up dependency caches in a single job on a first stage, then use the cache on several jobs on a second stage. Or, you could generate a Docker image and push it first, then From 60d0cab266242667914e2dc07ec4fe5e4473c3e2 Mon Sep 17 00:00:00 2001 From: native-api Date: Wed, 31 Jul 2019 17:13:00 +0300 Subject: [PATCH 0134/1536] fix typo --- _data/snippets.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/snippets.yml b/_data/snippets.yml index 84291895eb2..f9bf5c76e08 100644 --- a/_data/snippets.yml +++ b/_data/snippets.yml @@ -38,7 +38,7 @@ unix_note: | > * [Precise](/user/reference/precise/) > * [Trusty](/user/reference/trusty/) > * [Xenial](/user/reference/xenial/) - > * [Bionic](/user/reference/bionic/ + > * [Bionic](/user/reference/bionic/) > * [macOS](/user/reference/osx/) linux_note: | > Language versions and other build-environment specific From 0099bab2f15c6dcecf796e2069f47134ab73a058 Mon Sep 17 00:00:00 2001 From: Hiro Asari Date: Wed, 31 Jul 2019 10:31:44 -0400 Subject: [PATCH 0135/1536] Tweak wording on cache expiration We are running public repositories on travis-ci.com now, so we need to be accurate. --- user/caching.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/user/caching.md b/user/caching.md index 38809462f9d..7e2ddc7bebc 100644 --- a/user/caching.md +++ b/user/caching.md @@ -338,7 +338,9 @@ Use one of the following ways to access your cache and delete it if necessary: ### Caches expiration -Cache archives are currently set to expire after 28 days for open source projects and 45 days for private projects. This means a specific cache archive will be deleted if it wasn't changed after its expiration delay. +Cache archives are currently set to expire after 28 days for repositories on https://travis-ci.org and +45 days for those on https://travis-ci.com. +This means a specific cache archive will be deleted if it wasn't changed after its expiration delay. ## Configuration From 4b0d7d9409bf171b377ecbc2e2f5ca03a837fbc4 Mon Sep 17 00:00:00 2001 From: Jesse Donat Date: Wed, 31 Jul 2019 10:47:05 -0500 Subject: [PATCH 0136/1536] Note PHP 5.4 and 5.5 now require Precise (#2432) * Note PHP 5.4 and 5.5 now require Precise * Reword to note Xenial PHP versions. --- user/languages/php.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/user/languages/php.md b/user/languages/php.md index f1ac4395d6f..570555218a2 100644 --- a/user/languages/php.md +++ b/user/languages/php.md @@ -62,12 +62,17 @@ php: ``` {: data-file=".travis.yml"} -### PHP 5.2(.x) and 5.3(.x) support is available on Precise only +### PHP 5.2(.x) - 5.3(.x) support is available on Precise only -We do not support these versions on Trusty. +We do not support these versions on Trusty or Xenial. If you need to test them, please use Precise. See [this page](/user/reference/trusty#php-images) for more information. +### PHP 5.4(.x) - 5.5(.x) support is available on Precise and Trusty only + +We do not support these versions on Xenial. +If you need to test them, please use Precise or Trusty. +See [this page](/user/reference/xenial#php-images) for more information. ### HHVM versions are available on Trusty only From b7e4a81863741cb12c7a17a146d1d74c6e2af681 Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Wed, 31 Jul 2019 13:55:01 -0400 Subject: [PATCH 0137/1536] Add note about `ant`'s availability on Xenial --- user/languages/java.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/user/languages/java.md b/user/languages/java.md index 576e374ac32..9f2a3e3145c 100644 --- a/user/languages/java.md +++ b/user/languages/java.md @@ -162,6 +162,20 @@ ant test To use a different `script` command, customize the [build step](/user/job-lifecycle/#customizing-the-build-phase). +### Using Ant on Ubuntu Xenial (16.04) + +Unfortunately, `ant` currently doesn't come pre-installed on our Xenial image. You'll need to install it manually by adding the following recipe to your .travis.yml file: + +```yaml +dist: xenial +language: java +addons: + apt: + packages: + ant +``` +{: data-file=".travis.yml"} + ## Testing Against Multiple JDKs To test against multiple JDKs, use the `jdk:` key in `.travis.yml`. For example, From be8c73a313e74017fa0ec18e82884ff0478cae75 Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Wed, 31 Jul 2019 15:21:54 -0400 Subject: [PATCH 0138/1536] Fixed apt addons syntax --- user/languages/java.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/java.md b/user/languages/java.md index 9f2a3e3145c..0ff4cf0fef2 100644 --- a/user/languages/java.md +++ b/user/languages/java.md @@ -172,7 +172,7 @@ language: java addons: apt: packages: - ant + - ant ``` {: data-file=".travis.yml"} From 6be6853aa694117565b2d0dc261fec79e00d2e96 Mon Sep 17 00:00:00 2001 From: ssabrii <45571047+ssabrii@users.noreply.github.com> Date: Thu, 1 Aug 2019 15:59:43 -0400 Subject: [PATCH 0139/1536] Add workaround if debug vm crashes --- user/running-build-in-debug-mode.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/user/running-build-in-debug-mode.md b/user/running-build-in-debug-mode.md index a3e2b5b07c4..34e96d6e382 100644 --- a/user/running-build-in-debug-mode.md +++ b/user/running-build-in-debug-mode.md @@ -208,6 +208,21 @@ Once you exit from all the live `tmate` windows, the debug VM will terminate after resetting the job's status to the original status before you restarted it. No more phases (`before_install`, `install`, etc.) will be executed. +## If the debug VM crashes when running one of the `travis_run_*` functions + +If your debug build crashes when running any of the specified commands, we suggest narrowing down +the issue as follows: + +1- First establish which `travis_run_*` command is failing. + e.g. `travis_run_before_install` crashes the debug VM + +2- Run commands one by one within the phase, e.g. `travis_run_before_install` to find the command + that crashes the debug VM + +3- Make appropriate changes to the command that crashes the debug VM + +If you have any questions or concerns, don't hesitate to contact support@travis-ci.com. + ## Known issues ### In a Node.js debug session, the `node` and `npm` versions differ from what is defined in the configuration From 5bca1088b96d3d74e0d80173e8533733ab1b46ea Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Fri, 2 Aug 2019 07:47:16 -0400 Subject: [PATCH 0140/1536] Moved debug VM crash section in "Known issues" Also made some editorial changes. --- user/running-build-in-debug-mode.md | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/user/running-build-in-debug-mode.md b/user/running-build-in-debug-mode.md index 34e96d6e382..196c878c80d 100644 --- a/user/running-build-in-debug-mode.md +++ b/user/running-build-in-debug-mode.md @@ -208,21 +208,6 @@ Once you exit from all the live `tmate` windows, the debug VM will terminate after resetting the job's status to the original status before you restarted it. No more phases (`before_install`, `install`, etc.) will be executed. -## If the debug VM crashes when running one of the `travis_run_*` functions - -If your debug build crashes when running any of the specified commands, we suggest narrowing down -the issue as follows: - -1- First establish which `travis_run_*` command is failing. - e.g. `travis_run_before_install` crashes the debug VM - -2- Run commands one by one within the phase, e.g. `travis_run_before_install` to find the command - that crashes the debug VM - -3- Make appropriate changes to the command that crashes the debug VM - -If you have any questions or concerns, don't hesitate to contact support@travis-ci.com. - ## Known issues ### In a Node.js debug session, the `node` and `npm` versions differ from what is defined in the configuration @@ -234,3 +219,15 @@ executing any other command: ``` nvm install $TRAVIS_NODE_VERSION ``` +### If the debug VM crashes when running one of the `travis_run_*` functions + +If your debug build crashes when running any of the specified commands, we suggest narrowing down +the issue as follows: + +1- First establish which `travis_run_*` command is failing e.g. `travis_run_before_install` crashes the debug VM. + +2- Run commands one by one within the phase to find the command that crashes the debug VM e.g. if `travis_run_before_install` crashes, run the commands from in the `before_install:` phase one by one. + +3- Make appropriate changes to the command that crashes the debug VM. + +If you have any questions or concerns, don't hesitate to contact support@travis-ci.com. From d3e45f192865160b3c90cdfd996ce8ff716c24b6 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Mon, 5 Aug 2019 10:40:59 +0200 Subject: [PATCH 0141/1536] Update conditional-builds-stages-jobs.md --- user/conditional-builds-stages-jobs.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/user/conditional-builds-stages-jobs.md b/user/conditional-builds-stages-jobs.md index f5d9d4ebc04..8fce225fa76 100644 --- a/user/conditional-builds-stages-jobs.md +++ b/user/conditional-builds-stages-jobs.md @@ -1,15 +1,15 @@ --- -title: Conditional Builds, Stages, and Jobs +title: Conditional Builds, Stages and Jobs layout: en --- -You can filter out, and reject builds, stages, and jobs by specifying conditions in your build configuration (your `.travis.yml` file). +You can filter out and reject builds, stages and jobs by specifying conditions in your build configuration (your `.travis.yml` file). ## Conditional Builds -Configure Travis CI to only trigger builds when certain conditions are met, such as only building the master branch. Any potential builds that do not meet these conditions are listed in the Requests tab of your repository, even though the actual build is not generated. +Configure Travis CI to only trigger builds when certain conditions are met, such as only building the master branch. Any potential builds that do not meet these conditions are listed in the *Requests* tab of your repository, even though the actual build is not generated. ```yaml # require the branch name to be master (note for PRs this is the base branch name) @@ -17,7 +17,7 @@ if: branch = master ``` {: data-file=".travis.yml"} -Build requests that do not match the condition will not generate a build, but will be listed on the Requests tab. +Build requests that do not match the condition will not generate a build, but will be listed on the *Requests* tab. ## Conditional Stages From 5c6c7cc221836ed5d3f1ffd6afe63277722c23be Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Mon, 5 Aug 2019 12:44:22 +0200 Subject: [PATCH 0142/1536] Update speeding-up-the-build.md --- user/speeding-up-the-build.md | 42 +++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/user/speeding-up-the-build.md b/user/speeding-up-the-build.md index 6647e332c7a..6f6b50735ff 100644 --- a/user/speeding-up-the-build.md +++ b/user/speeding-up-the-build.md @@ -9,8 +9,7 @@ like in memory filesystem for DB's files, but there is a range of things that can be done to improve build times even more. - -## Parallelizing your builds across virtual machines +## Parallelizing your Builds across Virtual Machines To speed up a test suite, you can break it up into several parts using Travis CI's [build @@ -45,7 +44,7 @@ The neat part about this setup is that the unit test suite is usually going to be done before the integration test suite, giving you a faster visual feedback on the basic test coverage. -Depending on the size and complexity of your test suite you can split it up even +Depending on the size and complexity of your test suite, you can split it up even further. You could separate different concerns for integration tests into different subfolders and run them in separate stages of a build matrix. @@ -66,27 +65,27 @@ script: "bundle exec rspec $TESTFOLDER" {: data-file=".travis.yml"} For instance, the Rails project uses the build matrix feature to create separate -jobs for every database to test against, and also to split up the tests by +jobs for every database to test against and also to split up the tests by concern. One set runs tests only for the railties, another one for actionpack, -actionmailer, activesupport, and a whole bunch of sets runs the activerecord +actionmailer, activesupport and a whole bunch of sets run the activerecord tests against multiple databases. See their [.travis.yml file](https://github.com/rails/rails/blob/master/.travis.yml) for more examples. -## Parallelizing your build on one virtual machine +## Parallelizing your Build on One Virtual Machine Parallelizing the test suite on one virtual machine depends on the language and test runner: - For Ruby and RSpec use the [parallel_tests](https://github.com/grosser/parallel_tests) -- For Java, use the built in feature [to run tests in parallel +- For Java, use the built-in feature [to run tests in parallel using JUnit](http://incodewetrustinc.blogspot.com/2009/07/run-your-junit-tests-in-parallel-with.html). -To give you an idea of the speedup are we talking about, I've tried running tests in parallel on `travis-core` and I was able to see a drop from about 26 minutes to about 19 minutes across 4 jobs. +To give you an idea of the speedup we are talking about, I've tried to run tests in parallel on `travis-core` and I was able to see a drop from about 26 minutes to about 19 minutes across 4 jobs. -## Parallelizing RSpec, Cucumber and Minitest on multiple VMs +## Parallelizing RSpec, Cucumber and Minitest on Multiple VMs -If you want to parallel tests for RSpec, Cucumber or Minitest on multiple VMs to get faster feedback from CI then you can try [knapsack](https://github.com/ArturT/knapsack) gem. It will split tests across virtual machines and make sure that tests will run comparable time on each VM (each job will take similar time). You can use our matrix feature to set up knapsack. +If you want to parallel tests for RSpec, Cucumber or Minitest on multiple VMs to get faster feedback from CI, you can try [knapsack](https://github.com/ArturT/knapsack) gem. It will split tests across virtual machines and make sure that tests will run a comparable time on each VM (each job will take similar time). You can use our matrix feature to set up knapsack. -### RSpec parallelization example +### RSpec Parallelization example ```yaml script: "bundle exec rake knapsack:rspec" @@ -100,14 +99,14 @@ env: ``` {: data-file=".travis.yml"} -Such configuration will generate matrix with 2 following ENV rows: +Such configuration will generate a matrix with the 2 following ENV rows: ``` MY_GLOBAL_VAR=123 CI_NODE_TOTAL=2 CI_NODE_INDEX=0 MY_GLOBAL_VAR=123 CI_NODE_TOTAL=2 CI_NODE_INDEX=1 ``` -### Cucumber parallelization example +### Cucumber Parallelization example ```yaml script: "bundle exec rake knapsack:cucumber" @@ -120,7 +119,7 @@ env: ``` {: data-file=".travis.yml"} -### Minitest parallelization example +### Minitest Parallelization example ```yaml script: "bundle exec rake knapsack:minitest" @@ -133,9 +132,9 @@ env: ``` {: data-file=".travis.yml"} -### RSpec, Cucumber and Minitest parallelization example +### RSpec, Cucumber and Minitest Parallelization example -If you want to parallelize test suite for RSpec, Cucumber and Minitest at the same time then define script in `.travis.yml` this way: +If you want to parallelize a test suite for RSpec, Cucumber and Minitest at the same time, define script in `.travis.yml` as follows: ```yaml script: @@ -147,7 +146,7 @@ script: You can find more examples in [knapsack docs](https://github.com/ArturT/knapsack#info-for-travis-users). -## Caching the dependencies +## Caching the Dependencies Installing the dependencies for a project can take quite some time for bigger projects. In order to make it faster, you may try caching the dependencies. @@ -156,16 +155,16 @@ You can either use our [built-in caching](/user/caching/) or roll your own on S3 want to roll your own and you use Ruby with Bundler, check out [the great WAD project](https://github.com/Fingertips/WAD). For other languages, you can use s3 tools directly to upload and download the dependencies. -## Environment-specific ways to speed up your build +## Environment-Specific Ways to Speed up your Build In addition to the optimizations implemented by Travis, there are also -several environment-specific ways you may consider increasing the speed of +several environment-specific ways you may consider to increase the speed of your tests. ### PHP optimizations PHP VM images on Travis CI provide several PHP versions which include -XDebug. The XDebug extension is useful if you wish to generate code coverage +XDebug. The XDebug extension is useful, if you wish to generate code coverage reports in your Travis builds, but it has been shown to have a negative effect upon performance. @@ -198,7 +197,8 @@ See [Virtualization environments](/user/reference/overview/#virtualization-environments) to determine how many CPUs an environment normally has and set the `make` job parameter to a similar number (or slightly higher if your build frequently waits on disk I/O). -Note that doing this will cause concurrent recipe output to become interleaved. + +> Note that doing this will cause concurrent recipe output to become interleaved. #### Makefile parallelization example From 1e8dc99862a72cbbc08d172fe2586fbdfc98953a Mon Sep 17 00:00:00 2001 From: Logan Kilpatrick Date: Mon, 5 Aug 2019 20:07:43 -0700 Subject: [PATCH 0143/1536] Update julia.md Made an update so that those looking for other support resources know where to find it. --- user/languages/julia.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user/languages/julia.md b/user/languages/julia.md index b12644e3231..f51a34fae74 100644 --- a/user/languages/julia.md +++ b/user/languages/julia.md @@ -18,6 +18,8 @@ or altered at any time. If you run into any problems, please report them in the [Travis CI issue tracker](https://github.com/travis-ci/travis-ci/issues/new?labels=julia) and cc [@ararslan](https://github.com/ararslan), [@staticfloat](https://github.com/staticfloat), and [@StefanKarpinski](https://github.com/StefanKarpinski). +Support for Julia on TravisCI can be found on [Travis Community](https://travis-ci.community/c/languages/julia) or on the [Julia Lang Slack Channel](https://julialang.slack.com) under the __#testing__ channel. + ## Choosing Julia versions to test against Julia workers on Travis CI download and install a binary of Julia. You can specify From e8f88f629dbe43fb5b2cccc3fc360924dd3a3146 Mon Sep 17 00:00:00 2001 From: Floris Vanderhaeghe Date: Tue, 6 Aug 2019 15:02:15 +0200 Subject: [PATCH 0144/1536] Precise & Trusty are versions of Ubuntu --- 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 14858516e6b..753103bc03c 100644 --- a/user/languages/r.md +++ b/user/languages/r.md @@ -39,7 +39,7 @@ Travis CI supports a number of configuration options for your R package. ### R Versions -Travis CI supports R versions `3.0.3` and above on Linux Precise, Trusty and macOS. +Travis CI supports R versions `3.0.3` and above on Ubuntu Precise, Ubuntu Trusty and macOS. Aliases exist for each major release, e.g `3.1` points to `3.1.3`. In addition the name `oldrel` is aliased to the previous major release and `release` is aliased to the latest minor release. `devel` is built off of the [R git mirror](https://travis-ci.org/wch/r-source) From bfd8a27505aa67bb2a9780ef4f2252596189a32d Mon Sep 17 00:00:00 2001 From: Logan Kilpatrick Date: Tue, 6 Aug 2019 20:38:16 -0700 Subject: [PATCH 0145/1536] Update julia.md --- user/languages/julia.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/languages/julia.md b/user/languages/julia.md index f51a34fae74..e18ccbd87a3 100644 --- a/user/languages/julia.md +++ b/user/languages/julia.md @@ -15,10 +15,10 @@ This guide covers build environment and configuration topics specific to Travis CI support for Julia is contributed by the community and may be removed or altered at any time. If you run into any problems, please report them in the -[Travis CI issue tracker](https://github.com/travis-ci/travis-ci/issues/new?labels=julia) +[Travis CI Julia Community Forums](https://travis-ci.community/c/languages/julia) and cc [@ararslan](https://github.com/ararslan), [@staticfloat](https://github.com/staticfloat), and [@StefanKarpinski](https://github.com/StefanKarpinski). -Support for Julia on TravisCI can be found on [Travis Community](https://travis-ci.community/c/languages/julia) or on the [Julia Lang Slack Channel](https://julialang.slack.com) under the __#testing__ channel. +General support for Julia on Travis CI can be found on [Travis Community](https://travis-ci.community/c/languages/julia) or on the [Julia Lang Slack Channel](https://julialang.slack.com) under the __#testing__ channel. ## Choosing Julia versions to test against From 427792a951b256fd532809c894d28131ce0c31ca Mon Sep 17 00:00:00 2001 From: Logan Kilpatrick Date: Tue, 6 Aug 2019 20:39:34 -0700 Subject: [PATCH 0146/1536] Update julia.md --- user/languages/julia.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/julia.md b/user/languages/julia.md index e18ccbd87a3..a5023494e85 100644 --- a/user/languages/julia.md +++ b/user/languages/julia.md @@ -94,7 +94,7 @@ to manually install any dependencies that are not handled by `deps/build.jl`, it is possible to specify a custom dependency installation command as described in the [general build configuration](/user/customizing-the-build/) guide. -In a rare case, you may need to clone a private repo if it is a depenedancy of the repo you are trying to test. To add a private repo, check out the link here: [Private Dependencies](/user/private-dependencies/). Once you have the repo added, you will need to copy it to your julia folder and then run the default build script. Check out the script below to see how that is done: +In a rare case, you may need to clone a private repo if it is a depenedancy of the repo you are trying to test. To add a private repo, check out the link here: [Private Dependencies](/user/private-dependencies/). Once you have the repo added, you will need to copy it to your julia folder and then run the default build script. Check out the script below for __Linux__ to see how that is done: ``` script: From 0a7b6bd831841ecb5816ce6a31fae1c197988cd4 Mon Sep 17 00:00:00 2001 From: dknty11 <34019740+dknty11@users.noreply.github.com> Date: Wed, 7 Aug 2019 15:36:28 +0700 Subject: [PATCH 0147/1536] Update surge.md --- user/deployment/surge.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/deployment/surge.md b/user/deployment/surge.md index e07245a8d67..acfa202ec23 100644 --- a/user/deployment/surge.md +++ b/user/deployment/surge.md @@ -54,7 +54,8 @@ By default, Travis CI will only deploy from your `master` branch. You can specif ```yaml deploy: ... - on: myProductionBranch + on: + branch: myProductionBranch ``` {: data-file=".travis.yml"} From f7b6f3d5fcbc31afab2157182919af4966d5f130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20de=20Ant=C3=B3n?= Date: Wed, 7 Aug 2019 13:31:06 +0200 Subject: [PATCH 0148/1536] Update the instructions to see a preview --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f2ca9519a8f..84537e622b2 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Once you're done with your changes send a pull request. Thanks! ## How to check your edit before sending PR -You can inspect how your edits will be reflected by the documentation site. +You can inspect how your edits will be reflected by the documentation site. Either by clicking on the Netlify preview link in your Pull Request or building the docs locally. ### Install dependencies From 87d516b198d108bed97406e61176daba0640b135 Mon Sep 17 00:00:00 2001 From: nodanaonlyzuul Date: Wed, 7 Aug 2019 10:03:08 -0400 Subject: [PATCH 0149/1536] Add missing word and '.' I believe this sentence was intended to be either "use the parallel_tests gem." or "use parallel_tests." --- user/speeding-up-the-build.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/speeding-up-the-build.md b/user/speeding-up-the-build.md index 6f6b50735ff..288a470bce6 100644 --- a/user/speeding-up-the-build.md +++ b/user/speeding-up-the-build.md @@ -75,7 +75,7 @@ file](https://github.com/rails/rails/blob/master/.travis.yml) for more examples. Parallelizing the test suite on one virtual machine depends on the language and test runner: -- For Ruby and RSpec use the [parallel_tests](https://github.com/grosser/parallel_tests) +- For Ruby and RSpec use the [parallel_tests](https://github.com/grosser/parallel_tests) gem. - For Java, use the built-in feature [to run tests in parallel using JUnit](http://incodewetrustinc.blogspot.com/2009/07/run-your-junit-tests-in-parallel-with.html). From 2c3a68f1cce0902a895ffc7ac7704f974a3058af Mon Sep 17 00:00:00 2001 From: Prokop Simek Date: Wed, 7 Aug 2019 16:29:22 +0200 Subject: [PATCH 0150/1536] remove confusing example with 2 blank spaces In favor of another example --- user/build-matrix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/build-matrix.md b/user/build-matrix.md index 17fd49652b3..9df00a99823 100644 --- a/user/build-matrix.md +++ b/user/build-matrix.md @@ -148,7 +148,7 @@ env: matrix: exclude: - rvm: 1.9.3 - env: DB=mongodb SUITE=all # not 'env: DB=mongodb SUITE=all' or 'env: SUITE=all DB=mongodb' + env: DB=mongodb SUITE=all # not 'env: DB=mongodb' or 'env: SUITE=all DB=mongodb' - rvm: 1.9.3 env: DB=mongodb SUITE=compact # not 'env: SUITE=compact DB=mongodb' ``` From bd0960fec458b47431d661f74c9049cf765722ec Mon Sep 17 00:00:00 2001 From: Muizudeen Kusimo Date: Wed, 7 Aug 2019 09:57:27 -0700 Subject: [PATCH 0151/1536] Update reference to Xenial as default --- user/reference/overview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/reference/overview.md b/user/reference/overview.md index cd7ef1e6d00..dbe1f3e0258 100644 --- a/user/reference/overview.md +++ b/user/reference/overview.md @@ -20,8 +20,8 @@ Each build runs in one of the following virtual environments. A sudo enabled, full virtual machine per build, that runs Linux, one of: * [Ubuntu Bionic 18.04](/user/reference/bionic/) -* [Ubuntu Xenial 16.04](/user/reference/xenial/) -* [Ubuntu Trusty 14.04](/user/reference/trusty/) **default** +* [Ubuntu Xenial 16.04](/user/reference/xenial/) **default** +* [Ubuntu Trusty 14.04](/user/reference/trusty/) * [Ubuntu Precise 12.04](/user/reference/precise/) ### macOS From 628239650bf881f8a0cef2689a575f295b734479 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Thu, 8 Aug 2019 11:04:13 +0200 Subject: [PATCH 0152/1536] Create trusty-to-xenial-migration-guide.md --- trusty-to-xenial-migration-guide.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 trusty-to-xenial-migration-guide.md diff --git a/trusty-to-xenial-migration-guide.md b/trusty-to-xenial-migration-guide.md new file mode 100644 index 00000000000..723362cceb5 --- /dev/null +++ b/trusty-to-xenial-migration-guide.md @@ -0,0 +1,10 @@ +--- +title: Ubuntu Trusty to Ubuntu Xenial Migration Guide +layout: en +--- + +As of xxx, we're switching the default Linux distribution on Travis CI from Ubuntu Trusty 14.04 LTS to +Ubuntu Xenial 16.04. Here are the most common issues our customers ran into and how you can fix them. + +> If you’d like to stay on Ubuntu Trusty or need more time to set up your repository with Ubuntu Trusty, +please explicitly set `dist: trusty` in your .travis.yml file as soon as possible. From 922894abd540f9bf88041dfc0aa087ccd39613c9 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Thu, 8 Aug 2019 11:24:12 +0200 Subject: [PATCH 0153/1536] added screenshot --- images/2019-04-15-xenial-build-log.png | Bin 0 -> 27281 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/2019-04-15-xenial-build-log.png diff --git a/images/2019-04-15-xenial-build-log.png b/images/2019-04-15-xenial-build-log.png new file mode 100644 index 0000000000000000000000000000000000000000..51b99648a5081ae56a465f2900304fd159fcbe8e GIT binary patch literal 27281 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 literal 0 HcmV?d00001 From dd7c6762a817a330bf2dd2709cd57532b5536ead Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Thu, 8 Aug 2019 11:25:17 +0200 Subject: [PATCH 0154/1536] added more details for xenial from blog post --- trusty-to-xenial-migration-guide.md | 63 ++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/trusty-to-xenial-migration-guide.md b/trusty-to-xenial-migration-guide.md index 723362cceb5..ce181bc749f 100644 --- a/trusty-to-xenial-migration-guide.md +++ b/trusty-to-xenial-migration-guide.md @@ -3,8 +3,69 @@ title: Ubuntu Trusty to Ubuntu Xenial Migration Guide layout: en --- -As of xxx, we're switching the default Linux distribution on Travis CI from Ubuntu Trusty 14.04 LTS to +As of August, 13th 2019, we're switching the default Linux distribution on Travis CI from Ubuntu Trusty 14.04 LTS to Ubuntu Xenial 16.04. Here are the most common issues our customers ran into and how you can fix them. > If you’d like to stay on Ubuntu Trusty or need more time to set up your repository with Ubuntu Trusty, please explicitly set `dist: trusty` in your .travis.yml file as soon as possible. + +## What does this mean for your projects? + +Repositories without an explicit `dist: YAML` key in their `.travis.yml` file will be routed to Xenial instead of Trusty. + +Repositories without an explicit operating system `os:` key in their `travis.yml` file will use Linux Ubuntu Xenial 16.04. + +There are three important changes to take into account when updating to Xenial from our Trusty build environment: + +### 1. Services support + +Services like [MySQL or PostgreSQL](https://docs.travis-ci.com/user/database-setup/) are not started by default. To start any service, such as MySQL, add it to the services key in your config: + +``` + services: + - mysql +``` + +### 2. Third-party APT sources + +Sources from third-party APT repositories have been removed. During the Xenial image provision, third-party APT repositories are used to pre-install services like `redis-server`. These packages are available during build time, but to reduce the risk of sporadic `apt-get update` failures, the repositories are removed after the packages are installed. + +For example, to update the `git-lfs` version, you’d need to explicitly specify the source in your config: + +You can find the full list of sources and packages that have been used and to install and then removed [here](https://docs.travis-ci.com/user/reference/xenial#third-party-apt-repositories-removed). + +``` +addons: + apt: + sources: + - github-git-lfs-xenial + packages: + - git-lfs +``` + +### 3. Headless browser testing + +To use headless browser testing, you now start `xvfb` via the services key, like this: + +``` +services: + - xvfb +``` + +> If you had configured `xvfb` manually in your trusty builds, please replace it with the services key above, which is also easier to maintain! + +## To recap! + +The default build environment will gradually start changing on April, 23rd 2019. You can identify if your repository is now running on Xenial by checking your build log, under Operating System Details like: + +![OS details](/images/2019-04-15-xenial-build-log.png) + +Jobs run on Xenial, display Operating System Details, Description: Ubuntu 16.04.5 LTS +You can find the specific versions of what’s pre-installed in the Xenial Reference docs. + +> If your build depends on Ubuntu Trusty 14.04, you can explicitly specify `dist: trusty` to avoid your build being automatically routed to Xenial during this default build environment update. + + +## Need Help? + +Please feel free to contact us via our [support](mailto:support@travis-ci.com?subject=Issues%20migrating%20my%20build%20to%20Trusty) email address, or create a [GitHub issue](https://github.com/travis-ci/travis-ci/issues/new). From 900c93ace8ad86d428ca0e52343e81bfb8b8bb8c Mon Sep 17 00:00:00 2001 From: Daniel Hegeman Date: Thu, 8 Aug 2019 14:12:03 -0700 Subject: [PATCH 0155/1536] Type in 'escaping certain symbols' example The string being encrypted had a `B` where there should have been a `b` --- 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 b638abb3129..29f0e4ba7fe 100644 --- a/user/encryption-keys.md +++ b/user/encryption-keys.md @@ -157,7 +157,7 @@ travis encrypt "FOO=6\\&a\\(5\\!1Ab\\\\" Equivalently, you can do ```bash -travis encrypt 'FOO=6\&a\(5\!1AB\\' +travis encrypt 'FOO=6\&a\(5\!1Ab\\' ``` ### Notifications Example From fdc61acc74357cbc9a14724fcbe90609d21f2db0 Mon Sep 17 00:00:00 2001 From: Logan Kilpatrick Date: Thu, 8 Aug 2019 16:45:22 -0700 Subject: [PATCH 0156/1536] Update user/languages/julia.md Co-Authored-By: Pezi777 <52408528+Pezi777@users.noreply.github.com> --- user/languages/julia.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/julia.md b/user/languages/julia.md index a5023494e85..f062dd11bf4 100644 --- a/user/languages/julia.md +++ b/user/languages/julia.md @@ -18,7 +18,7 @@ or altered at any time. If you run into any problems, please report them in the [Travis CI Julia Community Forums](https://travis-ci.community/c/languages/julia) and cc [@ararslan](https://github.com/ararslan), [@staticfloat](https://github.com/staticfloat), and [@StefanKarpinski](https://github.com/StefanKarpinski). -General support for Julia on Travis CI can be found on [Travis Community](https://travis-ci.community/c/languages/julia) or on the [Julia Lang Slack Channel](https://julialang.slack.com) under the __#testing__ channel. +For general Julia support on Travis CI go to the [Travis Community](https://travis-ci.community/c/languages/julia) or [Julia Lang Slack Channel](https://julialang.slack.com) in the __#testing__ channel. ## Choosing Julia versions to test against From eb78ae0fa453da30577c7f64cd56525554955870 Mon Sep 17 00:00:00 2001 From: Sidney Liebrand Date: Fri, 9 Aug 2019 21:51:55 +0200 Subject: [PATCH 0157/1536] Remove quotes from NodeJS version example While setting up my first JS project using TravisCI (https://travis-ci.org/SidOfc/babel-plugin-transform-media-imports) my project was identified as a Ruby project while I had specifically set `language: node_js` and some versions, each enclosed by strings: ```yml node_js: - "12.0.0" - "11.0.0" ``` To fix the issue I had to remove the quotes: node_js: - 12.0.0 - 11.0.0 ``` --- user/languages/javascript-with-nodejs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/javascript-with-nodejs.md b/user/languages/javascript-with-nodejs.md index 5b52261721b..6c2ce2216cc 100644 --- a/user/languages/javascript-with-nodejs.md +++ b/user/languages/javascript-with-nodejs.md @@ -46,7 +46,7 @@ releases in your `.travis.yml`: ```yaml language: node_js node_js: - - "7" + - 7 ``` {: data-file=".travis.yml"} From 57cf219e8e39b1e242ae843089b26b3e9512f2e1 Mon Sep 17 00:00:00 2001 From: Logan Kilpatrick Date: Mon, 12 Aug 2019 07:42:23 -0700 Subject: [PATCH 0158/1536] Update julia.md Fixed a spelling mistake! --- user/languages/julia.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/julia.md b/user/languages/julia.md index f062dd11bf4..eca3e17475e 100644 --- a/user/languages/julia.md +++ b/user/languages/julia.md @@ -94,7 +94,7 @@ to manually install any dependencies that are not handled by `deps/build.jl`, it is possible to specify a custom dependency installation command as described in the [general build configuration](/user/customizing-the-build/) guide. -In a rare case, you may need to clone a private repo if it is a depenedancy of the repo you are trying to test. To add a private repo, check out the link here: [Private Dependencies](/user/private-dependencies/). Once you have the repo added, you will need to copy it to your julia folder and then run the default build script. Check out the script below for __Linux__ to see how that is done: +In a rare case, you may need to clone a private repo if it is a dependency of the repo you are trying to test. To add a private repo, check out the link here: [Private Dependencies](/user/private-dependencies/). Once you have the repo added, you will need to copy it to your julia folder and then run the default build script. Check out the script below for __Linux__ to see how that is done: ``` script: From 8e649398aed002b849972a81926d841626bffcc0 Mon Sep 17 00:00:00 2001 From: ssabrii <45571047+ssabrii@users.noreply.github.com> Date: Mon, 12 Aug 2019 10:44:38 -0400 Subject: [PATCH 0159/1536] Update xenial.md with Perl info --- user/reference/xenial.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user/reference/xenial.md b/user/reference/xenial.md index 1012971df18..f9efbe4d26e 100644 --- a/user/reference/xenial.md +++ b/user/reference/xenial.md @@ -140,6 +140,10 @@ is `openjdk8`; `openjdk7` and `openjdk8` on ppc64le. | groovy | 2.4.5 | {: style="width: 30%" } +## Perl support +* Default version on Xenial is `5.22` +* Supported versions `5.22`, `5.24`, `5.26`, `5.28` and `5.30` can be installed by using the `perl:`-key. + ## PHP support * For dynamic runtime selection, `phpenv` is available. From 47e0cf9333818c6fac9d2b344d3b9ac3087c63ca Mon Sep 17 00:00:00 2001 From: Zhengpeng Hou Date: Wed, 14 Aug 2019 00:01:58 +0800 Subject: [PATCH 0160/1536] xcode10.3 support --- _data/xcodes.yml | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/_data/xcodes.yml b/_data/xcodes.yml index 05aaec781e6..5c7ccb792c6 100644 --- a/_data/xcodes.yml +++ b/_data/xcodes.yml @@ -40,6 +40,49 @@ osx_images: - watchOS 5.1 - watchOS 6.0 jdk: "12.0.1" + - image: xcode10.3 + xcode: "10.3" + osx_version: "10.14.4" + xcode_full_version: "10.3" + xcode_build_version: "18E226" + image_publish_date: 2019-08-10 + sdks: + - macosx10.14 + - iphoneos12.4 + - iphonesimulator12.4 + - appletvos12.4 + - appletvsimulator12.4 + - watchos5.3 + - watchsimulator5.3 + simulators: + - iOS 10.3 + - iOS 11.0 + - iOS 11.1 + - iOS 11.2 + - iOS 11.3 + - iOS 11.4 + - iOS 12.0 + - iOS 12.1 + - iOS 12.2 + - iOS 12.4 + - tvOS 10.2 + - tvOS 11.0 + - tvOS 11.1 + - tvOS 11.2 + - tvOS 11.3 + - tvOS 11.4 + - tvOS 12.0 + - tvOS 12.1 + - tvOS 12.2 + - tvOS 12.4 + - watchOS 3.2 + - watchOS 4.0 + - watchOS 4.1 + - watchOS 4.2 + - watchOS 5.0 + - watchOS 5.1 + - watchOS 5.2 + - watchOS 5.3 - image: xcode10.2 xcode: "10.2" osx_version: "10.14" From 481c1eaa03b6c73a35e383c4a9f117620ef0bb2e Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 06:45:21 +0200 Subject: [PATCH 0161/1536] Update trusty-to-xenial-migration-guide.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- trusty-to-xenial-migration-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trusty-to-xenial-migration-guide.md b/trusty-to-xenial-migration-guide.md index ce181bc749f..b1f7893d2a6 100644 --- a/trusty-to-xenial-migration-guide.md +++ b/trusty-to-xenial-migration-guide.md @@ -56,7 +56,7 @@ services: ## To recap! -The default build environment will gradually start changing on April, 23rd 2019. You can identify if your repository is now running on Xenial by checking your build log, under Operating System Details like: +The default build environment is Ubuntu Xenial 16.04. You can identify if your repository is now running on Xenial by checking your build log, under Operating System Details like: ![OS details](/images/2019-04-15-xenial-build-log.png) From 0ad9ac4b5c5c6258cd2e1686441aee87b8e0ea24 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 06:45:45 +0200 Subject: [PATCH 0162/1536] Update trusty-to-xenial-migration-guide.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- trusty-to-xenial-migration-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trusty-to-xenial-migration-guide.md b/trusty-to-xenial-migration-guide.md index b1f7893d2a6..a0cc6889fe2 100644 --- a/trusty-to-xenial-migration-guide.md +++ b/trusty-to-xenial-migration-guide.md @@ -68,4 +68,4 @@ You can find the specific versions of what’s pre-installed in the Xenial Refer ## Need Help? -Please feel free to contact us via our [support](mailto:support@travis-ci.com?subject=Issues%20migrating%20my%20build%20to%20Trusty) email address, or create a [GitHub issue](https://github.com/travis-ci/travis-ci/issues/new). +Please feel free to contact us via our [support](mailto:support@travis-ci.com?subject=Issues%20migrating%20my%20build%20to%20Xenial) email address, or create a [forum topic](https://travis-ci.community/c/environments/xenial). From f22be256b57f1d8ad306ac7dfc94c1601bbf7ca2 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 06:46:01 +0200 Subject: [PATCH 0163/1536] Update trusty-to-xenial-migration-guide.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- trusty-to-xenial-migration-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trusty-to-xenial-migration-guide.md b/trusty-to-xenial-migration-guide.md index a0cc6889fe2..019a7638532 100644 --- a/trusty-to-xenial-migration-guide.md +++ b/trusty-to-xenial-migration-guide.md @@ -63,7 +63,7 @@ The default build environment is Ubuntu Xenial 16.04. You can identify if your r Jobs run on Xenial, display Operating System Details, Description: Ubuntu 16.04.5 LTS You can find the specific versions of what’s pre-installed in the Xenial Reference docs. -> If your build depends on Ubuntu Trusty 14.04, you can explicitly specify `dist: trusty` to avoid your build being automatically routed to Xenial during this default build environment update. +> If your build depends on a different Ubuntu distribution like Ubuntu Trusty 14.04, you can explicitly specify `dist: trusty` to ensure your build will use it. ## Need Help? From 0ebc39e1526ee3d88b17b18a5c8aa992562ceb66 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 10:54:27 +0200 Subject: [PATCH 0164/1536] Update trusty-to-xenial-migration-guide.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- trusty-to-xenial-migration-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trusty-to-xenial-migration-guide.md b/trusty-to-xenial-migration-guide.md index 019a7638532..a969f657a8e 100644 --- a/trusty-to-xenial-migration-guide.md +++ b/trusty-to-xenial-migration-guide.md @@ -32,7 +32,7 @@ Sources from third-party APT repositories have been removed. During the Xenial i For example, to update the `git-lfs` version, you’d need to explicitly specify the source in your config: -You can find the full list of sources and packages that have been used and to install and then removed [here](https://docs.travis-ci.com/user/reference/xenial#third-party-apt-repositories-removed). +You can find the full list of sources that have been used and to install packages and then were removed [here](https://docs.travis-ci.com/user/reference/xenial#third-party-apt-repositories-removed). ``` addons: From dd5fecc53f8bc8140bf63c362643c0b42c8536d4 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 11:06:34 +0200 Subject: [PATCH 0165/1536] set xenial as new default --- user/reference/linux.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/reference/linux.md b/user/reference/linux.md index 4fc59a83963..9f8e424a605 100644 --- a/user/reference/linux.md +++ b/user/reference/linux.md @@ -11,8 +11,8 @@ This page gives an overview of the different Ubuntu Linux distributions you can You can choose one of the following distributions: * [Ubuntu Bionic 18.04](/user/reference/bionic/) -* [Ubuntu Xenial 16.04](/user/reference/xenial/) -* [Ubuntu Trusty 14.04](/user/reference/trusty/) **default** +* [Ubuntu Xenial 16.04](/user/reference/xenial/) **default** +* [Ubuntu Trusty 14.04](/user/reference/trusty/) * [Ubuntu Precise 12.04](/user/reference/precise/) Travis CI also supports the [Windows Build Environment](/user/reference/windows/) and [macOS Build Environment](/user/reference/osx/). From 5705fd3eb8c479c7eae36a88367f952b58f9857b Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 11:27:05 +0200 Subject: [PATCH 0166/1536] update sidebar menu with migration guide link --- _includes/sidebar.html | 1 + 1 file changed, 1 insertion(+) diff --git a/_includes/sidebar.html b/_includes/sidebar.html index 4d114b30144..374cda414a3 100644 --- a/_includes/sidebar.html +++ b/_includes/sidebar.html @@ -84,6 +84,7 @@

        CI Environment Reference

      • Windows CI Environment Reference
      • Building on Multiple Operating Systems
      • Environment Variables
      • +
      • Trusty to Xenial Migration Guide
      • Precise to Trusty Migration Guide
      • Build Environment Updates
      • Build machines IP Addresses
      • From cffda59d3c7efc40472fef7278f786ef0fb0d397 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 11:32:11 +0200 Subject: [PATCH 0167/1536] added note to migration guide on trusty site --- user/reference/trusty.md | 1 + 1 file changed, 1 insertion(+) diff --git a/user/reference/trusty.md b/user/reference/trusty.md index 8d49e20bd30..0853efc39dc 100644 --- a/user/reference/trusty.md +++ b/user/reference/trusty.md @@ -21,6 +21,7 @@ dist: trusty ``` {: data-file=".travis.yml"} +> Trusty is EOL by Canonical, try update to a newer image and see our [Trusty to Xenial Migration Guide](/trusty-to-xenial-migration-guide). If you'd like to know more about the pros, cons, and current state of using Trusty, read on. From a6dd768439c96c2888cafac9f99c676147cb9d39 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 13:16:06 +0200 Subject: [PATCH 0168/1536] Update trusty.md --- user/reference/trusty.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/reference/trusty.md b/user/reference/trusty.md index 0853efc39dc..e1a7e46d92f 100644 --- a/user/reference/trusty.md +++ b/user/reference/trusty.md @@ -6,6 +6,8 @@ redirect_from: - /user/workers/standard-infrastructure/ --- +> Trusty is EOL by Canonical, try updating to a newer image and see our [Trusty to Xenial Migration Guide](/trusty-to-xenial-migration-guide). + ## What This Guide Covers This guide provides a general overview of which packages, tools and settings are @@ -21,8 +23,6 @@ dist: trusty ``` {: data-file=".travis.yml"} -> Trusty is EOL by Canonical, try update to a newer image and see our [Trusty to Xenial Migration Guide](/trusty-to-xenial-migration-guide). - If you'd like to know more about the pros, cons, and current state of using Trusty, read on. From 6566e6efc1a158d7fcbf00edc64da3de5d564ce5 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 13:16:26 +0200 Subject: [PATCH 0169/1536] Update precise.md --- user/reference/precise.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user/reference/precise.md b/user/reference/precise.md index b66d8778606..67e369517a8 100644 --- a/user/reference/precise.md +++ b/user/reference/precise.md @@ -7,6 +7,8 @@ redirect_from: - /user/workers/standard-infrastructure/ --- +> Precise is EOL by Canonical, try updating to a newer image and see our [Precise to Trusty Migration Guide](/user/precise-to-trusty-migration-guide) and [Trusty to Xenial Migration Guide](/trusty-to-xenial-migration-guide). + ### What This Guide Covers This guide explain what packages, tools and settings are available in the Travis From 37c889063e2eb8a14ef484c7bb317e4952ddb0e5 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 13:19:33 +0200 Subject: [PATCH 0170/1536] removed precise to trusty migration guide --- _includes/sidebar.html | 1 - 1 file changed, 1 deletion(-) diff --git a/_includes/sidebar.html b/_includes/sidebar.html index 374cda414a3..34e3037f5f9 100644 --- a/_includes/sidebar.html +++ b/_includes/sidebar.html @@ -85,7 +85,6 @@

        CI Environment Reference

      • Building on Multiple Operating Systems
      • Environment Variables
      • Trusty to Xenial Migration Guide
      • -
      • Precise to Trusty Migration Guide
      • Build Environment Updates
      • Build machines IP Addresses
      From bfbda77a240c6b21e312beae0ee3804bee61dff2 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 13:29:43 +0200 Subject: [PATCH 0171/1536] Update linux.md --- user/reference/linux.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/user/reference/linux.md b/user/reference/linux.md index c84fa6e4e57..fcb6bd0729b 100644 --- a/user/reference/linux.md +++ b/user/reference/linux.md @@ -21,15 +21,19 @@ To use our Ubuntu Linux build infrastructure, you can choose between the distrib ## Default -We use Ubuntu Trusty 14.04 as default. You find more about packages, tools and settings in [Ubuntu Trusty 14.04](/user/reference/trusty/). +We use Ubuntu Xenial 16.04 as default. You find more about packages, tools and settings in [Ubuntu Xenial 16.04](/user/reference/xenial/). -## Using Trusty +## Using Xenial -To use Ubuntu Trusty, add the following to your `.travis.yml`. +To use Ubuntu Xenial, add the following to your `.travis.yml`. ```yaml -dist: trusty +dist: xenial ``` {: data-file=".travis.yml"} Travis CI also supports the [Windows Build Environment](/user/reference/windows/) and [macOS Build Environment](/user/reference/osx/). + +## Migration Guides + +As Precise and Trusty are EOL by Canonical, try updating to a newer image and see our [Precise to Trusty Migration Guide](/user/precise-to-trusty-migration-guide) and [Trusty to Xenial Migration Guide](/trusty-to-xenial-migration-guide). From 8d079e8e38d6a4bae7bfbf89ef5e3332c38d9495 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 13:30:21 +0200 Subject: [PATCH 0172/1536] Update linux.md --- user/reference/linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/linux.md b/user/reference/linux.md index fcb6bd0729b..b8e6462b454 100644 --- a/user/reference/linux.md +++ b/user/reference/linux.md @@ -23,7 +23,7 @@ To use our Ubuntu Linux build infrastructure, you can choose between the distrib We use Ubuntu Xenial 16.04 as default. You find more about packages, tools and settings in [Ubuntu Xenial 16.04](/user/reference/xenial/). -## Using Xenial +### Using Xenial To use Ubuntu Xenial, add the following to your `.travis.yml`. From 262f1ea2039a7c8edcca580cb24c8c4b7acb9e2d Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 13:34:40 +0200 Subject: [PATCH 0173/1536] added link to overview page --- user/reference/precise.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/precise.md b/user/reference/precise.md index f8006fcca71..90c502aaf8c 100644 --- a/user/reference/precise.md +++ b/user/reference/precise.md @@ -390,4 +390,4 @@ Recent 1.7.x version (usually the most recent) ## Other Ubuntu Linux Build Environments -You can have a look at the [Ubuntu Linux overview page]() for the different Ubuntu Linux build environments you can use. +You can have a look at the [Ubuntu Linux overview page](/user/reference/linux) for the different Ubuntu Linux build environments you can use. From ae59218703fd03875d1cc66edc5f0c8197506016 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 13:35:09 +0200 Subject: [PATCH 0174/1536] added link to overview page --- user/reference/trusty.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/trusty.md b/user/reference/trusty.md index 846c6384f1d..479fbfc6ff3 100644 --- a/user/reference/trusty.md +++ b/user/reference/trusty.md @@ -374,4 +374,4 @@ versions) are shown in the "Build system information" section. ## Other Ubuntu Linux Build Environments -You can have a look at the [Ubuntu Linux overview page]() for the different Ubuntu Linux build environments you can use. +You can have a look at the [Ubuntu Linux overview page](/user/reference/linux) for the different Ubuntu Linux build environments you can use. From 44fb399abee84d51c8580e535da2f6bf406a6133 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 13:35:50 +0200 Subject: [PATCH 0175/1536] added link to overview page --- user/reference/xenial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/xenial.md b/user/reference/xenial.md index 50ce4dffd6c..c3f3e3c4855 100644 --- a/user/reference/xenial.md +++ b/user/reference/xenial.md @@ -167,4 +167,4 @@ To use one in your build, add it to the services key in your `travis.yml` : ## Other Ubuntu Linux Build Environments -You can have a look at the [Ubuntu Linux overview page]() for the different Ubuntu Linux build environments you can use. +You can have a look at the [Ubuntu Linux overview page](/user/reference/linux) for the different Ubuntu Linux build environments you can use. From f63be41692ea671fffe4081b0a763382dc26bd0f Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Wed, 14 Aug 2019 13:36:28 +0200 Subject: [PATCH 0176/1536] added link to overview page --- user/reference/bionic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/bionic.md b/user/reference/bionic.md index a9059c23e75..332aca0940f 100644 --- a/user/reference/bionic.md +++ b/user/reference/bionic.md @@ -164,4 +164,4 @@ To use one in your build, add it to the services key in your `travis.yml` : ## Other Ubuntu Linux Build Environments -You can have a look at the [Ubuntu Linux overview page]() for the different Ubuntu Linux build environments you can use. +You can have a look at the [Ubuntu Linux overview page](/user/reference/linux) for the different Ubuntu Linux build environments you can use. From a90266f860895a634f5eac9bc9db245b7002e59a Mon Sep 17 00:00:00 2001 From: Natalie Weizenbaum Date: Wed, 14 Aug 2019 19:02:22 -0700 Subject: [PATCH 0177/1536] Replace myself as a Dart maintainer @athomas has volunteered to be an owner for the time being. --- user/languages/dart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/languages/dart.md b/user/languages/dart.md index ce839c538a3..948d35c87c4 100644 --- a/user/languages/dart.md +++ b/user/languages/dart.md @@ -34,7 +34,7 @@ This guide covers build environment and configuration topics specific to Travis CI support for Dart is contributed by the community and may be removed or altered at any time. If you run into any problems, please report them in the [Travis CI issue tracker](https://github.com/travis-ci/travis-ci/issues/new?labels=community:dart) -and cc [@nex3](https://github.com/nex3) and [@a14n](https://github.com/a14n). +and cc [@athomas](https://github.com/athomas) and [@a14n](https://github.com/a14n). ## Choosing Dart versions to test against From 2f0e02ebb917c1c12afd215b5c1e8bc1af1e5e12 Mon Sep 17 00:00:00 2001 From: valery1707 Date: Thu, 15 Aug 2019 10:28:58 +0300 Subject: [PATCH 0178/1536] Fix links to installed JDK list on Xenial and Bionic --- user/languages/java.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/languages/java.md b/user/languages/java.md index 0ff4cf0fef2..1fb6939d344 100644 --- a/user/languages/java.md +++ b/user/languages/java.md @@ -195,8 +195,8 @@ details. The list of available JVMs for different dists are at - * [JDKs installed for **Bionic**](/user/reference/bionic/#jvm-clojure-groovy-java-scala-images) - * [JDKs installed for **Xenial**](/user/reference/xenial/#jvm-clojure-groovy-java-scala-images) + * [JDKs installed for **Bionic**](/user/reference/bionic/#jvm-clojure-groovy-java-scala-support) + * [JDKs installed for **Xenial**](/user/reference/xenial/#jvm-clojure-groovy-java-scala-support) * [JDKs installed for **Trusty**](/user/reference/trusty/#jvm-clojure-groovy-java-scala-images) * [JDKs installed for **Precise**](/user/reference/precise/#jvm-clojure-groovy-java-scala-vm-images) From 032a46b2f7861e41aefc234d3b06105679502ab2 Mon Sep 17 00:00:00 2001 From: Michael Howitz Date: Thu, 15 Aug 2019 16:16:06 +0200 Subject: [PATCH 0179/1536] Add more commands to switch between windows. `ctrl-b 1` led to the error message `Window not found: :=1`. Same for `ctrl-b 0`. (Yes, I created a new window using ``ctrl-b c` beforehand. So I am happy that I discovered another way to switch windows. Maybe this helps others, too. --- user/running-build-in-debug-mode.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/user/running-build-in-debug-mode.md b/user/running-build-in-debug-mode.md index a3e2b5b07c4..5369eb9153f 100644 --- a/user/running-build-in-debug-mode.md +++ b/user/running-build-in-debug-mode.md @@ -188,6 +188,19 @@ ctrl-b 0 This switches your session's focus to the window with the index 0. You can substitute `0` with any valid index to switch to that window. +``` +ctrl-b n +``` + +Switch to the next window. + +``` +ctrl-b p +``` + +Switch to the previous window. + + Switching between windows can be helpful if you want to run long-running process in one window while looking at the debug VM in another. From 44674c620c616e84c388366c5cdd8440a661d947 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 16 Aug 2019 08:39:50 +0200 Subject: [PATCH 0180/1536] moved migration guide to user folder --- .../trusty-to-xenial-migration-guide.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename trusty-to-xenial-migration-guide.md => user/trusty-to-xenial-migration-guide.md (100%) diff --git a/trusty-to-xenial-migration-guide.md b/user/trusty-to-xenial-migration-guide.md similarity index 100% rename from trusty-to-xenial-migration-guide.md rename to user/trusty-to-xenial-migration-guide.md From 3a967dbe6aa3fe0250f59c7a2dd3263b7fbfb230 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 16 Aug 2019 08:41:13 +0200 Subject: [PATCH 0181/1536] updated path to migration guide --- _includes/sidebar.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_includes/sidebar.html b/_includes/sidebar.html index 34e3037f5f9..77c7cef7edf 100644 --- a/_includes/sidebar.html +++ b/_includes/sidebar.html @@ -84,7 +84,7 @@

      CI Environment Reference

    • Windows CI Environment Reference
    • Building on Multiple Operating Systems
    • Environment Variables
    • -
    • Trusty to Xenial Migration Guide
    • +
    • Trusty to Xenial Migration Guide
    • Build Environment Updates
    • Build machines IP Addresses
    • From 577892b4fc766892387ac751e1165fb5e601f1f8 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 16 Aug 2019 08:42:37 +0200 Subject: [PATCH 0182/1536] updated path to migration guide --- user/reference/precise.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/precise.md b/user/reference/precise.md index 67e369517a8..830c2dff9de 100644 --- a/user/reference/precise.md +++ b/user/reference/precise.md @@ -7,7 +7,7 @@ redirect_from: - /user/workers/standard-infrastructure/ --- -> Precise is EOL by Canonical, try updating to a newer image and see our [Precise to Trusty Migration Guide](/user/precise-to-trusty-migration-guide) and [Trusty to Xenial Migration Guide](/trusty-to-xenial-migration-guide). +> Precise is EOL by Canonical, try updating to a newer image and see our [Precise to Trusty Migration Guide](/user/precise-to-trusty-migration-guide) and [Trusty to Xenial Migration Guide](/user/trusty-to-xenial-migration-guide). ### What This Guide Covers From 4ea0f430f775084333d2194606b6d01e797bb787 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 16 Aug 2019 08:43:45 +0200 Subject: [PATCH 0183/1536] updated path to migration guide --- user/reference/trusty.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/trusty.md b/user/reference/trusty.md index e1a7e46d92f..37eb9b50d28 100644 --- a/user/reference/trusty.md +++ b/user/reference/trusty.md @@ -6,7 +6,7 @@ redirect_from: - /user/workers/standard-infrastructure/ --- -> Trusty is EOL by Canonical, try updating to a newer image and see our [Trusty to Xenial Migration Guide](/trusty-to-xenial-migration-guide). +> Trusty is EOL by Canonical, try updating to a newer image and see our [Trusty to Xenial Migration Guide](/user/trusty-to-xenial-migration-guide). ## What This Guide Covers From d1de31312d5791d1c78aea9fc7cc8829d79afde0 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 16 Aug 2019 08:46:37 +0200 Subject: [PATCH 0184/1536] updated path to migration guide --- user/reference/linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/reference/linux.md b/user/reference/linux.md index b8e6462b454..7e7b3a589a6 100644 --- a/user/reference/linux.md +++ b/user/reference/linux.md @@ -36,4 +36,4 @@ Travis CI also supports the [Windows Build Environment](/user/reference/windows/ ## Migration Guides -As Precise and Trusty are EOL by Canonical, try updating to a newer image and see our [Precise to Trusty Migration Guide](/user/precise-to-trusty-migration-guide) and [Trusty to Xenial Migration Guide](/trusty-to-xenial-migration-guide). +As Precise and Trusty are EOL by Canonical, try updating to a newer image and see our [Precise to Trusty Migration Guide](/user/precise-to-trusty-migration-guide) and [Trusty to Xenial Migration Guide](/user/trusty-to-xenial-migration-guide). From aa68a5d3f2a29f242a084fa81486c8fbac98a95d Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 16 Aug 2019 10:11:34 +0200 Subject: [PATCH 0185/1536] Update user/trusty-to-xenial-migration-guide.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/trusty-to-xenial-migration-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/trusty-to-xenial-migration-guide.md b/user/trusty-to-xenial-migration-guide.md index a969f657a8e..ff43679d8fe 100644 --- a/user/trusty-to-xenial-migration-guide.md +++ b/user/trusty-to-xenial-migration-guide.md @@ -3,7 +3,7 @@ title: Ubuntu Trusty to Ubuntu Xenial Migration Guide layout: en --- -As of August, 13th 2019, we're switching the default Linux distribution on Travis CI from Ubuntu Trusty 14.04 LTS to +As of August, 13th 2019, we've switched the default Linux distribution on Travis CI from Ubuntu Trusty 14.04 LTS to Ubuntu Xenial 16.04. Here are the most common issues our customers ran into and how you can fix them. > If you’d like to stay on Ubuntu Trusty or need more time to set up your repository with Ubuntu Trusty, From 3cc0d15c386b854d32e122ddd40ec9be05b328ec Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Fri, 16 Aug 2019 12:11:10 +0200 Subject: [PATCH 0186/1536] Update python.md now that Xenial is default distro @tapaswenipathak @native-api @takluyver @MariadeAnton @Pezi777 Your reviews please. --- user/languages/python.md | 52 +++++++++++----------------------------- 1 file changed, 14 insertions(+), 38 deletions(-) diff --git a/user/languages/python.md b/user/languages/python.md index 31b5ad92827..6bc3f0ea130 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -43,14 +43,14 @@ 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.6" # current detault Python on Travis CI + - "3.7" + - "3.7-dev" # 3.7 development branch + - "3.8-dev" # 3.8 development branch + - "nightly" # nightly build # command to install dependencies install: - pip install -r requirements.txt @@ -60,24 +60,6 @@ script: ``` {: data-file=".travis.yml"} -### Python 3.7 and higher - -You'll need to add `dist: xenial` or `dist: bionic` to your `.travis.yml` file to use Python 3.7 and higher. - -For example: - -```yaml -dist: xenial # required for Python >= 3.7 -language: python -python: - - "3.7" - - "3.7-dev" # 3.7 development branch - - "3.8-dev" # 3.8 development branch - - "nightly" # nightly build -``` -{: data-file=".travis.yml"} - - ### Travis CI Uses Isolated virtualenvs The CI Environment uses separate virtualenv instances for each Python @@ -85,7 +67,7 @@ version. This means that as soon as you specify `language: python` in `.travis.y 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 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). +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 Xenial, this means 2.7.12 and 3.5.1). 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`: @@ -93,7 +75,7 @@ To do this, include the following in your `.travis.yml`: language: python python: - "2.7" - - "3.4" + - "3.5" virtualenv: system_site_packages: true ``` @@ -104,17 +86,17 @@ virtualenv: Travis CI supports PyPy and PyPy3. -To test your project against PyPy, add "pypy3.5" to the list of Pythons +To test your project against PyPy, add "pypy" and/or "pypy3" to the list of Pythons in your `.travis.yml`: ```yaml language: python python: - "2.7" - - "3.5" - - "3.6" + - "3.7" # PyPy versions - - "pypy3.5" + - "pypy" # currently Python 2.7.13, PyPy 7.1.1 + - "pypy3" # currently Python 3.6.1, PyPy 7.1.1-beta0 # command to install dependencies install: - pip install -r requirements.txt @@ -136,11 +118,6 @@ 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 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`, `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 @@ -186,12 +163,11 @@ matrix: include: - name: "Python 3.7.1 on Xenial Linux" python: 3.7 # this works for Linux but is ignored on macOS or Windows - dist: xenial # required for Python >= 3.7 - - name: "Python 3.7.2 on macOS" + - name: "Python 3.7.4 on macOS" os: osx - osx_image: xcode10.2 # Python 3.7.2 running on macOS 10.14.3 + osx_image: xcode11 # Python 3.7.4 running on macOS 10.14.3 language: shell # 'language: python' is an error on Travis CI macOS - - name: "Python 3.7.3 on Windows" + - name: "Python 3.7.4 on Windows" os: windows # Windows 10.0.17134 N/A Build 17134 language: shell # 'language: python' is an error on Travis CI Windows before_install: From d37b02d8c076cf2b40bd9b1cd6dcf778e42252ab Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Fri, 16 Aug 2019 12:16:03 +0200 Subject: [PATCH 0187/1536] Fix typo: macOS is 10.14.4 --- 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 6bc3f0ea130..c19cb88a720 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -165,7 +165,7 @@ matrix: python: 3.7 # this works for Linux but is ignored on macOS or Windows - name: "Python 3.7.4 on macOS" os: osx - osx_image: xcode11 # Python 3.7.4 running on macOS 10.14.3 + osx_image: xcode11 # Python 3.7.4 running on macOS 10.14.4 language: shell # 'language: python' is an error on Travis CI macOS - name: "Python 3.7.4 on Windows" os: windows # Windows 10.0.17134 N/A Build 17134 From f2e66851c10356f4e7e60b67a2569fd3bb0cec05 Mon Sep 17 00:00:00 2001 From: Pezi777 <52408528+Pezi777@users.noreply.github.com> Date: Fri, 16 Aug 2019 12:40:59 +0200 Subject: [PATCH 0188/1536] Update user/trusty-to-xenial-migration-guide.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- user/trusty-to-xenial-migration-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/trusty-to-xenial-migration-guide.md b/user/trusty-to-xenial-migration-guide.md index ff43679d8fe..b6e1f448517 100644 --- a/user/trusty-to-xenial-migration-guide.md +++ b/user/trusty-to-xenial-migration-guide.md @@ -61,7 +61,7 @@ The default build environment is Ubuntu Xenial 16.04. You can identify if your r ![OS details](/images/2019-04-15-xenial-build-log.png) Jobs run on Xenial, display Operating System Details, Description: Ubuntu 16.04.5 LTS -You can find the specific versions of what’s pre-installed in the Xenial Reference docs. +You can find the specific versions of what’s pre-installed in the [Xenial Reference docs](/user/reference/xenial/). > If your build depends on a different Ubuntu distribution like Ubuntu Trusty 14.04, you can explicitly specify `dist: trusty` to ensure your build will use it. From 8d0481057eb495d00a22204a04729e70348c31fc Mon Sep 17 00:00:00 2001 From: ssabrii <45571047+ssabrii@users.noreply.github.com> Date: Tue, 20 Aug 2019 12:07:03 -0400 Subject: [PATCH 0189/1536] Add Windows info common build problems --- user/common-build-problems.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/user/common-build-problems.md b/user/common-build-problems.md index e70cbabbb69..1b83d737878 100644 --- a/user/common-build-problems.md +++ b/user/common-build-problems.md @@ -387,6 +387,11 @@ before_install: ``` {: data-file=".travis.yml"} +## **Windows**: common build problems and known issues + +For a list of common builds problems and known issues, please visit our community forum [here](https://travis-ci.community/t/current-known-issues-please-read-this-before-posting-a-new-topic/264). +Our forum helps give better visibility on the issues customers are running into. + ## Travis CI does not preserve the state between builds Travis CI uses virtual machine snapshotting to make sure no state is preserved between From 308c648f8ef19b5ab9a0c0bd76bbfd5f9ae1623d Mon Sep 17 00:00:00 2001 From: Muizudeen Kusimo Date: Thu, 22 Aug 2019 10:03:54 -0700 Subject: [PATCH 0190/1536] Correct typo on `href` --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 057e4b43a20..813aef2de02 100644 --- a/index.html +++ b/index.html @@ -46,7 +46,7 @@

      Deployment Guides

      Common Questions

      • What repository providers can I use?
      • -
      • Can I use Ubuntu 18.04 Bionic for my builds?
      • +
      • Can I use Ubuntu 18.04 Bionic for my builds?
      • Can I use Ubuntu Xenial for my builds?
      • How do I change the notification email address?
      • What IP addresses do the builds use?
      • From dbe9a0538dc4d395289106352cd2761c052b1a98 Mon Sep 17 00:00:00 2001 From: Tanzinul Islam <11808226+tanzislam@users.noreply.github.com> Date: Sat, 24 Aug 2019 19:12:53 +0100 Subject: [PATCH 0191/1536] Fix typo in git-submodule command --- user/private-dependencies.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/private-dependencies.md b/user/private-dependencies.md index be2b0f79232..43b63bb41fb 100644 --- a/user/private-dependencies.md +++ b/user/private-dependencies.md @@ -279,7 +279,7 @@ gem 'lib2', github: "myorg/lib2" ``` > In case of private git submodules, be aware that the `git submodule -> update --init recursive` command runs before the `~/.netrc` credentials +> 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: > From 87c420c1c2c71146d17bafdc4823876d191359e8 Mon Sep 17 00:00:00 2001 From: Gil Megidish Date: Mon, 26 Aug 2019 14:54:57 +0300 Subject: [PATCH 0192/1536] Removed old parameters that are no longer used --- user/deployment/testfairy.md | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/user/deployment/testfairy.md b/user/deployment/testfairy.md index 927e2fad4e6..810dd0ea682 100644 --- a/user/deployment/testfairy.md +++ b/user/deployment/testfairy.md @@ -50,32 +50,3 @@ deploy: testers-groups: qa-stuff,friends ``` {: data-file=".travis.yml"} - -## More Options - -- **auto-update**: Upgrade previous installations to this version automatically. -- **max-duration**: Maximum session recording length, eg "60m". Default is "10m". -- **data-only-wifi**: Record video and metrics only when connected to wifi network. -- **video**: If true, Video recording settings "true", "false". Default is "true". -- **video-quality**: Video quality settings, "high", "medium" or "low". Default is "high". -- **screenshot-interval**: Seconds between video frames. Default "1" seconds. -- **record-on-background**: If true, data will be collected while the app on background. -- **metrics**: Comma-separated list of metrics to record. View list on [TestFairy Docs](https://docs.testfairy.com/API/Upload_API.html). - -For example: - -```yaml -deploy: - provider: testfairy - api-key: "TESTFAIRY API KEY" - app-file: bin/MainActivity_release.apk - symbols-file: bin/proguard_mapping.txt - testers-groups: qa-stuff,friends - auto-update: true - screenshot-interval: 2 - video: true - video-quality: high - data-only-wifi: true - metrics: cpu,memory,network,phone-signal,logcat,gps,battery -``` -{: data-file=".travis.yml"} From 37e2eac2e06bddaaa07155b3cd6b4025fcd69885 Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Thu, 29 Aug 2019 15:31:13 -0400 Subject: [PATCH 0193/1536] Removed references and recipes relate to the container-based infra --- user/database-setup.md | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/user/database-setup.md b/user/database-setup.md index e5a078d0aef..576c2176c36 100644 --- a/user/database-setup.md +++ b/user/database-setup.md @@ -438,8 +438,6 @@ services: Neo4j Server uses default configuration and binds to localhost on port 7474. -> Neo4j does not start on container-based infrastructure. See https://github.com/travis-ci/travis-ci/issues/3243 - ## ElasticSearch Start ElasticSearch in your `.travis.yml`: @@ -472,25 +470,6 @@ before_install: We advise verifying the validity of the download URL [on ElasticSearch's website](https://www.elastic.co/downloads/elasticsearch). -> `sudo` is not available on [Container-based infrastructure](/user/reference/overview/#virtualization-environments). - -### Installing ElasticSearch on trusty container-based infrastructure - -ElasticSearch is not installed by default on the [trusty container-based infrastructure](/user/reference/trusty/) -but you can install it by adding the following steps to your `.travis.yml`. - -```yaml -env: - - ES_VERSION=5.1.1 ES_DOWNLOAD_URL=https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${ES_VERSION}.tar.gz -install: - - wget ${ES_DOWNLOAD_URL} - - tar -xzf elasticsearch-${ES_VERSION}.tar.gz - - ./elasticsearch-${ES_VERSION}/bin/elasticsearch & -script: - - wget -q --waitretry=1 --retry-connrefused -T 10 -O - http://127.0.0.1:9200 -``` -{: data-file=".travis.yml"} - ### Truncated Output in the Build Log When ElasticSearch starts, you may see a truncated error message such as: From 6309c74ca363a1096da44ed910a0c2dce82187b8 Mon Sep 17 00:00:00 2001 From: Dominic Jodoin Date: Fri, 30 Aug 2019 13:44:00 -0400 Subject: [PATCH 0194/1536] Account affected by 422 errors need to be synced --- user/enterprise/troubleshooting-guide.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/user/enterprise/troubleshooting-guide.md b/user/enterprise/troubleshooting-guide.md index fec28e46f0a..15feb423842 100644 --- a/user/enterprise/troubleshooting-guide.md +++ b/user/enterprise/troubleshooting-guide.md @@ -194,13 +194,13 @@ There are two options listed below to initiate a sync between your Travis CI Ent #### Sync account from Travis CI web interface -To sync your account with your GitHub instance: +Ask the owner of **the affected account** (usually printed in the logs) to sync it with your GitHub instance. To do so they should: 1. Open `https://`. -2. In the upper right corner of the page hover over the user icon and select 'Profile' from the dropdown menu. -3. In the upper right corner of the profile page click on 'Sync account'. +2. In the upper right corner of the page, hover over the user icon and select 'Profile' from the dropdown menu. +3. In the upper right corner of the profile page, click on 'Sync account'. -#### Sync from the CLI with administrator privileges``` +#### Sync account from the CLI with administrator privileges``` An administrator can also initiate a sync on behalf of someone else via the `travis` CLI tool on the platform machine: From da164d15b6a0939a3c9c750ca348a6832eee61e1 Mon Sep 17 00:00:00 2001 From: Logan Kilpatrick Date: Sat, 31 Aug 2019 16:58:11 -0700 Subject: [PATCH 0195/1536] Update julia.md Added sample projects to look at for reference. --- user/languages/julia.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/user/languages/julia.md b/user/languages/julia.md index eca3e17475e..14eb4a2d973 100644 --- a/user/languages/julia.md +++ b/user/languages/julia.md @@ -119,3 +119,16 @@ TRAVIS_JULIA_VERSION ``` In addition, `JULIA_PROJECT` is set to `@.`, which means Julia will search through parent directories until a `Project.toml` or `JuliaProject.toml` file is found; the containing directory then is used the home project/environment. + +## Example Projects + +Below are a list of open source Julia projects utalizing Travis CI in different ways: + +1) [Plots.jl](https://github.com/JuliaPlots/Plots.jl/blob/master/.travis.yml) +2) [AbstractPlotting.jl](https://github.com/JuliaPlots/AbstractPlotting.jl/blob/master/.travis.yml) +3) [DiffEqDocs.jl](https://github.com/JuliaDiffEq/DiffEqDocs.jl/blob/master/.travis.yml) +4) [Pkj.jl](https://github.com/JuliaLang/Pkg.jl/blob/master/.travis.yml) +5) [NeuralVerification.jl](https://github.com/sisl/NeuralVerification.jl/blob/master/.travis.yml) +6) [POMDP's.jl](https://github.com/JuliaPOMDP/POMDPs.jl/blob/master/.travis.yml) + +As a bonus, check out the `.travis.yml` file for Base Julia [here](https://github.com/JuliaLang/julia/blob/master/.travis.yml). From 37759ea8b08e72d30a34f03dfd07923118828d7f Mon Sep 17 00:00:00 2001 From: Timofey Gorshkov Date: Mon, 2 Sep 2019 12:48:48 +0300 Subject: [PATCH 0196/1536] Add link to Environment Variables article (#2501) --- user/coveralls.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/coveralls.md b/user/coveralls.md index 84fc9456abb..78a20a3defb 100644 --- a/user/coveralls.md +++ b/user/coveralls.md @@ -86,7 +86,7 @@ Coveralls have documentation for many other programming languages: ## Using Coveralls with Docker builds -If you're using Docker in builds, ensure that the necessary environment variables are exposed to the container: +If you're using Docker in builds, ensure that the necessary [environment variables](https://docs.travis-ci.com/user/environment-variables) are exposed to the container: ```sh docker exec -e TRAVIS_JOB_ID="$TRAVIS_JOB_ID" -e TRAVIS_BRANCH="$TRAVIS_BRANCH" ... ``` From c4e4e717eada57ecdc77a728fa525cc9bafade3b Mon Sep 17 00:00:00 2001 From: Nick Bartlett Date: Mon, 2 Sep 2019 05:53:27 -0400 Subject: [PATCH 0197/1536] :memo: typo fix detault -> default (#2495) --- 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 c19cb88a720..99bb1cc5613 100644 --- a/user/languages/python.md +++ b/user/languages/python.md @@ -46,7 +46,7 @@ python: - "2.7" - "3.4" - "3.5" - - "3.6" # current detault Python on Travis CI + - "3.6" # current default Python on Travis CI - "3.7" - "3.7-dev" # 3.7 development branch - "3.8-dev" # 3.8 development branch From 014b54a9ec8e3788258ec984a52e854029f889ff Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Wed, 4 Sep 2019 15:22:52 +0200 Subject: [PATCH 0198/1536] bump html_proofer and nokogiri --- Gemfile.lock | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 801345753f0..5a580c35601 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -20,13 +20,13 @@ GIT GEM remote: https://rubygems.org/ specs: - activesupport (4.2.11) + activesupport (4.2.11.1) i18n (~> 0.7) minitest (~> 5.1) thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) - addressable (2.5.2) - public_suffix (>= 2.0.2, < 4.0) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) ast (2.4.0) capybara (2.4.4) mime-types (>= 1.16) @@ -41,18 +41,17 @@ GEM execjs coffee-script-source (1.12.2) colorator (1.1.0) - colorize (0.8.1) em-websocket (0.5.1) eventmachine (>= 0.12.9) http_parser.rb (~> 0.6.0) erubis (2.7.0) - ethon (0.11.0) + ethon (0.12.0) ffi (>= 1.3.0) eventmachine (1.2.7) execjs (2.7.0) faraday (0.15.2) multipart-post (>= 1.2, < 3) - ffi (1.9.25) + ffi (1.11.1) forwardable-extended (2.6.0) haml (5.0.4) temple (>= 0.8.0) @@ -60,13 +59,13 @@ GEM hike (1.2.3) hooks (0.4.1) uber (~> 0.0.14) - html-proofer (3.9.3) - activesupport (>= 4.2, < 6.0) + html-proofer (3.12.0) addressable (~> 2.3) - colorize (~> 0.8) - mercenary (~> 0.3.2) - nokogiri (~> 1.8.1) + mercenary (~> 0.3) + nokogiri (~> 1.10) parallel (~> 1.3) + rainbow (~> 3.0) + timerizer (~> 0.3) typhoeus (~> 1.3) yell (~> 2.0) http_parser.rb (0.6.0) @@ -141,19 +140,19 @@ GEM mime-types (3.1) mime-types-data (~> 3.2015) mime-types-data (3.2016.0521) - mini_portile2 (2.3.0) + mini_portile2 (2.4.0) minitest (5.11.3) multi_json (1.13.1) multipart-post (2.0.0) - nokogiri (1.8.5) - mini_portile2 (~> 2.3.0) + nokogiri (1.10.4) + mini_portile2 (~> 2.4.0) padrino-helpers (0.12.9) i18n (~> 0.6, >= 0.6.7) padrino-support (= 0.12.9) tilt (>= 1.4.1, < 3) padrino-support (0.12.9) activesupport (>= 3.1) - parallel (1.12.1) + parallel (1.17.0) parser (2.5.1.0) ast (~> 2.4.0) pathutil (0.16.1) @@ -162,7 +161,7 @@ GEM pry (0.11.3) coderay (~> 1.1.0) method_source (~> 0.9.0) - public_suffix (3.0.3) + public_suffix (4.0.1) puma (3.11.4) rack (1.6.11) rack-jekyll (0.5.0) @@ -212,6 +211,7 @@ GEM thor (0.20.0) thread_safe (0.3.6) tilt (1.4.1) + timerizer (0.3.2) typhoeus (1.3.1) ethon (>= 0.9.0) tzinfo (1.2.5) @@ -223,7 +223,7 @@ GEM unicode-display_width (1.4.0) xpath (2.1.0) nokogiri (~> 1.3) - yell (2.0.7) + yell (2.2.0) PLATFORMS ruby From 7c0c5a99e604e992f1d9e5c68b30989897e2d9ba Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Tue, 6 Aug 2019 14:49:37 +0200 Subject: [PATCH 0199/1536] add a page about deployments using dpl v2 --- user/deployment-v2.md | 207 ++++++++++++++++++++++++++++++++++++++++++ user/deployment.md | 5 +- 2 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 user/deployment-v2.md diff --git a/user/deployment-v2.md b/user/deployment-v2.md new file mode 100644 index 00000000000..8d970bb8b4c --- /dev/null +++ b/user/deployment-v2.md @@ -0,0 +1,207 @@ +--- +title: Deployment (v2) +layout: en +--- + +> This page documents deployments using the next major version dpl v2 which +> currently is in a preview release phase. Please see our blog post on details +> about the release process. Documentation for dpl v1, the current default +> version, can be found [here](/user/deployments). + +## Supported Providers + +Continuous Deployment to the following providers is supported: + +{% include deployments.html %} + +To deploy to a custom or unsupported provider, use the [after-success build +stage](/user/deployment/custom/) or [script provider](/user/deployment/script). + +## Maturity Levels + +In order to communicate the current development status and maturity of dpl's +support for a particular service the respective provider is marked with one of +the following maturity levels, according to the given criteria: + +* `dev` - the provider is in development (initial level) +* `alpha` - the provider is fully tested +* `beta` - the provider has been in alpha for at least a month, and successful real-world production deployments have been observed +* `stable` - the provider has been in beta for at least two months, and there are no open issues that qualify as critical (such as deployments failing, documented functionality broken, etc) + +Dpl v2 represents a major rewrite, so support for all providers has been +reset to `dev` or `alpha`, depending on the test status. + +For all levels except `stable` a message will be printed to your build log +that informs you about the current status. + +## Cleaning up the Git working directory + +The previous version of dpl, our deployment integration tooling, used to +reset your working directory, and delete all changes made during the build +using `git stash --all`. In order to keep changes one had to opt out using +`skip_cleanup: true`. This default turned out to be useful only for very few +providers, and has been changed in dpl v2. + +If you do need to clean up the working directory from any changes made during +the build process, please opt in to cleanup by adding the following to your +`.travis.yml` file: + +```yaml +deploy: + cleanup: true +``` +{: data-file=".travis.yml"} + +## 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 +cloudControl and Heroku, your `deploy` section would look something like this: + +```yaml +deploy: + - provider: cloudcontrol + email: "YOUR CLOUDCONTROL EMAIL" + password: "YOUR CLOUDCONTROL PASSWORD" + deployment: "APP_NAME/DEP_NAME" + - provider: heroku + api_key: "YOUR HEROKU API KEY" +``` +{: data-file=".travis.yml"} + +## Conditional Releases with `on:` + +Set your build to deploy only in specific circumstances by configuring the `on:` key for any deployment provider. + +```yaml +deploy: + provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" + skip_cleanup: true + on: + branch: release + condition: $MY_ENV = super_awesome +``` +{: data-file=".travis.yml"} + +When *all* conditions specified in the `on:` section are met, your build will deploy. + +Use the following options to configure conditional deployment: + +* `repo`: in the form `owner_name/repo_name`. Deploy only when the build occurs on a particular repository. For example + + ```yaml + deploy: + provider: s3 + on: + repo: travis-ci/dpl + ``` + {: data-file=".travis.yml"} + +* `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. + +* `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. + +* `condition`: deploy when *a single* bash condition evaluates to `true`. This must be a string value, and is equivalent to `if [[ ]]; then ; fi`. For example, `$CC = gcc`. + +* `tags` can be `true`, `false` or any other string: + + * `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. + * `tags: false`: deployment is triggered if and only if `$TRAVIS_TAG` is empty. + This also causes the `branch` condition to be ignored. + * 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 Deployment + +This example deploys to Appfog only from the `staging` branch when the test has run on Node.js version 0.11. + +```yaml +language: node_js +deploy: + provider: appfog + user: ... + api_key: ... + on: + branch: staging + node_js: '0.11' # this should be quoted; otherwise, 0.10 would not work +``` +{: data-file=".travis.yml"} + +The next example deploys using a custom script `deploy.sh`, only for builds on the branches `staging` and `production`. + +```yaml +deploy: + provider: script + script: deploy.sh + on: + all_branches: true + condition: $TRAVIS_BRANCH =~ ^(staging|production)$ +``` +{: data-file=".travis.yml"} + +The next example deploys using custom scripts `deploy_production.sh` and `deploy_staging.sh` depending on the branch that triggered the job. + +```yaml +deploy: + - provider: script + script: deploy_production.sh + on: + branch: production + - provider: script + script: deploy_staging.sh + on: + branch: staging +``` +{: data-file=".travis.yml"} + +The next example deploys to S3 only when `$CC` is set to `gcc`. + +```yaml +deploy: + provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + skip_cleanup: true + bucket: "S3 Bucket" + on: + condition: "$CC = gcc" +``` +{: data-file=".travis.yml"} + +This example deploys to GitHub Releases when a tag is set and the Ruby version is 2.0.0. + +```yaml +deploy: + provider: releases + api_key: "GITHUB OAUTH TOKEN" + file: "FILE TO UPLOAD" + skip_cleanup: true + on: + tags: true + rvm: 2.0.0 +``` +{: data-file=".travis.yml"} + +### 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). + +If you contribute to or experiment with the [deploy tool](https://github.com/travis-ci/dpl) make sure you use the edge version from GitHub: + +```yaml +deploy: + provider: awesome-experimental-provider + edge: true +``` +{: data-file=".travis.yml"} + +## Pull Requests + +Note that pull request builds skip the deployment step altogether. diff --git a/user/deployment.md b/user/deployment.md index ae56c2b687e..f08ffd023ac 100644 --- a/user/deployment.md +++ b/user/deployment.md @@ -4,7 +4,10 @@ layout: en swiftypetags: 'skip_cleanup' --- - +> This page documents deployments using dpl v1 which currently still is the +> default version. The next major version dpl v2 will be released soon. Please +> see our blog post on details about the release process. Documentation for dpl +> v2 can be found [here](/user/deployments-v2). ## Supported Providers From e888b2654e1d9e241967346a6f7c2da7f2defb32 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Thu, 8 Aug 2019 16:38:29 +0200 Subject: [PATCH 0200/1536] Apply suggestions from code review Co-Authored-By: Pezi777 <52408528+Pezi777@users.noreply.github.com> --- user/deployment-v2.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/user/deployment-v2.md b/user/deployment-v2.md index 8d970bb8b4c..7a014f39609 100644 --- a/user/deployment-v2.md +++ b/user/deployment-v2.md @@ -20,13 +20,13 @@ stage](/user/deployment/custom/) or [script provider](/user/deployment/script). ## Maturity Levels In order to communicate the current development status and maturity of dpl's -support for a particular service the respective provider is marked with one of +support for a particular service, the respective provider is marked with one of the following maturity levels, according to the given criteria: * `dev` - the provider is in development (initial level) * `alpha` - the provider is fully tested -* `beta` - the provider has been in alpha for at least a month, and successful real-world production deployments have been observed -* `stable` - the provider has been in beta for at least two months, and there are no open issues that qualify as critical (such as deployments failing, documented functionality broken, etc) +* `beta` - the provider has been in alpha for at least a month and successful real-world production deployments have been observed +* `stable` - the provider has been in beta for at least two months and there are no open issues that qualify as critical (such as deployments failing, documented functionality broken, etc.) Dpl v2 represents a major rewrite, so support for all providers has been reset to `dev` or `alpha`, depending on the test status. @@ -34,13 +34,13 @@ reset to `dev` or `alpha`, depending on the test status. For all levels except `stable` a message will be printed to your build log that informs you about the current status. -## Cleaning up the Git working directory +## Cleaning up the Git Working Directory -The previous version of dpl, our deployment integration tooling, used to -reset your working directory, and delete all changes made during the build +The previous version of dpl - our deployment integration tooling - used to +reset your working directory and delete all changes made during the build using `git stash --all`. In order to keep changes one had to opt out using `skip_cleanup: true`. This default turned out to be useful only for very few -providers, and has been changed in dpl v2. +providers and has been changed in dpl v2. If you do need to clean up the working directory from any changes made during the build process, please opt in to cleanup by adding the following to your @@ -101,13 +101,13 @@ Use the following options to configure conditional deployment: {: data-file=".travis.yml"} * `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 + 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. -* `jdk`, `node`, `perl`, `php`, `python`, `ruby`, `scala`, `go`: for language runtimes that support multiple versions, +* `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. -* `condition`: deploy when *a single* bash condition evaluates to `true`. This must be a string value, and is equivalent to `if [[ ]]; then ; fi`. For example, `$CC = gcc`. +* `condition`: deploy when *a single* bash condition evaluates to `true`. This must be a string value and is equivalent to `if [[ ]]; then ; fi`. For example, `$CC = gcc`. * `tags` can be `true`, `false` or any other string: @@ -193,7 +193,7 @@ deploy: 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). -If you contribute to or experiment with the [deploy tool](https://github.com/travis-ci/dpl) make sure you use the edge version from GitHub: +If you contribute to or experiment with the [deploy tool](https://github.com/travis-ci/dpl), make sure you use the edge version from GitHub: ```yaml deploy: @@ -204,4 +204,4 @@ deploy: ## Pull Requests -Note that pull request builds skip the deployment step altogether. +> Note that pull request builds skip the deployment step altogether. From 5cead9ab466ead276ffe581ef5d96c1c146a9f6e Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Wed, 4 Sep 2019 14:50:09 +0200 Subject: [PATCH 0201/1536] fork the deployment section, add a conditional banner to the layout --- _layouts/en.html | 21 ++ user/deployment-v2/anynines.md | 51 ++++ user/deployment-v2/atlas.md | 77 ++++++ user/deployment-v2/azure-web-apps.md | 99 ++++++++ user/deployment-v2/bintray.md | 200 +++++++++++++++ user/deployment-v2/bitballoon.md | 54 ++++ user/deployment-v2/bluemixcloudfoundry.md | 52 ++++ user/deployment-v2/boxfuse.md | 86 +++++++ user/deployment-v2/cargo.md | 97 +++++++ user/deployment-v2/catalyze.md | 89 +++++++ user/deployment-v2/chefsupermarket.md | 23 ++ user/deployment-v2/cloud66.md | 72 ++++++ user/deployment-v2/cloudfiles.md | 159 ++++++++++++ user/deployment-v2/cloudfoundry.md | 48 ++++ user/deployment-v2/codedeploy.md | 174 +++++++++++++ user/deployment-v2/custom.md | 51 ++++ user/deployment-v2/elasticbeanstalk.md | 70 +++++ user/deployment-v2/engineyard.md | 111 ++++++++ user/deployment-v2/firebase.md | 78 ++++++ user/deployment-v2/gcs.md | 125 +++++++++ user/deployment-v2/google-app-engine.md | 138 ++++++++++ user/deployment-v2/hackage.md | 49 ++++ user/deployment-v2/hephy.md | 66 +++++ user/deployment-v2/heroku.md | 205 +++++++++++++++ user/deployment-v2/lambda.md | 94 +++++++ user/deployment-v2/launchpad.md | 53 ++++ user/deployment-v2/npm.md | 161 ++++++++++++ user/deployment-v2/openshift.md | 155 +++++++++++ user/deployment-v2/opsworks.md | 152 +++++++++++ user/deployment-v2/packagecloud.md | 130 ++++++++++ user/deployment-v2/pages.md | 63 +++++ user/deployment-v2/puppetforge.md | 55 ++++ user/deployment-v2/pypi.md | 170 +++++++++++++ user/deployment-v2/releases.md | 267 +++++++++++++++++++ user/deployment-v2/rubygems.md | 182 +++++++++++++ user/deployment-v2/s3.md | 296 ++++++++++++++++++++++ user/deployment-v2/scalingo.md | 72 ++++++ user/deployment-v2/script.md | 73 ++++++ user/deployment-v2/snaps.md | 74 ++++++ user/deployment-v2/surge.md | 70 +++++ user/deployment-v2/testfairy.md | 82 ++++++ user/deployment-v2/transifex.md | 66 +++++ user/deployment/anynines.md | 1 + user/deployment/atlas.md | 1 + user/deployment/azure-web-apps.md | 1 + user/deployment/bintray.md | 1 + user/deployment/bitballoon.md | 1 + user/deployment/bluemixcloudfoundry.md | 1 + user/deployment/boxfuse.md | 1 + user/deployment/cargo.md | 1 + user/deployment/catalyze.md | 1 + user/deployment/chefsupermarket.md | 1 + user/deployment/cloud66.md | 1 + user/deployment/cloudfiles.md | 1 + user/deployment/cloudfoundry.md | 1 + user/deployment/codedeploy.md | 1 + user/deployment/custom.md | 1 + user/deployment/elasticbeanstalk.md | 5 +- user/deployment/engineyard.md | 1 + user/deployment/firebase.md | 3 +- user/deployment/gcs.md | 1 + user/deployment/google-app-engine.md | 3 +- user/deployment/hackage.md | 1 + user/deployment/hephy.md | 1 + user/deployment/heroku.md | 1 + user/deployment/lambda.md | 1 + user/deployment/launchpad.md | 1 + user/deployment/npm.md | 1 + user/deployment/openshift.md | 1 + user/deployment/opsworks.md | 1 + user/deployment/packagecloud.md | 1 + user/deployment/pages.md | 1 + user/deployment/puppetforge.md | 1 + user/deployment/pypi.md | 1 + user/deployment/releases.md | 5 +- user/deployment/rubygems.md | 1 + user/deployment/s3.md | 3 +- user/deployment/scalingo.md | 1 + user/deployment/script.md | 1 + user/deployment/snaps.md | 3 +- user/deployment/surge.md | 3 +- user/deployment/testfairy.md | 1 + user/deployment/transifex.md | 1 + 83 files changed, 4460 insertions(+), 9 deletions(-) create mode 100644 user/deployment-v2/anynines.md create mode 100644 user/deployment-v2/atlas.md create mode 100644 user/deployment-v2/azure-web-apps.md create mode 100644 user/deployment-v2/bintray.md create mode 100644 user/deployment-v2/bitballoon.md create mode 100644 user/deployment-v2/bluemixcloudfoundry.md create mode 100644 user/deployment-v2/boxfuse.md create mode 100644 user/deployment-v2/cargo.md create mode 100644 user/deployment-v2/catalyze.md create mode 100644 user/deployment-v2/chefsupermarket.md create mode 100644 user/deployment-v2/cloud66.md create mode 100644 user/deployment-v2/cloudfiles.md create mode 100644 user/deployment-v2/cloudfoundry.md create mode 100644 user/deployment-v2/codedeploy.md create mode 100644 user/deployment-v2/custom.md create mode 100644 user/deployment-v2/elasticbeanstalk.md create mode 100644 user/deployment-v2/engineyard.md create mode 100644 user/deployment-v2/firebase.md create mode 100644 user/deployment-v2/gcs.md create mode 100644 user/deployment-v2/google-app-engine.md create mode 100644 user/deployment-v2/hackage.md create mode 100644 user/deployment-v2/hephy.md create mode 100644 user/deployment-v2/heroku.md create mode 100644 user/deployment-v2/lambda.md create mode 100644 user/deployment-v2/launchpad.md create mode 100644 user/deployment-v2/npm.md create mode 100644 user/deployment-v2/openshift.md create mode 100644 user/deployment-v2/opsworks.md create mode 100644 user/deployment-v2/packagecloud.md create mode 100644 user/deployment-v2/pages.md create mode 100644 user/deployment-v2/puppetforge.md create mode 100644 user/deployment-v2/pypi.md create mode 100644 user/deployment-v2/releases.md create mode 100644 user/deployment-v2/rubygems.md create mode 100644 user/deployment-v2/s3.md create mode 100644 user/deployment-v2/scalingo.md create mode 100644 user/deployment-v2/script.md create mode 100644 user/deployment-v2/snaps.md create mode 100644 user/deployment-v2/surge.md create mode 100644 user/deployment-v2/testfairy.md create mode 100644 user/deployment-v2/transifex.md diff --git a/_layouts/en.html b/_layouts/en.html index 4167d4f6ba7..c715ec6bb54 100644 --- a/_layouts/en.html +++ b/_layouts/en.html @@ -18,6 +18,27 @@

        {{ page.title }}

        {% endunless %} + {% if page.deploy == 'v1' %} +
        +

        + This page documents deployments using dpl v1 which currently is the default + version. The next major version dpl v2 will be released soon, and we recommend + starting to use it. Please see our blog post + for details. Documentation for dpl v2 can be found here. +

        +
        + {% elsif page.deploy == 'v2' %} +
        +

        + This page documents deployments using the next major version dpl v2 which + currently is in a preview release phase. Please see our blog post + for details. Documentation for dpl v1, the current default version, can be + found here. +

        +
        + {% endif %} + + {% unless page.no_toc %}
        {% include toc.html h_min=2 h_max=2 class="list-language" santize=true html=content %} diff --git a/user/deployment-v2/anynines.md b/user/deployment-v2/anynines.md new file mode 100644 index 00000000000..38831a8b02c --- /dev/null +++ b/user/deployment-v2/anynines.md @@ -0,0 +1,51 @@ +--- +title: anynines Deployment +layout: en +deploy: v2 + +--- + +You now have the amazing ability to deploy directly to [anynines](http://www.anynines.com/) after a successful build on Travis CI + +## Getting on the Edge + +Proper anynines support is currently included only in the edge version of Travis. See how to enable it via the `.travis.yml` below. + +## The Easy Way + +Go Grab the Travis gem from [GitHub](https://github.com/travis-ci/travis.rb) and run this command: + +`travis setup anynines` + +You will be asked to answer a few simple questions about your anynines setup and Travis will take care of the rest! + +Open up your newly created `.travis.yml` and add `edge: true` to enable the deploy tool. See yml below for an example of how to do this. + +## The Slightly Harder Way + +So you want to write your own `.travis.yml`, fine. Here is the minimum required to get up and running + +```yaml + deploy: + edge: true + provider: anynines + username: johndoe@example.com + password: secretpassword + organization: myorganization + space: staging + app_name: My app name # (optional) +``` +{: data-file=".travis.yml"} + +***Make sure that you encrypt your password before pushing your updated .travis.yml to GitHub.*** + +This can be easily accomplished using the Travis gem above and running: + +``` +travis encrypt --add deploy.password +``` + +### Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). diff --git a/user/deployment-v2/atlas.md b/user/deployment-v2/atlas.md new file mode 100644 index 00000000000..3307a0e37ff --- /dev/null +++ b/user/deployment-v2/atlas.md @@ -0,0 +1,77 @@ +--- +title: Atlas deployment +layout: en +deploy: v2 + +--- + +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. +2. [Generate](https://atlas.hashicorp.com/settings/tokens) an Atlas API token for Travis CI. +3. Add the following minimum configuration to your `.travis.yml` + + ```yaml + deploy: + provider: atlas + token: "YOUR ATLAS API TOKEN" + app: "YOUR ATLAS USERNAME/YOUR ATLAS APP NAME" + ``` + {: data-file=".travis.yml"} + +## Including or Excluding Files + +You can include and exclude files by adding the `include` and `exclude` entries to `.travis.yml`. Both are glob patterns of files or directories to include or exclude, and may be specified multiple times. If there is a conflict, excludes have precedence over includes. + +```yaml +deploy: + provider: atlas + exclude: "*.log" + include: + - "build/*" + - "bin/*" +``` +{: data-file=".travis.yml"} + +### Using your Version Control System + +Get the lists of files to exclude and include from your version control system (Git, Mercurial or Subversion): + +```yaml +deploy: + provider: atlas + vcs: true +``` +{: data-file=".travis.yml"} + +## Other Deployment Options + +### Specifying the Address of the Atlas Server: + +```yaml +deploy: + provider: atlas + address: "URL OF THE ATLAS SERVER" +``` +{: data-file=".travis.yml"} + +### Adding Custom Metadata + +Add one or more items of metadata: + +```yaml +deploy: + provider: atlas + metadata: + - "custom_name=Jane" + - "custom_surname=Doe" +``` +{: data-file=".travis.yml"} + +{{ site.data.snippets.conditional_deploy }} + +{{ site.data.snippets.before_and_after }} diff --git a/user/deployment-v2/azure-web-apps.md b/user/deployment-v2/azure-web-apps.md new file mode 100644 index 00000000000..855371d82d7 --- /dev/null +++ b/user/deployment-v2/azure-web-apps.md @@ -0,0 +1,99 @@ +--- +title: Azure Web App Deployment +layout: en +deploy: v2 + +--- + +Travis CI can automatically deploy your [Azure Web App](https://azure.microsoft.com/en-us/services/app-service/web/) after a successful build. + +For a minimal configuration, all you need to do is enable [Local Git Deployment](https://azure.microsoft.com/en-us/documentation/articles/app-service-deploy-local-git/) and add the following to your `.travis.yml`: + +```yaml +deploy: + provider: azure_web_apps + username: azure_deployment_user # If AZURE_WA_USERNAME isn't set + password: azure_deployment_password # If AZURE_WA_PASSWORD isn't set + site: azure_deployment_sitename # If AZURE_WA_SITE isn't set + slot: azure_deployment_slotname # (optional) If AZURE_WA_SLOT isn't set +``` +{: data-file=".travis.yml"} + +It is not recommended that you put your Azure Deployment credentials unencrypted into your `.travis.yml`. Instead, use hidden environment variables or encrypted 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. As an alternative to the web interface, you can also use the CLI's [`env`](https://github.com/travis-ci/travis.rb#env) command. + +
        + Travis CI Settings +
        Environment Variables in the Repository Settings
        +
        + +### Fetch Deployment Progress and Logs + +The Azure Web App provider can print Azure's deployment progress to your Travis log using the `verbose` option. However, Git will print your password if the authentication fails (it will not if you provide a correct user/password combination). + +``` +deploy: + provider: azure_web_apps + verbose: true +``` + +### Branch to deploy from + +By default, Travis CI will only deploy from your **master** branch. + +You can explicitly specify the branch to deploy from with the **on** option: + +``` +deploy: + provider: azure_web_apps + on: production +``` + +Alternatively, you can also configure it to deploy from all branches: + +``` +deploy: + provider: azure_web_apps + on: + all_branches: true +``` + +Builds triggered from Pull Requests will never trigger a deploy. + +### Note on `.gitignore` + +As this deployment strategy relies on `git`, be mindful that the deployment will +honor `.gitignore`. + +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 + +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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} + +### Deploying to slots + +You might need to deploy multiple branches to different slots. You can set multiple providers to deploy to specific slots. The following configuration would deploy the `master` branch to the `myapp-staging` slot and the `develop` branch to the `myapp-develop` slot. In order to use slots you'll need to [set up staging environments for web apps in Azure App Service](https://azure.microsoft.com/en-us/documentation/articles/web-sites-staged-publishing/). + +```yaml +deploy: +- provider: azure_web_apps + slot: myapp-staging +- provider: azure_web_apps + slot: myapp-develop + on: develop +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/bintray.md b/user/deployment-v2/bintray.md new file mode 100644 index 00000000000..d2283eb860d --- /dev/null +++ b/user/deployment-v2/bintray.md @@ -0,0 +1,200 @@ +--- +title: Bintray Deployment +layout: en +deploy: v2 + +--- + +Travis CI can automatically deploy your build artifacts to [Bintray](https://bintray.com/). + +Here is an example `.travis.yml`: + +```yaml +deploy: + provider: bintray + file: "Path to a descriptor file, containing information for the Bintray upload" + user: "Bintray user" + key: "Bintray API key" + passphrase: "Optional. In case a passphrase is configured on Bintray and GPG signing is used" + skip_cleanup: true # to upload artifacts created during the build +``` +{: data-file=".travis.yml"} + +### Encrypt your API key + +It is recommended that you encrypt your api key. You can encrypt this key using the `travis` command line client and this command: + +```bash +$ travis encrypt --add deploy.key +``` + +Example: + +```bash +$ travis encrypt ab012cd345678901234e456fa7bc89def01a23b4 --add deploy.key +``` + + + +### Branch to deploy from + +By default, Travis CI will only deploy from your **master** branch. + +You can explicitly specify the branch to deploy from with the **on** option: + +```yaml +deploy: + .. + on: production +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure it to deploy from all branches: + +```yaml +deploy: + .. + on: + all_branches: true +``` +{: data-file=".travis.yml"} + +Builds triggered from Pull Requests will never trigger a deploy. + +### Conditional Deploys + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +### 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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} + +### `dry_run` option + +For testing deployment configuration, you can add `dry_run: true` to prevent connecting +to the Bintray server: + +```yaml +deploy: + .. + dry_run: true +``` +{: data-file=".travis.yml"} + +### Descriptor file example + +The descriptor is in JSON file format in three sections: + +```js +{ + "package": { + "name": "auto-upload", + "repo": "myRepo", + "subject": "myBintrayUser", + "desc": "I was pushed completely automatically", + "website_url": "www.jfrog.com", + "issue_tracker_url": "https://github.com/bintray/bintray-client-java/issues", + "vcs_url": "https://github.com/bintray/bintray-client-java.git", + "github_use_tag_release_notes": true, + "github_release_notes_file": "RELEASE.txt", + "licenses": ["MIT"], + "labels": ["cool", "awesome", "gorilla"], + "public_download_numbers": false, + "public_stats": false, + "attributes": [{"name": "att1", "values" : ["val1"], "type": "string"}, + {"name": "att2", "values" : [1, 2.2, 4], "type": "number"}, + {"name": "att5", "values" : ["2014-12-28T19:43:37+0100"], "type": "date"}] + }, + + "version": { + "name": "0.5", + "desc": "This is a version", + "released": "2015-01-04", + "vcs_tag": "0.5", + "attributes": [{"name": "VerAtt1", "values" : ["VerVal1"], "type": "string"}, + {"name": "VerAtt2", "values" : [1, 3.3, 5], "type": "number"}, + {"name": "VerAtt3", "values" : ["2015-01-01T19:43:37+0100"], "type": "date"}], + "gpgSign": false + }, + + "files": + [ + {"includePattern": "build/bin(.*)*/(.*\\.gem)", "excludePattern": ".*/do-not-deploy/.*", "uploadPattern": "gems/$2"}, + {"includePattern": "build/docs/(.*)", "uploadPattern": "docs/$1"} + ], + "publish": true +} +``` + +#### Package Section + +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 version control system url, such as a github repository url +- `licenses` is the [Bintray licences](https://bintray.com/docs/api/#_licenses){: data-proofer-ignore=""}, which is a list with at least one item. + + +#### Version Section + +Package version information. In case the version already exists on Bintray, only the name field is mandatory. + +#### Files Section + +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. 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. + +In the example above, the following files are uploaded: + +- All gem files located under `build/bin/` (including sub directories), except for files under a `do-not-deploy` directory. The files will be uploaded to Bintray under the `gems` folder. +- All files under `build/docs`. The files will be uploaded to Bintray under the `docs` folder. + +**Note:** Regular expressions defined as part of the `includePattern` and `excludePattern` properties must be wrapped with brackets. + +#### Debian Upload + +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": "pool/main/m/mypackage/$1", + "matrixParams": { + "deb_distribution": "vivid", + "deb_component": "main", + "deb_architecture": "amd64"} + } +] +``` + +#### Overwriting Existing Files + +If an artifact by a given name already exists in the Bintray repository, then by default it is not overwritten. If you want to replace the existing file, define the `override` key in your matrix properties: + +```js +"files": + [{"includePattern": "build/bin/(myfile.bin)", "uploadPattern": "$1", + "matrixParams": { + "override": 1 } + } +] +``` diff --git a/user/deployment-v2/bitballoon.md b/user/deployment-v2/bitballoon.md new file mode 100644 index 00000000000..669bac5f279 --- /dev/null +++ b/user/deployment-v2/bitballoon.md @@ -0,0 +1,54 @@ +--- +title: BitBalloon Deployment +layout: en +deploy: v2 + +--- + + + +Travis CI can automatically deploy files to +[BitBalloon](https://www.bitballoon.com/) after a successful build. + +To deploy the current directory to BitBalloon, add your encrypted BitBalloon `site-id` and `access-token` to your `.travis.yml`: + +```yaml +deploy: + provider: bitballoon + site-id: + secure: "YOUR ENCRYPTED SITE ID" + access-token: + secure: "YOUR ENCRYPTED ACCESS TOKEN" +``` +{: data-file=".travis.yml"} + +## Deploying a specific directory + +To deploy a specific directory to BitBalloon, use the `local-dir` key: + +```yaml +deploy: + provider: bitballoon + site-id: + secure: "YOUR ENCRYPTED SITE ID" + access-token: + secure: "YOUR ENCRYPTED ACCESS TOKEN" + local-dir: "_build/" +``` +{: data-file=".travis.yml"} + +## 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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/bluemixcloudfoundry.md b/user/deployment-v2/bluemixcloudfoundry.md new file mode 100644 index 00000000000..6c2af71fe20 --- /dev/null +++ b/user/deployment-v2/bluemixcloudfoundry.md @@ -0,0 +1,52 @@ +--- +title: Bluemix CloudFoundry Deployment +layout: en +deploy: v2 + +--- + +You now have the ability to deploy directly to [IBM Bluemix](http://bluemix.net/) after a successful build on Travis CI. + +## The Easy Way + +Go grab [the Travis gem from GitHub](https://github.com/travis-ci/travis.rb) and run this command: + +```bash +travis setup bluemixcloudfoundry +``` + +You will need the following information about your Bluemix environment: username, password, organization, space, and region. Available Bluemix regions are US South (ng) London (eu-gb), and Sydney (au-syd). Travis offers to encrypt your password, and will take care of the rest. Learn more about [managing organizations and spaces](http://bluemix.net/docs/admin/orgs_spaces.html). + +## The Slightly Harder Way + +You can also directly edit your `.travis.yml`. Insert the following to get up and running: + +```yaml + deploy: + edge: true + provider: bluemixcloudfoundry + username: brian_knobbs@example.com + password: somewhatsecretpassword + organization: myawesomeorganization + space: staging + manifest: manifest-prod.yml # (optional) Defaults to manifest.yml. + app_name: My app name # (optional) + region: eu-gb # (optional) [ng, eu-gb , au-syd] Defaults to US South region (ng). + api: https://api.ng.bluemix.net # (optional) Overrides region setting if specified for Bluemix local installations. +``` +{: data-file=".travis.yml"} + +***Make sure that you encrypt your password before pushing your updated .travis.yml to GitHub.*** + +You can do this using the Travis gem by running: + +```bash +travis encrypt --add deploy.password +``` + +If your password includes symbols (such as braces, parentheses, backslashes, and pipe symbols), [you must escape those symbols before running `travis encrypt`](/user/encryption-keys/#note-on-escaping-certain-symbols). + +### Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). diff --git a/user/deployment-v2/boxfuse.md b/user/deployment-v2/boxfuse.md new file mode 100644 index 00000000000..51508c74695 --- /dev/null +++ b/user/deployment-v2/boxfuse.md @@ -0,0 +1,86 @@ +--- +title: Boxfuse Deployment +layout: en +deploy: v2 + +--- + +Travis CI can automatically deploy your [Boxfuse](https://boxfuse.com/) application after a successful build. + +For a minimal configuration, all you need to do is add the following to your `.travis.yml`: + +```yaml +deploy: + provider: boxfuse + user: "YOUR BOXFUSE CLIENT USER" + secret: "YOUR BOXFUSE CLIENT SECRET" + payload: "YOUR APPLICATION ARTIFACT (typically a jar, war, tar.gz or zip file)" +``` +{: data-file=".travis.yml"} + +We recommended that you encrypt your Boxfuse user and secret. Assuming you have the Travis CI command line client installed, you can do it like this (you will be prompted for values on the command line): + +```bash +travis encrypt --add deploy.user +travis encrypt --add deploy.secret +``` + +Alternatively you can pass in your credentials using Travis CI [encrypted environment variables](/user/environment-variables/#encrypting-environment-variables) called `BOXFUSE_USER` and `BOXFUSE_SECRET`. You can define these variables either using the Travis CI command line client or directly in the Travis CI repository settings UI. + +Finally you can also fully configure Boxfuse by placing a `boxfuse.conf` file in the root of your repository. More info about configuration in the [Boxfuse Command-line Client documentation](https://boxfuse.com/docs/commandline/). + +### Specifying the Boxfuse app and image version + +By default Boxfuse will detect the app and the version automatically from the name of your payload file. You can override this like this: + +```yaml +deploy: + provider: boxfuse + user: "YOUR BOXFUSE CLIENT USER" + secret: "YOUR BOXFUSE CLIENT SECRET" + payload: "YOUR APPLICATION ARTIFACT (typically a jar, war, tar.gz or zip file)" + image: "YOUR BOXFUSE APP AND VERSION (ex.: myapp:1.23)" +``` +{: data-file=".travis.yml"} + +You can also use Travis CI [environment variables](/user/environment-variables) like `TRAVIS_BUILD_NUMBER` to assign a version to the image. Ex.: `image: "myapp:$TRAVIS_BUILD_NUMBER"` + +### Specifying the Boxfuse environment + +By default Boxfuse will deploy to your `test` environment. You can override this like this: + +```yaml +deploy: + provider: boxfuse + user: "YOUR BOXFUSE CLIENT USER" + secret: "YOUR BOXFUSE CLIENT SECRET" + payload: "YOUR APPLICATION ARTIFACT (typically a jar, war, tar.gz or zip file)" + env: "YOUR BOXFUSE ENVIRONMENT (default: test)" +``` +{: data-file=".travis.yml"} + +### Using alternative configuration files + +You can also fully configure Boxfuse by placing a `boxfuse.conf` file in the root of your repository. You can specify an alternative configuration file like this: + +```yaml +deploy: + provider: boxfuse + configfile: "YOUR BOXFUSE CONFIGURATION FILE" +``` +{: data-file=".travis.yml"} + +### Specifying custom arguments + +If the [Boxfuse Client](https://boxfuse.com/docs/commandline) functionality you need is not included here, you can pass additional arguments to the Boxfuse executable by using the `extra_args` parameter: + +```yaml +deploy: + provider: boxfuse + extra_args: "YOUR EXTRA ARGS (ex.: -X)" +``` +{: data-file=".travis.yml"} + +### Further information + +Go to the [Boxfuse website](https://boxfuse.com) to learn more about Boxfuse and how to configure it. diff --git a/user/deployment-v2/cargo.md b/user/deployment-v2/cargo.md new file mode 100644 index 00000000000..5af9b48ae29 --- /dev/null +++ b/user/deployment-v2/cargo.md @@ -0,0 +1,97 @@ +--- +title: Cargo Releases +layout: en +deploy: v2 +--- + +Travis CI can automatically release your Rust crate to [crates.io][] +after a successful build. (Alternative registries may be supported in the +future). + +A minimal `.travis.yml` configuration for publishing to [crates.io][] looks like: + +```yaml +language: rust +deploy: + provider: cargo + token: "YOUR_API_TOKEN" +``` +{: data-file=".travis.yml"} + +## crates.io API token + +An API token can be obtained by logging in to your [crates.io][] account, and +generating a new token at . + +Always [encrypt](/user/encryption-keys/#usage) your API token. Assuming you +have the Travis CI command line client installed, you can do it like this: + +```bash +$ travis encrypt YOUR_API_TOKEN --add deploy.token +``` + +## What to release + +Most likely, you would only want to deploy to crates.io when a new version of +your package is cut. To do this, you can tell Travis CI to only deploy on tagged +commits, like so: + +```yaml +deploy: + ... + on: + tags: true +``` +{: data-file=".travis.yml"} + +If you tag a commit locally, remember to run `git push --tags` to ensure that +your tags are uploaded to GitHub. + +You can explicitly specify the branch to release from with the **on** option: + +```yaml +deploy: + ... + on: + branch: production +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure Travis CI to release from all branches: + +```yaml +deploy: + ... + on: + all_branches: true +``` +{: data-file=".travis.yml"} + +Builds triggered from Pull Requests will never trigger a release. + +## Releasing build artifacts + +After your tests ran and before the release, Travis CI will clean up any +additional files and changes you made. + +This is necessary because Cargo will refuse to publish crates from a dirty +working directory (an option to allow this may be added to this provider in the +future). + +## 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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} + +[crates.io]: https://crates.io/ diff --git a/user/deployment-v2/catalyze.md b/user/deployment-v2/catalyze.md new file mode 100644 index 00000000000..3dc498c019c --- /dev/null +++ b/user/deployment-v2/catalyze.md @@ -0,0 +1,89 @@ +--- +title: Catalyze Deployment +layout: en +deploy: v2 + +--- + + + +Travis CI can automatically deploy to [Catalyze](https://www.catalyze.io/) after +a successful build. + +Before configuring your `.travis.yml` you need to: + +1. Find your Catalyze git remote: + 1. Make sure your Catalyze environment is + [associated](https://resources.datica.com/compliant-cloud/articles/initial-setup/#sts=4. Associate to Your Environment). + 2. Get the git remote by running `git remote -v`{: #remote} from within the associated repository. + + 3. Edit your `.travis.yml`: + + ```yaml + deploy: + provider: catalyze + target: "ssh://git@git.catalyzeapps.com:2222/app1234.git" + ``` + {: data-file=".travis.yml"} + +2. Set up a deployment key to Catalyze for Travis CI: + 1. Install the Travis CI [command line client](https://github.com/travis-ci/travis.rb). + 2. Get the public SSH key for your Travis CI project and save it to a file by running + + ```bash + travis pubkey > travis.pub + ``` + + 3. Add the key as a deploy key using the catalyze command line client within + the associated repo. For example: + + ```bash + catalyze deploy-keys add travisci ./travis.pub code-1 + ``` + + where `code-1` is the name of your service. + +3. Set up Catalyze as a known host for Travis CI: + 1. List your known hosts by running `cat ~/.ssh/known_hosts`. + 2. Find and copy the line from known_hosts that includes the git remote found in [Step 1](#remote){: data-proofer-ignore=""}. It'll look something like + + ``` + [git.catalyzeapps.com]:2222 ecdsa-sha2-nistp256 BBBB12abZmKlLXNo... + ``` + + 3. Update your `before_deploy` step in `.travis.yml` to update the `known_hosts` file: + + ```yaml + before_deploy: echo "[git.catalyzeapps.com]:2222 ecdsa-sha2-nistp256 BBBB12abZmKlLXNo..." >> ~/.ssh/known_hosts + ``` + {: data-file=".travis.yml"} + +### Deploying a subset of your Files + +To only deploy the `build` folder, for example, set `skip_cleanup: true` and +path: "build": + +```yaml +deploy: + provider: catalyze + target: "ssh://git@git.catalyzeapps.com:2222/app1234.git" + skip_cleanup: true + path: "build" +``` +{: data-file=".travis.yml"} + +### 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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/chefsupermarket.md b/user/deployment-v2/chefsupermarket.md new file mode 100644 index 00000000000..18a1dfc44b4 --- /dev/null +++ b/user/deployment-v2/chefsupermarket.md @@ -0,0 +1,23 @@ +--- +title: Chef Supermarket deployment +layout: en +deploy: v2 + +--- + +Travis CI can automatically deploy your cookbook to [Chef +Supermarket](https://supermarket.chef.io/) after a successful build. + +To deploy to Chef Supermarket add your Chef Supermarket `user_id`, your +[encrypted](/user/encrypting-files) Chef Supermarket client key and the +[`cookbook_category`](https://docs.getchef.com/knife_cookbook_site.html#id12) to +your `.travis.yml`: + +```yaml +deploy: + provider: chef-supermarket + user_id: "" + # the encrypted client key file is decrypted in the before_install stage of the build when you add it using the instructions above + cookbook_category: "Others" +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/cloud66.md b/user/deployment-v2/cloud66.md new file mode 100644 index 00000000000..927fd55b3be --- /dev/null +++ b/user/deployment-v2/cloud66.md @@ -0,0 +1,72 @@ +--- +title: Cloud 66 Deployment +layout: en +deploy: v2 +--- + +Travis CI can automatically deploy your [Cloud 66](https://www.cloud66.com/) application after a successful build. + +For a minimal configuration, all you need to do is add the following to your `.travis.yml`: + +```yaml +deploy: + provider: cloud66 + redeployment_hook: "YOUR REDEPLOYMENT HOOK URL" +``` +{: data-file=".travis.yml"} + +You can find the redeployment hook in the information menu within the Cloud 66 portal. + +You can also have the `travis` tool set up everything for you: + +```bash +travis setup cloud66 +``` + +Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. + +### Branch to deploy from + +By default, Travis CI will only deploy from your **master** branch. + +You can explicitly specify the branch to deploy from with the **on** option: + +```yaml +deploy: + provider: cloud66 + redeployment_hook: "YOUR REDEPLOYMENT HOOK URL" + on: production +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure it to deploy from all branches: + +```yaml +deploy: + provider: cloud66 + redeployment_hook: "YOUR REDEPLOYMENT HOOK URL" + on: + all_branches: true +``` +{: data-file=".travis.yml"} + +Builds triggered from Pull Requests will never trigger a deploy. + +### Conditional Deploys + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +### 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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/cloudfiles.md b/user/deployment-v2/cloudfiles.md new file mode 100644 index 00000000000..e9df55c806b --- /dev/null +++ b/user/deployment-v2/cloudfiles.md @@ -0,0 +1,159 @@ +--- +title: Rackspace Cloud Files Deployment +layout: en +deploy: v2 + +--- + +Travis CI can automatically upload your build to [Rackspace Cloud Files](https://www.rackspace.com/cloud/files/) after a successful build. + +For a minimal configuration, all you need to do is add the following to your `.travis.yml`: + +```yaml +deploy: + provider: cloudfiles + username: "RACKSPACE USERNAME" + api_key: "RACKSPACE API KEY" + region: "CLOUDFILE REGION" + container: "CLOUDFILES CONTAINER NAME" +``` +{: data-file=".travis.yml"} + +This example is almost certainly not ideal, as you probably want to upload your built binaries and documentation. Set skip_cleanup to true to prevent Travis CI from deleting your build artifacts. + +```yaml +deploy: + provider: cloudfiles + username: "RACKSPACE USERNAME" + api_key: "RACKSPACE API KEY" + region: "CLOUDFILE REGION" + container: "CLOUDFILES CONTAINER NAME" + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +It is recommended encrypt that you encrypt your Rackspace api key. +Assuming you have the Travis CI command line client installed, you can do it like this: + +```bash +travis encrypt --add deploy.api-key +``` + +You will be prompted to enter your api key on the command line. + +You can also have the `travis` tool set up everything for you: + +```bash +travis setup cloudfiles +``` + +Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. + +### Deploy On Tags + +Often, you want to deploy only when you release a new version of your code. + +You can tell Travis CI only to deploy on tags, like this: + +```yaml +deploy: + provider: cloudfiles + username: "RACKSPACE USERNAME" + api_key: "RACKSPACE API KEY" + region: "CLOUDFILE REGION" + container: "CLOUDFILES CONTAINER NAME" + skip_cleanup: true + on: + tags: true +``` +{: data-file=".travis.yml"} + +### Deploy To Only One Folder + +Often, you don't want to upload your entire project to Cloud Files. You can tell Travis CI to only upload a single folder to Cloud Files. This example uploads the build directory of your project to Cloud Files: + +```yaml +before_deploy: "cd build" +deploy: + provider: cloudfiles + username: "RACKSPACE USERNAME" + api_key: "RACKSPACE API KEY" + region: "CLOUDFILE REGION" + container: "CLOUDFILES CONTAINER NAME" + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +### Deploy to Multiple Containers: + +If you want to upload to multiple containers, you can do this: + +```yaml +deploy: + - provider: cloudfiles + username: "RACKSPACE USERNAME" + api_key: "RACKSPACE API KEY" + region: "CLOUDFILE REGION" + container: "CLOUDFILES CONTAINER NAME" + skip_cleanup: true + - provider: cloudfiles + username: "RACKSPACE USERNAME" + api_key: "RACKSPACE API KEY" + region: "CLOUDFILE REGION" + container: "CLOUDFILES CONTAINER NAME" + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +### Branch to release from + +You can explicitly specify the branch to release from with the **on** option: + +```yaml +deploy: + provider: cloudfiles + username: "RACKSPACE USERNAME" + api_key: "RACKSPACE API KEY" + region: "CLOUDFILE REGION" + container: "CLOUDFILES CONTAINER NAME" + skip_cleanup: true + on: + branch: production +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure Travis CI to release from all branches: + +```yaml +deploy: + provider: cloudfiles + username: "RACKSPACE USERNAME" + api_key: "RACKSPACE API KEY" + region: "CLOUDFILE REGION" + container: "CLOUDFILES CONTAINER NAME" + skip_cleanup: true + on: + all_branches: true +``` +{: data-file=".travis.yml"} + +Builds triggered from Pull Requests will never trigger a release. + +### Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +### Running commands before and after release + +Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/cloudfoundry.md b/user/deployment-v2/cloudfoundry.md new file mode 100644 index 00000000000..90b65dea068 --- /dev/null +++ b/user/deployment-v2/cloudfoundry.md @@ -0,0 +1,48 @@ +--- +title: CloudFoundry Deployment +layout: en +deploy: v2 + +--- + +You now have the amazing ability to deploy directly to [CloudFoundry](https://run.pivotal.io/) after a successful build on Travis CI. + +## The Easy Way + +Go grab [the Travis gem from GitHub](https://github.com/travis-ci/travis.rb) and run this command: + +`travis setup cloudfoundry` + +You will be asked to answer a few simple questions about your CloudFoundry setup, and Travis will take care of the rest! + +## The Slightly Harder Way + +So you want to write your own `.travis.yml`, fine. Here is the minimum required to get up and running: + +```yaml + deploy: + provider: cloudfoundry + username: hulk_hogan@example.com + password: supersecretpassword + api: https://api.run.pivotal.io + organization: myawesomeorganization + space: staging + manifest: manifest-staging.yml # (optional) Defaults to manifest.yml. + app_name: My app name # (optional) +``` +{: data-file=".travis.yml"} + +***Make sure that you encrypt your password before pushing your updated .travis.yml to GitHub.*** + +You can do this using the Travis gem above and running: + +```bash +travis encrypt --add deploy.password +``` + +If your password includes symbols (such as braces, parentheses, backslashes, and pipe symbols), [you must escape those symbols before running `travis encrypt`](/user/encryption-keys/#note-on-escaping-certain-symbols). + +### Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). diff --git a/user/deployment-v2/codedeploy.md b/user/deployment-v2/codedeploy.md new file mode 100644 index 00000000000..55960ddf923 --- /dev/null +++ b/user/deployment-v2/codedeploy.md @@ -0,0 +1,174 @@ +--- +title: AWS CodeDeploy +layout: en +deploy: v2 + +--- + +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 +deploy: + - provider: s3 + # rest of S3 deployment for MyApp.zip + # ⋮ + - provider: codedeploy + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" + key: latest/MyApp.zip + application: MyApp + deployment_group: MyDeploymentGroup +``` +{: data-file=".travis.yml"} + +Note that in this example, Travis CI will attempt to deploy to an existing CodeDeploy Application called MyApp in AWS Region `us-east-1`. + +A complete example can be found [here](https://github.com/travis-ci/cat-party/blob/master/.travis.yml). + +You can find your AWS Access Keys [here](https://console.aws.amazon.com/iam/home?#security_credential). It is recommended to encrypt that key. + +If your CodeDeploy application lives in any region other than `us-east-1` please add a region field to `.travis.yml` (see [AWS-region-to-deploy-to](/user/deployment/codedeploy#aws-region-to-deploy-to)). + +Assuming you have the Travis CI command line client installed, you can do it like this: + +```bash +travis encrypt --add deploy.secret_access_key +``` + +You will be prompted to enter your api key on the command line. + +You can also have the `travis` tool set up everything for you: + +```bash +travis setup codedeploy +``` + +Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. + +This command will also offer to set up [S3 deployment](/user/deployment/s3/), if you want to bundle to be uploaded from the Travis CI build. + +## Branch to deploy from + +You can explicitly specify the branch to deploy from with the **on** option: + +```yaml +deploy: + provider: codedeploy + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" + key: latest/MyApp.zip + bundle_type: zip + application: MyApp + deployment_group: MyDeploymentGroup + on: + branch: production +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure Travis CI to deploy from all branches: + +```yaml +deploy: + provider: codedeploy + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" + key: latest/MyApp.zip + bundle_type: zip + application: MyApp + deployment_group: MyDeploymentGroup + on: + all_branches: true +``` +{: data-file=".travis.yml"} + +Builds triggered from Pull Requests will never trigger a release. + +## S3 deployment or GitHub deployment + +For a minimal configuration with GitHub, add the following to your `.travis.yml`: + +```yaml +deploy: + - provider: codedeploy + revision_type: github + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + application: "Your Codedeploy application" + deployment_group: "The Deployment group associated with the codedeploy application" + region: "Region in which your ec2 instance is." +``` +{: data-file=".travis.yml"} + +Please note that `region` should match the instance region on which codedeploy is configured. + +## 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: + +```yaml +deploy: + provider: codedeploy + wait_until_deployed: true + # ⋮ +``` +{: data-file=".travis.yml"} + +Travis CI will wait for the deploy to complete, and log whether it succeeded. + +## 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 extension 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). + +## Note on `.gitignore` + +As this deployment strategy relies on `git`, be mindful that the deployment will +honor `.gitignore`. + +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 + +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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + # ⋮ +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} + +## AWS region to deploy to + +You can explicitly specify the AWS region to deploy to with the **region** option: + +```yaml +deploy: + provider: codedeploy + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" + key: latest/MyApp.zip + bundle_type: zip + application: MyApp + deployment_group: MyDeploymentGroup + region: us-west-1 +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/custom.md b/user/deployment-v2/custom.md new file mode 100644 index 00000000000..01d1964b2a3 --- /dev/null +++ b/user/deployment-v2/custom.md @@ -0,0 +1,51 @@ +--- +title: Custom Deployment +layout: en +deploy: v2 + +--- + +You can deploy to your own server the way you would deploy from your local +machine by adding a custom [`after_success`](/user/customizing-the-build/) step. + +You may choose the [Script provider](/user/deployment/script/) instead, as it +provides conditional deployment. + +### SFTP + +```yaml +env: + global: + - 'SFTP_USER=[user]' + - 'SFTP_PASSWORD=[password]' + - 'SFTP_KEY=[base64-encoded-rsa-key]' +after_success: +- echo "${SFTP_KEY}" | base64 --decode >/tmp/sftp_rsa +- curl --ftp-create-dirs + -T filename + --key /tmp/sftp_rsa + sftp://${SFTP_USER}:${SFTP_PASSWORD}@example.com/directory/filename +``` +{: data-file=".travis.yml"} + +The env variables `SFTP_USER` and `SFTP_PASSWORD` can also be +[encrypted](/user/encryption-keys/). + +See [curl(1)](http://curl.haxx.se/docs/manpage.html) for more details on how to +use cURL as an SFTP client. + +### Git + +This should also work with services you can deploy to via git. + +```yaml +after_success: + - eval "$(ssh-agent -s)" #start the ssh agent + - chmod 600 .travis/deploy_key.pem # this key should have push access + - ssh-add .travis/deploy_key.pem + - git remote add deploy DEPLOY_REPO_URI_GOES_HERE + - git push deploy +``` +{: data-file=".travis.yml"} + +See ["How can I encrypt files that include sensitive data?"](/user/travis-ci-for-private/#how-can-i-encrypt-files-that-include-sensitive-data) if you don't want to commit the private key unencrypted to your repository. diff --git a/user/deployment-v2/elasticbeanstalk.md b/user/deployment-v2/elasticbeanstalk.md new file mode 100644 index 00000000000..732290f09b4 --- /dev/null +++ b/user/deployment-v2/elasticbeanstalk.md @@ -0,0 +1,70 @@ +--- +title: AWS Elastic Beanstalk Deployment +layout: en +deploy: v2 + +--- + + + +Travis CI can automatically deploy your application to [Elastic +Beanstalk](https://aws.amazon.com/documentation/elastic-beanstalk/) after a +successful build. + +To deploy to AWS Elastic Beanstalk add the following to your `.travis.yml`: + +* `access-key-id`: [Encrypted](/user/encryption-keys#usage) AWS Access Key ID, obtained from your [AWS Console](https://console.aws.amazon.com/iam/home?#security_credential). +* `secret-access-key`: [Encrypted](/user/encryption-keys#usage) AWS Secret Key, obtained from your [AWS Console](https://console.aws.amazon.com/iam/home?#security_credential). +* `region`: **must** be the region the Elastic Beanstalk application is running on, for example `us-east-1`. +* `app`: Application name. +* `env`: Elastic Beanstalk environment the application will be deployed to. +* `bucket_name`: Bucket name to upload the code of your app to. Elastic Beanstalk will create and deploy an application version from the source bundle in this Amazon S3 bucket. + +```yaml +deploy: + provider: elasticbeanstalk + access_key_id: + secure: "Encrypted =" + secret_access_key: + secure: "Encypted =" + region: "us-east-1" + app: "example-app-name" + env: "example-app-environment" + bucket_name: "the-target-S3-bucket" +``` +{: data-file=".travis.yml"} + +Alternatively, use the Travis CI command line setup tool to add the deployment `travis setup elasticbeanstalk`. + +## Creating an application without deploying it + +To create an application without deploying it, add `only_create_app_version: "true"` to your `.travis.yml`. + +## Optional settings + +* `zip_file`: The zip file to deploy. You also need to set `skip_cleanup` to prevent Travis CI deleting the zip file at the end of the build. If this is left unspecified, a zip file will be created from all the files that are part of the repository under test (determined with `git ls-files`). +* `bucket_path`: Location within Bucket to upload app to. + +## Environment variables + +The following environment variables are available: + +* `ELASTIC_BEANSTALK_ENV`: Used if the `env` key is not set in your `.travis.yml`. +* `ELASTIC_BEANSTALK_LABEL`: Label name of the new version. +* `ELASTIC_BEANSTALK_DESCRIPTION`: Description of the new version. Defaults to the last commit message. + +## 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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/engineyard.md b/user/deployment-v2/engineyard.md new file mode 100644 index 00000000000..15ef7e35391 --- /dev/null +++ b/user/deployment-v2/engineyard.md @@ -0,0 +1,111 @@ +--- +title: Engine Yard Deployment +layout: en +deploy: v2 + +--- + +Travis CI can automatically deploy your [Engine Yard](https://www.engineyard.com/) application after a successful build. + +For a minimal configuration, all you need to do is add the following to your `.travis.yml`: + +```yaml +deploy: + provider: engineyard + api_key: "YOUR API KEY" +``` +{: data-file=".travis.yml"} + +You can also use `email` and `password` instead of `api_key`. It is recommended to encrypt the key/password. + +Optional settings include: `app`, `account`, `environment` and `migrate`. + +You can also have the `travis` tool set up everything for you: + +```bash +$ travis setup engineyard +``` + +Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. + +### Application or Environment to deploy + +By default, we will try to deploy to an application by the same name as the repository. For example, if you deploy an application from the GitHub repository [travis-ci/travis-chat](https://github.com/travis-ci/travis-chat) without explicitly specify the name of the application, Travis CI will try to deploy to a Engine Yard app named *travis-chat*. + +You can explicitly set the name via the **app** option: + +```yaml +deploy: + provider: engineyard + api_key: ... + app: my-app-123 +``` +{: data-file=".travis.yml"} + +It is also possible to deploy different branches to different applications: + +```yaml +deploy: + provider: engineyard + api_key: ... + app: + master: my-app + foo: my-foo +``` +{: data-file=".travis.yml"} + +This branch specific settings are possible for all options (except `on`) and can be very useful for deploying to different environments: + +```yaml +deploy: + provider: engineyard + api_key: ... + environment: + master: staging + production: production +``` +{: data-file=".travis.yml"} + +### Branch to deploy from + +If you have branch specific options, as [shown above](#application-or-environment-to-deploy), Travis CI will automatically figure out which branches to deploy from. Otherwise, it will only deploy from your **master** branch. + +You can also explicitly specify the branch to deploy from with the **on** option: + +```yaml +deploy: + provider: engineyard + api_key: ... + on: production +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure it to deploy from all branches: + +```yaml +deploy: + provider: engineyard + api_key: ... + on: + all_branches: true +``` +{: data-file=".travis.yml"} + +Builds triggered from Pull Requests will never trigger a deploy. + +### Running migrations + +You can trigger migrations by using the migrate option: + +```yaml +deploy: + provider: engineyard + api_key: ... + migrate: "rake db:migrate" +``` +{: data-file=".travis.yml"} + +### Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). diff --git a/user/deployment-v2/firebase.md b/user/deployment-v2/firebase.md new file mode 100644 index 00000000000..a187b13e767 --- /dev/null +++ b/user/deployment-v2/firebase.md @@ -0,0 +1,78 @@ +--- +title: Firebase Deployment +layout: en +deploy: v2 + +--- + + + +Travis CI can automatically deploy your application to [Firebase](https://firebase.google.com/) +after a successful build. + +To use the default configuration, add your [encrypted](/user/encryption-keys/#usage) Firebase [token](/user/deployment/firebase/#generating-your-firebase-token) to your `.travis.yml`, all other information is read from your `firebase.json`: + +```yaml +deploy: + provider: firebase + token: + secure: "YOUR ENCRYPTED token" +``` +{: data-file=".travis.yml"} + +## Generating your Firebase token + +Generate your Firebase token after [installing the Firebase tools](https://github.com/firebase/firebase-tools#installation) by running: + +```bash +# This generates a token, e.g. "1/AD7sdasdasdKJA824OvEFc1c89Xz2ilBlaBlaBla" +firebase login:ci +# Encrypt this token +travis encrypt "1/AD7sdasdasdKJA824OvEFc1c89Xz2ilBlaBlaBla" --add +# This command may generate a warning ("If you tried to pass the name of the repository as the first argument, you probably won't get the results you wanted"). You can ignore it. +``` +When using `travis encrypt --add` you are likely to receive `WARNING: The name of the repository is now passed to the command with the -r option` (see https://github.com/travis-ci/travis-ci/issues/7869). The token will be added to your `.travis.yml`, regardless. Inspect and move the token to the `secure:` section of your `.travis.yml` if it isn't added there. + +Remember to [encrypt](/user/encryption-keys/#usage) the token before adding it to your `.travis.yml` + +## Deploying to a custom project + +To deploy to a different project than the one specified in the `firebase.json`, use the `project` key in your `.travis.yml`: + +```yaml +deploy: + provider: firebase + token: + secure: "YOUR ENCRYPTED token" + project: "myapp-staging" +``` +{: data-file=".travis.yml"} + +## Adding a message to a deployment + +To add a message to describe the deployment, use the `message` key in your `.travis.yml`: + +```yaml +deploy: + provider: firebase + token: + secure: "YOUR ENCRYPTED token" + message: "your message" +``` +{: data-file=".travis.yml"} + +## 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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/gcs.md b/user/deployment-v2/gcs.md new file mode 100644 index 00000000000..461f868e0f2 --- /dev/null +++ b/user/deployment-v2/gcs.md @@ -0,0 +1,125 @@ +--- +title: Google Cloud Storage (GCS) Deployment +layout: en +deploy: v2 + +--- + +Travis CI supports uploading to Google Cloud Storage (GCS). + +A minimal configuration is: + +```yaml +deploy: + provider: gcs + access_key_id: "GCS Interoperable Access Key ID" + secret_access_key: "GCS Interoperable Access Secret" + bucket: "GCS Bucket" +``` +{: data-file=".travis.yml"} + +This example is almost certainly not ideal, as you probably want to upload your built binaries and documentation. Set `skip_cleanup` to `true` to prevent Travis CI from deleting your build artifacts. + +```yaml +deploy: + provider: gcs + access_key_id: "GCS Interoperable Access Key ID" + secret_access_key: "GCS Interoperable Access Secret" + bucket: "GCS Bucket" + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +You can find your GCS Interoperable Access Keys [here](https://developers.google.com/storage/docs/migrating). +It is recommended to encrypt that key. +Assuming you have the Travis CI command line client installed, you can do it like this: + +```bash +travis encrypt --add deploy.secret_access_key +``` + +You will be prompted to enter your api key on the command line. + +You can also have the `travis` tool set up everything for you: + +```bash +travis setup gcs +``` + +Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. + +### GCS ACL via option + +You can set the acl of your uploaded files via the `acl` option like this: + +```yaml +deploy: + provider: gcs + access_key_id: "GCS Interoperable Access Key ID" + secret_access_key: "GCS Interoperable Access Secret" + bucket: "GCS Bucket" + skip_cleanup: true + acl: public-read +``` +{: data-file=".travis.yml"} + +Valid ACL values are: `private`, `public-read`, `public-read-write`, `authenticated-read`, `bucket-owner-read`, `bucket-owner-full-control`. The ACL defaults to `private`. +See the [full documentation on Google Cloud](https://cloud.google.com/storage/docs/reference-headers#xgoogacl). + +### Deploying specific folder + +You can set specific directory to be uploaded using `local-dir` option like this: + +```yaml +deploy: + provider: gcs + access_key_id: "GCS Interoperable Access Key ID" + secret_access_key: "GCS Interoperable Access Secret" + bucket: "GCS Bucket" + skip_cleanup: true + acl: public-read + local-dir: directory-name +``` +{: data-file=".travis.yml"} + +If the `directory-name` is generated during build process, it will be deleted (cleaned up) before deploying, unless `skip_cleanup` is set to true. + +### Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +### Setting `Content-Encoding` header + +GCS uploads can optionally set HTTP header `Content-Encoding`. +This header allows files to be sent compressed while retaining file extensions and +the associated MIME types. + +To enable this feature, add: + +```yaml +deploy: + provider: gcs + ... + detect_encoding: true # <== default is false +``` +{: data-file=".travis.yml"} + +If the file is compressed with `gzip` or `compress`, it will be uploaded with +the appropriate header. + +### HTTP cache control + +GCS uploads can optionally set the `Cache-Control` HTTP header. + +Set HTTP header `Cache-Control` to suggest that the browser cache the file. Defaults to `no-cache`. Valid options are `no-cache`, `no-store`, `max-age=`, `s-maxage= no-transform`, `public`, `private`. + +```yaml +deploy: + provider: gcs + ... + cache_control: "max-age=31536000" +``` +{: data-file=".travis.yml"} + +See the [full documentation on Google Cloud](https://cloud.google.com/storage/docs/reference-headers#cachecontrol). diff --git a/user/deployment-v2/google-app-engine.md b/user/deployment-v2/google-app-engine.md new file mode 100644 index 00000000000..d3736750554 --- /dev/null +++ b/user/deployment-v2/google-app-engine.md @@ -0,0 +1,138 @@ +--- +title: Google App Engine Deployment +layout: en +deploy: v2 + +--- + +Travis CI can automatically deploy your [Google App Engine](https://cloud.google.com/appengine/docs) or [Managed VMs](https://cloud.google.com/appengine/docs/managed-vms/) application after a successful build. + +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: gae + keyfile: "YOUR SERVICE ACCOUNT JSON FILE" + project: "YOUR PROJECT ID" +``` +{: data-file=".travis.yml"} + +Then go to the [Google Cloud Console Dashboard](http://console.developers.google.com) and: + +1. Enable "Google App Engine Admin API", +2. Go to "Credentials", click "Add Credential" and "Service account key", finally click "JSON" to download your Service Account JSON file. + +It is *strongly* recommended that you encrypt your key before committing it to a repo. +First make sure you have the [Travis command line tool](https://github.com/travis-ci/travis.rb#readme) installed. +Then execute the following command from the terminal: + +```bash +travis encrypt-file client-secret.json --add +``` + +The `--add` flag automatically adds the decryption step to the .travis file. + +Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. + +More detailed instructions for encrypting keys using Travis can be found [here](/user/encrypting-files/). + +### Project to deploy + +By default, the project will be deployed with the same name as the repository. Usually, you will want to explicilty configure the **project** option to match the project ID found in your Cloud console (note that this is sometimes, but not always, the same as the project name). + +You can explicitly set the project id via the **project** option: + +```yaml +deploy: + provider: gae + keyfile: ... + project: continuous-deployment-demo +``` +{: data-file=".travis.yml"} + +### Version to deploy + +Either the **version** flag or the **default** option must be set. If default is true, the default version will be deployed to, which will be `http://your-project-id.appspot.com`. If the **version** flag is set instead, it will deploy to `http://version-dot-your-project-id.appspot.com`. + +### Branch to deploy from + +By default, Travis will only deploy from your **master** branch. + +You can also explicitly specify the branch to deploy from with the **on** option: + +```yaml +deploy: + provider: gae + keyfile: ... + project: ... + on: production +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure it to deploy from all branches: + +```yaml +deploy: + provider: gae + keyfile: ... + project: ... + on: + all_branches: true +``` +{: data-file=".travis.yml"} + +Builds triggered from Pull Requests will never trigger a deploy. + +### Deploying without Promoting + +By default, when your application is deployed it will be promoted to receive all traffic. You can disable that using the `no_promote` option: + +```yaml +deploy: + provider: gae + keyfile: ... + project: continuous-deployment-demo + no_promote: true +``` +{: data-file=".travis.yml"} + +In addition to that, and according to the [Google Cloud SDK changelog](https://cloud.google.com/sdk/release_notes#0981_20151007), *"in a future Cloud SDK release, deployments that promote the new version to receive all traffic will stop the previous version by default"*. + +You can prevent that from happening by setting the option `no_stop_previous_version`: + +```yaml +deploy: + provider: gae + keyfile: ... + project: continuous-deployment-demo + no_stop_previous_version: true +``` +{: data-file=".travis.yml"} + +### Skipping Cleanup + +Many App Engine apps use [pip](https://pip.pypa.io/en/latest/installing.html) to vendor library requirements into the directory, and sometimes you need build artifacts or other +credentials to deploy. If so, you want to avoid the Travis cleanup step that will clean you working directory before the deploy. + +```yaml +deploy: + provider: gae + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +### Example Repo + +See [this link](https://github.com/googlecloudplatform/continuous-deployment-demo/tree/appengine_travis_deploy) for an example +App Engine app with a Travis deployment configured. See the other branches in the project for Managed VMs examples, and examples +without using this provider. + +### Other Available Configuration Options + +- **project**: [Project ID](https://developers.google.com/console/help/new/#projectnumber) used to identify the project on Google Cloud. +- **keyfile**: Path to the JSON file containing your [Service Account](https://developers.google.com/console/help/new/#serviceaccounts) credentials in [JSON Web Token](https://tools.ietf.org/html/rfc7519) format. To be obtained via the [Google Developers Console](https://console.developers.google.com/project/_/apiui/credential). Defaults to `"service-account.json"`. Note that this file should be handled with care as it contains authorization keys. +- **config**: Path to your module configuration file. Defaults to `"app.yaml"`. This file is runtime dependent ([Go](https://cloud.google.com/appengine/docs/go/config/appconfig), [Java](https://cloud.google.com/appengine/docs/java/config/appconfig), [PHP](https://cloud.google.com/appengine/docs/php/config/appconfig), [Python](https://cloud.google.com/appengine/docs/python/config/appconfig)) +- **version**: The version of the app that will be created or replaced by this deployment. If you do not specify a version, one will be generated for you. See [`gcloud app deploy`](https://cloud.google.com/sdk/gcloud/reference/app/deploy) +- **default**: Flag to set the deployed version to be the default serving version. See [`gcloud app deploy`](https://cloud.google.com/sdk/gcloud/reference/app/deploy) +- **verbosity**: Lets you adjust the verbosity when invoking `"gcloud"`. Defaults to `"warning"`. See [`gcloud`](https://cloud.google.com/sdk/gcloud/reference/). +- **docker_build**: If deploying a Managed VM, specifies where to build your image. Typical values are `"remote"` to build on Google Cloud Engine and `"local"` which requires Docker to be set up properly (to utilize this on Travis CI, read [Using Docker on Travis CI](https://blog.travis-ci.com/2015-08-19-using-docker-on-travis-ci/)). Defaults to `"remote"`. diff --git a/user/deployment-v2/hackage.md b/user/deployment-v2/hackage.md new file mode 100644 index 00000000000..c50205ecf06 --- /dev/null +++ b/user/deployment-v2/hackage.md @@ -0,0 +1,49 @@ +--- +title: Hackage Deployment +layout: en +deploy: v2 + +--- + +Travis CI supports uploading to [Hackage](https://hackage.haskell.org/). + +A minimal configuration is: + +```yaml +deploy: + provider: hackage + username: "Hackage User Name" + password: "Hackage Password" +``` +{: data-file=".travis.yml"} + +It is recommended to encrypt password. +Assuming you have the Travis CI command line client installed, you can do it like this: + +```bash +$ travis encrypt --add deploy.password +``` + +You will be prompted to enter your api key on the command line. + +You can also have the `travis` tool set up everything for you: + +```bash +$ travis setup hackage +``` + +Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. + +### Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +For example, if you build your project with [different GHC versions](/user/languages/haskell/#specifying-haskell-compiler-versions) but only want to deploy from one GHC version, add an `on` condition to your `deploy:` section: + +```yaml +deploy: + on: + condition: $TRAVIS_HASKELL_VERSION = 8.2.2 +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/hephy.md b/user/deployment-v2/hephy.md new file mode 100644 index 00000000000..f6efcc40696 --- /dev/null +++ b/user/deployment-v2/hephy.md @@ -0,0 +1,66 @@ +--- +title: Hephy Deployment +layout: en +deploy: v2 + +--- + +Travis CI supports uploading to Hephy. + +A minimal configuration is: + +```yaml +deploy: + provider: hephy + controller: hephy.hephyapps.com + username: "Hephy User Name" + password: "Hephy Password" + app: App_name + cli_version: vX.Y.Z # e.g. v2.7.0 being the latest at this time +``` +{: data-file=".travis.yml"} + +It is recommended that you encrypt your password. +Assuming you have the Travis CI command line client installed, you can do it like this: + +```bash +$ travis encrypt "YOUR HEPHY PASSWORD" --add deploy.password +``` + +You will be prompted to enter your api key on the command line. + +You can also have the `travis` tool set up everything for you: + +```bash +$ travis setup hephy +``` + +> Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. + +### Conditional Releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +### Note on `.gitignore` + +As this deployment strategy relies on `git`, be mindful that the deployment will +honor `.gitignore`. + +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 + +Sometimes you want to run commands before or after triggering a deployment. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. + +```yaml + before_deploy: "echo 'ready?'" + deploy: + .. + after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/heroku.md b/user/deployment-v2/heroku.md new file mode 100644 index 00000000000..671aa0daa3f --- /dev/null +++ b/user/deployment-v2/heroku.md @@ -0,0 +1,205 @@ +--- +title: Heroku Deployment +layout: en +deploy: v2 + +--- + + + +Travis CI can automatically deploy your [Heroku](https://www.heroku.com/) application after a successful build. + +To use the default configuration, add your encrypted Heroku api key to your `.travis.yml`: + +```yaml +deploy: + provider: heroku + api_key: + secure: "YOUR ENCRYPTED API KEY" +``` +{: data-file=".travis.yml"} + +If you have both the [Heroku](https://devcenter.heroku.com/articles/heroku-cli) and [Travis CI](https://github.com/travis-ci/travis.rb#readme) command line clients installed, you can get your key, encrypt it and add it to your `.travis.yml` by running the following command from your project directory: + +```bash +travis encrypt $(heroku auth:token) --add deploy.api_key +``` + +`travis` command defaults to using [travis-ci.org](https://travis-ci.org) as the API endpoint. If your build runs on [travis-ci.com](https://travis-ci.com) (even if your repository is public), add `--pro` flag to override this: + +```bash +travis encrypt $(heroku auth:token) --add deploy.api_key --pro +``` +You can also use the Travis CI command line setup tool `travis setup heroku`. + +## Deploying Custom Application Names + +By default, we will try to deploy to an application by the same name as the repository. For example, if you deploy an application from the GitHub repository [travis-ci/travis-chat](https://github.com/travis-ci/travis-chat) without explicitly specify the name of the application, Travis CI will try to deploy to a Heroku app named *travis-chat*. + +You can explicitly set the name via the **app** option: + +```yaml +deploy: + provider: heroku + api_key: ... + app: my-app-123 +``` +{: data-file=".travis.yml"} + +It is also possible to deploy different branches to different applications: + +```yaml +deploy: + provider: heroku + api_key: ... + app: + master: my-app-staging + production: my-app-production +``` +{: data-file=".travis.yml"} + +If these apps belong to different Heroku accounts, you will have to do the same for the API key: + +```yaml +deploy: + provider: heroku + api_key: + master: ... + production: ... + app: + master: my-app-staging + production: my-app-production +``` +{: data-file=".travis.yml"} + +## Deploying Specific Branches + +If you have branch specific options, as [shown above](#deploying-custom-application-names), Travis CI will automatically figure out which branches to deploy from. Otherwise, it will only deploy from your **master** branch. + +You can also explicitly specify the branch to deploy from with the **on** option: + +```yaml +deploy: + provider: heroku + api_key: ... + on: production +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure it to deploy from all branches: + +```yaml +deploy: + provider: heroku + api_key: ... + on: + all_branches: true +``` +{: data-file=".travis.yml"} + +Builds triggered from Pull Requests will never trigger a deploy. + +## Running Commands + +In some setups, you might want to run a command on Heroku after a successful deploy. You can do this with the **run** option: + +```yaml +deploy: + provider: heroku + api_key: ... + run: "rake db:migrate" +``` +{: data-file=".travis.yml"} + +It also accepts a list of commands: + +```yaml +deploy: + provider: heroku + api_key: ... + run: + - "rake db:migrate" + - "rake cleanup" +``` +{: data-file=".travis.yml"} + +> Take note that Heroku app might not be completely deployed and ready to serve requests when we run your commands. To mitigate this situation, you can add a `sleep` statement to add a delay before your commands. + +### Error Logs for Custom Commands + +Custom Heroku commands do not affect the Travis CI build status or trigger Travis CI notifications. + +Use an addon such as [Papertrail](https://elements.heroku.com/addons/papertrail){: data-proofer-ignore=""} or [Logentries](https://elements.heroku.com/addons/logentries){: data-proofer-ignore=""} to get notifications for `rake db:migrate` or other commands. + +These add-ons have email notification systems that can be triggered when certain string matches occur in your Heroku logs. For example you could trigger an e-mail notification if the log contains "this and all later migrations canceled". + +### Restarting Applications + +Sometimes you want to restart your Heroku application between or after commands. You can easily do so by adding a "restart" command: + +```yaml +deploy: + provider: heroku + api_key: ... + run: + - "rake db:migrate" + - restart + - "rake cleanup" +``` +{: data-file=".travis.yml"} + +## Deploying build artifacts + +After your tests ran and before the deploy, Travis CI will clean up any additional files and changes you made. + +Maybe that is not what you want, as you might generate some artifacts (think asset compilation) that are supposed to be deployed, too. There is now an option to skip the clean up: + +```yaml +deploy: + provider: heroku + api_key: ... + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +{% include conditional_deploy.html provider="heroku" %} + +### Deploy Strategy + +Travis CI supports different mechanisms for deploying to Heroku: + +- **api:** Uses Heroku's [Build API](https://devcenter.heroku.com/articles/build-and-release-using-the-api). This is the default strategy. +- **git:** Does a `git push` over HTTPS. + +It defaults to **api**, but you can change that via the **strategy** option: + +```yaml +deploy: + provider: heroku + api_key: ... + strategy: git +``` +{: data-file=".travis.yml"} + +#### Using `.gitignore` on `git` strategy + +When you use any of the `git` strategies, be mindful that the deployment will +honor `.gitignore`. + +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 + +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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/lambda.md b/user/deployment-v2/lambda.md new file mode 100644 index 00000000000..e10c8d1d49a --- /dev/null +++ b/user/deployment-v2/lambda.md @@ -0,0 +1,94 @@ +--- +title: Lambda Deployment +layout: en +deploy: v2 + +--- + +Travis CI supports uploading to [AWS Lambda](https://aws.amazon.com/lambda/). + +A minimal configuration is: + +```yaml +deploy: + provider: lambda + function_name: "lambda-test" + region: "us-east-1" + role: "arn:aws:iam::0123456789012:role/lambda_basic_execution" + runtime: "nodejs4.3" + handler_name: "handler" +``` +{: data-file=".travis.yml"} + +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 +$ travis encrypt "AWS SECRET ACCESS KEY" --add deploy.secret_access_key +``` + +You will be prompted to enter your secret access key on the command line. + +### Optional configuration parameters + +See [documentation](https://github.com/travis-ci/dpl#lambda) for additional +configuration parameters + +### Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +### AWS permissions + +The AWS user that Travis deploys as must have the following IAM permissions in order to deploy: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "ListExistingRolesAndPolicies", + "Effect": "Allow", + "Action": [ + "iam:ListRolePolicies", + "iam:ListRoles" + ], + "Resource": "*" + }, + { + "Sid": "CreateAndListFunctions", + "Effect": "Allow", + "Action": [ + "lambda:CreateFunction", + "lambda:ListFunctions" + ], + "Resource": "*" + }, + { + "Sid": "DeployCode", + "Effect": "Allow", + "Action": [ + "lambda:GetFunction", + "lambda:UpdateFunctionCode", + "lambda:UpdateFunctionConfiguration" + ], + "Resource": [ + "arn:aws:lambda:::function:" + ] + }, + { + "Sid": "SetRole", + "Effect": "Allow", + "Action": [ + "iam:PassRole" + ], + "Resource": "arn:aws:iam:::role/" + } + ] +} +``` + +It does not appear to be possible to wildcard the `DeployCode` statement such that Travis can deploy any function in a particular region by specifying the resource as `arn:aws:lambda:::function:*` but it is possible to limit the deployment permissions on a per function basis by specifying the complete ARN to one or more functions, i.e. `arn:aws:lambda:::function:`. diff --git a/user/deployment-v2/launchpad.md b/user/deployment-v2/launchpad.md new file mode 100644 index 00000000000..7009ddfc618 --- /dev/null +++ b/user/deployment-v2/launchpad.md @@ -0,0 +1,53 @@ +--- +title: Launchpad deployment +layout: en +deploy: v2 + +--- + +Travis CI can get [Launchpad](https://launchpad.net/) to automatically import your code from GitHub after a successful build, which is useful if you are building and hosting Debian packages. + +To automatically trigger an import: + +1. [Register](https://launchpad.net/projects/+new) a project on Launchpad and then [import](https://code.launchpad.net/+code-imports/+new) your GitHub project there. +2. [Generate](https://help.launchpad.net/API/SigningRequests) an API **access token** that we can use to trigger a new code import. Please make sure that the `oauth_consumer_key` is set to `Travis Deploy`. +3. Add the following to your `.travis.yml` + +```yaml +deploy: + provider: launchpad + slug: "LAUNCHPAD PROJECT SLUG" + oauth_token: "YOUR OAUTH_TOKEN" + oauth_token_secret: "YOUR OAUTH_TOKEN_SECRET" +``` +{: data-file=".travis.yml"} + +It is recommended to [encrypt both your `oauth_token` and your `oauth_token_secret`](/user/deployment/launchpad/#encrypting-your-oauth-tokens). + +The `slug` contains user or team name, project name, and branch name, and is formatted like `~user-name/project-name/branch-name`. If your project's code is a git repository, the form is `~user-name/project-name/+git/repository-name`. You can find your project's slug in the header (and the url) of its `code.launchpad.net` page. + +
        + Launchpad slug +
        + +### Encrypting your OAUTH tokens + +It is recommended that you encrypt both OAUTH tokens using the Travis CI command line client by removing them from your `travis.yml` above and running the following commands: + +```bash +$ travis encrypt "YOUR OAUTH_TOKEN" --add deploy.oauth_token +$ travis encrypt "YOUR OAUTH_TOKEN_SECRET" --add deploy.oauth_token_secret +``` + +The resulting `.travis.yml` looks like this: + +```yaml +deploy: + provider: launchpad + slug: "LAUNCHPAD PROJECT SLUG" + oauth_token: + secure: KmMdcwTWGubXVRu93/lY1NtyHxrjHK4TzCfemgwjsYzPcZuPmEA+pz+umQBN\n1ZhzUHZwDNsDd2VnBgYq27ZdcS2cRvtyI/IFuM/xJoRi0jpdTn/KsXR47zeE\nr2bFxRqrdY0fERVHSMkBiBrN/KV5T70js4Y6FydsWaQgXCg+WEU= + oauth_token_secret: + secure: jAglFtDjncy4E3upL/RF0ZOcmJ2UMrqHFCLQwU8PBdurhTMBeTw+IO6cXx5z\nU5zqvPYo/ghZ8mMuUhvHiGDM6m6OlMP7+l10VTxH1CoVew2NcQvRdfK3P+4S\nZJ43Hyh/ZLCjft+JK0tBwoa3VbH2+ZTzkRZQjdg54bE16C7Mf1A= +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/npm.md b/user/deployment-v2/npm.md new file mode 100644 index 00000000000..25e02c64f37 --- /dev/null +++ b/user/deployment-v2/npm.md @@ -0,0 +1,161 @@ +--- +title: npm Releasing +layout: en +deploy: v2 +--- + +Travis CI can automatically release your npm package to [npmjs.com][npmjs] +or another npm-like registry after a successful build. By default Travis CI +publishes to npmjs.com, however if you have a `publishConfig.registry` key in your +`package.json` then Travis CI publishes to that registry instead. + + + + + +A minimal `.travis.yml` configuration for publishing to [npmjs.com][npmjs] with npm version 2+ looks like: + +```yaml +deploy: + provider: npm + email: "YOUR_EMAIL_ADDRESS" + api_key: "YOUR_AUTH_TOKEN" +``` +{: data-file=".travis.yml"} + +You can have the `travis` tool set up everything for you: + +```bash +$ travis setup npm +``` + +Keep in mind that the above command has to run in your project directory, so +it can modify the `.travis.yml` for you. + +## NPM auth token + +Your NPM Auth Token can be obtained by: + +1. Log in to your NPM account, and generate a new token at `https://www.npmjs.com/settings/USER/tokens`, where + `USER` is the name of the user account which is capable of publishing the npm package. +1. Use the NPM CLI command [`npm adduser`](https://docs.npmjs.com/cli/adduser) to create a user, then open the `~/.npmrc` file: + 1. For NPM v2+, use the `authToken` value. + 1. For NPM ~1, use the `auth` value. + +Always [encrypt](/user/encryption-keys/#usage) your auth token. Assuming you have the Travis CI command line client installed, you can do it like this: + +```bash +$ travis encrypt YOUR_AUTH_TOKEN --add deploy.api_key +``` + +## What to release + +Most likely, you would only want to deploy to npm when a new version of your +package is cut. To do this, you can tell Travis CI to only deploy on tagged +commits, like so: + +```yaml +deploy: + ... + on: + tags: true +``` +{: data-file=".travis.yml"} + +If you tag a commit locally, remember to run `git push --tags` to ensure that +your tags are uploaded to GitHub. + +You can explicitly specify the branch to release from with the **on** option: + +```yaml +deploy: + ... + on: + branch: production +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure Travis CI to release from all branches: + +```yaml +deploy: + ... + on: + all_branches: true +``` +{: data-file=".travis.yml"} + +Builds triggered from Pull Requests will never trigger a release. + +## Releasing build artifacts + +After your tests ran and before the release, Travis CI will clean up any additional files and changes you made. + +Maybe that is not what you want, as you might generate some artifacts that are supposed to be released, too. There is now an option to skip the clean up: + +```yaml +deploy: + ... + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +## Conditional releases + +[A deployment issue](https://github.com/travis-ci/travis-ci/issues/4738) is +reported when multiple attempts are made. +We recommend deploying from only one job with +[Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +## Tagging releases + +You can automatically add [npm distribution tags](https://docs.npmjs.com/getting-started/using-tags) with the `tag` option: + +```yaml +deploy: + ... + tag: next +``` +{: data-file=".travis.yml"} + +## Note on `.gitignore` + +Notice that `npm` deployment honors `.gitignore` if `.npmignore` does not exist. +This means that if your build creates artifacts in places listed in `.gitignore`, +they will not be included in the uploaded package. + +See [`npm` documentation](https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package) +for more details. + +If your `.gitignore` file matches something that your build creates, use +[`before_deploy`](#running-commands-before-and-after-deploy) to change +its content, or create (potentially empty) `.npmignore` file +to override it. + +## 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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} + +## Troubleshooting "npm ERR! You need a paid account to perform this action." + +npm assumes that [scoped packages](https://docs.npmjs.com/misc/scope) are +private by default. You can explicitly tell npm your package is a public package +and avoid this error by adding the following to your `package.json` file: + +```json + "publishConfig": { + "access": "public" + }, +``` + +[npmjs]: https://npmjs.com/ diff --git a/user/deployment-v2/openshift.md b/user/deployment-v2/openshift.md new file mode 100644 index 00000000000..453b866717e --- /dev/null +++ b/user/deployment-v2/openshift.md @@ -0,0 +1,155 @@ +--- +title: OpenShift Deployment +layout: en +deploy: v2 + +--- + +Travis CI can automatically deploy your [OpenShift](https://www.openshift.com/) application after a successful build. + +For a minimal configuration, all you need to do is add the following to your `.travis.yml`: + +```yaml +deploy: + provider: openshift + user: "YOU USER NAME" + password: "YOUR PASSWORD" # can be encrypted + domain: "YOUR OPENSHIFT DOMAIN" +``` +{: data-file=".travis.yml"} + +Currently it is not possible to use a token instead of the password, as these tokens expire too quickly. We are working with the OpenShift team on a solution. + +You can also have the `travis` tool set up everything for you: + +```bash +travis setup openshift +``` + +Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. + +To provide the best service possible, Travis CI has teamed up with OpenShift as a [partner](https://www.openshift.com/partners) and there is an official [Travis CI QuickStart](https://hub.openshift.com/quickstarts/26-travis-ci) to get you going. + +### Application to deploy + +By default, we will try to deploy to an application by the same name as the repository. For example, if you deploy an application from the GitHub repository [travis-ci/travis-chat](https://github.com/travis-ci/travis-chat) without explicitly specify the name of the application, Travis CI will try to deploy to an OpenShift app named *travis-chat*. + +You can explicitly set the name via the **app** option: + +```yaml +deploy: + provider: openshift + ... + app: my-app-123 +``` +{: data-file=".travis.yml"} + +It is also possible to deploy different branches to different applications: + +```yaml +deploy: + provider: openshift + ... + app: + master: my-app-staging + production: my-app-production +``` +{: data-file=".travis.yml"} + +If these apps belong to different OpenShift domains, you will have to do the same for the domain: + +```yaml +deploy: + provider: openshift + ... + domain: + master: ... + production: ... + app: + master: my-app-staging + production: my-app-production +``` +{: data-file=".travis.yml"} + +### Branch to deploy from + +If you have branch specific options, as [shown above](#application-to-deploy), Travis CI will automatically figure out which branches to deploy from. Otherwise, it will only deploy from your **master** branch. + +You can also explicitly specify the branch to deploy from with the **on** option: + +```yaml +deploy: + provider: openshift + ... + on: production +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure it to deploy from all branches: + +```yaml +deploy: + provider: openshift + ... + on: + all_branches: true +``` +{: data-file=".travis.yml"} + +Builds triggered from Pull Requests will never trigger a deploy. + +### Deploying build artifacts + +After your tests ran and before the deploy, Travis CI will clean up any additional files and changes you made. + +Maybe that is not what you want, as you might generate some artifacts (think asset compilation) that are supposed to be deployed, too. There is now an option to skip the clean up: + +```yaml +deploy: + provider: openshift + ... + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +### Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +### Note on `.gitignore` + +As this deployment strategy relies on `git`, be mindful that the deployment will +honor `.gitignore`. + +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 + +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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} + +### Deployment branch + +OpenShift can be configured to deploy from a branch different from the default `master` via `rhc app-configure --deployment-branch mybranch`. + +If you've done this to your application, specify this desired branch with `deployment_branch`: + +```yaml +deploy: + provider: openshift + ... + deployment_branch: mybranch +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/opsworks.md b/user/deployment-v2/opsworks.md new file mode 100644 index 00000000000..052a2bcdab4 --- /dev/null +++ b/user/deployment-v2/opsworks.md @@ -0,0 +1,152 @@ +--- +title: AWS OpsWorks Deployment +layout: en +deploy: v2 + +--- + +Travis CI can automatically deploy your [AWS OpsWorks](https://aws.amazon.com/en/opsworks/) application after a successful build. + +For a minimal configuration, all you need to do is add the following to your `.travis.yml`: + +```yaml +deploy: + provider: opsworks + access-key-id: ACCESS-KEY-ID + secret-access-key: SECRET-ACCESS-KEY + app-id: APP-ID + region: REGION # (default: us-east-1) +``` +{: data-file=".travis.yml"} + +`region` isn't required but it defaults to `us-east-1`. If your application is located in a different region you will get an error like "OpsWorks service error: Unable to find app with ID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx". + +You can obtain your AWS Access Key Id and your AWS Secret Access Key from [here](https://console.aws.amazon.com/iam/home?#security_credential). It is recommended to encrypt your AWS Secret Access Key. Assuming you have the `travis` client installed, you can do it like this: + +```bash +travis encrypt SECRET-ACCESS-KEY --add deploy.secret-access-key +``` + +You can also have the `travis` tool set up everything for you: + +```bash +travis setup opsworks +``` + +Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. Note that the `region` isn't generated by running `travis setup opsworks`. + +### Migrate the Database + +If you want to migrate your rails database on travis to AWS OpsWorks, add the `migrate` option to your `.travis.yml`. + +```yaml +deploy: + provider: opsworks + access-key-id: ACCESS-KEY-ID + secret-access-key: SECRET-ACCESS-KEY + app-id: APP-ID + migrate: true +``` +{: data-file=".travis.yml"} + +### Branch to deploy from + +By default, Travis CI will only deploy from your **master** branch. + +You can explicitly specify the branch to deploy from with the **on** option: + +```yaml +deploy: + provider: opsworks + access-key-id: ACCESS-KEY-ID + secret-access-key: SECRET-ACCESS-KEY + app-id: APP-ID + on: production +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure it to deploy from all branches: + +```yaml +deploy: + provider: opsworks + access-key-id: ACCESS-KEY-ID + secret-access-key: SECRET-ACCESS-KEY + app-id: APP-ID + on: + all_branches: true +``` +{: data-file=".travis.yml"} + +Builds triggered from Pull Requests will never trigger a deploy. + +### Deploying build artifacts + +After your tests run and before the deploy stage, Travis CI will clean up any additional files and changes you made. + +Maybe that is not what you want, as you might generate some artifacts (think asset compilation) that are supposed to be deployed, too. There is now an option to skip the clean up: + +```yaml +deploy: + provider: opsworks + access-key-id: ACCESS-KEY-ID + secret-access-key: SECRET-ACCESS-KEY + app-id: APP-ID + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +### Waiting for Deployments + +By default, the build will continue immediately after triggering an OpsWorks +deploy. To wait for the deploy to complete, use the **wait-until-deployed** +option: + +```yaml +deploy: + provider: opsworks + access-key-id: ACCESS-KEY-ID + secret-access-key: SECRET-ACCESS-KEY + app-id: APP-ID + wait-until-deployed: true +``` +{: data-file=".travis.yml"} + +Travis CI will wait up to 10 minutes for the deploy to complete, and log +whether it succeeded. + +### Updating App Settings after successful Deployments + +By default the deploy from Travis CI triggers a deployment on OpsWorks but does not touch any other configuration. To also update the revision in App Settings use the **update-app-on-success** option. In addition you have to set the **wait-until-deployed** option: + +```yaml +deploy: + provider: opsworks + access-key-id: ACCESS-KEY-ID + secret-access-key: SECRET-ACCESS-KEY + app-id: APP-ID + wait-until-deployed: true + update-app-on-success: true +``` +{: data-file=".travis.yml"} + +Travis CI will wait until the deployment returns successful and only then update the revision in App Settings. + +### Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +### 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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/packagecloud.md b/user/deployment-v2/packagecloud.md new file mode 100644 index 00000000000..1350db2065b --- /dev/null +++ b/user/deployment-v2/packagecloud.md @@ -0,0 +1,130 @@ +--- +title: packagecloud Deployment +layout: en +deploy: v2 + +--- + +Travis CI can automatically push your RPM, Deb, Deb source, or RubyGem package build +artifacts to [packagecloud.io](https://packagecloud.io/) after a successful build. + +For a minimal configuration, all you need to do is add the following to your `.travis.yml`: + +```yaml +deploy: + provider: packagecloud + repository: "YOUR REPO" + username: "YOUR USERNAME" + token: "YOUR TOKEN" + dist: "YOUR DIST" # like 'ubuntu/precise', or 'centos/5', if pushing deb or rpms +``` +{: data-file=".travis.yml"} + +Take note that your repository name should not have a forward slash in it. For example if your repository appears as `username / repo` on packagecloud.io, you should only put `repo` in the `repository:` option and put `username` in the `username:` option. + +You can retrieve your api token by logging in and visiting the [API Token](https://packagecloud.io/api_token) page under Account Settings. + +This is the list of [supported distributions](https://packagecloud.io/docs#os_distro_version) for the 'dist' option. + +It is recommended to encrypt your auth token. Assuming you have the Travis CI command line client installed, you can do it like this: + +```bash +travis encrypt THE-API-TOKEN --add deploy.token +``` + +You can also have the `travis` tool set up everything for you: + +```bash +travis setup packagecloud +``` + +Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. + +### Branch to release from + +You can explicitly specify the branch to release from with the **on** option: + +```yaml +deploy: + provider: packagecloud + on: + branch: production + # ⋮ +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure Travis CI to release from all branches: + +```yaml +deploy: + provider: packagecloud + on: + all_branches: true + # ⋮ +``` +{: data-file=".travis.yml"} + +By default, Travis CI will only release from the **master** branch. + +Builds triggered from Pull Requests will never trigger a release. + +### Releasing build artifacts + +After your tests ran and before the release, Travis CI will clean up any additional files and changes you made. + +Maybe that is not what you want, as you might generate some artifacts that are supposed to be released, too. There is now an option to skip the clean up: + +```yaml +deploy: + provider: packagecloud + skip_cleanup: true + # ⋮ +``` +{: data-file=".travis.yml"} + +### Specify package folder + +By default, the packagecloud provider will scan the current directory and push all supported packages. +You can specify which directory to scan from with the `local-dir` option. This example scans from `build` directory of your project. + +```yaml +deploy: + provider: packagecloud + local-dir: build + # ⋮ +``` +{: data-file=".travis.yml"} + +Alternately, you may wish to specify the `package_glob` argument to restrict which files to scan. It defaults to `**/*` (recursively finding all package files) but this may pick up other artifacts you don't want to release. For example, if you only want to push gems in the top level directory: + +```yaml +deploy: + provider: packagecloud + package_glob: "*.gem" + # ⋮ +``` +{: data-file=".travis.yml"} + +### A note about Debian source packages + +If the packagecloud provider finds any `.dsc` files, it will scan it and try to locate it's contents within +the `local-dir` directory. Ensure the source package and it's contents are output to the same directory for it to work. + +### Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +### Running commands before and after release + +Sometimes you want to run commands before or after releasing a package. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + # ⋮ +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/pages.md b/user/deployment-v2/pages.md new file mode 100644 index 00000000000..9829fca5acb --- /dev/null +++ b/user/deployment-v2/pages.md @@ -0,0 +1,63 @@ +--- +title: GitHub Pages Deployment +layout: en +deploy: v2 + +--- + +> 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. + +You will need to provide a [personal access +token](https://help.github.com/articles/creating-an-access-token-for-command-line-use/) +and set the deployment provider details in `.travis.yml`. + +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: pages + skip_cleanup: true + github_token: $GITHUB_TOKEN # Set in the settings page of your repository, as a secure variable + keep_history: true + on: + branch: master +``` +{: data-file=".travis.yml"} + +> 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. + +## Setting the GitHub token + +You'll need to generate a [personal access +token](https://help.github.com/articles/creating-an-access-token-for-command-line-use/) +with the `public_repo` or `repo` scope (`repo` is required for private +repositories). Since the token should be private, +you'll want to pass it to Travis securely in your [repository +settings](/user/environment-variables#defining-variables-in-repository-settings) +or via [encrypted variables in +`.travis.yml`](/user/environment-variables#defining-encrypted-variables-in-travisyml). + +## Further configuration + +* `local_dir`: Directory to push to GitHub Pages, defaults to current directory. + Can be specified as an absolute path or a relative path from the current directory. +* `repo`: Repo slug, defaults to current repo. **Note:** The slug consists of username and repo name and is formatted like `user/repo-name`. +* `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 you to use the 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`. +* `deployment_file`: Optional, defaults to `false`, enables creation of deployment-info files. diff --git a/user/deployment-v2/puppetforge.md b/user/deployment-v2/puppetforge.md new file mode 100644 index 00000000000..58f49e2ecfb --- /dev/null +++ b/user/deployment-v2/puppetforge.md @@ -0,0 +1,55 @@ +--- +title: Puppet Forge Deployment +layout: en +deploy: v2 + +--- + + + +Travis CI can automatically deploy your modules to [Puppet Forge ](https://forge.puppet.com/) or to your own Forge instance after a successful build. + +To deploy to Puppet Forge, add your Puppet Forge username and your +[encrypted](/user/encryption-keys/#usage) Puppet Forge password to your +`.travis.yml`: + +```yaml +deploy: + provider: puppetforge + user: "" + password: + secure: "YOUR ENCRYPTED PASSWORD" +``` +{: data-file=".travis.yml"} + +## Deploying to a custom forge + +To deploy to your own hosted Forge instance by adding it in the `url` key: + +You can explicitly set the name via the **app** option: + +```yaml +deploy: + provider: puppetforge + user: "" + password: + secure: "YOUR ENCRYPTED PASSWORD" + url: https://forgeapi.example.com/ +``` +{: data-file=".travis.yml"} + +## 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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/pypi.md b/user/deployment-v2/pypi.md new file mode 100644 index 00000000000..c57939ec597 --- /dev/null +++ b/user/deployment-v2/pypi.md @@ -0,0 +1,170 @@ +--- +title: PyPI deployment +layout: en +deploy: v2 + +--- + +Travis CI can automatically release your Python package to [PyPI](https://pypi.python.org/) after a successful build. + + + +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: pypi + user: "Your username" + password: "Your password" +``` +{: data-file=".travis.yml"} + +However, this would expose your PyPI password to the world. +We recommend you [encrypt](/user/encryption-keys/) your password and add it to your .travis.yml by running: + +```bash +travis encrypt your-password-here --add deploy.password +``` + +If you are using travis-ci.com and not travis-ci.org, you need to add the `--com` argument to switch the Travis API endpoint: + +```bash +travis encrypt your-password-here --add deploy.password --com +``` + +> Note that if your PyPI password contains [special characters](/user/encryption-keys#note-on-escaping-certain-symbols) you need to escape them before encrypting your password. Some people have [reported difficulties](https://github.com/travis-ci/dpl/issues/377) connecting to PyPI with passwords containing anything except alphanumeric characters. + +```yaml +deploy: + provider: pypi + user: "Your username" + password: + secure: "Your encrypted password" +``` +{: data-file=".travis.yml"} + +## Deploying tags + +Most likely, you would only want to deploy to PyPI when a new version of your +package is cut. To do this, you can tell Travis CI to only deploy on tagged +commits, like so: + +```yaml +deploy: + provider: pypi + user: ... + password: ... + on: + tags: true +``` +{: data-file=".travis.yml"} + +If you tag a commit locally, remember to run `git push --tags` to ensure that your tags are uploaded to GitHub. + +## Deploying specific branches + +You can explicitly specify the branch to release from with the **on** option: + +```yaml +deploy: + provider: pypi + user: ... + password: ... + on: + branch: production +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure Travis CI to release from all branches: + +```yaml +deploy: + provider: pypi + user: ... + password: ... + on: + all_branches: true +``` +{: data-file=".travis.yml"} + +By default, Travis CI will only release from the **master** branch. + +Builds triggered from Pull Requests will never trigger a release. + +## Releasing to a self hosted PyPI + +To release to a different PyPI index: + +```yaml +deploy: + provider: pypi + user: ... + password: ... + server: https://mypackageindex.com/index +``` +{: data-file=".travis.yml"} + +## Uploading different distributions + +By default, only a source distribution ('sdist') will be uploaded to PyPI. +If you would like to upload different distributions, specify them using the `distributions` option, like this: + +``` +deploy: + provider: pypi + user: ... + password: ... + distributions: "sdist bdist_wheel" # Your distributions here +``` + +If you specify `bdist_wheel` in the distributions, the `wheel` package will automatically be installed. + +## Upload artifacts only once + +By default, Travis CI runs the deploy stage for each `python` and `environment` that you specify. Many of these will generate competing build artifacts that will fail to upload to pypi with a message something like this: + +``` +HTTPError: 400 Client Error: File already exists. See https://pypi.org/help/#file-name-reuse for url: https://upload.pypi.org/legacy/ +``` + +To avoid this, use the `skip_existing` flag: + +``` +deploy: + provider: pypi + user: ... + password: ... + skip_existing: true +``` + +## Releasing build artifacts + +After your tests ran and before the release, Travis CI will clean up any additional files and changes you made. + +Maybe that is not what you want, as you might generate some artifacts that are supposed to be released, too. There is now an option to skip the clean up: + +``` +deploy: + provider: pypi + user: ... + password: ... + skip_cleanup: true +``` + +## Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +## Running commands before and after release + +Sometimes you want to run commands before or after releasing a package. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. + +``` +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` diff --git a/user/deployment-v2/releases.md b/user/deployment-v2/releases.md new file mode 100644 index 00000000000..f8c6cea3d7d --- /dev/null +++ b/user/deployment-v2/releases.md @@ -0,0 +1,267 @@ +--- +title: GitHub Releases Uploading +layout: en +deploy: v2 + +--- + +Travis CI can automatically upload assets to git tags on your GitHub repository. + +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: releases + api_key: "GITHUB OAUTH TOKEN" + file: "FILE TO UPLOAD" + skip_cleanup: true + on: + tags: true +``` +{: data-file=".travis.yml"} + +This configuration will use the "GITHUB OAUTH TOKEN" to upload "FILE TO UPLOAD" +(relative to the working directory) on tagged builds. + +> 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, so it is important that +you understand how tags affect GitHub Releases. + +## Deploying only on tagged builds + +With [`on.tags: true`](/user/deployment/#conditional-releases-with-on), +your Releases deployment will trigger if and only if the build is a tagged +build. + +## Regular releases + +When the `draft` option is not set to `true` (more on this below), a regular +release is created. +Regular releases require tags. +If you set `on.tags: true` (as the initial example in this document), this +requirement is met. + +## Draft releases with `draft: true` +With + +```yaml +deploy: + provider: releases + api_key: "GITHUB OAUTH TOKEN" + file: "FILE TO UPLOAD" + skip_cleanup: true + draft: true +``` +{: data-file=".travis.yml"} + +the resultant deployment is a draft Release that only repository collaborators +can see. +This gives you an opportunity to examine and edit the draft release. + +## Setting the tag at deployment time + +GitHub Releases needs the present commit to be tagged at the deployment time. +If you set `on.tags: true`, the commit is guaranteed to have a tag. + +Depending on the workflow, however, this is not desirable. + +In such cases, it is possible to postpone setting the tag until +you have all the information you need. +A natural place to do this is `before_deploy`. +For example: + +```yaml + 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" + - export TRAVIS_TAG=${TRAVIS_TAG:-$(date +'%Y%m%d%H%M%S')-$(git log --format=%h -1)} + - git tag $TRAVIS_TAG + deploy: + provider: releases + api_key: "GITHUB OAUTH TOKEN" + file: "FILE TO UPLOAD" + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +### When tag is not set at deployment time + +If the tag is still not set at the time of deployment, the deployment +provider attempts to match the current commit with a tag from remote, +and if one is found, uses it. + +This could be a problem if multiple tags are assigned to the current commit and +the one you want is not matched. +In such a case, assign the tag you need (the method will depend on your use +case) to `$TRAVIS_TAG` to get around the problem. + +If the build commit does not match any tag at deployment time, GitHub creates one +when the release is created. +The GitHub-generated tags are of the form `untagged-*`, where `*` is a random +hex string. +Notice that this tag is immediately available on GitHub, and thus +will trigger a new Travis CI build, unless it is prevented by +other means; for instance, by +[blocklisting `/^untagged/`](/user/customizing-the-build/#safelisting-or-blocklisting-branches). + +## Overwrite existing files on the release + +If you need to overwrite existing files, add `overwrite: true` to the `deploy` section of your `.travis.yml`. + +## Using Travis CI client to populate initial deployment configuration + +You can also use the [Travis CI command line client](https://github.com/travis-ci/travis.rb#installation) to configure your `.travis.yml`: + +```bash +travis setup releases +``` + +Or, if you're using a private repository or the GitHub Apps integration: + +```bash +travis setup releases --com +``` + +## 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. + +This results in something similar to: + +```yaml +deploy: + provider: releases + api_key: + secure: YOUR_API_KEY_ENCRYPTED + file: "FILE TO UPLOAD" + skip_cleanup: true + on: + tags: true +``` +{: data-file=".travis.yml"} + +**Warning:** the `public_repo` and `repo` scopes for GitHub oauth tokens grant write access to all of a user's (public) repositories. For security, it's ideal for `api_key` to have write access limited to only repositories where Travis deploys to GitHub releases. The suggested workaround is to create a [machine user](https://developer.github.com/v3/guides/managing-deploy-keys/#machine-users) — a dummy GitHub account that is granted write access on a per repository basis. + +## Authentication with a Username and Password + +You can also authenticate with your GitHub username and password using the `user` and `password` options. This is not recommended as it allows full access to your GitHub account but is simplest to setup. It is recommended to encrypt your password using `travis encrypt "GITHUB PASSWORD" --add deploy.password`. This example authenticates using a username and password. + +```yaml +deploy: + provider: releases + user: "GITHUB USERNAME" + password: "GITHUB PASSWORD" + file: "FILE TO UPLOAD" + skip_cleanup: true + on: + tags: true +``` +{: data-file=".travis.yml"} + +## Deploying to GitHub Enterprise + +If you wish to upload assets to a GitHub Enterprise repository, you must override the `$OCTOKIT_API_ENDPOINT` environment variable with your GitHub Enterprise API endpoint: + +``` +http(s)://"GITHUB ENTERPRISE HOSTNAME"/api/v3/ +``` + +You can configure this in [Repository Settings](/user/environment-variables/#defining-variables-in-repository-settings) or via your `.travis.yml`: + +```yaml +env: + global: + - OCTOKIT_API_ENDPOINT="GITHUB ENTERPRISE API ENDPOINT" +``` +{: data-file=".travis.yml"} + +## Uploading Multiple Files + +You can upload multiple files using yml array notation. This example uploads two files. + +```yaml +deploy: + provider: releases + api_key: + secure: YOUR_API_KEY_ENCRYPTED + file: + - "FILE 1" + - "FILE 2" + skip_cleanup: true + on: + tags: true +``` +{: data-file=".travis.yml"} + +You can also enable wildcards by setting `file_glob` to `true`. This example +includes all files in a given directory. + +```yaml +deploy: + provider: releases + api_key: "GITHUB OAUTH TOKEN" + file_glob: true + file: directory/* + skip_cleanup: true + on: + tags: true +``` +{: data-file=".travis.yml"} + +You can use the glob pattern to recursively find the files: + +```yaml +deploy: + provider: releases + api_key: "GITHUB OAUTH TOKEN" + file_glob: true + file: directory/**/* + skip_cleanup: true + on: + tags: true +``` +{: data-file=".travis.yml"} + +Please note that all paths in `file` are relative to the current working directory, not to [`$TRAVIS_BUILD_DIR`](/user/environment-variables/#default-environment-variables). + +### Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +## Running commands before or after release + +Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} + +## Advanced options + +Options from `.travis.yml` are passed through to Octokit API's +[#create_release](https://octokit.github.io/octokit.rb/Octokit/Client/Releases.html#create_release-instance_method) +and [#update_release](https://octokit.github.io/octokit.rb/Octokit/Client/Releases.html#update_release-instance_method) methods, +so you can use any valid Octokit option, +unless they are treated separately in this document. + +These include: + +* `name` +* `body` +* `prerelease` (boolean) + +Note that formatting in `body` is [not preserved](https://github.com/travis-ci/dpl/issues/155). + +## Troubleshooting Git Submodules + +GitHub Releases executes a number of git commands during deployment. For this reason, it is important that the working directory is set to the one for which the release will be created, which generally isn't a problem, but if you clone another repository during the build or use submodules, it is worth double checking. + diff --git a/user/deployment-v2/rubygems.md b/user/deployment-v2/rubygems.md new file mode 100644 index 00000000000..adbf86bd913 --- /dev/null +++ b/user/deployment-v2/rubygems.md @@ -0,0 +1,182 @@ +--- +title: RubyGems Deployment +layout: en +deploy: v2 + +--- + +Travis CI can automatically release your Ruby gem to [RubyGems](https://rubygems.org/) after a successful build. + +For a minimal configuration, all you need to do is add the following to your `.travis.yml`: + +```yaml +deploy: + provider: rubygems + api_key: "YOUR API KEY" +``` +{: data-file=".travis.yml"} + +Most likely you would only want to deploy to RubyGems when a new version of +your package is cut. To do this, you can tell Travis CI to only deploy on +tagged commits, like so: + +```yaml +deploy: + provider: rubygems + api_key: "YOUR API KEY" + on: + tags: true +``` +{: data-file=".travis.yml"} + +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. +Assuming you have the Travis CI command line client installed, you can do it like this: + +```bash +travis encrypt --add deploy.api_key +``` + +You will be prompted to enter your api key on the command line. + +You can also have the `travis` tool set up everything for you: + +```bash +travis setup rubygems +``` + +Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. + +## 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. + +This gives your gem's users the option to download a newer, possibly more unstable version of your gem. + +To enable this, add the following line to your gemspec, underneath your existing `version` line: + +``` +s.version = "#{s.version}-alpha-#{ENV['TRAVIS_BUILD_NUMBER']}" if ENV['TRAVIS'] +``` + +If your gem's current version is 1.0.0, then Travis CI will create a prerelease with the version 1.0.0-alpha-20, where `20` is the build number. + +### Gem to release + +By default, we will try to release a gem by the same name as the repository. For example, if you release a gem from the GitHub repository [travis-ci/travis-chat](https://github.com/travis-ci/travis-chat) without explicitly specify the name of the application, Travis CI will try to release the gem named *travis-chat*. + +You can explicitly set the name via the **gem** option: + +```yaml +deploy: + provider: rubygems + api_key: ... + gem: my-gem-123 +``` +{: data-file=".travis.yml"} + +It is also possible to release different branches to different gems: + +```yaml +deploy: + provider: rubygems + api_key: ... + gem: + master: my-gem + old: my-gem-old +``` +{: data-file=".travis.yml"} + +If these gems belong to different RubyGems accounts, you will have to do the same for the API key: + +```yaml +deploy: + provider: rubygems + api_key: + master: ... + old: ... + gem: + master: my-gem + old: my-gem-old +``` +{: data-file=".travis.yml"} + +### Gemspec to use + +If you like, you can specify can alternate option with the `gemspec` option: + +```yaml +deploy: + provider: rubygems + api_key: ... + gemspec: my-gemspec.gemspec +``` +{: data-file=".travis.yml"} + +### Branch to release from + +If you have branch specific options, as [shown above](#gem-to-release), Travis CI will automatically figure out which branches to release from. Otherwise, it will only release from your **master** branch. + +You can also explicitly specify the branch to release from with the **on** option: + +```yaml +deploy: + provider: rubygems + api_key: ... + on: + branch: production +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure it to release from all branches: + +```yaml +deploy: + provider: rubygems + api_key: ... + on: + all_branches: true +``` +{: data-file=".travis.yml"} + +Builds triggered from Pull Requests will never trigger a release. + +### Releasing build artifacts + +After your tests ran and before the release, Travis CI will clean up any additional files and changes you made. + +Maybe that is not what you want, as you might generate some artifacts that are supposed to be released, too. There is now an option to skip the clean up: + +```yaml +deploy: + provider: rubygems + api_key: ... + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +### Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +### Gem must be registered beforehand + +Note that the gem you upload must be registered beforehand. +If the gem does not exist on the host to which it is uploaded, deployment will fail. +See [this GitHub issue](https://github.com/travis-ci/dpl/issues/574) for details. + +### Running commands before and after release + +Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/s3.md b/user/deployment-v2/s3.md new file mode 100644 index 00000000000..8867f0efa52 --- /dev/null +++ b/user/deployment-v2/s3.md @@ -0,0 +1,296 @@ +--- +title: S3 Deployment +layout: en +deploy: v2 +--- + + + +Travis CI can automatically upload your build to Amazon S3 after a successful build. + +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" +``` +{: data-file=".travis.yml"} + +You can find your [AWS Access Keys](https://console.aws.amazon.com/iam/home?#security_credential) in your Amazon Console. You should probably encrypt the secret key with the Travis CI command line: + +```bash +travis encrypt --add deploy.secret_access_key +``` + +The previous example is almost certainly not ideal, as you probably want to upload your built binaries and documentation. Set `skip_cleanup` to `true` to prevent Travis CI from deleting your build artifacts. + +```yaml +deploy: + provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +> Note that deploying to S3 only adds files to your bucket, it does not remove them. If you need to remove deprecated files you can do that manually in your Amazon S3 console. + +Instead of adding your Amazon S3 configuration to your `.travis.yml` you can run the Travis CI command line in your project directory to set it up: + +```bash +$ travis setup s3 +``` + +Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. + +## S3 ACL via option + +You can set the acl of your uploaded files via the `acl` option like this: + +```yaml +deploy: + provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" + skip_cleanup: true + acl: public_read +``` +{: data-file=".travis.yml"} + +Valid ACL values are: `private`, `public_read`, `public_read_write`, `authenticated_read`, `bucket_owner_read`, `bucket_owner_full_control`. The ACL defaults to `private`. + +Note that, in order to set `acl`, the bucket's policy must allow such operations via the `s3:PutObjectAcl` action. +An example policy might look like this: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowPublicRead", + "Effect": "Allow", + "Principal": { + "AWS": "PRINCIPAL_ID" + }, + "Action": [ + "s3:AbortMultipartUpload", + "s3:DeleteObject", + "s3:GetObject", + "s3:GetObjectAcl", + "s3:PutObject", + "s3:PutObjectAcl" + ], + "Resource": "arn:aws:s3:::BUCKET_NAME/*" + } + ] +} +``` + +Be sure to set up the principal and resources according to your needs. + +## S3 ACL with bucket policy + +Another way to set ACL for your artifacts is via a S3 bucket policy. + +This bucket policy grants the public read permission: + +```json +{ + "Version": "2014-09-25", + "Statement":[{ + "Sid":"AllowPublicRead", + "Effect":"Allow", + "Principal": "*", + "Action":["s3:GetObject"], + "Resource":["arn:aws:s3:::"YOUR BUCKET NAME"/*" + ] + } + ] +} +``` + +## S3 bucket regions + +By default the region `us-east-1` is used when deploying to S3. If your bucket is hosted in a different region, deploying using the default region results in the following error. + +``` +The bucket you are attempting to access must be addressed using the specified endpoint. +Please send all future requests to this endpoint. (AWS::S3::Errors::PermanentRedirect) +``` + +This can be resolved by specifying your bucket's region using the `region` configuration. For example, this example uses the `eu-west-1` region. + +```yaml +deploy: + provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" + skip_cleanup: true + region: eu-west-1 +``` +{: data-file=".travis.yml"} + +## Deploy From Only One Folder + +Often, you don't want to upload your entire project to S3. You can tell Travis CI to only upload a single folder to S3. You can use the `local_dir` option to do so. This example uploads the `build` directory of your project to S3: + +```yaml +deploy: + provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" + skip_cleanup: true + local_dir: build +``` +{: data-file=".travis.yml"} + +## Deploy to a Specific S3 Folder + +Often, you want to upload only to a specific S3 Folder. You can use the `upload-dir` option to set the S3 destination folder. This example uploads to the `travis-builds` folder of your s3 bucket. + +```yaml +deploy: + provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" + skip_cleanup: true + upload-dir: travis-builds +``` +{: data-file=".travis.yml"} + +## Deploy to a S3 hosted website: + +To upload to a S3 hosted website, to use this template to upload to your website. + +```yaml +deploy: + provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" + skip_cleanup: true + region: "Bucket region" +``` +{: data-file=".travis.yml"} + +Remember that you need to set the bucket to have an ACL of `public` for anybody to be able to see your website. + +## Deploy to Multiple Buckets: + +If you want to upload to multiple buckets, you can do this: + +```yaml +deploy: + - provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" + skip_cleanup: true + - provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "Second S3 Bucket" + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +## Conditional releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +## Running commands before and after release + +Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. + +```yaml + before_deploy: "echo 'ready?'" + deploy: + .. + after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} + +## Setting `Content-Encoding` header + +S3 uploads can optionally set HTTP header `Content-Encoding`. +This header allows files to be sent compressed while retaining file extensions and +the associated MIME types. + +To enable this feature, add: + +```yaml +deploy: + provider: s3 + .. + detect_encoding: true # <== default is false +``` +{: data-file=".travis.yml"} + +If the file is compressed with `gzip` or `compress`, it will be uploaded with +the appropriate header. + +## Setting `charset` on `Content-Type` header + +S3 can take a content-type header. Normally this doesn't include a character set as well. If you would like to add a character set, add the `default_text_charset` option with what you want it to be. For example: + +```yaml +deploy: + provider: s3 + .. + default_text_charset: 'utf-8' # Default is '' +``` +{: data-file=".travis.yml"} + +## HTTP cache control + +S3 uploads can optionally set `Cache-Control` and `Expires` HTTP headers. + +Set HTTP header `Cache-Control` to suggest that the browser cache the file. Defaults to `no-cache`. Valid options are `no-cache`, `no-store`, `max-age=`, `s-maxage= no-transform`, `public`, `private`. + +`Expires` sets the date and time that the cached object is no longer cacheable. Defaults to not set. The date must be in the format `YYYY-MM-DD HH:MM:SS -ZONE`. + +```yaml +deploy: + provider: s3 + .. + cache_control: "max-age=31536000" + expires: "2012-12-21 00:00:00 -0000" +``` +{: data-file=".travis.yml"} + +## Set dot_match flag to upload files starting with a period + +S3 uploads can be set to upload all files starting with a `.` + +```yaml +deploy: + provider: s3 + .. + dot_match: true +``` +{: data-file=".travis.yml"} + + +## Using S3-compatible Object Storage + +You can use an S3-compatible object storage such as Digital Ocean Spaces +by setting the `endpoint` key. + +```yaml +deploy: + provider: s3 + .. + endpoint: https://nyc3.digitaloceanspaces.com +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/scalingo.md b/user/deployment-v2/scalingo.md new file mode 100644 index 00000000000..eede7991ab2 --- /dev/null +++ b/user/deployment-v2/scalingo.md @@ -0,0 +1,72 @@ +--- +title: Scalingo deployment +layout: en +deploy: v2 + +--- + + + +Travis CI can automatically deploy your application to +[Scalingo](https://scalingo.com/) application after a successful build. + +Chose one of two ways to connect to your Scalingo account: + +* Using a [username and password](/user/deployment/scalingo/#connecting-using-a-username-and-password). +* Using an [api key](/user/deployment/scalingo/#connecting-using-an-api-key). + + + +## Connecting using a username and password + +Add your Scalingo username and your [encrypted](/user/encryption-keys/#usage) +Scalingo password to your `.travis.yml`: + +```yaml +deploy: + provider: scalingo + user: "" + password: + secure: "YOUR ENCRYPTED PASSWORD" +``` +{: data-file=".travis.yml"} + +## Connecting using an api key + +Add your [encrypted](/user/encryption-keys/#usage) +Scalingo `api_key` to your `.travis.yml`: + +```yaml +deploy: + provider: scalingo + api_key: + secure: "YOUR ENCRYPTED PASSWORD" +``` +{: data-file=".travis.yml"} + +## Optional settings + +* `remote`: Remote url or git remote name of your git repository. The default + remote name is "scalingo". +* `branch`: Branch of your git repository to deploy. The default branch name is + "master". +* `app`: Only necessary if your repository does not contain the appropriate + remote. Specifying the `app` will add a remote to your local repository: `git + remote add git@scalingo.com:.git` + +### 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. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/script.md b/user/deployment-v2/script.md new file mode 100644 index 00000000000..4d3ca15c84f --- /dev/null +++ b/user/deployment-v2/script.md @@ -0,0 +1,73 @@ +--- +title: Script deployment +layout: en +deploy: v2 + +--- + +If your deployment needs more customization than the `after_success` method allows, +use a custom script. + +The following example runs `scripts/deploy.sh` on the `develop` branch of your repository if the build is successful. + +```yaml +deploy: + provider: script + script: bash scripts/deploy.sh + on: + branch: develop +``` +{: data-file=".travis.yml"} + +If you need to run multiple commands, write a executable wrapper script that runs them all. The argument to `script:` in the script deployment provider needs to be a single command. + +If the script returns a nonzero status, deployment is considered +a failure, and the build will be marked as "errored". + +## Passing Arguments to the Script + +It is possible to pass arguments to a script deployment. + +```yaml +deploy: + # deploy develop to the staging environment + - provider: script + script: bash scripts/deploy.sh staging + on: + branch: develop + # deploy master to production + - provider: script + script: bash scripts/deploy.sh production + on: + branch: master +``` +{: data-file=".travis.yml"} + +The script has access to all the usual [environment variables](/user/environment-variables/#default-environment-variables). + +```yaml +deploy: + provider: script + script: bash scripts/deploy.sh production $TRAVIS_TAG + on: + tags: true + all_branches: true +``` +{: data-file=".travis.yml"} + +## Ruby version + +To ensure that deployments run consistently, we use the version of Ruby that is +pre-installed on all of our build images, which may change when images are updated. + +* The `travis_internal_ruby` function prints the exact pre-installed Ruby version + +If you need to run a command that requires a different Ruby version than the +pre-installed default, you need to set it explicitly: + +```yaml +deploy: + provider: script + script: rvm use $TRAVIS_RUBY_VERSION do script.rb +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/snaps.md b/user/deployment-v2/snaps.md new file mode 100644 index 00000000000..5e3e7f6b97f --- /dev/null +++ b/user/deployment-v2/snaps.md @@ -0,0 +1,74 @@ +--- +title: Snap Store +layout: en +deploy: v2 +permalink: /user/deployment/snaps/ +--- + +Travis CI can automatically upload and release your app to the [Snap Store](https://snapcraft.io) after a successful build. + +[Snapcraft](https://snapcraft.io/) lets you distribute to all Ubuntu releases and a [growing set of Linux distributions](https://docs.snapcraft.io/core/install) with a single artefact. You publish and update at your pace while still reaching everyone; you're not locked to the release cycle of Ubuntu or any other distribution. The updates apply automatically and roll back if anything goes wrong. They're secure; each update is cryptographically signed and is tamper-proof once installed. The applications are locked down using the same container primitives found in Docker and LXD. + +To upload your snap, add the following to your `.travis.yml`: + +```yaml +dist: xenial + +deploy: + provider: snap + snap: my_*.snap + channel: edge + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +The `snap` value should be a string that matches exactly one file when the deployment starts. +If the name of the snap file is not known ahead of time, you can use a shell glob pattern, as shown +in the example above. + +## Providing credentials to upload the snap +To upload snaps from Travis CI, export a Snap Store login token, and provide it as an environment variable +`$SNAP_TOKEN`. + +If you have not done so already, [enable snap support](https://docs.snapcraft.io/core/install) on your system. + +```bash +sudo snap install snapcraft --classic +``` + +Login tokens can specify how, when, and where they can be used, thus minimising damage from compromise. +For Travis CI, export a token that can only upload this snap to the channel you specified above (in this example, `edge`): + +```bash +snapcraft export-login --snaps my-snap-name --channels edge - +``` + +_Note: The final `-` requests the login be exported to stdout instead of a file. It is required._ + +The token will be printed out. + +_Note: The `edge` channel is intended for the bleeding edge: your every commit to master will be built and uploaded._ + +### Using the CLI client +Using our [CLI client](https://github.com/travis-ci/travis.rb#readme), define `$SNAP_TOKEN`: + +```bash +# in the repository root +travis env set SNAP_TOKEN "" +``` + +### Using Settings page +Equivalently, you can do this on the [Settings page](https://docs.travis-ci.com/user/environment-variables#defining-variables-in-repository-settings) of your repository at Travis CI. + +## Using uploaded Snap +Your community of early-adopters and testers can install your app in any of the [supported Linux distributions](https://docs.snapcraft.io/core/install) with: + +```bash +sudo snap install my-snap-name --edge +``` + +Each upload gets a monotonically increasing integer. When you're ready, you can release one of these built commits to the stable channel for public discovery in the [Snap storefront](https://snapcraft.io/store). For example, you could promote the very first upload to stable: + +```bash +snapcraft release my-snap-name 1 stable +``` diff --git a/user/deployment-v2/surge.md b/user/deployment-v2/surge.md new file mode 100644 index 00000000000..0c981392d35 --- /dev/null +++ b/user/deployment-v2/surge.md @@ -0,0 +1,70 @@ +--- +title: Surge.sh Deployment +layout: en +deploy: v2 + +--- + +Travis CI can deploy your static files to [Surge.sh](https://surge.sh/) after a successful build. Builds triggered from Pull Requests will never trigger a deploy. + +You will need to set 2 environment variables in your travis settings and set the deployment provider details in `.travis.yml` + +### Environment variables + +- **SURGE_LOGIN**: Set it to the email address you use with Surge +- **SURGE_TOKEN**: Set it to your login token (get it by doing a `surge token`) + +### Configuration of `.travis.yml`: + +- Add `surge` as deployment provider in `.travis.yml` + +- If your project folder is not the repo root you can set the deploy option `project` to define a path relative to repo root to deploy. + +- If you do not have a `CNAME` file with the name of the domain to publish to you can set the deploy option `domain` with the domain to deploy to. + +Example: + +```yaml +deploy: + provider: surge + project: ./static/ + domain: example.surge.sh +``` +{: data-file=".travis.yml"} + +### Generated content + +If you are generating files for deployment you must tell the `deploy` step to keep your changes: + +```yaml +deploy: + ... + skip_cleanup: true +``` +{: data-file=".travis.yml"} + +It is suggested that you generate your files during the `script` step or the `before_deploy` step. + +- When generating files during the `script` step, an error results in a failed build. +- When generating files during the `before_deploy` step, an error does *not* result in a failed build. + +### Branches + +By default, Travis CI will only deploy from your `master` branch. You can specify what branch to deploy from with the deploy option `on`: + +```yaml +deploy: + ... + on: myProductionBranch +``` +{: data-file=".travis.yml"} + +To deploy from all branches set the deploy->on option `all_branches` to `true` + +```yaml +deploy: + ... + on: + all_branches: true +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/testfairy.md b/user/deployment-v2/testfairy.md new file mode 100644 index 00000000000..c3f783504aa --- /dev/null +++ b/user/deployment-v2/testfairy.md @@ -0,0 +1,82 @@ +--- +title: TestFairy deployment +layout: en +deploy: v2 + +--- + +Travis CI can automatically deploy your Android and iOS Apps to [TestFairy](https://www.testfairy.com/). + +For a minimal configuration, add the following `deploy` key to your `.travis.yml`: + +```yaml +deploy: + provider: testfairy + api-key: "TESTFAIRY API KEY" + app-file: Path to the app file (APK/IPA) +``` +{: data-file=".travis.yml"} + +You can find your API key on [TestFairy settings page](https://app.testfairy.com/settings/). + +Always encrypt your api-key. If you have the Travis CI command line client installed, run the following command in your repository directory: + +```bash +$ travis encrypt "YOUR API KEY" --add deploy.api-key +``` + +## Symbols file + +Attach your symbols mapping file so TestFairy can de-obfuscate and symbolicate crash reports automatically. Set the `symbols-file` key to your `proguard_mapping.txt` file or to a zipped `.dSYM` file. + +```yaml +deploy: + provider: testfairy + api-key: "TESTFAIRY API KEY" + app-file: Path to the app file (APK/IPA) + symbols-file: Path to the symbols file +``` +{: data-file=".travis.yml"} + +## Invite testers automatically + +To automatically invite testers upon build upload, specify a comma-separated list of groups in the `testers-groups` key. Set the `notify` key to `true` if you want to notify them via email: + +```yaml +deploy: + provider: testfairy + api-key: "TESTFAIRY API KEY" + app-file: Path to the app file (APK/IPA) + notify: false + testers-groups: qa-stuff,friends +``` +{: data-file=".travis.yml"} + +## More Options + +- **auto-update**: Upgrade previous installations to this version automatically. +- **max-duration**: Maximum session recording length, eg "60m". Default is "10m". +- **data-only-wifi**: Record video and metrics only when connected to wifi network. +- **video**: If true, Video recording settings "true", "false". Default is "true". +- **video-quality**: Video quality settings, "high", "medium" or "low". Default is "high". +- **screenshot-interval**: Seconds between video frames. Default "1" seconds. +- **record-on-background**: If true, data will be collected while the app on background. +- **metrics**: Comma-separated list of metrics to record. View list on [TestFairy Docs](https://docs.testfairy.com/API/Upload_API.html). + +For example: + +```yaml +deploy: + provider: testfairy + api-key: "TESTFAIRY API KEY" + app-file: bin/MainActivity_release.apk + symbols-file: bin/proguard_mapping.txt + testers-groups: qa-stuff,friends + auto-update: true + screenshot-interval: 2 + video: true + video-quality: high + data-only-wifi: true + metrics: cpu,memory,network,phone-signal,logcat,gps,battery +``` +{: data-file=".travis.yml"} diff --git a/user/deployment-v2/transifex.md b/user/deployment-v2/transifex.md new file mode 100644 index 00000000000..df62e7991fc --- /dev/null +++ b/user/deployment-v2/transifex.md @@ -0,0 +1,66 @@ +--- +title: Transifex Deployment +layout: en +deploy: v2 + +--- + +Travis CI supports uploading to [Transifex](https://www.transifex.com/). + +A minimal configuration is: + +```yaml +deploy: + provider: transifex + controller: transifex.transifexapps.com + username: "Transifex User Name" + password: "Transifex Password" + app: App_name + cli_version: vX.Y.Z # e.g. v2.7.0 being the latest at this time +``` +{: data-file=".travis.yml"} + +It is recommended that you encrypt your password. +Assuming you have the Travis CI command line client installed, you can do it like this: + +```bash +$ travis encrypt "YOUR TRANSIFEX PASSWORD" --add deploy.password +``` + +You will be prompted to enter your api key on the command line. + +You can also have the `travis` tool set up everything for you: + +```bash +$ travis setup transifex +``` + +Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. + +### Conditional Releases + +You can deploy only when certain conditions are met. +See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). + +### Note on `.gitignore` + +As this deployment strategy relies on `git`, be mindful that the deployment will +honor `.gitignore`. + +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 + +Sometimes you want to run commands before or after triggering a deployment. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. + +```yaml + before_deploy: "echo 'ready?'" + deploy: + .. + after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/user/deployment/anynines.md b/user/deployment/anynines.md index cb6fb87b889..24e4104b411 100644 --- a/user/deployment/anynines.md +++ b/user/deployment/anynines.md @@ -1,6 +1,7 @@ --- title: anynines Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/atlas.md b/user/deployment/atlas.md index 6fdd914dcb0..4c03b97c01d 100644 --- a/user/deployment/atlas.md +++ b/user/deployment/atlas.md @@ -1,6 +1,7 @@ --- title: Atlas deployment layout: en +deploy: v1 --- diff --git a/user/deployment/azure-web-apps.md b/user/deployment/azure-web-apps.md index 1b27ca0f082..07e0aff67bd 100644 --- a/user/deployment/azure-web-apps.md +++ b/user/deployment/azure-web-apps.md @@ -1,6 +1,7 @@ --- title: Azure Web App Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/bintray.md b/user/deployment/bintray.md index d3b5ca810bb..f31685b1f79 100644 --- a/user/deployment/bintray.md +++ b/user/deployment/bintray.md @@ -1,6 +1,7 @@ --- title: Bintray Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/bitballoon.md b/user/deployment/bitballoon.md index bd75b1998c0..bfccb9c9f22 100644 --- a/user/deployment/bitballoon.md +++ b/user/deployment/bitballoon.md @@ -1,6 +1,7 @@ --- title: BitBalloon Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/bluemixcloudfoundry.md b/user/deployment/bluemixcloudfoundry.md index a58dec84bdc..d2bb4725da8 100644 --- a/user/deployment/bluemixcloudfoundry.md +++ b/user/deployment/bluemixcloudfoundry.md @@ -1,6 +1,7 @@ --- title: Bluemix CloudFoundry Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/boxfuse.md b/user/deployment/boxfuse.md index aab0b6046ab..01e6be25b77 100644 --- a/user/deployment/boxfuse.md +++ b/user/deployment/boxfuse.md @@ -1,6 +1,7 @@ --- title: Boxfuse Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/cargo.md b/user/deployment/cargo.md index 01bec8aee2c..8f2bd98f104 100644 --- a/user/deployment/cargo.md +++ b/user/deployment/cargo.md @@ -1,6 +1,7 @@ --- title: Cargo Releases layout: en +deploy: v1 --- Travis CI can automatically release your Rust crate to [crates.io][] diff --git a/user/deployment/catalyze.md b/user/deployment/catalyze.md index 91796037c16..8f3ee8c7f44 100644 --- a/user/deployment/catalyze.md +++ b/user/deployment/catalyze.md @@ -1,6 +1,7 @@ --- title: Catalyze Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/chefsupermarket.md b/user/deployment/chefsupermarket.md index 2dc796a48e6..b36dddb0da7 100644 --- a/user/deployment/chefsupermarket.md +++ b/user/deployment/chefsupermarket.md @@ -1,6 +1,7 @@ --- title: Chef Supermarket deployment layout: en +deploy: v1 --- diff --git a/user/deployment/cloud66.md b/user/deployment/cloud66.md index 35b49d7d20b..d7163aafcd0 100644 --- a/user/deployment/cloud66.md +++ b/user/deployment/cloud66.md @@ -1,6 +1,7 @@ --- title: Cloud 66 Deployment layout: en +deploy: v1 --- Travis CI can automatically deploy your [Cloud 66](https://www.cloud66.com/) application after a successful build. diff --git a/user/deployment/cloudfiles.md b/user/deployment/cloudfiles.md index ba090d2d930..5beaae09a89 100644 --- a/user/deployment/cloudfiles.md +++ b/user/deployment/cloudfiles.md @@ -1,6 +1,7 @@ --- title: Rackspace Cloud Files Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/cloudfoundry.md b/user/deployment/cloudfoundry.md index ea97847bdab..9365382821a 100644 --- a/user/deployment/cloudfoundry.md +++ b/user/deployment/cloudfoundry.md @@ -1,6 +1,7 @@ --- title: CloudFoundry Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/codedeploy.md b/user/deployment/codedeploy.md index 1f9f84607e8..bab4cc62c0e 100644 --- a/user/deployment/codedeploy.md +++ b/user/deployment/codedeploy.md @@ -1,6 +1,7 @@ --- title: AWS CodeDeploy layout: en +deploy: v1 --- diff --git a/user/deployment/custom.md b/user/deployment/custom.md index 1f0c464b8a3..3903c35a50b 100644 --- a/user/deployment/custom.md +++ b/user/deployment/custom.md @@ -1,6 +1,7 @@ --- title: Custom Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/elasticbeanstalk.md b/user/deployment/elasticbeanstalk.md index 490682fe9e6..92bd48838bb 100644 --- a/user/deployment/elasticbeanstalk.md +++ b/user/deployment/elasticbeanstalk.md @@ -1,6 +1,7 @@ --- title: AWS Elastic Beanstalk Deployment layout: en +deploy: v1 --- @@ -22,11 +23,11 @@ To deploy to AWS Elastic Beanstalk add the following to your `.travis.yml`: ```yaml deploy: provider: elasticbeanstalk - access_key_id: + access_key_id: secure: "Encrypted =" secret_access_key: secure: "Encypted =" - region: "us-east-1" + region: "us-east-1" app: "example-app-name" env: "example-app-environment" bucket_name: "the-target-S3-bucket" diff --git a/user/deployment/engineyard.md b/user/deployment/engineyard.md index cfd6ed37e80..556e09b7c4e 100644 --- a/user/deployment/engineyard.md +++ b/user/deployment/engineyard.md @@ -1,6 +1,7 @@ --- title: Engine Yard Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/firebase.md b/user/deployment/firebase.md index b56ca5bcc7a..1f2c4fde693 100644 --- a/user/deployment/firebase.md +++ b/user/deployment/firebase.md @@ -1,6 +1,7 @@ --- title: Firebase Deployment layout: en +deploy: v1 --- @@ -30,7 +31,7 @@ firebase login:ci travis encrypt "1/AD7sdasdasdKJA824OvEFc1c89Xz2ilBlaBlaBla" --add # This command may generate a warning ("If you tried to pass the name of the repository as the first argument, you probably won't get the results you wanted"). You can ignore it. ``` -When using `travis encrypt --add` you are likely to receive `WARNING: The name of the repository is now passed to the command with the -r option` (see https://github.com/travis-ci/travis-ci/issues/7869). The token will be added to your `.travis.yml`, regardless. Inspect and move the token to the `secure:` section of your `.travis.yml` if it isn't added there. +When using `travis encrypt --add` you are likely to receive `WARNING: The name of the repository is now passed to the command with the -r option` (see https://github.com/travis-ci/travis-ci/issues/7869). The token will be added to your `.travis.yml`, regardless. Inspect and move the token to the `secure:` section of your `.travis.yml` if it isn't added there. Remember to [encrypt](/user/encryption-keys/#usage) the token before adding it to your `.travis.yml` diff --git a/user/deployment/gcs.md b/user/deployment/gcs.md index e20a4a9d881..4b45dba7561 100644 --- a/user/deployment/gcs.md +++ b/user/deployment/gcs.md @@ -1,6 +1,7 @@ --- title: Google Cloud Storage (GCS) Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/google-app-engine.md b/user/deployment/google-app-engine.md index 942d89e2798..26226e4e1eb 100644 --- a/user/deployment/google-app-engine.md +++ b/user/deployment/google-app-engine.md @@ -1,13 +1,14 @@ --- title: Google App Engine Deployment layout: en +deploy: v1 --- Travis CI can automatically deploy your [Google App Engine](https://cloud.google.com/appengine/docs) or [Managed VMs](https://cloud.google.com/appengine/docs/managed-vms/) application after a successful build. For a minimal configuration, add the following to your `.travis.yml`: - + ```yaml deploy: provider: gae diff --git a/user/deployment/hackage.md b/user/deployment/hackage.md index 6df5d009f64..b96ec3030c9 100644 --- a/user/deployment/hackage.md +++ b/user/deployment/hackage.md @@ -1,6 +1,7 @@ --- title: Hackage Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/hephy.md b/user/deployment/hephy.md index 51b9fd2b8ec..a80db9d9c9e 100644 --- a/user/deployment/hephy.md +++ b/user/deployment/hephy.md @@ -1,6 +1,7 @@ --- title: Hephy Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/heroku.md b/user/deployment/heroku.md index b0d5cc6a7c4..bc0df76ad28 100644 --- a/user/deployment/heroku.md +++ b/user/deployment/heroku.md @@ -1,6 +1,7 @@ --- title: Heroku Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/lambda.md b/user/deployment/lambda.md index 12f8deabc18..dceb26d3071 100644 --- a/user/deployment/lambda.md +++ b/user/deployment/lambda.md @@ -1,6 +1,7 @@ --- title: Lambda Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/launchpad.md b/user/deployment/launchpad.md index 831cb83952b..ac39e40fb87 100644 --- a/user/deployment/launchpad.md +++ b/user/deployment/launchpad.md @@ -1,6 +1,7 @@ --- title: Launchpad deployment layout: en +deploy: v1 --- diff --git a/user/deployment/npm.md b/user/deployment/npm.md index 09a4fa0bfff..d5b3c06b6d6 100644 --- a/user/deployment/npm.md +++ b/user/deployment/npm.md @@ -1,6 +1,7 @@ --- title: npm Releasing layout: en +deploy: v1 --- Travis CI can automatically release your npm package to [npmjs.com][npmjs] diff --git a/user/deployment/openshift.md b/user/deployment/openshift.md index a56b00fb77e..614e8dbaeb4 100644 --- a/user/deployment/openshift.md +++ b/user/deployment/openshift.md @@ -1,6 +1,7 @@ --- title: OpenShift Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/opsworks.md b/user/deployment/opsworks.md index c5c2ed80c68..9366b68f546 100644 --- a/user/deployment/opsworks.md +++ b/user/deployment/opsworks.md @@ -1,6 +1,7 @@ --- title: AWS OpsWorks Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/packagecloud.md b/user/deployment/packagecloud.md index 4a595320b60..701282da71d 100644 --- a/user/deployment/packagecloud.md +++ b/user/deployment/packagecloud.md @@ -1,6 +1,7 @@ --- title: packagecloud Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/pages.md b/user/deployment/pages.md index 1aa5ae2f3aa..f91219d223a 100644 --- a/user/deployment/pages.md +++ b/user/deployment/pages.md @@ -1,6 +1,7 @@ --- title: GitHub Pages Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/puppetforge.md b/user/deployment/puppetforge.md index 8c62e689e14..a841586dbe1 100644 --- a/user/deployment/puppetforge.md +++ b/user/deployment/puppetforge.md @@ -1,6 +1,7 @@ --- title: Puppet Forge Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/pypi.md b/user/deployment/pypi.md index 41549255cee..47802035766 100644 --- a/user/deployment/pypi.md +++ b/user/deployment/pypi.md @@ -1,6 +1,7 @@ --- title: PyPI deployment layout: en +deploy: v1 --- diff --git a/user/deployment/releases.md b/user/deployment/releases.md index 05783da6640..76849f33694 100644 --- a/user/deployment/releases.md +++ b/user/deployment/releases.md @@ -1,6 +1,7 @@ --- title: GitHub Releases Uploading layout: en +deploy: v1 --- @@ -61,7 +62,7 @@ This gives you an opportunity to examine and edit the draft release. ## Setting the tag at deployment time GitHub Releases needs the present commit to be tagged at the deployment time. -If you set `on.tags: true`, the commit is guaranteed to have a tag. +If you set `on.tags: true`, the commit is guaranteed to have a tag. Depending on the workflow, however, this is not desirable. @@ -102,7 +103,7 @@ The GitHub-generated tags are of the form `untagged-*`, where `*` is a random hex string. Notice that this tag is immediately available on GitHub, and thus will trigger a new Travis CI build, unless it is prevented by -other means; for instance, by +other means; for instance, by [blocklisting `/^untagged/`](/user/customizing-the-build/#safelisting-or-blocklisting-branches). ## Overwrite existing files on the release diff --git a/user/deployment/rubygems.md b/user/deployment/rubygems.md index 2dcbcbc03cd..b6a40d4b72d 100644 --- a/user/deployment/rubygems.md +++ b/user/deployment/rubygems.md @@ -1,6 +1,7 @@ --- title: RubyGems Deployment layout: en +deploy: v1 --- diff --git a/user/deployment/s3.md b/user/deployment/s3.md index 85e939ec061..092353ba43e 100644 --- a/user/deployment/s3.md +++ b/user/deployment/s3.md @@ -1,6 +1,7 @@ --- title: S3 Deployment layout: en +deploy: v1 --- @@ -292,4 +293,4 @@ deploy: .. endpoint: https://nyc3.digitaloceanspaces.com ``` -{: data-file=".travis.yml"} \ No newline at end of file +{: data-file=".travis.yml"} diff --git a/user/deployment/scalingo.md b/user/deployment/scalingo.md index 3883ddaabfe..74b86db039d 100644 --- a/user/deployment/scalingo.md +++ b/user/deployment/scalingo.md @@ -1,6 +1,7 @@ --- title: Scalingo deployment layout: en +deploy: v1 --- diff --git a/user/deployment/script.md b/user/deployment/script.md index 117dbf98046..30d19fe26ce 100644 --- a/user/deployment/script.md +++ b/user/deployment/script.md @@ -1,6 +1,7 @@ --- title: Script deployment layout: en +deploy: v1 --- diff --git a/user/deployment/snaps.md b/user/deployment/snaps.md index 3d0a784feb6..3c58adde225 100644 --- a/user/deployment/snaps.md +++ b/user/deployment/snaps.md @@ -1,6 +1,7 @@ --- title: Snap Store layout: en +deploy: v1 permalink: /user/deployment/snaps/ --- @@ -44,7 +45,7 @@ snapcraft export-login --snaps my-snap-name --channels edge - _Note: The final `-` requests the login be exported to stdout instead of a file. It is required._ -The token will be printed out. +The token will be printed out. _Note: The `edge` channel is intended for the bleeding edge: your every commit to master will be built and uploaded._ diff --git a/user/deployment/surge.md b/user/deployment/surge.md index acfa202ec23..d07a47ba15a 100644 --- a/user/deployment/surge.md +++ b/user/deployment/surge.md @@ -1,6 +1,7 @@ --- title: Surge.sh Deployment layout: en +deploy: v1 --- @@ -27,7 +28,7 @@ Example: deploy: provider: surge project: ./static/ - domain: example.surge.sh + domain: example.surge.sh ``` {: data-file=".travis.yml"} diff --git a/user/deployment/testfairy.md b/user/deployment/testfairy.md index 927e2fad4e6..e4d0c8234d5 100644 --- a/user/deployment/testfairy.md +++ b/user/deployment/testfairy.md @@ -1,6 +1,7 @@ --- title: TestFairy deployment layout: en +deploy: v1 --- diff --git a/user/deployment/transifex.md b/user/deployment/transifex.md index c7a3c8c3893..497f83e693c 100644 --- a/user/deployment/transifex.md +++ b/user/deployment/transifex.md @@ -1,6 +1,7 @@ --- title: Transifex Deployment layout: en +deploy: v1 --- From 24830b4b54db4befd8a6cfc8e90a875efde201b2 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Wed, 4 Sep 2019 15:02:36 +0200 Subject: [PATCH 0202/1536] remove edge note from anynines --- user/deployment-v2/anynines.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/user/deployment-v2/anynines.md b/user/deployment-v2/anynines.md index 38831a8b02c..a6c92def189 100644 --- a/user/deployment-v2/anynines.md +++ b/user/deployment-v2/anynines.md @@ -7,10 +7,6 @@ deploy: v2 You now have the amazing ability to deploy directly to [anynines](http://www.anynines.com/) after a successful build on Travis CI -## Getting on the Edge - -Proper anynines support is currently included only in the edge version of Travis. See how to enable it via the `.travis.yml` below. - ## The Easy Way Go Grab the Travis gem from [GitHub](https://github.com/travis-ci/travis.rb) and run this command: @@ -19,15 +15,12 @@ Go Grab the Travis gem from [GitHub](https://github.com/travis-ci/travis.rb) and You will be asked to answer a few simple questions about your anynines setup and Travis will take care of the rest! -Open up your newly created `.travis.yml` and add `edge: true` to enable the deploy tool. See yml below for an example of how to do this. - ## The Slightly Harder Way So you want to write your own `.travis.yml`, fine. Here is the minimum required to get up and running ```yaml deploy: - edge: true provider: anynines username: johndoe@example.com password: secretpassword From a1126c608c688a59bffac6ccd71d7a051282ae83 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Wed, 4 Sep 2019 15:06:44 +0200 Subject: [PATCH 0203/1536] remove atlas --- user/deployment-v2/atlas.md | 77 ------------------------------------- 1 file changed, 77 deletions(-) delete mode 100644 user/deployment-v2/atlas.md diff --git a/user/deployment-v2/atlas.md b/user/deployment-v2/atlas.md deleted file mode 100644 index 3307a0e37ff..00000000000 --- a/user/deployment-v2/atlas.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: Atlas deployment -layout: en -deploy: v2 - ---- - -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. -2. [Generate](https://atlas.hashicorp.com/settings/tokens) an Atlas API token for Travis CI. -3. Add the following minimum configuration to your `.travis.yml` - - ```yaml - deploy: - provider: atlas - token: "YOUR ATLAS API TOKEN" - app: "YOUR ATLAS USERNAME/YOUR ATLAS APP NAME" - ``` - {: data-file=".travis.yml"} - -## Including or Excluding Files - -You can include and exclude files by adding the `include` and `exclude` entries to `.travis.yml`. Both are glob patterns of files or directories to include or exclude, and may be specified multiple times. If there is a conflict, excludes have precedence over includes. - -```yaml -deploy: - provider: atlas - exclude: "*.log" - include: - - "build/*" - - "bin/*" -``` -{: data-file=".travis.yml"} - -### Using your Version Control System - -Get the lists of files to exclude and include from your version control system (Git, Mercurial or Subversion): - -```yaml -deploy: - provider: atlas - vcs: true -``` -{: data-file=".travis.yml"} - -## Other Deployment Options - -### Specifying the Address of the Atlas Server: - -```yaml -deploy: - provider: atlas - address: "URL OF THE ATLAS SERVER" -``` -{: data-file=".travis.yml"} - -### Adding Custom Metadata - -Add one or more items of metadata: - -```yaml -deploy: - provider: atlas - metadata: - - "custom_name=Jane" - - "custom_surname=Doe" -``` -{: data-file=".travis.yml"} - -{{ site.data.snippets.conditional_deploy }} - -{{ site.data.snippets.before_and_after }} From f3bdc2e5471c049f63c0acfeed9a057c08533afb Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Wed, 4 Sep 2019 16:54:43 +0200 Subject: [PATCH 0204/1536] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- _layouts/en.html | 6 +++--- user/deployment-v2.md | 12 ++++++------ user/deployment-v2/azure-web-apps.md | 2 +- user/deployment-v2/bintray.md | 2 +- user/deployment-v2/bitballoon.md | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/_layouts/en.html b/_layouts/en.html index c715ec6bb54..2b9acbad767 100644 --- a/_layouts/en.html +++ b/_layouts/en.html @@ -24,7 +24,7 @@

        {{ page.title }}

        This page documents deployments using dpl v1 which currently is the default version. The next major version dpl v2 will be released soon, and we recommend starting to use it. Please see our blog post - for details. Documentation for dpl v2 can be found here. + for details. dpl v2 documentation can be found here.

        {% elsif page.deploy == 'v2' %} @@ -32,8 +32,8 @@

        {{ page.title }}

        This page documents deployments using the next major version dpl v2 which currently is in a preview release phase. Please see our blog post - for details. Documentation for dpl v1, the current default version, can be - found here. + for details. The current default version is dpl v1. + Check dpl v1 documentation here.

        {% endif %} diff --git a/user/deployment-v2.md b/user/deployment-v2.md index 7a014f39609..b4282911a1d 100644 --- a/user/deployment-v2.md +++ b/user/deployment-v2.md @@ -3,10 +3,10 @@ title: Deployment (v2) layout: en --- -> This page documents deployments using the next major version dpl v2 which -> currently is in a preview release phase. Please see our blog post on details +> ALPHA This page documents deployments using the next major version dpl v2 which +> currently is in a preview release phase. Please see [the announcement blog post](https://blog.travis-ci.com/2019-08-27-deployment-tooling-dpl-v2-preview-release) on details > about the release process. Documentation for dpl v1, the current default -> version, can be found [here](/user/deployments). +> version, can be found [here](/user/deployments). {: alpha} ## Supported Providers @@ -15,7 +15,7 @@ Continuous Deployment to the following providers is supported: {% include deployments.html %} To deploy to a custom or unsupported provider, use the [after-success build -stage](/user/deployment/custom/) or [script provider](/user/deployment/script). +step](/user/deployment/custom/) or [script provider](/user/deployment/script). ## Maturity Levels @@ -90,7 +90,7 @@ When *all* conditions specified in the `on:` section are met, your build will de Use the following options to configure conditional deployment: -* `repo`: in the form `owner_name/repo_name`. Deploy only when the build occurs on a particular repository. For example +* `repo`: in the form `owner_name/repo_name`. Deploy only when the build occurs on a particular repository. For example: ```yaml deploy: @@ -191,7 +191,7 @@ deploy: ### 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). +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?subject:New%20deployment%20provider%20proposal). If you contribute to or experiment with the [deploy tool](https://github.com/travis-ci/dpl), make sure you use the edge version from GitHub: diff --git a/user/deployment-v2/azure-web-apps.md b/user/deployment-v2/azure-web-apps.md index 855371d82d7..6d30f051744 100644 --- a/user/deployment-v2/azure-web-apps.md +++ b/user/deployment-v2/azure-web-apps.md @@ -72,7 +72,7 @@ its content. ### 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. +Sometimes you want to run commands before or after deploying. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/bintray.md b/user/deployment-v2/bintray.md index d2283eb860d..a54239b2d37 100644 --- a/user/deployment-v2/bintray.md +++ b/user/deployment-v2/bintray.md @@ -68,7 +68,7 @@ See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with ### 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. +Sometimes you want to run commands before or after deploying. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/bitballoon.md b/user/deployment-v2/bitballoon.md index 669bac5f279..4657d32410d 100644 --- a/user/deployment-v2/bitballoon.md +++ b/user/deployment-v2/bitballoon.md @@ -40,7 +40,7 @@ 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 +the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml From c95503bd5be7cf80c4f2559a04da5b07657f04ad Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Wed, 4 Sep 2019 17:07:24 +0200 Subject: [PATCH 0205/1536] s/stages/steps --- user/deployment-v2/cargo.md | 2 +- user/deployment-v2/catalyze.md | 2 +- user/deployment-v2/cloud66.md | 2 +- user/deployment-v2/cloudfiles.md | 2 +- user/deployment-v2/codedeploy.md | 2 +- user/deployment-v2/elasticbeanstalk.md | 2 +- user/deployment-v2/firebase.md | 2 +- user/deployment-v2/hephy.md | 2 +- user/deployment-v2/heroku.md | 2 +- user/deployment-v2/npm.md | 2 +- user/deployment-v2/openshift.md | 2 +- user/deployment-v2/opsworks.md | 2 +- user/deployment-v2/packagecloud.md | 2 +- user/deployment-v2/puppetforge.md | 2 +- user/deployment-v2/pypi.md | 2 +- user/deployment-v2/releases.md | 2 +- user/deployment-v2/rubygems.md | 2 +- user/deployment-v2/s3.md | 2 +- user/deployment-v2/scalingo.md | 2 +- user/deployment-v2/transifex.md | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/user/deployment-v2/cargo.md b/user/deployment-v2/cargo.md index 5af9b48ae29..bce11a9863e 100644 --- a/user/deployment-v2/cargo.md +++ b/user/deployment-v2/cargo.md @@ -81,7 +81,7 @@ future). ## 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 +`before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml diff --git a/user/deployment-v2/catalyze.md b/user/deployment-v2/catalyze.md index 3dc498c019c..71606f85c1a 100644 --- a/user/deployment-v2/catalyze.md +++ b/user/deployment-v2/catalyze.md @@ -75,7 +75,7 @@ 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 +the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml diff --git a/user/deployment-v2/cloud66.md b/user/deployment-v2/cloud66.md index 927fd55b3be..f0808a178cc 100644 --- a/user/deployment-v2/cloud66.md +++ b/user/deployment-v2/cloud66.md @@ -59,7 +59,7 @@ See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with ### 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. +Sometimes you want to run commands before or after deploying. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/cloudfiles.md b/user/deployment-v2/cloudfiles.md index e9df55c806b..f90175f61bf 100644 --- a/user/deployment-v2/cloudfiles.md +++ b/user/deployment-v2/cloudfiles.md @@ -146,7 +146,7 @@ See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with ### Running commands before and after release -Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. +Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. ```yaml before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/codedeploy.md b/user/deployment-v2/codedeploy.md index 55960ddf923..f9db89a6c77 100644 --- a/user/deployment-v2/codedeploy.md +++ b/user/deployment-v2/codedeploy.md @@ -143,7 +143,7 @@ its content. ## 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. +Sometimes you want to run commands before or after deploying. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/elasticbeanstalk.md b/user/deployment-v2/elasticbeanstalk.md index 732290f09b4..f183e3a0738 100644 --- a/user/deployment-v2/elasticbeanstalk.md +++ b/user/deployment-v2/elasticbeanstalk.md @@ -56,7 +56,7 @@ The following environment variables are available: ## 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 +the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml diff --git a/user/deployment-v2/firebase.md b/user/deployment-v2/firebase.md index a187b13e767..f99045f8657 100644 --- a/user/deployment-v2/firebase.md +++ b/user/deployment-v2/firebase.md @@ -64,7 +64,7 @@ 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 +the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml diff --git a/user/deployment-v2/hephy.md b/user/deployment-v2/hephy.md index f6efcc40696..3f67670bfad 100644 --- a/user/deployment-v2/hephy.md +++ b/user/deployment-v2/hephy.md @@ -53,7 +53,7 @@ its content. ### Running Commands Before and After Deploy -Sometimes you want to run commands before or after triggering a deployment. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. +Sometimes you want to run commands before or after triggering a deployment. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. ```yaml before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/heroku.md b/user/deployment-v2/heroku.md index 671aa0daa3f..7f6787658e0 100644 --- a/user/deployment-v2/heroku.md +++ b/user/deployment-v2/heroku.md @@ -192,7 +192,7 @@ its content. ### 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. +Sometimes you want to run commands before or after deploying. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/npm.md b/user/deployment-v2/npm.md index 25e02c64f37..cdd284050fe 100644 --- a/user/deployment-v2/npm.md +++ b/user/deployment-v2/npm.md @@ -134,7 +134,7 @@ to override it. ## 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. +Sometimes you want to run commands before or after deploying. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/openshift.md b/user/deployment-v2/openshift.md index 453b866717e..58d5c9be362 100644 --- a/user/deployment-v2/openshift.md +++ b/user/deployment-v2/openshift.md @@ -128,7 +128,7 @@ its content. ### 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. +Sometimes you want to run commands before or after deploying. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/opsworks.md b/user/deployment-v2/opsworks.md index 052a2bcdab4..54063f4ec96 100644 --- a/user/deployment-v2/opsworks.md +++ b/user/deployment-v2/opsworks.md @@ -139,7 +139,7 @@ See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with ### 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. +Sometimes you want to run commands before or after deploying. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/packagecloud.md b/user/deployment-v2/packagecloud.md index 1350db2065b..dba893b4d23 100644 --- a/user/deployment-v2/packagecloud.md +++ b/user/deployment-v2/packagecloud.md @@ -117,7 +117,7 @@ See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with ### Running commands before and after release -Sometimes you want to run commands before or after releasing a package. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. +Sometimes you want to run commands before or after releasing a package. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. ```yaml before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/puppetforge.md b/user/deployment-v2/puppetforge.md index 58f49e2ecfb..dc36dd4887c 100644 --- a/user/deployment-v2/puppetforge.md +++ b/user/deployment-v2/puppetforge.md @@ -41,7 +41,7 @@ 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 +the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml diff --git a/user/deployment-v2/pypi.md b/user/deployment-v2/pypi.md index c57939ec597..d6fcd132f63 100644 --- a/user/deployment-v2/pypi.md +++ b/user/deployment-v2/pypi.md @@ -158,7 +158,7 @@ See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with ## Running commands before and after release -Sometimes you want to run commands before or after releasing a package. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. +Sometimes you want to run commands before or after releasing a package. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. ``` before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/releases.md b/user/deployment-v2/releases.md index f8c6cea3d7d..fed8880a1e2 100644 --- a/user/deployment-v2/releases.md +++ b/user/deployment-v2/releases.md @@ -233,7 +233,7 @@ See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with ## Running commands before or after release -Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. +Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. ```yaml before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/rubygems.md b/user/deployment-v2/rubygems.md index adbf86bd913..620cc885c98 100644 --- a/user/deployment-v2/rubygems.md +++ b/user/deployment-v2/rubygems.md @@ -169,7 +169,7 @@ See [this GitHub issue](https://github.com/travis-ci/dpl/issues/574) for details ### Running commands before and after release -Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. +Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. ```yaml before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/s3.md b/user/deployment-v2/s3.md index 8867f0efa52..947b9e53849 100644 --- a/user/deployment-v2/s3.md +++ b/user/deployment-v2/s3.md @@ -209,7 +209,7 @@ See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with ## Running commands before and after release -Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. +Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. ```yaml before_deploy: "echo 'ready?'" diff --git a/user/deployment-v2/scalingo.md b/user/deployment-v2/scalingo.md index eede7991ab2..ceb5d1b6eca 100644 --- a/user/deployment-v2/scalingo.md +++ b/user/deployment-v2/scalingo.md @@ -58,7 +58,7 @@ 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 +the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. ```yaml diff --git a/user/deployment-v2/transifex.md b/user/deployment-v2/transifex.md index df62e7991fc..d3202600066 100644 --- a/user/deployment-v2/transifex.md +++ b/user/deployment-v2/transifex.md @@ -53,7 +53,7 @@ its content. ### Running Commands Before and After Deploy -Sometimes you want to run commands before or after triggering a deployment. You can use the `before_deploy` and `after_deploy` stages for this. These will only be triggered if Travis CI is actually pushing a release. +Sometimes you want to run commands before or after triggering a deployment. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. ```yaml before_deploy: "echo 'ready?'" From 5578c7b3ff907a26ca9b4c66db8d37b460d90262 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Wed, 4 Sep 2019 17:10:48 +0200 Subject: [PATCH 0206/1536] more s/stages/steps --- user/deployment-v2/chefsupermarket.md | 2 +- user/deployment-v2/opsworks.md | 2 +- user/deployment-v2/pypi.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/user/deployment-v2/chefsupermarket.md b/user/deployment-v2/chefsupermarket.md index 18a1dfc44b4..aef53484757 100644 --- a/user/deployment-v2/chefsupermarket.md +++ b/user/deployment-v2/chefsupermarket.md @@ -17,7 +17,7 @@ your `.travis.yml`: deploy: provider: chef-supermarket user_id: "" - # the encrypted client key file is decrypted in the before_install stage of the build when you add it using the instructions above + # the encrypted client key file is decrypted in the before_install step of the build when you add it using the instructions above cookbook_category: "Others" ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/opsworks.md b/user/deployment-v2/opsworks.md index 54063f4ec96..7c35c5a09d0 100644 --- a/user/deployment-v2/opsworks.md +++ b/user/deployment-v2/opsworks.md @@ -82,7 +82,7 @@ Builds triggered from Pull Requests will never trigger a deploy. ### Deploying build artifacts -After your tests run and before the deploy stage, Travis CI will clean up any additional files and changes you made. +After your tests run and before the deploy step, Travis CI will clean up any additional files and changes you made. Maybe that is not what you want, as you might generate some artifacts (think asset compilation) that are supposed to be deployed, too. There is now an option to skip the clean up: diff --git a/user/deployment-v2/pypi.md b/user/deployment-v2/pypi.md index d6fcd132f63..c889360f453 100644 --- a/user/deployment-v2/pypi.md +++ b/user/deployment-v2/pypi.md @@ -121,7 +121,7 @@ If you specify `bdist_wheel` in the distributions, the `wheel` package will auto ## Upload artifacts only once -By default, Travis CI runs the deploy stage for each `python` and `environment` that you specify. Many of these will generate competing build artifacts that will fail to upload to pypi with a message something like this: +By default, Travis CI runs the deploy step for each `python` and `environment` that you specify. Many of these will generate competing build artifacts that will fail to upload to pypi with a message something like this: ``` HTTPError: 400 Client Error: File already exists. See https://pypi.org/help/#file-name-reuse for url: https://upload.pypi.org/legacy/ From aaec5b129022fc44e478a78ce03e6e03d3d0ed3a Mon Sep 17 00:00:00 2001 From: mariadeanton Date: Wed, 4 Sep 2019 17:28:47 +0200 Subject: [PATCH 0207/1536] update introductory notes in dpl v1 and v2 --- user/deployment-v2.md | 5 +---- user/deployment.md | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/user/deployment-v2.md b/user/deployment-v2.md index b4282911a1d..29b9ade54c8 100644 --- a/user/deployment-v2.md +++ b/user/deployment-v2.md @@ -3,10 +3,7 @@ title: Deployment (v2) layout: en --- -> ALPHA This page documents deployments using the next major version dpl v2 which -> currently is in a preview release phase. Please see [the announcement blog post](https://blog.travis-ci.com/2019-08-27-deployment-tooling-dpl-v2-preview-release) on details -> about the release process. Documentation for dpl v1, the current default -> version, can be found [here](/user/deployments). {: alpha} +> ALPHA This page documents deployments using the next major version dpl v2 which currently is in a preview release phase. Please see [the announcement blog post](https://blog.travis-ci.com/2019-08-27-deployment-tooling-dpl-v2-preview-release) on details about the release process. Documentation for dpl v1, the current default version, can be found [here](/user/deployments). {: alpha} ## Supported Providers diff --git a/user/deployment.md b/user/deployment.md index f08ffd023ac..906423f8632 100644 --- a/user/deployment.md +++ b/user/deployment.md @@ -4,10 +4,10 @@ layout: en swiftypetags: 'skip_cleanup' --- -> This page documents deployments using dpl v1 which currently still is the +> This page documents deployments using dpl v1 which is the > default version. The next major version dpl v2 will be released soon. Please -> see our blog post on details about the release process. Documentation for dpl -> v2 can be found [here](/user/deployments-v2). +> see our blog post on details about the release process. [Documentation for dpl +> v2 can be found here](/user/deployments-v2). ## Supported Providers From edaef9591799ab415f8e075b03f44708d5b64c4d Mon Sep 17 00:00:00 2001 From: mariadeanton Date: Wed, 4 Sep 2019 17:30:12 +0200 Subject: [PATCH 0208/1536] update links in the introductory notes for dpl v1 and v2 --- user/deployment-v2.md | 2 +- user/deployment.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/user/deployment-v2.md b/user/deployment-v2.md index 29b9ade54c8..81e70b2ac23 100644 --- a/user/deployment-v2.md +++ b/user/deployment-v2.md @@ -3,7 +3,7 @@ title: Deployment (v2) layout: en --- -> ALPHA This page documents deployments using the next major version dpl v2 which currently is in a preview release phase. Please see [the announcement blog post](https://blog.travis-ci.com/2019-08-27-deployment-tooling-dpl-v2-preview-release) on details about the release process. Documentation for dpl v1, the current default version, can be found [here](/user/deployments). {: alpha} +> ALPHA This page documents deployments using the next major version dpl v2 which currently is in a preview release phase. Please see [the announcement blog post](https://blog.travis-ci.com/2019-08-27-deployment-tooling-dpl-v2-preview-release) on details about the release process. Documentation for dpl v1, the current default version, can be found [here](/user/deployment). {: alpha} ## Supported Providers diff --git a/user/deployment.md b/user/deployment.md index 906423f8632..cc478a140d4 100644 --- a/user/deployment.md +++ b/user/deployment.md @@ -7,7 +7,7 @@ swiftypetags: 'skip_cleanup' > This page documents deployments using dpl v1 which is the > default version. The next major version dpl v2 will be released soon. Please > see our blog post on details about the release process. [Documentation for dpl -> v2 can be found here](/user/deployments-v2). +> v2 can be found here](/user/deployment-v2). ## Supported Providers From 8b5a1b6503be496161977c6442e4e4dc4745d512 Mon Sep 17 00:00:00 2001 From: mariadeanton Date: Wed, 4 Sep 2019 17:35:47 +0200 Subject: [PATCH 0209/1536] update intro banners again with link to blog post and fixed ALPHA note --- user/deployment-v2.md | 3 ++- user/deployment.md | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/user/deployment-v2.md b/user/deployment-v2.md index 81e70b2ac23..116b5df93ea 100644 --- a/user/deployment-v2.md +++ b/user/deployment-v2.md @@ -3,7 +3,8 @@ title: Deployment (v2) layout: en --- -> ALPHA This page documents deployments using the next major version dpl v2 which currently is in a preview release phase. Please see [the announcement blog post](https://blog.travis-ci.com/2019-08-27-deployment-tooling-dpl-v2-preview-release) on details about the release process. Documentation for dpl v1, the current default version, can be found [here](/user/deployment). {: alpha} +>ALPHA This page documents deployments using the next major version dpl v2 which is in a preview release phase. Please see [the announcement blog post](https://blog.travis-ci.com/2019-08-27-deployment-tooling-dpl-v2-preview-release) on details about the release process. Documentation for dpl v1, the current default version, can be found [here](/user/deployment). +{: .alpha} ## Supported Providers diff --git a/user/deployment.md b/user/deployment.md index cc478a140d4..7e1d43a541b 100644 --- a/user/deployment.md +++ b/user/deployment.md @@ -6,8 +6,7 @@ swiftypetags: 'skip_cleanup' > This page documents deployments using dpl v1 which is the > default version. The next major version dpl v2 will be released soon. Please -> see our blog post on details about the release process. [Documentation for dpl -> v2 can be found here](/user/deployment-v2). +> see [the announcement blog post](https://blog.travis-ci.com/2019-08-27-deployment-tooling-dpl-v2-preview-release) on details about the release process. [Documentation for dpl v2 can be found here](/user/deployment-v2). ## Supported Providers From ad508af9a45216133b4123aa3b4fca7d8ddd21a3 Mon Sep 17 00:00:00 2001 From: Leonor <39262644+maleovera@users.noreply.github.com> Date: Fri, 6 Sep 2019 11:45:56 +0200 Subject: [PATCH 0210/1536] Update privacy-policy.md --- legal/privacy-policy.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/legal/privacy-policy.md b/legal/privacy-policy.md index 8c25efc3e47..4bd2ca1c3b2 100644 --- a/legal/privacy-policy.md +++ b/legal/privacy-policy.md @@ -8,7 +8,7 @@ Below is an overview of what data we collect for what purpose and how we ensure We take the protection of our users’ (**“User/you/your”**) personal data very seriously and strictly comply with applicable data protection laws and regulations. In our privacy policy below (**“Privacy Policy”**) we provide you with an overview of what data we collect for what purpose and how we ensure the protection of the data. -The controller is Travis CI GmbH, Rigaer Straße 8, 10247 Berlin/Germany, registered at the local court (Amtsgericht) of Charlottenburg under HRB 40133 B, represented by the managing directors Fritz Thielemann and Konstantin Haase (“we/us/our”). We offer websites at travis-ci.org and travis-ci.com (each and jointly the “Website”) which provide customers (“Customer(s)”) with certain services related to our Travis CI Software as defined in our Terms and Conditions in their applicable form (the “TC”) (“Travis CI Software”). Customer will create an admin account via our Website and make the services of the Travis CI Software also available to other Users. +The controller is Travis CI GmbH, Rigaer Straße 8, 10247 Berlin/Germany, registered at the local court (Amtsgericht) of Charlottenburg under HRB 40133 B, represented by the managing director Randy Jacops (“we/us/our”). We offer websites at travis-ci.org and travis-ci.com (each and jointly the “Website”) which provide customers (“Customer(s)”) with certain services related to our Travis CI Software as defined in our Terms and Conditions in their applicable form (the “TC”) (“Travis CI Software”). Customer will create an admin account via our Website and make the services of the Travis CI Software also available to other Users. Please read the following information regarding the privacy policy carefully. In case you have further questions, please do not hesitate to contact us at any time at data@travis-ci.com. @@ -19,7 +19,7 @@ Please read the following information regarding the privacy policy carefully. In Travis CI GmbH Rigaer Straße 8, 10247 Berlin/Germany, registered at the local court (Amtsgericht) of Charlottenburg under HRB 40133 B, -represented by the managing directors Fritz Thielemann and Konstantin Haase +represented by the managing director Randy Jacops email: data@travis-ci.com We have appointed a data protection officer who may be reached via data@travis-ci.com. From ddea912bb925cf8f8bad78cad3b50314231be8e5 Mon Sep 17 00:00:00 2001 From: Logan Kilpatrick Date: Fri, 6 Sep 2019 07:42:51 -0400 Subject: [PATCH 0211/1536] Update julia.md Removed link to Julia base. --- user/languages/julia.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/user/languages/julia.md b/user/languages/julia.md index 14eb4a2d973..2792849d88f 100644 --- a/user/languages/julia.md +++ b/user/languages/julia.md @@ -130,5 +130,3 @@ Below are a list of open source Julia projects utalizing Travis CI in different 4) [Pkj.jl](https://github.com/JuliaLang/Pkg.jl/blob/master/.travis.yml) 5) [NeuralVerification.jl](https://github.com/sisl/NeuralVerification.jl/blob/master/.travis.yml) 6) [POMDP's.jl](https://github.com/JuliaPOMDP/POMDPs.jl/blob/master/.travis.yml) - -As a bonus, check out the `.travis.yml` file for Base Julia [here](https://github.com/JuliaLang/julia/blob/master/.travis.yml). From 69881e44adaea73c574566b66a232a4515582e78 Mon Sep 17 00:00:00 2001 From: ssabrii <45571047+ssabrii@users.noreply.github.com> Date: Fri, 6 Sep 2019 10:30:43 -0400 Subject: [PATCH 0212/1536] Update user/common-build-problems.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- 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 1b83d737878..e7dff255500 100644 --- a/user/common-build-problems.md +++ b/user/common-build-problems.md @@ -389,7 +389,7 @@ before_install: ## **Windows**: common build problems and known issues -For a list of common builds problems and known issues, please visit our community forum [here](https://travis-ci.community/t/current-known-issues-please-read-this-before-posting-a-new-topic/264). +For a list of common build problems on Windows, known issues and workarounds, please visit the [Travis CI community forum].(https://travis-ci.community/t/current-known-issues-please-read-this-before-posting-a-new-topic/264). Our forum helps give better visibility on the issues customers are running into. ## Travis CI does not preserve the state between builds From 159d082de8e51c02801f3dadc32f2c483e2cd798 Mon Sep 17 00:00:00 2001 From: ssabrii <45571047+ssabrii@users.noreply.github.com> Date: Fri, 6 Sep 2019 10:31:00 -0400 Subject: [PATCH 0213/1536] Update user/common-build-problems.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: María de Antón --- 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 e7dff255500..b3af9c13858 100644 --- a/user/common-build-problems.md +++ b/user/common-build-problems.md @@ -390,7 +390,7 @@ before_install: ## **Windows**: common build problems and known issues For a list of common build problems on Windows, known issues and workarounds, please visit the [Travis CI community forum].(https://travis-ci.community/t/current-known-issues-please-read-this-before-posting-a-new-topic/264). -Our forum helps give better visibility on the issues customers are running into. +The [Travis CI community forum](https://travis-ci.community) provides better visibility on the issues customers are running into and how to solve them. ## Travis CI does not preserve the state between builds From 2ed5ba1eaed9ac73b8bed52fe8ff061e09cfb501 Mon Sep 17 00:00:00 2001 From: Martin Capodici Date: Mon, 9 Sep 2019 15:35:46 +1000 Subject: [PATCH 0214/1536] Added language: node_js to example Because it doesn't work without it. Good for beginners. --- user/deployment/npm.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/user/deployment/npm.md b/user/deployment/npm.md index d5b3c06b6d6..285c6396874 100644 --- a/user/deployment/npm.md +++ b/user/deployment/npm.md @@ -16,6 +16,10 @@ publishes to npmjs.com, however if you have a `publishConfig.registry` key in yo A minimal `.travis.yml` configuration for publishing to [npmjs.com][npmjs] with npm version 2+ looks like: ```yaml +language: node_js +node_js: + - "11.13" + deploy: provider: npm email: "YOUR_EMAIL_ADDRESS" From 0bf3449f4d313cf2e4e2349721d9cbd0dad13067 Mon Sep 17 00:00:00 2001 From: Danish Khan Date: Mon, 9 Sep 2019 17:34:12 -0700 Subject: [PATCH 0215/1536] update xenial documentation for enterprise worker --- user/enterprise/xenial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/enterprise/xenial.md b/user/enterprise/xenial.md index 96cf62652f8..cf9d1e34761 100644 --- a/user/enterprise/xenial.md +++ b/user/enterprise/xenial.md @@ -24,7 +24,7 @@ $ curl -sSL -o /tmp/installer.sh https://raw.githubusercontent.com/travis-ci/tra $ sudo bash /tmp/installer.sh \ --travis_enterprise_host="[travis.yourhost.com]" \ --travis_enterprise_security_token="[RabbitMQ Password/Enterprise Security Token]" \ ---travis_beta_build_images=true +--travis_build_images=xenial ``` ## Restarting `travis-worker` From 9e2843fc0af639d4e97053d4368b421909ebba8a Mon Sep 17 00:00:00 2001 From: zero323 Date: Wed, 11 Sep 2019 12:38:14 +0200 Subject: [PATCH 0216/1536] Use API token instead of user / password Since July PyPI supports [token based authentication](https://pypi.org/help/#apitoken), and it is now recommended, when possible. --- user/deployment/pypi.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/user/deployment/pypi.md b/user/deployment/pypi.md index 47802035766..64adbd042e3 100644 --- a/user/deployment/pypi.md +++ b/user/deployment/pypi.md @@ -9,40 +9,43 @@ Travis CI can automatically release your Python package to [PyPI](https://pypi.p -For a minimal configuration, add the following to your `.travis.yml`: +For a minimal configuration, generate [PyPI API token](https://pypi.org/help/#apitoken) and add the following to your `.travis.yml`: ```yaml deploy: provider: pypi - user: "Your username" - password: "Your password" + user: "__token__" + password: "Your PyPI API token, including the pypi- prefix" ``` {: data-file=".travis.yml"} -However, this would expose your PyPI password to the world. +However, this would expose your PyPI API token to the world. We recommend you [encrypt](/user/encryption-keys/) your password and add it to your .travis.yml by running: ```bash -travis encrypt your-password-here --add deploy.password +travis encrypt your-api-token --add deploy.password ``` If you are using travis-ci.com and not travis-ci.org, you need to add the `--com` argument to switch the Travis API endpoint: ```bash -travis encrypt your-password-here --add deploy.password --com +travis encrypt your-api-token --add deploy.password --com ``` -> Note that if your PyPI password contains [special characters](/user/encryption-keys#note-on-escaping-certain-symbols) you need to escape them before encrypting your password. Some people have [reported difficulties](https://github.com/travis-ci/dpl/issues/377) connecting to PyPI with passwords containing anything except alphanumeric characters. - ```yaml deploy: provider: pypi - user: "Your username" + user: "__token__" password: - secure: "Your encrypted password" + secure: "Your encrypted token" ``` {: data-file=".travis.yml"} +It is also possible, but not recommended, to use PyPI user and password, instead of token. + +> Note that if your PyPI password contains [special characters](/user/encryption-keys#note-on-escaping-certain-symbols) you need to escape them before encrypting your password. Some people have [reported difficulties](https://github.com/travis-ci/dpl/issues/377) connecting to PyPI with passwords containing anything except alphanumeric characters. + + ## Deploying tags Most likely, you would only want to deploy to PyPI when a new version of your From 88823f6cfa4633f3e7a57e522f2f41d5f18ff2fe Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Wed, 11 Sep 2019 16:30:41 +0200 Subject: [PATCH 0217/1536] fix style issue with multiline alpha/beta messages --- assets/stylesheets/_utils.sass | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/assets/stylesheets/_utils.sass b/assets/stylesheets/_utils.sass index 257033b5f65..e0143687c2b 100644 --- a/assets/stylesheets/_utils.sass +++ b/assets/stylesheets/_utils.sass @@ -89,12 +89,14 @@ img.app font-style: normal background: $cream-light color: $quartz-red + padding: 0 1em border: 1px solid $quartz-red p color: $brick-red &:before content: "" - display: inline-block + display: block + float: left width: 1.7em height: 1.7em border-radius: 50% @@ -111,12 +113,14 @@ img.app font-style: normal background: $haze-yellow color: $dozer-yellow + padding: 0 1em border: 1px solid $canary-yellow p color: $dozer-yellow &:before content: "" - display: inline-block + display: block + float: left width: 1.7em height: 1.7em border-radius: 50% From 62d072ec4cf8e955a8e5257faa0201f01667c3af Mon Sep 17 00:00:00 2001 From: Muizudeen Kusimo Date: Wed, 11 Sep 2019 14:58:04 -0700 Subject: [PATCH 0218/1536] Add Node Dependency advice --- 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 b3af9c13858..b9e84d4f956 100644 --- a/user/common-build-problems.md +++ b/user/common-build-problems.md @@ -622,3 +622,7 @@ jobs: This creates only one job, _Peanut Butter and Bread_ under the stage named _Breakfast_ as you have defined. It is important to note that in YAML, the `-` symbol is used to create a list of items and the earlier example creates a list of 2 items, while you actually wanted 1. You can read more on [How to define Build Stages](/user/build-stages/#how-to-define-build-stages) and YAML lists syntax in the official [documentation](https://yaml.org/spec/1.2/spec.html#id2759963). + +## **Node**: Script execution before dependency installation causes build failures + +When adding custom setup instructions to a NodeJS build, care should be taken not to add these before _dependencies are installed_. The safest place to add custom setup scripts is in the `before_script` phase. Symptoms of this problem include previously succeeding builds suddenly failing due to the addition of a new dependency. From 93eea488d4c78d1c904f474192a54239a1faf615 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Thu, 5 Sep 2019 17:41:48 +0200 Subject: [PATCH 0219/1536] extract shared topics to includes --- _data/deploy_providers_v2.yml | 39 +++++++++ _includes/deploy/before_after_deploy.md | 15 ++++ _includes/deploy/branch.md | 45 +++++++++++ _includes/deploy/conditional.md | 5 ++ _includes/deploy/shared.md | 5 ++ user/deployment-v2.md | 6 +- user/deployment-v2/azure-web-apps.md | 49 +++--------- user/deployment-v2/bintray.md | 63 +-------------- user/deployment-v2/bitballoon.md | 23 +----- user/deployment-v2/bluemixcloudfoundry.md | 7 +- user/deployment-v2/boxfuse.md | 30 +++---- user/deployment-v2/cargo.md | 19 +---- user/deployment-v2/catalyze.md | 89 -------------------- user/deployment-v2/chefsupermarket.md | 14 ++-- user/deployment-v2/cloud66.md | 49 +----------- user/deployment-v2/cloudfiles.md | 93 +-------------------- user/deployment-v2/cloudfoundry.md | 17 ++-- user/deployment-v2/codedeploy.md | 71 +--------------- user/deployment-v2/datica.md | 70 ++++++++++++++++ user/deployment-v2/elasticbeanstalk.md | 40 +++------ user/deployment-v2/engineyard.md | 42 ++-------- user/deployment-v2/firebase.md | 35 +++----- user/deployment-v2/gcs.md | 30 +------ user/deployment-v2/google-app-engine.md | 28 +++---- user/deployment-v2/hackage.md | 19 +---- user/deployment-v2/hephy.md | 30 +------ user/deployment-v2/heroku.md | 61 +------------- user/deployment-v2/lambda.md | 98 ++++++++++++----------- user/deployment-v2/launchpad.md | 4 +- user/deployment-v2/npm.md | 28 +------ user/deployment-v2/openshift.md | 59 +------------- user/deployment-v2/opsworks.md | 52 +----------- user/deployment-v2/packagecloud.md | 49 +----------- user/deployment-v2/pages.md | 9 ++- user/deployment-v2/puppetforge.md | 20 +---- user/deployment-v2/pypi.md | 84 +------------------ user/deployment-v2/releases.md | 23 +----- user/deployment-v2/rubygems.md | 27 +------ user/deployment-v2/s3.md | 5 +- user/deployment-v2/scalingo.md | 26 +----- user/deployment-v2/script.md | 4 +- user/deployment-v2/snaps.md | 7 ++ user/deployment-v2/surge.md | 39 +-------- user/deployment-v2/testfairy.md | 4 +- user/deployment-v2/transifex.md | 30 +------ 45 files changed, 393 insertions(+), 1169 deletions(-) create mode 100644 _data/deploy_providers_v2.yml create mode 100644 _includes/deploy/before_after_deploy.md create mode 100644 _includes/deploy/branch.md create mode 100644 _includes/deploy/conditional.md create mode 100644 _includes/deploy/shared.md delete mode 100644 user/deployment-v2/catalyze.md create mode 100644 user/deployment-v2/datica.md diff --git a/_data/deploy_providers_v2.yml b/_data/deploy_providers_v2.yml new file mode 100644 index 00000000000..1fefc6482c0 --- /dev/null +++ b/_data/deploy_providers_v2.yml @@ -0,0 +1,39 @@ +anynines: "/user/deployment-v2/anynines/" +AWS CodeDeploy: "/user/deployment-v2/codedeploy/" +AWS Elastic Beanstalk: "/user/deployment-v2/elasticbeanstalk/" +AWS Lambda: "/user/deployment-v2/lambda/" +AWS OpsWorks: "/user/deployment-v2/opsworks/" +AWS S3: "/user/deployment-v2/s3/" +Azure Web Apps: "/user/deployment-v2/azure-web-apps/" +bintray: "/user/deployment-v2/bintray/" +BitBalloon: "/user/deployment-v2/bitballoon/" +Bluemix CloudFoundry: "/user/deployment-v2/bluemixcloudfoundry/" +Boxfuse: "/user/deployment-v2/boxfuse/" +Catalyze: "/user/deployment-v2/catalyze/" +Chef Supermarket: "/user/deployment-v2/chefsupermarket/" +Cloud 66: "/user/deployment-v2/cloud66/" +CloudFoundry: "/user/deployment-v2/cloudfoundry/" +Cargo: "/user/deployment-v2/cargo/" +Engine Yard: "/user/deployment-v2/engineyard/" +GitHub Pages: "/user/deployment-v2/pages/" +GitHub Releases: "/user/deployment-v2/releases/" +Google App Engine: "/user/deployment-v2/google-app-engine/" +Google Cloud Storage: "/user/deployment-v2/gcs/" +Google Firebase: "/user/deployment-v2/firebase/" +Hackage: "/user/deployment-v2/hackage/" +Hephy: "/user/deployment-v2/hephy/" +Heroku: "/user/deployment-v2/heroku/" +Launchpad: "/user/deployment-v2/launchpad/" +npm: "/user/deployment-v2/npm/" +OpenShift: "/user/deployment-v2/openshift/" +packagecloud.io: "/user/deployment-v2/packagecloud/" +Puppet Forge: "/user/deployment-v2/puppetforge/" +PyPI: "/user/deployment-v2/pypi/" +Rackspace Cloud Files: "/user/deployment-v2/cloudfiles/" +RubyGems: "/user/deployment-v2/rubygems/" +Scalingo: "/user/deployment-v2/scalingo/" +Script: "/user/deployment-v2/script/" +Snap Store: "/user/deployment-v2/snaps/" +Surge.sh: "/user/deployment-v2/surge/" +TestFairy: "/user/deployment-v2/testfairy/" +Transifex: "/user/deployment-v2/transifex/" diff --git a/_includes/deploy/before_after_deploy.md b/_includes/deploy/before_after_deploy.md new file mode 100644 index 00000000000..65b6f117b6f --- /dev/null +++ b/_includes/deploy/before_after_deploy.md @@ -0,0 +1,15 @@ +### 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` steps for this. These will only be triggered +if Travis CI is actually deploying. + +```yaml +before_deploy: "echo 'ready?'" +deploy: + # .. +after_deploy: + - ./after_deploy_1.sh + - ./after_deploy_2.sh +``` +{: data-file=".travis.yml"} diff --git a/_includes/deploy/branch.md b/_includes/deploy/branch.md new file mode 100644 index 00000000000..ebd0ba5a084 --- /dev/null +++ b/_includes/deploy/branch.md @@ -0,0 +1,45 @@ +### Branch to deploy from + +By default, Travis CI will only deploy from your **master** branch. + +You can explicitly specify the branch to deploy from with the **on** option: + +```yaml +deploy: + provider: {{ page.provider }} + on: production +``` +{: data-file=".travis.yml"} + +Alternatively, you can also configure it to deploy from all branches: + +```yaml +deploy: + provider: {{ page.provider }} + on: + all_branches: true +``` +{: data-file=".travis.yml"} + +Builds triggered from Pull Requests will never trigger a deploy. + +### Branches + +By default, Travis CI will only deploy from your `master` branch. You can specify what branch to deploy from with the deploy option `on`: + +```yaml +deploy: + ... + on: myProductionBranch +``` +{: data-file=".travis.yml"} + +To deploy from all branches set the deploy->on option `all_branches` to `true` + +```yaml +deploy: + ... + on: + all_branches: true +``` +{: data-file=".travis.yml"} diff --git a/_includes/deploy/conditional.md b/_includes/deploy/conditional.md new file mode 100644 index 00000000000..005cba52e60 --- /dev/null +++ b/_includes/deploy/conditional.md @@ -0,0 +1,5 @@ +### Conditional Deploys + +You can deploy only when certain conditions are met. + +See [Conditional Releases with `on:`](/user/deployment-v2#conditional-releases-with-on). diff --git a/_includes/deploy/shared.md b/_includes/deploy/shared.md new file mode 100644 index 00000000000..be8bc825baa --- /dev/null +++ b/_includes/deploy/shared.md @@ -0,0 +1,5 @@ +{% include deploy/branch.md %} + +{% include deploy/conditional.md %} + +{% include deploy/before_after_deploy.md %} diff --git a/user/deployment-v2.md b/user/deployment-v2.md index 116b5df93ea..e4ef6abb288 100644 --- a/user/deployment-v2.md +++ b/user/deployment-v2.md @@ -10,7 +10,11 @@ layout: en Continuous Deployment to the following providers is supported: -{% include deployments.html %} +
          +{% for provider in site.data.deploy_providers_v2 %} +
        • {{provider[0]}}
        • +{% endfor %} +
        To deploy to a custom or unsupported provider, use the [after-success build step](/user/deployment/custom/) or [script provider](/user/deployment/script). diff --git a/user/deployment-v2/azure-web-apps.md b/user/deployment-v2/azure-web-apps.md index 6d30f051744..2f12dfd9668 100644 --- a/user/deployment-v2/azure-web-apps.md +++ b/user/deployment-v2/azure-web-apps.md @@ -2,7 +2,7 @@ title: Azure Web App Deployment layout: en deploy: v2 - +provider: azure_web_apps --- Travis CI can automatically deploy your [Azure Web App](https://azure.microsoft.com/en-us/services/app-service/web/) after a successful build. @@ -24,7 +24,7 @@ It is not recommended that you put your Azure Deployment credentials unencrypted 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. As an alternative to the web interface, you can also use the CLI's [`env`](https://github.com/travis-ci/travis.rb#env) command.
        - Travis CI Settings + Travis CI Settings
        Environment Variables in the Repository Settings
        @@ -32,34 +32,12 @@ To define variables in Repository Settings, make sure you're logged in, navigate The Azure Web App provider can print Azure's deployment progress to your Travis log using the `verbose` option. However, Git will print your password if the authentication fails (it will not if you provide a correct user/password combination). -``` +```yaml deploy: provider: azure_web_apps verbose: true ``` - -### Branch to deploy from - -By default, Travis CI will only deploy from your **master** branch. - -You can explicitly specify the branch to deploy from with the **on** option: - -``` -deploy: - provider: azure_web_apps - on: production -``` - -Alternatively, you can also configure it to deploy from all branches: - -``` -deploy: - provider: azure_web_apps - on: - all_branches: true -``` - -Builds triggered from Pull Requests will never trigger a deploy. +{: data-file=".travis.yml"} ### Note on `.gitignore` @@ -70,20 +48,6 @@ 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 - -Sometimes you want to run commands before or after deploying. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} - ### Deploying to slots You might need to deploy multiple branches to different slots. You can set multiple providers to deploy to specific slots. The following configuration would deploy the `master` branch to the `myapp-staging` slot and the `develop` branch to the `myapp-develop` slot. In order to use slots you'll need to [set up staging environments for web apps in Azure App Service](https://azure.microsoft.com/en-us/documentation/articles/web-sites-staged-publishing/). @@ -97,3 +61,8 @@ deploy: on: develop ``` {: data-file=".travis.yml"} + + +{% include deploy/branch.md %} + +{% include deploy/before_after_deploy.md %} diff --git a/user/deployment-v2/bintray.md b/user/deployment-v2/bintray.md index a54239b2d37..4925b686f50 100644 --- a/user/deployment-v2/bintray.md +++ b/user/deployment-v2/bintray.md @@ -2,7 +2,7 @@ title: Bintray Deployment layout: en deploy: v2 - +provider: bintray --- Travis CI can automatically deploy your build artifacts to [Bintray](https://bintray.com/). @@ -34,64 +34,6 @@ Example: $ travis encrypt ab012cd345678901234e456fa7bc89def01a23b4 --add deploy.key ``` - - -### Branch to deploy from - -By default, Travis CI will only deploy from your **master** branch. - -You can explicitly specify the branch to deploy from with the **on** option: - -```yaml -deploy: - .. - on: production -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure it to deploy from all branches: - -```yaml -deploy: - .. - on: - all_branches: true -``` -{: data-file=".travis.yml"} - -Builds triggered from Pull Requests will never trigger a deploy. - -### Conditional Deploys - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - -### 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` steps for this. These will only be triggered if Travis CI is actually deploying. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} - -### `dry_run` option - -For testing deployment configuration, you can add `dry_run: true` to prevent connecting -to the Bintray server: - -```yaml -deploy: - .. - dry_run: true -``` -{: data-file=".travis.yml"} - ### Descriptor file example The descriptor is in JSON file format in three sections: @@ -147,7 +89,6 @@ Bintray package information. The following information is mandatory on open sour - `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/#_licenses){: data-proofer-ignore=""}, which is a list with at least one item. - #### Version Section Package version information. In case the version already exists on Bintray, only the name field is mandatory. @@ -198,3 +139,5 @@ If an artifact by a given name already exists in the Bintray repository, then by } ] ``` + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/bitballoon.md b/user/deployment-v2/bitballoon.md index 4657d32410d..bdceda53ace 100644 --- a/user/deployment-v2/bitballoon.md +++ b/user/deployment-v2/bitballoon.md @@ -2,13 +2,10 @@ title: BitBalloon Deployment layout: en deploy: v2 - +provider: bitballoon --- - - -Travis CI can automatically deploy files to -[BitBalloon](https://www.bitballoon.com/) after a successful build. +Travis CI can automatically deploy files to [BitBalloon](https://www.bitballoon.com/) after a successful build. To deploy the current directory to BitBalloon, add your encrypted BitBalloon `site-id` and `access-token` to your `.travis.yml`: @@ -37,18 +34,4 @@ deploy: ``` {: data-file=".travis.yml"} -## 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` steps for this. These will only be -triggered if Travis CI is actually deploying. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} diff --git a/user/deployment-v2/bluemixcloudfoundry.md b/user/deployment-v2/bluemixcloudfoundry.md index 6c2af71fe20..c06b5a36050 100644 --- a/user/deployment-v2/bluemixcloudfoundry.md +++ b/user/deployment-v2/bluemixcloudfoundry.md @@ -2,7 +2,7 @@ title: Bluemix CloudFoundry Deployment layout: en deploy: v2 - +provider: bluemixcloudfoundry --- You now have the ability to deploy directly to [IBM Bluemix](http://bluemix.net/) after a successful build on Travis CI. @@ -46,7 +46,4 @@ travis encrypt --add deploy.password If your password includes symbols (such as braces, parentheses, backslashes, and pipe symbols), [you must escape those symbols before running `travis encrypt`](/user/encryption-keys/#note-on-escaping-certain-symbols). -### Conditional releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). +{% include deploy/shared.md %} diff --git a/user/deployment-v2/boxfuse.md b/user/deployment-v2/boxfuse.md index 51508c74695..c8fbbe53e7e 100644 --- a/user/deployment-v2/boxfuse.md +++ b/user/deployment-v2/boxfuse.md @@ -2,7 +2,7 @@ title: Boxfuse Deployment layout: en deploy: v2 - +provider: boxfuse --- Travis CI can automatically deploy your [Boxfuse](https://boxfuse.com/) application after a successful build. @@ -12,9 +12,9 @@ For a minimal configuration, all you need to do is add the following to your `.t ```yaml deploy: provider: boxfuse - user: "YOUR BOXFUSE CLIENT USER" - secret: "YOUR BOXFUSE CLIENT SECRET" - payload: "YOUR APPLICATION ARTIFACT (typically a jar, war, tar.gz or zip file)" + user: "your boxfuse client user" + secret: "your boxfuse client secret" + payload: "your application artifact (typically a jar, war, tar.gz or zip file)" ``` {: data-file=".travis.yml"} @@ -36,10 +36,10 @@ By default Boxfuse will detect the app and the version automatically from the na ```yaml deploy: provider: boxfuse - user: "YOUR BOXFUSE CLIENT USER" - secret: "YOUR BOXFUSE CLIENT SECRET" - payload: "YOUR APPLICATION ARTIFACT (typically a jar, war, tar.gz or zip file)" - image: "YOUR BOXFUSE APP AND VERSION (ex.: myapp:1.23)" + user: "your boxfuse client user" + secret: "your boxfuse client secret" + payload: "your application artifact (typically a jar, war, tar.gz or zip file)" + image: "your boxfuse app and version (ex.: myapp:1.23)" ``` {: data-file=".travis.yml"} @@ -52,10 +52,10 @@ By default Boxfuse will deploy to your `test` environment. You can override this ```yaml deploy: provider: boxfuse - user: "YOUR BOXFUSE CLIENT USER" - secret: "YOUR BOXFUSE CLIENT SECRET" - payload: "YOUR APPLICATION ARTIFACT (typically a jar, war, tar.gz or zip file)" - env: "YOUR BOXFUSE ENVIRONMENT (default: test)" + user: "your boxfuse client user" + secret: "your boxfuse client secret" + payload: "your application artifact (typically a jar, war, tar.gz or zip file)" + env: "your boxfuse environment (default: test)" ``` {: data-file=".travis.yml"} @@ -66,7 +66,7 @@ You can also fully configure Boxfuse by placing a `boxfuse.conf` file in the roo ```yaml deploy: provider: boxfuse - configfile: "YOUR BOXFUSE CONFIGURATION FILE" + configfile: "your boxfuse configuration file" ``` {: data-file=".travis.yml"} @@ -77,10 +77,12 @@ If the [Boxfuse Client](https://boxfuse.com/docs/commandline) functionality you ```yaml deploy: provider: boxfuse - extra_args: "YOUR EXTRA ARGS (ex.: -X)" + extra_args: "extra args (ex.: -X)" ``` {: data-file=".travis.yml"} ### Further information Go to the [Boxfuse website](https://boxfuse.com) to learn more about Boxfuse and how to configure it. + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/cargo.md b/user/deployment-v2/cargo.md index bce11a9863e..b8f764e74ac 100644 --- a/user/deployment-v2/cargo.md +++ b/user/deployment-v2/cargo.md @@ -2,6 +2,7 @@ title: Cargo Releases layout: en deploy: v2 +provider: cargo --- Travis CI can automatically release your Rust crate to [crates.io][] @@ -78,20 +79,4 @@ This is necessary because Cargo will refuse to publish crates from a dirty working directory (an option to allow this may be added to this provider in the future). -## 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` steps for this. These will only be triggered -if Travis CI is actually deploying. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} - -[crates.io]: https://crates.io/ +{% include deploy/shared.md %} diff --git a/user/deployment-v2/catalyze.md b/user/deployment-v2/catalyze.md deleted file mode 100644 index 71606f85c1a..00000000000 --- a/user/deployment-v2/catalyze.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Catalyze Deployment -layout: en -deploy: v2 - ---- - - - -Travis CI can automatically deploy to [Catalyze](https://www.catalyze.io/) after -a successful build. - -Before configuring your `.travis.yml` you need to: - -1. Find your Catalyze git remote: - 1. Make sure your Catalyze environment is - [associated](https://resources.datica.com/compliant-cloud/articles/initial-setup/#sts=4. Associate to Your Environment). - 2. Get the git remote by running `git remote -v`{: #remote} from within the associated repository. - - 3. Edit your `.travis.yml`: - - ```yaml - deploy: - provider: catalyze - target: "ssh://git@git.catalyzeapps.com:2222/app1234.git" - ``` - {: data-file=".travis.yml"} - -2. Set up a deployment key to Catalyze for Travis CI: - 1. Install the Travis CI [command line client](https://github.com/travis-ci/travis.rb). - 2. Get the public SSH key for your Travis CI project and save it to a file by running - - ```bash - travis pubkey > travis.pub - ``` - - 3. Add the key as a deploy key using the catalyze command line client within - the associated repo. For example: - - ```bash - catalyze deploy-keys add travisci ./travis.pub code-1 - ``` - - where `code-1` is the name of your service. - -3. Set up Catalyze as a known host for Travis CI: - 1. List your known hosts by running `cat ~/.ssh/known_hosts`. - 2. Find and copy the line from known_hosts that includes the git remote found in [Step 1](#remote){: data-proofer-ignore=""}. It'll look something like - - ``` - [git.catalyzeapps.com]:2222 ecdsa-sha2-nistp256 BBBB12abZmKlLXNo... - ``` - - 3. Update your `before_deploy` step in `.travis.yml` to update the `known_hosts` file: - - ```yaml - before_deploy: echo "[git.catalyzeapps.com]:2222 ecdsa-sha2-nistp256 BBBB12abZmKlLXNo..." >> ~/.ssh/known_hosts - ``` - {: data-file=".travis.yml"} - -### Deploying a subset of your Files - -To only deploy the `build` folder, for example, set `skip_cleanup: true` and -path: "build": - -```yaml -deploy: - provider: catalyze - target: "ssh://git@git.catalyzeapps.com:2222/app1234.git" - skip_cleanup: true - path: "build" -``` -{: data-file=".travis.yml"} - -### 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` steps for this. These will only be -triggered if Travis CI is actually deploying. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} diff --git a/user/deployment-v2/chefsupermarket.md b/user/deployment-v2/chefsupermarket.md index aef53484757..d125d37c3fe 100644 --- a/user/deployment-v2/chefsupermarket.md +++ b/user/deployment-v2/chefsupermarket.md @@ -2,7 +2,7 @@ title: Chef Supermarket deployment layout: en deploy: v2 - +provider: chef_supermarket --- Travis CI can automatically deploy your cookbook to [Chef @@ -10,14 +10,16 @@ Supermarket](https://supermarket.chef.io/) after a successful build. To deploy to Chef Supermarket add your Chef Supermarket `user_id`, your [encrypted](/user/encrypting-files) Chef Supermarket client key and the -[`cookbook_category`](https://docs.getchef.com/knife_cookbook_site.html#id12) to -your `.travis.yml`: +cookbook [`category`](https://docs.getchef.com/knife_cookbook_site.html#id12) +to your `.travis.yml`: ```yaml deploy: - provider: chef-supermarket - user_id: "" + provider: chef_supermarket + user_id: # the encrypted client key file is decrypted in the before_install step of the build when you add it using the instructions above - cookbook_category: "Others" + category: Others ``` {: data-file=".travis.yml"} + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/cloud66.md b/user/deployment-v2/cloud66.md index f0808a178cc..c710bd1f006 100644 --- a/user/deployment-v2/cloud66.md +++ b/user/deployment-v2/cloud66.md @@ -2,6 +2,7 @@ title: Cloud 66 Deployment layout: en deploy: v2 +provider: cloud66 --- Travis CI can automatically deploy your [Cloud 66](https://www.cloud66.com/) application after a successful build. @@ -11,7 +12,7 @@ For a minimal configuration, all you need to do is add the following to your `.t ```yaml deploy: provider: cloud66 - redeployment_hook: "YOUR REDEPLOYMENT HOOK URL" + redeployment_hook: "your redeployment hook url" ``` {: data-file=".travis.yml"} @@ -25,48 +26,4 @@ travis setup cloud66 Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. -### Branch to deploy from - -By default, Travis CI will only deploy from your **master** branch. - -You can explicitly specify the branch to deploy from with the **on** option: - -```yaml -deploy: - provider: cloud66 - redeployment_hook: "YOUR REDEPLOYMENT HOOK URL" - on: production -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure it to deploy from all branches: - -```yaml -deploy: - provider: cloud66 - redeployment_hook: "YOUR REDEPLOYMENT HOOK URL" - on: - all_branches: true -``` -{: data-file=".travis.yml"} - -Builds triggered from Pull Requests will never trigger a deploy. - -### Conditional Deploys - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - -### 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` steps for this. These will only be triggered if Travis CI is actually deploying. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} diff --git a/user/deployment-v2/cloudfiles.md b/user/deployment-v2/cloudfiles.md index f90175f61bf..c5c04e7ed1d 100644 --- a/user/deployment-v2/cloudfiles.md +++ b/user/deployment-v2/cloudfiles.md @@ -2,7 +2,7 @@ title: Rackspace Cloud Files Deployment layout: en deploy: v2 - +provider: cloudfiles --- Travis CI can automatically upload your build to [Rackspace Cloud Files](https://www.rackspace.com/cloud/files/) after a successful build. @@ -19,21 +19,7 @@ deploy: ``` {: data-file=".travis.yml"} -This example is almost certainly not ideal, as you probably want to upload your built binaries and documentation. Set skip_cleanup to true to prevent Travis CI from deleting your build artifacts. - -```yaml -deploy: - provider: cloudfiles - username: "RACKSPACE USERNAME" - api_key: "RACKSPACE API KEY" - region: "CLOUDFILE REGION" - container: "CLOUDFILES CONTAINER NAME" - skip_cleanup: true -``` -{: data-file=".travis.yml"} - -It is recommended encrypt that you encrypt your Rackspace api key. -Assuming you have the Travis CI command line client installed, you can do it like this: +It is recommended that you encrypt your Rackspace api key. Assuming you have the Travis CI command line client installed, you can do it like this: ```bash travis encrypt --add deploy.api-key @@ -49,25 +35,6 @@ travis setup cloudfiles Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. -### Deploy On Tags - -Often, you want to deploy only when you release a new version of your code. - -You can tell Travis CI only to deploy on tags, like this: - -```yaml -deploy: - provider: cloudfiles - username: "RACKSPACE USERNAME" - api_key: "RACKSPACE API KEY" - region: "CLOUDFILE REGION" - container: "CLOUDFILES CONTAINER NAME" - skip_cleanup: true - on: - tags: true -``` -{: data-file=".travis.yml"} - ### Deploy To Only One Folder Often, you don't want to upload your entire project to Cloud Files. You can tell Travis CI to only upload a single folder to Cloud Files. This example uploads the build directory of your project to Cloud Files: @@ -80,7 +47,6 @@ deploy: api_key: "RACKSPACE API KEY" region: "CLOUDFILE REGION" container: "CLOUDFILES CONTAINER NAME" - skip_cleanup: true ``` {: data-file=".travis.yml"} @@ -95,65 +61,12 @@ deploy: api_key: "RACKSPACE API KEY" region: "CLOUDFILE REGION" container: "CLOUDFILES CONTAINER NAME" - skip_cleanup: true - provider: cloudfiles username: "RACKSPACE USERNAME" api_key: "RACKSPACE API KEY" region: "CLOUDFILE REGION" container: "CLOUDFILES CONTAINER NAME" - skip_cleanup: true ``` {: data-file=".travis.yml"} -### Branch to release from - -You can explicitly specify the branch to release from with the **on** option: - -```yaml -deploy: - provider: cloudfiles - username: "RACKSPACE USERNAME" - api_key: "RACKSPACE API KEY" - region: "CLOUDFILE REGION" - container: "CLOUDFILES CONTAINER NAME" - skip_cleanup: true - on: - branch: production -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure Travis CI to release from all branches: - -```yaml -deploy: - provider: cloudfiles - username: "RACKSPACE USERNAME" - api_key: "RACKSPACE API KEY" - region: "CLOUDFILE REGION" - container: "CLOUDFILES CONTAINER NAME" - skip_cleanup: true - on: - all_branches: true -``` -{: data-file=".travis.yml"} - -Builds triggered from Pull Requests will never trigger a release. - -### Conditional releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - -### Running commands before and after release - -Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} diff --git a/user/deployment-v2/cloudfoundry.md b/user/deployment-v2/cloudfoundry.md index 90b65dea068..033f05acbfe 100644 --- a/user/deployment-v2/cloudfoundry.md +++ b/user/deployment-v2/cloudfoundry.md @@ -2,7 +2,7 @@ title: CloudFoundry Deployment layout: en deploy: v2 - +provider: cloudfoundry --- You now have the amazing ability to deploy directly to [CloudFoundry](https://run.pivotal.io/) after a successful build on Travis CI. @@ -22,13 +22,13 @@ So you want to write your own `.travis.yml`, fine. Here is the minimum required ```yaml deploy: provider: cloudfoundry - username: hulk_hogan@example.com - password: supersecretpassword + username: your@email.com + password: your_password api: https://api.run.pivotal.io - organization: myawesomeorganization + organization: your_organization space: staging manifest: manifest-staging.yml # (optional) Defaults to manifest.yml. - app_name: My app name # (optional) + app_name: your_app_name # (optional) ``` {: data-file=".travis.yml"} @@ -40,9 +40,4 @@ You can do this using the Travis gem above and running: travis encrypt --add deploy.password ``` -If your password includes symbols (such as braces, parentheses, backslashes, and pipe symbols), [you must escape those symbols before running `travis encrypt`](/user/encryption-keys/#note-on-escaping-certain-symbols). - -### Conditional releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). +{% include deploy/shared.md %} diff --git a/user/deployment-v2/codedeploy.md b/user/deployment-v2/codedeploy.md index f9db89a6c77..655c6b6cbb6 100644 --- a/user/deployment-v2/codedeploy.md +++ b/user/deployment-v2/codedeploy.md @@ -2,7 +2,7 @@ title: AWS CodeDeploy layout: en deploy: v2 - +provider: codedeploy --- Travis CI can automatically trigger a new Deployment on [AWS CodeDeploy](http://aws.amazon.com/documentation/codedeploy/) after a successful build. @@ -50,44 +50,6 @@ 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](/user/deployment/s3/), if you want to bundle to be uploaded from the Travis CI build. -## Branch to deploy from - -You can explicitly specify the branch to deploy from with the **on** option: - -```yaml -deploy: - provider: codedeploy - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - bucket: "S3 Bucket" - key: latest/MyApp.zip - bundle_type: zip - application: MyApp - deployment_group: MyDeploymentGroup - on: - branch: production -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure Travis CI to deploy from all branches: - -```yaml -deploy: - provider: codedeploy - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - bucket: "S3 Bucket" - key: latest/MyApp.zip - bundle_type: zip - application: MyApp - deployment_group: MyDeploymentGroup - on: - all_branches: true -``` -{: data-file=".travis.yml"} - -Builds triggered from Pull Requests will never trigger a release. - ## S3 deployment or GitHub deployment For a minimal configuration with GitHub, add the following to your `.travis.yml`: @@ -126,35 +88,6 @@ The [bundleType](http://docs.aws.amazon.com/codedeploy/latest/APIReference/API_S 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). - -## Note on `.gitignore` - -As this deployment strategy relies on `git`, be mindful that the deployment will -honor `.gitignore`. - -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 - -Sometimes you want to run commands before or after deploying. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - # ⋮ -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} - ## AWS region to deploy to You can explicitly specify the AWS region to deploy to with the **region** option: @@ -172,3 +105,5 @@ deploy: region: us-west-1 ``` {: data-file=".travis.yml"} + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/datica.md b/user/deployment-v2/datica.md new file mode 100644 index 00000000000..18416439964 --- /dev/null +++ b/user/deployment-v2/datica.md @@ -0,0 +1,70 @@ +--- +title: Datica Deployment +layout: en +deploy: v2 +provider: datica +--- + +Travis CI can automatically deploy to [Datica](https://datica.com) after +a successful build. + +Before configuring your `.travis.yml` you need to: + +### Find your Catalyze git remote + +Make sure your Catalyze environment is [associated](https://resources.datica.com/compliant-cloud/articles/initial-setup/#sts=4. Associate to Your Environment). + +Get the git remote by running `git remote -v`{: #remote} from within the associated repository, and add it to your `.travis.yml` + +```yaml +deploy: + provider: catalyze + target: ssh://git@git.catalyzeapps.com:2222/app1234.git +``` +{: data-file=".travis.yml"} + +### Set up the repository's key as a deployment key on Datica + +Install the Travis CI [command line client](https://github.com/travis-ci/travis.rb), and get the public SSH key for your Travis CI project and save it to a file by running + +```bash +travis pubkey > travis.pub +``` + +Add the key as a deploy key using the catalyze command line client within the associated repo. For example: + +```bash +catalyze deploy-keys add travisci ./travis.pub your-service +``` + +### Set up Datica as a known host on Travis CI + +List your known hosts by running `cat ~/.ssh/known_hosts`, and find and copy the line that includes the git remote found in [Step 1](#remote){: data-proofer-ignore=""}. + +It'll look something like: + + ``` + [git.catalyzeapps.com]:2222 ecdsa-sha2-nistp256 BBBB12abZmKlLXNo... + ``` + +Update your `before_deploy` step in `.travis.yml` to update the `known_hosts` file: + + ```yaml + before_deploy: echo "[git.catalyzeapps.com]:2222 ecdsa-sha2-nistp256 BBBB12abZmKlLXNo..." >> ~/.ssh/known_hosts + ``` + {: data-file=".travis.yml"} + +### Deploying a subset of your Files + +To only deploy the `build` folder, for example, set `path`: + +```yaml +deploy: + provider: catalyze + target: ssh://git@git.catalyzeapps.com:2222/app1234.git + skip_cleanup: true + path: build +``` +{: data-file=".travis.yml"} + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/elasticbeanstalk.md b/user/deployment-v2/elasticbeanstalk.md index f183e3a0738..9810e215a0b 100644 --- a/user/deployment-v2/elasticbeanstalk.md +++ b/user/deployment-v2/elasticbeanstalk.md @@ -2,19 +2,15 @@ title: AWS Elastic Beanstalk Deployment layout: en deploy: v2 - +provider: elasticbeanstalk --- - - -Travis CI can automatically deploy your application to [Elastic -Beanstalk](https://aws.amazon.com/documentation/elastic-beanstalk/) after a -successful build. +Travis CI can automatically deploy your application to [Elastic Beanstalk](https://aws.amazon.com/documentation/elastic-beanstalk/) after a successful build. To deploy to AWS Elastic Beanstalk add the following to your `.travis.yml`: -* `access-key-id`: [Encrypted](/user/encryption-keys#usage) AWS Access Key ID, obtained from your [AWS Console](https://console.aws.amazon.com/iam/home?#security_credential). -* `secret-access-key`: [Encrypted](/user/encryption-keys#usage) AWS Secret Key, obtained from your [AWS Console](https://console.aws.amazon.com/iam/home?#security_credential). +* `access_key_id`: [Encrypted](/user/encryption-keys#usage) AWS Access Key ID, obtained from your [AWS Console](https://console.aws.amazon.com/iam/home?#security_credential). +* `secret_access_key`: [Encrypted](/user/encryption-keys#usage) AWS Secret Key, obtained from your [AWS Console](https://console.aws.amazon.com/iam/home?#security_credential). * `region`: **must** be the region the Elastic Beanstalk application is running on, for example `us-east-1`. * `app`: Application name. * `env`: Elastic Beanstalk environment the application will be deployed to. @@ -24,13 +20,13 @@ To deploy to AWS Elastic Beanstalk add the following to your `.travis.yml`: deploy: provider: elasticbeanstalk access_key_id: - secure: "Encrypted =" + secure: "Encrypted access_key_id=" secret_access_key: - secure: "Encypted =" + secure: "Encypted secret_access_key=" region: "us-east-1" - app: "example-app-name" - env: "example-app-environment" - bucket_name: "the-target-S3-bucket" + app: "your-app-name" + env: "your-app-environment" + bucket_name: "your-S3-bucket" ``` {: data-file=".travis.yml"} @@ -51,20 +47,6 @@ The following environment variables are available: * `ELASTIC_BEANSTALK_ENV`: Used if the `env` key is not set in your `.travis.yml`. * `ELASTIC_BEANSTALK_LABEL`: Label name of the new version. -* `ELASTIC_BEANSTALK_DESCRIPTION`: Description of the new version. Defaults to the last commit message. - -## 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` steps for this. These will only be -triggered if Travis CI is actually deploying. +* `ELASTIC_BEANSTALK_DESCRIPTION`: Description of the new version. Defaults to the last commit message. -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} diff --git a/user/deployment-v2/engineyard.md b/user/deployment-v2/engineyard.md index 15ef7e35391..940dabd3e8b 100644 --- a/user/deployment-v2/engineyard.md +++ b/user/deployment-v2/engineyard.md @@ -2,7 +2,7 @@ title: Engine Yard Deployment layout: en deploy: v2 - +provider: engineyard --- Travis CI can automatically deploy your [Engine Yard](https://www.engineyard.com/) application after a successful build. @@ -12,7 +12,7 @@ For a minimal configuration, all you need to do is add the following to your `.t ```yaml deploy: provider: engineyard - api_key: "YOUR API KEY" + api_key: your-api-key ``` {: data-file=".travis.yml"} @@ -47,7 +47,7 @@ It is also possible to deploy different branches to different applications: ```yaml deploy: provider: engineyard - api_key: ... + api_key: your-api-key app: master: my-app foo: my-foo @@ -59,40 +59,13 @@ This branch specific settings are possible for all options (except `on`) and can ```yaml deploy: provider: engineyard - api_key: ... + api_key: your-api-key environment: master: staging production: production ``` {: data-file=".travis.yml"} -### Branch to deploy from - -If you have branch specific options, as [shown above](#application-or-environment-to-deploy), Travis CI will automatically figure out which branches to deploy from. Otherwise, it will only deploy from your **master** branch. - -You can also explicitly specify the branch to deploy from with the **on** option: - -```yaml -deploy: - provider: engineyard - api_key: ... - on: production -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure it to deploy from all branches: - -```yaml -deploy: - provider: engineyard - api_key: ... - on: - all_branches: true -``` -{: data-file=".travis.yml"} - -Builds triggered from Pull Requests will never trigger a deploy. - ### Running migrations You can trigger migrations by using the migrate option: @@ -100,12 +73,9 @@ You can trigger migrations by using the migrate option: ```yaml deploy: provider: engineyard - api_key: ... + api_key: your-api-key migrate: "rake db:migrate" ``` {: data-file=".travis.yml"} -### Conditional releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). +{% include deploy/shared.md %} diff --git a/user/deployment-v2/firebase.md b/user/deployment-v2/firebase.md index f99045f8657..c115d973eb9 100644 --- a/user/deployment-v2/firebase.md +++ b/user/deployment-v2/firebase.md @@ -2,11 +2,9 @@ title: Firebase Deployment layout: en deploy: v2 - +provider: firebase --- - - Travis CI can automatically deploy your application to [Firebase](https://firebase.google.com/) after a successful build. @@ -16,7 +14,7 @@ To use the default configuration, add your [encrypted](/user/encryption-keys/#us deploy: provider: firebase token: - secure: "YOUR ENCRYPTED token" + secure: "your encrypted token" ``` {: data-file=".travis.yml"} @@ -24,13 +22,20 @@ deploy: Generate your Firebase token after [installing the Firebase tools](https://github.com/firebase/firebase-tools#installation) by running: +Run this command to generate a token (e.g. `1/AD7sdasdasdKJA824OvEFc1c89Xz2ilBlaBlaBla`) + ```bash -# This generates a token, e.g. "1/AD7sdasdasdKJA824OvEFc1c89Xz2ilBlaBlaBla" firebase login:ci -# Encrypt this token +``` + +Encrypt the token: + +``` travis encrypt "1/AD7sdasdasdKJA824OvEFc1c89Xz2ilBlaBlaBla" --add -# This command may generate a warning ("If you tried to pass the name of the repository as the first argument, you probably won't get the results you wanted"). You can ignore it. ``` + +This command may generate a warning ("If you tried to pass the name of the repository as the first argument, you probably won't get the results you wanted"). You can ignore it. + When using `travis encrypt --add` you are likely to receive `WARNING: The name of the repository is now passed to the command with the -r option` (see https://github.com/travis-ci/travis-ci/issues/7869). The token will be added to your `.travis.yml`, regardless. Inspect and move the token to the `secure:` section of your `.travis.yml` if it isn't added there. Remember to [encrypt](/user/encryption-keys/#usage) the token before adding it to your `.travis.yml` @@ -61,18 +66,4 @@ deploy: ``` {: data-file=".travis.yml"} -## 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` steps for this. These will only be -triggered if Travis CI is actually deploying. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} diff --git a/user/deployment-v2/gcs.md b/user/deployment-v2/gcs.md index 461f868e0f2..e2e8c377d0c 100644 --- a/user/deployment-v2/gcs.md +++ b/user/deployment-v2/gcs.md @@ -2,7 +2,7 @@ title: Google Cloud Storage (GCS) Deployment layout: en deploy: v2 - +provider: gcs --- Travis CI supports uploading to Google Cloud Storage (GCS). @@ -66,7 +66,7 @@ deploy: Valid ACL values are: `private`, `public-read`, `public-read-write`, `authenticated-read`, `bucket-owner-read`, `bucket-owner-full-control`. The ACL defaults to `private`. See the [full documentation on Google Cloud](https://cloud.google.com/storage/docs/reference-headers#xgoogacl). -### Deploying specific folder +### Deploying a specific folder You can set specific directory to be uploaded using `local-dir` option like this: @@ -84,30 +84,6 @@ deploy: If the `directory-name` is generated during build process, it will be deleted (cleaned up) before deploying, unless `skip_cleanup` is set to true. -### Conditional releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - -### Setting `Content-Encoding` header - -GCS uploads can optionally set HTTP header `Content-Encoding`. -This header allows files to be sent compressed while retaining file extensions and -the associated MIME types. - -To enable this feature, add: - -```yaml -deploy: - provider: gcs - ... - detect_encoding: true # <== default is false -``` -{: data-file=".travis.yml"} - -If the file is compressed with `gzip` or `compress`, it will be uploaded with -the appropriate header. - ### HTTP cache control GCS uploads can optionally set the `Cache-Control` HTTP header. @@ -123,3 +99,5 @@ deploy: {: data-file=".travis.yml"} See the [full documentation on Google Cloud](https://cloud.google.com/storage/docs/reference-headers#cachecontrol). + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/google-app-engine.md b/user/deployment-v2/google-app-engine.md index d3736750554..796f7b98049 100644 --- a/user/deployment-v2/google-app-engine.md +++ b/user/deployment-v2/google-app-engine.md @@ -2,7 +2,7 @@ title: Google App Engine Deployment layout: en deploy: v2 - +provider: gae --- Travis CI can automatically deploy your [Google App Engine](https://cloud.google.com/appengine/docs) or [Managed VMs](https://cloud.google.com/appengine/docs/managed-vms/) application after a successful build. @@ -109,24 +109,6 @@ deploy: ``` {: data-file=".travis.yml"} -### Skipping Cleanup - -Many App Engine apps use [pip](https://pip.pypa.io/en/latest/installing.html) to vendor library requirements into the directory, and sometimes you need build artifacts or other -credentials to deploy. If so, you want to avoid the Travis cleanup step that will clean you working directory before the deploy. - -```yaml -deploy: - provider: gae - skip_cleanup: true -``` -{: data-file=".travis.yml"} - -### Example Repo - -See [this link](https://github.com/googlecloudplatform/continuous-deployment-demo/tree/appengine_travis_deploy) for an example -App Engine app with a Travis deployment configured. See the other branches in the project for Managed VMs examples, and examples -without using this provider. - ### Other Available Configuration Options - **project**: [Project ID](https://developers.google.com/console/help/new/#projectnumber) used to identify the project on Google Cloud. @@ -136,3 +118,11 @@ without using this provider. - **default**: Flag to set the deployed version to be the default serving version. See [`gcloud app deploy`](https://cloud.google.com/sdk/gcloud/reference/app/deploy) - **verbosity**: Lets you adjust the verbosity when invoking `"gcloud"`. Defaults to `"warning"`. See [`gcloud`](https://cloud.google.com/sdk/gcloud/reference/). - **docker_build**: If deploying a Managed VM, specifies where to build your image. Typical values are `"remote"` to build on Google Cloud Engine and `"local"` which requires Docker to be set up properly (to utilize this on Travis CI, read [Using Docker on Travis CI](https://blog.travis-ci.com/2015-08-19-using-docker-on-travis-ci/)). Defaults to `"remote"`. + +### Example Repo + +See [this link](https://github.com/googlecloudplatform/continuous-deployment-demo/tree/appengine_travis_deploy) for an example +App Engine app with a Travis deployment configured. See the other branches in the project for Managed VMs examples, and examples +without using this provider. + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/hackage.md b/user/deployment-v2/hackage.md index c50205ecf06..4b4e4ad31c2 100644 --- a/user/deployment-v2/hackage.md +++ b/user/deployment-v2/hackage.md @@ -2,7 +2,7 @@ title: Hackage Deployment layout: en deploy: v2 - +provider: hackage --- Travis CI supports uploading to [Hackage](https://hackage.haskell.org/). @@ -17,7 +17,8 @@ deploy: ``` {: data-file=".travis.yml"} -It is recommended to encrypt password. +It is recommended to encrypt the password. + Assuming you have the Travis CI command line client installed, you can do it like this: ```bash @@ -34,16 +35,4 @@ $ travis setup hackage Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. -### Conditional releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - -For example, if you build your project with [different GHC versions](/user/languages/haskell/#specifying-haskell-compiler-versions) but only want to deploy from one GHC version, add an `on` condition to your `deploy:` section: - -```yaml -deploy: - on: - condition: $TRAVIS_HASKELL_VERSION = 8.2.2 -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} diff --git a/user/deployment-v2/hephy.md b/user/deployment-v2/hephy.md index 3f67670bfad..2a5b582f2c8 100644 --- a/user/deployment-v2/hephy.md +++ b/user/deployment-v2/hephy.md @@ -2,7 +2,7 @@ title: Hephy Deployment layout: en deploy: v2 - +provider: hephy --- Travis CI supports uploading to Hephy. @@ -37,30 +37,4 @@ $ travis setup hephy > Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. -### Conditional Releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - -### Note on `.gitignore` - -As this deployment strategy relies on `git`, be mindful that the deployment will -honor `.gitignore`. - -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 - -Sometimes you want to run commands before or after triggering a deployment. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. - -```yaml - before_deploy: "echo 'ready?'" - deploy: - .. - after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} diff --git a/user/deployment-v2/heroku.md b/user/deployment-v2/heroku.md index 7f6787658e0..eaa8096fdf1 100644 --- a/user/deployment-v2/heroku.md +++ b/user/deployment-v2/heroku.md @@ -2,11 +2,9 @@ title: Heroku Deployment layout: en deploy: v2 - +provider: heroku --- - - Travis CI can automatically deploy your [Heroku](https://www.heroku.com/) application after a successful build. To use the default configuration, add your encrypted Heroku api key to your `.travis.yml`: @@ -72,33 +70,6 @@ deploy: ``` {: data-file=".travis.yml"} -## Deploying Specific Branches - -If you have branch specific options, as [shown above](#deploying-custom-application-names), Travis CI will automatically figure out which branches to deploy from. Otherwise, it will only deploy from your **master** branch. - -You can also explicitly specify the branch to deploy from with the **on** option: - -```yaml -deploy: - provider: heroku - api_key: ... - on: production -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure it to deploy from all branches: - -```yaml -deploy: - provider: heroku - api_key: ... - on: - all_branches: true -``` -{: data-file=".travis.yml"} - -Builds triggered from Pull Requests will never trigger a deploy. - ## Running Commands In some setups, you might want to run a command on Heroku after a successful deploy. You can do this with the **run** option: @@ -148,22 +119,6 @@ deploy: ``` {: data-file=".travis.yml"} -## Deploying build artifacts - -After your tests ran and before the deploy, Travis CI will clean up any additional files and changes you made. - -Maybe that is not what you want, as you might generate some artifacts (think asset compilation) that are supposed to be deployed, too. There is now an option to skip the clean up: - -```yaml -deploy: - provider: heroku - api_key: ... - skip_cleanup: true -``` -{: data-file=".travis.yml"} - -{% include conditional_deploy.html provider="heroku" %} - ### Deploy Strategy Travis CI supports different mechanisms for deploying to Heroku: @@ -190,16 +145,4 @@ 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 - -Sometimes you want to run commands before or after deploying. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} diff --git a/user/deployment-v2/lambda.md b/user/deployment-v2/lambda.md index e10c8d1d49a..e2ab04cc4b3 100644 --- a/user/deployment-v2/lambda.md +++ b/user/deployment-v2/lambda.md @@ -2,7 +2,7 @@ title: Lambda Deployment layout: en deploy: v2 - +provider: lambda --- Travis CI supports uploading to [AWS Lambda](https://aws.amazon.com/lambda/). @@ -36,59 +36,61 @@ You will be prompted to enter your secret access key on the command line. See [documentation](https://github.com/travis-ci/dpl#lambda) for additional configuration parameters -### Conditional releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - ### AWS permissions The AWS user that Travis deploys as must have the following IAM permissions in order to deploy: ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "ListExistingRolesAndPolicies", - "Effect": "Allow", - "Action": [ - "iam:ListRolePolicies", - "iam:ListRoles" - ], - "Resource": "*" - }, - { - "Sid": "CreateAndListFunctions", - "Effect": "Allow", - "Action": [ - "lambda:CreateFunction", - "lambda:ListFunctions" - ], - "Resource": "*" - }, - { - "Sid": "DeployCode", - "Effect": "Allow", - "Action": [ - "lambda:GetFunction", - "lambda:UpdateFunctionCode", - "lambda:UpdateFunctionConfiguration" - ], - "Resource": [ - "arn:aws:lambda:::function:" - ] - }, - { - "Sid": "SetRole", - "Effect": "Allow", - "Action": [ - "iam:PassRole" - ], - "Resource": "arn:aws:iam:::role/" - } - ] + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "ListExistingRolesAndPolicies", + "Effect": "Allow", + "Action": [ + "iam:ListRolePolicies", + "iam:ListRoles" + ], + "Resource": "*" + }, + { + "Sid": "CreateAndListFunctions", + "Effect": "Allow", + "Action": [ + "lambda:CreateFunction", + "lambda:ListFunctions" + ], + "Resource": "*" + }, + { + "Sid": "DeployCode", + "Effect": "Allow", + "Action": [ + "lambda:GetFunction", + "lambda:UpdateFunctionCode", + "lambda:UpdateFunctionConfiguration" + ], + "Resource": [ + "arn:aws:lambda:::function:" + ] + }, + { + "Sid": "SetRole", + "Effect": "Allow", + "Action": [ + "iam:PassRole" + ], + "Resource": "arn:aws:iam:::role/" + } + ] } ``` -It does not appear to be possible to wildcard the `DeployCode` statement such that Travis can deploy any function in a particular region by specifying the resource as `arn:aws:lambda:::function:*` but it is possible to limit the deployment permissions on a per function basis by specifying the complete ARN to one or more functions, i.e. `arn:aws:lambda:::function:`. +It does not appear to be possible to wildcard the `DeployCode` statement such +that Travis can deploy any function in a particular region by specifying the +resource as `arn:aws:lambda:::function:*` but it is +possible to limit the deployment permissions on a per function basis by +specifying the complete ARN to one or more functions, i.e. +`arn:aws:lambda:::function:`. + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/launchpad.md b/user/deployment-v2/launchpad.md index 7009ddfc618..35632351fd2 100644 --- a/user/deployment-v2/launchpad.md +++ b/user/deployment-v2/launchpad.md @@ -2,7 +2,7 @@ title: Launchpad deployment layout: en deploy: v2 - +provider: launchpad --- Travis CI can get [Launchpad](https://launchpad.net/) to automatically import your code from GitHub after a successful build, which is useful if you are building and hosting Debian packages. @@ -51,3 +51,5 @@ deploy: secure: jAglFtDjncy4E3upL/RF0ZOcmJ2UMrqHFCLQwU8PBdurhTMBeTw+IO6cXx5z\nU5zqvPYo/ghZ8mMuUhvHiGDM6m6OlMP7+l10VTxH1CoVew2NcQvRdfK3P+4S\nZJ43Hyh/ZLCjft+JK0tBwoa3VbH2+ZTzkRZQjdg54bE16C7Mf1A= ``` {: data-file=".travis.yml"} + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/npm.md b/user/deployment-v2/npm.md index cdd284050fe..4c8af3a2671 100644 --- a/user/deployment-v2/npm.md +++ b/user/deployment-v2/npm.md @@ -2,6 +2,7 @@ title: npm Releasing layout: en deploy: v2 +provider: npm --- Travis CI can automatically release your npm package to [npmjs.com][npmjs] @@ -9,10 +10,6 @@ or another npm-like registry after a successful build. By default Travis CI publishes to npmjs.com, however if you have a `publishConfig.registry` key in your `package.json` then Travis CI publishes to that registry instead. - - - - A minimal `.travis.yml` configuration for publishing to [npmjs.com][npmjs] with npm version 2+ looks like: ```yaml @@ -100,13 +97,6 @@ deploy: ``` {: data-file=".travis.yml"} -## Conditional releases - -[A deployment issue](https://github.com/travis-ci/travis-ci/issues/4738) is -reported when multiple attempts are made. -We recommend deploying from only one job with -[Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - ## Tagging releases You can automatically add [npm distribution tags](https://docs.npmjs.com/getting-started/using-tags) with the `tag` option: @@ -132,20 +122,6 @@ If your `.gitignore` file matches something that your build creates, use its content, or create (potentially empty) `.npmignore` file to override it. -## 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` steps for this. These will only be triggered if Travis CI is actually deploying. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} - ## Troubleshooting "npm ERR! You need a paid account to perform this action." npm assumes that [scoped packages](https://docs.npmjs.com/misc/scope) are @@ -158,4 +134,4 @@ and avoid this error by adding the following to your `package.json` file: }, ``` -[npmjs]: https://npmjs.com/ +{% include deploy/shared.md %} diff --git a/user/deployment-v2/openshift.md b/user/deployment-v2/openshift.md index 58d5c9be362..ac083416cae 100644 --- a/user/deployment-v2/openshift.md +++ b/user/deployment-v2/openshift.md @@ -2,7 +2,7 @@ title: OpenShift Deployment layout: en deploy: v2 - +provider: openshift --- Travis CI can automatically deploy your [OpenShift](https://www.openshift.com/) application after a successful build. @@ -71,33 +71,6 @@ deploy: ``` {: data-file=".travis.yml"} -### Branch to deploy from - -If you have branch specific options, as [shown above](#application-to-deploy), Travis CI will automatically figure out which branches to deploy from. Otherwise, it will only deploy from your **master** branch. - -You can also explicitly specify the branch to deploy from with the **on** option: - -```yaml -deploy: - provider: openshift - ... - on: production -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure it to deploy from all branches: - -```yaml -deploy: - provider: openshift - ... - on: - all_branches: true -``` -{: data-file=".travis.yml"} - -Builds triggered from Pull Requests will never trigger a deploy. - ### Deploying build artifacts After your tests ran and before the deploy, Travis CI will clean up any additional files and changes you made. @@ -112,34 +85,6 @@ deploy: ``` {: data-file=".travis.yml"} -### Conditional releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - -### Note on `.gitignore` - -As this deployment strategy relies on `git`, be mindful that the deployment will -honor `.gitignore`. - -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 - -Sometimes you want to run commands before or after deploying. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually deploying. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} - ### Deployment branch OpenShift can be configured to deploy from a branch different from the default `master` via `rhc app-configure --deployment-branch mybranch`. @@ -153,3 +98,5 @@ deploy: deployment_branch: mybranch ``` {: data-file=".travis.yml"} + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/opsworks.md b/user/deployment-v2/opsworks.md index 7c35c5a09d0..11c3c1bef75 100644 --- a/user/deployment-v2/opsworks.md +++ b/user/deployment-v2/opsworks.md @@ -2,7 +2,7 @@ title: AWS OpsWorks Deployment layout: en deploy: v2 - +provider: opsworks --- Travis CI can automatically deploy your [AWS OpsWorks](https://aws.amazon.com/en/opsworks/) application after a successful build. @@ -49,37 +49,6 @@ deploy: ``` {: data-file=".travis.yml"} -### Branch to deploy from - -By default, Travis CI will only deploy from your **master** branch. - -You can explicitly specify the branch to deploy from with the **on** option: - -```yaml -deploy: - provider: opsworks - access-key-id: ACCESS-KEY-ID - secret-access-key: SECRET-ACCESS-KEY - app-id: APP-ID - on: production -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure it to deploy from all branches: - -```yaml -deploy: - provider: opsworks - access-key-id: ACCESS-KEY-ID - secret-access-key: SECRET-ACCESS-KEY - app-id: APP-ID - on: - all_branches: true -``` -{: data-file=".travis.yml"} - -Builds triggered from Pull Requests will never trigger a deploy. - ### Deploying build artifacts After your tests run and before the deploy step, Travis CI will clean up any additional files and changes you made. @@ -132,21 +101,4 @@ deploy: Travis CI will wait until the deployment returns successful and only then update the revision in App Settings. -### Conditional releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - -### 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` steps for this. These will only be triggered if Travis CI is actually deploying. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} diff --git a/user/deployment-v2/packagecloud.md b/user/deployment-v2/packagecloud.md index dba893b4d23..7d6fbeceb02 100644 --- a/user/deployment-v2/packagecloud.md +++ b/user/deployment-v2/packagecloud.md @@ -2,7 +2,7 @@ title: packagecloud Deployment layout: en deploy: v2 - +provider: packagecloud --- Travis CI can automatically push your RPM, Deb, Deb source, or RubyGem package build @@ -40,34 +40,6 @@ travis setup packagecloud Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. -### Branch to release from - -You can explicitly specify the branch to release from with the **on** option: - -```yaml -deploy: - provider: packagecloud - on: - branch: production - # ⋮ -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure Travis CI to release from all branches: - -```yaml -deploy: - provider: packagecloud - on: - all_branches: true - # ⋮ -``` -{: data-file=".travis.yml"} - -By default, Travis CI will only release from the **master** branch. - -Builds triggered from Pull Requests will never trigger a release. - ### Releasing build artifacts After your tests ran and before the release, Travis CI will clean up any additional files and changes you made. @@ -110,21 +82,4 @@ deploy: If the packagecloud provider finds any `.dsc` files, it will scan it and try to locate it's contents within the `local-dir` directory. Ensure the source package and it's contents are output to the same directory for it to work. -### Conditional releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - -### Running commands before and after release - -Sometimes you want to run commands before or after releasing a package. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - # ⋮ -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} diff --git a/user/deployment-v2/pages.md b/user/deployment-v2/pages.md index 9829fca5acb..d7ff43bfea4 100644 --- a/user/deployment-v2/pages.md +++ b/user/deployment-v2/pages.md @@ -2,10 +2,13 @@ title: GitHub Pages Deployment layout: en deploy: v2 - +provider: 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`. +> 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. @@ -61,3 +64,5 @@ or via [encrypted variables in * `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`. * `deployment_file`: Optional, defaults to `false`, enables creation of deployment-info files. + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/puppetforge.md b/user/deployment-v2/puppetforge.md index dc36dd4887c..ea7f33cf4b0 100644 --- a/user/deployment-v2/puppetforge.md +++ b/user/deployment-v2/puppetforge.md @@ -2,11 +2,9 @@ title: Puppet Forge Deployment layout: en deploy: v2 - +provider: puppetforge --- - - Travis CI can automatically deploy your modules to [Puppet Forge ](https://forge.puppet.com/) or to your own Forge instance after a successful build. To deploy to Puppet Forge, add your Puppet Forge username and your @@ -38,18 +36,4 @@ deploy: ``` {: data-file=".travis.yml"} -## 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` steps for this. These will only be -triggered if Travis CI is actually deploying. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} diff --git a/user/deployment-v2/pypi.md b/user/deployment-v2/pypi.md index c889360f453..dd08031e1c0 100644 --- a/user/deployment-v2/pypi.md +++ b/user/deployment-v2/pypi.md @@ -2,13 +2,11 @@ title: PyPI deployment layout: en deploy: v2 - +provider: pypi --- Travis CI can automatically release your Python package to [PyPI](https://pypi.python.org/) after a successful build. - - For a minimal configuration, add the following to your `.travis.yml`: ```yaml @@ -43,54 +41,6 @@ deploy: ``` {: data-file=".travis.yml"} -## Deploying tags - -Most likely, you would only want to deploy to PyPI when a new version of your -package is cut. To do this, you can tell Travis CI to only deploy on tagged -commits, like so: - -```yaml -deploy: - provider: pypi - user: ... - password: ... - on: - tags: true -``` -{: data-file=".travis.yml"} - -If you tag a commit locally, remember to run `git push --tags` to ensure that your tags are uploaded to GitHub. - -## Deploying specific branches - -You can explicitly specify the branch to release from with the **on** option: - -```yaml -deploy: - provider: pypi - user: ... - password: ... - on: - branch: production -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure Travis CI to release from all branches: - -```yaml -deploy: - provider: pypi - user: ... - password: ... - on: - all_branches: true -``` -{: data-file=".travis.yml"} - -By default, Travis CI will only release from the **master** branch. - -Builds triggered from Pull Requests will never trigger a release. - ## Releasing to a self hosted PyPI To release to a different PyPI index: @@ -137,34 +87,4 @@ deploy: skip_existing: true ``` -## Releasing build artifacts - -After your tests ran and before the release, Travis CI will clean up any additional files and changes you made. - -Maybe that is not what you want, as you might generate some artifacts that are supposed to be released, too. There is now an option to skip the clean up: - -``` -deploy: - provider: pypi - user: ... - password: ... - skip_cleanup: true -``` - -## Conditional releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - -## Running commands before and after release - -Sometimes you want to run commands before or after releasing a package. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. - -``` -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` +{% include deploy/shared.md %} diff --git a/user/deployment-v2/releases.md b/user/deployment-v2/releases.md index fed8880a1e2..77769ad2668 100644 --- a/user/deployment-v2/releases.md +++ b/user/deployment-v2/releases.md @@ -2,7 +2,7 @@ title: GitHub Releases Uploading layout: en deploy: v2 - +provider: releases --- Travis CI can automatically upload assets to git tags on your GitHub repository. @@ -82,7 +82,6 @@ For example: provider: releases api_key: "GITHUB OAUTH TOKEN" file: "FILE TO UPLOAD" - skip_cleanup: true ``` {: data-file=".travis.yml"} @@ -226,25 +225,6 @@ deploy: Please note that all paths in `file` are relative to the current working directory, not to [`$TRAVIS_BUILD_DIR`](/user/environment-variables/#default-environment-variables). -### Conditional releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - -## Running commands before or after release - -Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} - ## Advanced options Options from `.travis.yml` are passed through to Octokit API's @@ -265,3 +245,4 @@ Note that formatting in `body` is [not preserved](https://github.com/travis-ci/d GitHub Releases executes a number of git commands during deployment. For this reason, it is important that the working directory is set to the one for which the release will be created, which generally isn't a problem, but if you clone another repository during the build or use submodules, it is worth double checking. +{% include deploy/shared.md %} diff --git a/user/deployment-v2/rubygems.md b/user/deployment-v2/rubygems.md index 620cc885c98..91f8772fea6 100644 --- a/user/deployment-v2/rubygems.md +++ b/user/deployment-v2/rubygems.md @@ -2,7 +2,7 @@ title: RubyGems Deployment layout: en deploy: v2 - +provider: rubygems --- Travis CI can automatically release your Ruby gem to [RubyGems](https://rubygems.org/) after a successful build. @@ -156,27 +156,4 @@ deploy: ``` {: data-file=".travis.yml"} -### Conditional releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - -### Gem must be registered beforehand - -Note that the gem you upload must be registered beforehand. -If the gem does not exist on the host to which it is uploaded, deployment will fail. -See [this GitHub issue](https://github.com/travis-ci/dpl/issues/574) for details. - -### Running commands before and after release - -Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} diff --git a/user/deployment-v2/s3.md b/user/deployment-v2/s3.md index 947b9e53849..4e5206f2746 100644 --- a/user/deployment-v2/s3.md +++ b/user/deployment-v2/s3.md @@ -2,10 +2,9 @@ title: S3 Deployment layout: en deploy: v2 +provider: s3 --- - - Travis CI can automatically upload your build to Amazon S3 after a successful build. For a minimal configuration, add the following to your `.travis.yml`: @@ -294,3 +293,5 @@ deploy: endpoint: https://nyc3.digitaloceanspaces.com ``` {: data-file=".travis.yml"} + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/scalingo.md b/user/deployment-v2/scalingo.md index ceb5d1b6eca..d1c2683597f 100644 --- a/user/deployment-v2/scalingo.md +++ b/user/deployment-v2/scalingo.md @@ -2,22 +2,16 @@ title: Scalingo deployment layout: en deploy: v2 - +provider: scalingo --- - - -Travis CI can automatically deploy your application to -[Scalingo](https://scalingo.com/) application after a successful build. +Travis CI can automatically deploy your application to [Scalingo](https://scalingo.com/) application after a successful build. Chose one of two ways to connect to your Scalingo account: * Using a [username and password](/user/deployment/scalingo/#connecting-using-a-username-and-password). * Using an [api key](/user/deployment/scalingo/#connecting-using-an-api-key). - - ## Connecting using a username and password Add your Scalingo username and your [encrypted](/user/encryption-keys/#usage) @@ -55,18 +49,4 @@ deploy: remote. Specifying the `app` will add a remote to your local repository: `git remote add git@scalingo.com:.git` -### 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` steps for this. These will only be -triggered if Travis CI is actually deploying. - -```yaml -before_deploy: "echo 'ready?'" -deploy: - .. -after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} diff --git a/user/deployment-v2/script.md b/user/deployment-v2/script.md index 4d3ca15c84f..17dde910333 100644 --- a/user/deployment-v2/script.md +++ b/user/deployment-v2/script.md @@ -2,7 +2,7 @@ title: Script deployment layout: en deploy: v2 - +provider: script --- If your deployment needs more customization than the `after_success` method allows, @@ -71,3 +71,5 @@ deploy: script: rvm use $TRAVIS_RUBY_VERSION do script.rb ``` {: data-file=".travis.yml"} + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/snaps.md b/user/deployment-v2/snaps.md index 5e3e7f6b97f..94d02923cc1 100644 --- a/user/deployment-v2/snaps.md +++ b/user/deployment-v2/snaps.md @@ -2,6 +2,7 @@ title: Snap Store layout: en deploy: v2 +provider: snap permalink: /user/deployment/snaps/ --- @@ -27,6 +28,7 @@ If the name of the snap file is not known ahead of time, you can use a shell glo in the example above. ## Providing credentials to upload the snap + To upload snaps from Travis CI, export a Snap Store login token, and provide it as an environment variable `$SNAP_TOKEN`. @@ -50,6 +52,7 @@ The token will be printed out. _Note: The `edge` channel is intended for the bleeding edge: your every commit to master will be built and uploaded._ ### Using the CLI client + Using our [CLI client](https://github.com/travis-ci/travis.rb#readme), define `$SNAP_TOKEN`: ```bash @@ -58,9 +61,11 @@ travis env set SNAP_TOKEN "" ``` ### Using Settings page + Equivalently, you can do this on the [Settings page](https://docs.travis-ci.com/user/environment-variables#defining-variables-in-repository-settings) of your repository at Travis CI. ## Using uploaded Snap + Your community of early-adopters and testers can install your app in any of the [supported Linux distributions](https://docs.snapcraft.io/core/install) with: ```bash @@ -72,3 +77,5 @@ Each upload gets a monotonically increasing integer. When you're ready, you can ```bash snapcraft release my-snap-name 1 stable ``` + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/surge.md b/user/deployment-v2/surge.md index 0c981392d35..fd5ff6b8676 100644 --- a/user/deployment-v2/surge.md +++ b/user/deployment-v2/surge.md @@ -2,7 +2,7 @@ title: Surge.sh Deployment layout: en deploy: v2 - +provider: surge --- Travis CI can deploy your static files to [Surge.sh](https://surge.sh/) after a successful build. Builds triggered from Pull Requests will never trigger a deploy. @@ -32,39 +32,4 @@ deploy: ``` {: data-file=".travis.yml"} -### Generated content - -If you are generating files for deployment you must tell the `deploy` step to keep your changes: - -```yaml -deploy: - ... - skip_cleanup: true -``` -{: data-file=".travis.yml"} - -It is suggested that you generate your files during the `script` step or the `before_deploy` step. - -- When generating files during the `script` step, an error results in a failed build. -- When generating files during the `before_deploy` step, an error does *not* result in a failed build. - -### Branches - -By default, Travis CI will only deploy from your `master` branch. You can specify what branch to deploy from with the deploy option `on`: - -```yaml -deploy: - ... - on: myProductionBranch -``` -{: data-file=".travis.yml"} - -To deploy from all branches set the deploy->on option `all_branches` to `true` - -```yaml -deploy: - ... - on: - all_branches: true -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} diff --git a/user/deployment-v2/testfairy.md b/user/deployment-v2/testfairy.md index c3f783504aa..4120debfd07 100644 --- a/user/deployment-v2/testfairy.md +++ b/user/deployment-v2/testfairy.md @@ -2,7 +2,7 @@ title: TestFairy deployment layout: en deploy: v2 - +provider: testfairy --- Travis CI can automatically deploy your Android and iOS Apps to [TestFairy](https://www.testfairy.com/). @@ -80,3 +80,5 @@ deploy: metrics: cpu,memory,network,phone-signal,logcat,gps,battery ``` {: data-file=".travis.yml"} + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/transifex.md b/user/deployment-v2/transifex.md index d3202600066..5006d8a8395 100644 --- a/user/deployment-v2/transifex.md +++ b/user/deployment-v2/transifex.md @@ -2,7 +2,7 @@ title: Transifex Deployment layout: en deploy: v2 - +provider: transifex --- Travis CI supports uploading to [Transifex](https://www.transifex.com/). @@ -37,30 +37,4 @@ $ travis setup transifex Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. -### Conditional Releases - -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). - -### Note on `.gitignore` - -As this deployment strategy relies on `git`, be mindful that the deployment will -honor `.gitignore`. - -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 - -Sometimes you want to run commands before or after triggering a deployment. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. - -```yaml - before_deploy: "echo 'ready?'" - deploy: - .. - after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} +{% include deploy/shared.md %} From 1094211c62062c75ec8908627ded2fa6dd96906f Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Thu, 5 Sep 2019 19:03:49 +0200 Subject: [PATCH 0220/1536] extract more --- _includes/deploy/cleanup.md | 23 ++++ _includes/deploy/conditional.md | 122 ++++++++++++++++- _includes/deploy/conditional_link.md | 5 + _includes/deploy/maturity_levels.md | 16 +++ _includes/deploy/multiple_targets.md | 19 +++ _includes/deploy/overview.md | 8 ++ _includes/deploy/pull_requests.md | 3 + _includes/deploy/shared.md | 2 +- user/deployment-v2.md | 188 +-------------------------- user/deployment-v2/anynines.md | 4 +- 10 files changed, 202 insertions(+), 188 deletions(-) create mode 100644 _includes/deploy/cleanup.md create mode 100644 _includes/deploy/conditional_link.md create mode 100644 _includes/deploy/maturity_levels.md create mode 100644 _includes/deploy/multiple_targets.md create mode 100644 _includes/deploy/overview.md create mode 100644 _includes/deploy/pull_requests.md diff --git a/_includes/deploy/cleanup.md b/_includes/deploy/cleanup.md new file mode 100644 index 00000000000..78f31bdf863 --- /dev/null +++ b/_includes/deploy/cleanup.md @@ -0,0 +1,23 @@ +## Cleaning up the Git Working Directory + +By default your Git working directory will not be cleaned up before the deploy +step, so it might contain left over artifacts from previous steps. + +For many providers and deployment targets this is not an issue or even intended. + +If you do need to clean up the working directory from any changes made during +the build process you can add the following to your `.travis.yml` file: + +```yaml +deploy: + provider: {{ page.provider | default: '[your provider]' }} + cleanup: true +``` +{: data-file=".travis.yml"} + +Please note that the previous version of dpl, our deployment integration +tooling, used to reset your working directory and delete all changes made +during the build using `git stash --all`. In order to keep changes one had to +opt out using `skip_cleanup: true`. This default turned out to be useful only +for very few providers and has been changed in dpl v2. You still might find +external tutorials or posts mentioning `skip_cleanup`. diff --git a/_includes/deploy/conditional.md b/_includes/deploy/conditional.md index 005cba52e60..6647da77c7f 100644 --- a/_includes/deploy/conditional.md +++ b/_includes/deploy/conditional.md @@ -1,5 +1,121 @@ -### Conditional Deploys +## Conditional Releases with `on:` + +Set your build to deploy only in specific circumstances by configuring the `on:` key for any deployment provider. + +```yaml +deploy: + provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" + skip_cleanup: true + on: + branch: release + condition: $MY_ENV = super_awesome +``` +{: data-file=".travis.yml"} + +When *all* conditions specified in the `on:` section are met, your build will deploy. + +Use the following options to configure conditional deployment: + +* `repo`: in the form `owner_name/repo_name`. Deploy only when the build occurs on a particular repository. For example: + + ```yaml + deploy: + provider: s3 + on: + repo: travis-ci/dpl + ``` + {: data-file=".travis.yml"} + +* `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. + +* `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. + +* `condition`: deploy when *a single* bash condition evaluates to `true`. This must be a string value and is equivalent to `if [[ ]]; then ; fi`. For example, `$CC = gcc`. + +* `tags` can be `true`, `false` or any other string: + + * `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. + * `tags: false`: deployment is triggered if and only if `$TRAVIS_TAG` is empty. + This also causes the `branch` condition to be ignored. + * 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 Deployment + +This example deploys to Appfog only from the `staging` branch when the test has run on Node.js version 0.11. + +```yaml +language: node_js +deploy: + provider: appfog + user: ... + api_key: ... + on: + branch: staging + node_js: '0.11' # this should be quoted; otherwise, 0.10 would not work +``` +{: data-file=".travis.yml"} + +The next example deploys using a custom script `deploy.sh`, only for builds on the branches `staging` and `production`. + +```yaml +deploy: + provider: script + script: deploy.sh + on: + all_branches: true + condition: $TRAVIS_BRANCH =~ ^(staging|production)$ +``` +{: data-file=".travis.yml"} + +The next example deploys using custom scripts `deploy_production.sh` and `deploy_staging.sh` depending on the branch that triggered the job. + +```yaml +deploy: + - provider: script + script: deploy_production.sh + on: + branch: production + - provider: script + script: deploy_staging.sh + on: + branch: staging +``` +{: data-file=".travis.yml"} + +The next example deploys to S3 only when `$CC` is set to `gcc`. + +```yaml +deploy: + provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + skip_cleanup: true + bucket: "S3 Bucket" + on: + condition: "$CC = gcc" +``` +{: data-file=".travis.yml"} + +This example deploys to GitHub Releases when a tag is set and the Ruby version is 2.0.0. + +```yaml +deploy: + provider: releases + api_key: "GITHUB OAUTH TOKEN" + file: "FILE TO UPLOAD" + skip_cleanup: true + on: + tags: true + rvm: 2.0.0 +``` +{: data-file=".travis.yml"} -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment-v2#conditional-releases-with-on). diff --git a/_includes/deploy/conditional_link.md b/_includes/deploy/conditional_link.md new file mode 100644 index 00000000000..005cba52e60 --- /dev/null +++ b/_includes/deploy/conditional_link.md @@ -0,0 +1,5 @@ +### Conditional Deploys + +You can deploy only when certain conditions are met. + +See [Conditional Releases with `on:`](/user/deployment-v2#conditional-releases-with-on). diff --git a/_includes/deploy/maturity_levels.md b/_includes/deploy/maturity_levels.md new file mode 100644 index 00000000000..ad41310d89d --- /dev/null +++ b/_includes/deploy/maturity_levels.md @@ -0,0 +1,16 @@ +## Maturity Levels + +In order to communicate the current development status and maturity of dpl's +support for a particular service, the respective provider is marked with one of +the following maturity levels, according to the given criteria: + +* `dev` - the provider is in development (initial level) +* `alpha` - the provider is fully tested +* `beta` - the provider has been in alpha for at least a month and successful real-world production deployments have been observed +* `stable` - the provider has been in beta for at least two months and there are no open issues that qualify as critical (such as deployments failing, documented functionality broken, etc.) + +Dpl v2 represents a major rewrite, so support for all providers has been +reset to `dev` or `alpha`, depending on the test status. + +For all levels except `stable` a message will be printed to your build log +that informs you about the current status. diff --git a/_includes/deploy/multiple_targets.md b/_includes/deploy/multiple_targets.md new file mode 100644 index 00000000000..06ebe789d1b --- /dev/null +++ b/_includes/deploy/multiple_targets.md @@ -0,0 +1,19 @@ +## Deploying to Multiple Targets + +Running multiple deployments to different providers (or the same provider with +different configurations) is possible by adding configurations to the `deploy` +section as a list. For example, if you want to deploy to both s3 and Heroku, +your `deploy` section would look something like this: + +```yaml +deploy: + - provider: s3 + access_key_id: + secret_access_key: + # ... + - provider: heroku + api_key: + # ... +``` +{: data-file=".travis.yml"} + diff --git a/_includes/deploy/overview.md b/_includes/deploy/overview.md new file mode 100644 index 00000000000..12e5fe8aa60 --- /dev/null +++ b/_includes/deploy/overview.md @@ -0,0 +1,8 @@ +{% include deploy/maturity_levels.md %} + +{% include deploy/pull_requests.md %} + +{% include deploy/cleanup.md %} + +{% include deploy/conditional.md %} + diff --git a/_includes/deploy/pull_requests.md b/_includes/deploy/pull_requests.md new file mode 100644 index 00000000000..94b977a5c2f --- /dev/null +++ b/_includes/deploy/pull_requests.md @@ -0,0 +1,3 @@ +## Pull Requests + +Note that pull request builds skip the deployment step altogether. diff --git a/_includes/deploy/shared.md b/_includes/deploy/shared.md index be8bc825baa..412ce2c8980 100644 --- a/_includes/deploy/shared.md +++ b/_includes/deploy/shared.md @@ -1,5 +1,5 @@ {% include deploy/branch.md %} -{% include deploy/conditional.md %} +{% include deploy/conditional_link.md %} {% include deploy/before_after_deploy.md %} diff --git a/user/deployment-v2.md b/user/deployment-v2.md index e4ef6abb288..b86b721d4ff 100644 --- a/user/deployment-v2.md +++ b/user/deployment-v2.md @@ -19,191 +19,17 @@ Continuous Deployment to the following providers is supported: To deploy to a custom or unsupported provider, use the [after-success build step](/user/deployment/custom/) or [script provider](/user/deployment/script). -## Maturity Levels +### Contributing to dpl -In order to communicate the current development status and maturity of dpl's -support for a particular service, the respective provider is marked with one of -the following maturity levels, according to the given criteria: - -* `dev` - the provider is in development (initial level) -* `alpha` - the provider is fully tested -* `beta` - the provider has been in alpha for at least a month and successful real-world production deployments have been observed -* `stable` - the provider has been in beta for at least two months and there are no open issues that qualify as critical (such as deployments failing, documented functionality broken, etc.) - -Dpl v2 represents a major rewrite, so support for all providers has been -reset to `dev` or `alpha`, depending on the test status. - -For all levels except `stable` a message will be printed to your build log -that informs you about the current status. - -## Cleaning up the Git Working Directory - -The previous version of dpl - our deployment integration tooling - used to -reset your working directory and delete all changes made during the build -using `git stash --all`. In order to keep changes one had to opt out using -`skip_cleanup: true`. This default turned out to be useful only for very few -providers and has been changed in dpl v2. - -If you do need to clean up the working directory from any changes made during -the build process, please opt in to cleanup by adding the following to your -`.travis.yml` file: - -```yaml -deploy: - cleanup: true -``` -{: data-file=".travis.yml"} - -## 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 -cloudControl and Heroku, your `deploy` section would look something like this: +If you contribute to or experiment with [dpl](https://github.com/travis-ci/dpl), our deployment tooling, make sure you use the edge version from GitHub: ```yaml deploy: - - provider: cloudcontrol - email: "YOUR CLOUDCONTROL EMAIL" - password: "YOUR CLOUDCONTROL PASSWORD" - deployment: "APP_NAME/DEP_NAME" - - provider: heroku - api_key: "YOUR HEROKU API KEY" + provider: + edge: + branch: master + source: /dpl # only needed for forks of travis-ci/dpl ``` {: data-file=".travis.yml"} -## Conditional Releases with `on:` - -Set your build to deploy only in specific circumstances by configuring the `on:` key for any deployment provider. - -```yaml -deploy: - provider: s3 - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - bucket: "S3 Bucket" - skip_cleanup: true - on: - branch: release - condition: $MY_ENV = super_awesome -``` -{: data-file=".travis.yml"} - -When *all* conditions specified in the `on:` section are met, your build will deploy. - -Use the following options to configure conditional deployment: - -* `repo`: in the form `owner_name/repo_name`. Deploy only when the build occurs on a particular repository. For example: - - ```yaml - deploy: - provider: s3 - on: - repo: travis-ci/dpl - ``` - {: data-file=".travis.yml"} - -* `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. - -* `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. - -* `condition`: deploy when *a single* bash condition evaluates to `true`. This must be a string value and is equivalent to `if [[ ]]; then ; fi`. For example, `$CC = gcc`. - -* `tags` can be `true`, `false` or any other string: - - * `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. - * `tags: false`: deployment is triggered if and only if `$TRAVIS_TAG` is empty. - This also causes the `branch` condition to be ignored. - * 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 Deployment - -This example deploys to Appfog only from the `staging` branch when the test has run on Node.js version 0.11. - -```yaml -language: node_js -deploy: - provider: appfog - user: ... - api_key: ... - on: - branch: staging - node_js: '0.11' # this should be quoted; otherwise, 0.10 would not work -``` -{: data-file=".travis.yml"} - -The next example deploys using a custom script `deploy.sh`, only for builds on the branches `staging` and `production`. - -```yaml -deploy: - provider: script - script: deploy.sh - on: - all_branches: true - condition: $TRAVIS_BRANCH =~ ^(staging|production)$ -``` -{: data-file=".travis.yml"} - -The next example deploys using custom scripts `deploy_production.sh` and `deploy_staging.sh` depending on the branch that triggered the job. - -```yaml -deploy: - - provider: script - script: deploy_production.sh - on: - branch: production - - provider: script - script: deploy_staging.sh - on: - branch: staging -``` -{: data-file=".travis.yml"} - -The next example deploys to S3 only when `$CC` is set to `gcc`. - -```yaml -deploy: - provider: s3 - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - skip_cleanup: true - bucket: "S3 Bucket" - on: - condition: "$CC = gcc" -``` -{: data-file=".travis.yml"} - -This example deploys to GitHub Releases when a tag is set and the Ruby version is 2.0.0. - -```yaml -deploy: - provider: releases - api_key: "GITHUB OAUTH TOKEN" - file: "FILE TO UPLOAD" - skip_cleanup: true - on: - tags: true - rvm: 2.0.0 -``` -{: data-file=".travis.yml"} - -### 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?subject:New%20deployment%20provider%20proposal). - -If you contribute to or experiment with the [deploy tool](https://github.com/travis-ci/dpl), make sure you use the edge version from GitHub: - -```yaml -deploy: - provider: awesome-experimental-provider - edge: true -``` -{: data-file=".travis.yml"} - -## Pull Requests - -> Note that pull request builds skip the deployment step altogether. +You can find more information about contributing to dpl [here](https://github.com/travis-ci/dpl#contributing-to-dpl). diff --git a/user/deployment-v2/anynines.md b/user/deployment-v2/anynines.md index a6c92def189..6a505774a0e 100644 --- a/user/deployment-v2/anynines.md +++ b/user/deployment-v2/anynines.md @@ -38,7 +38,5 @@ This can be easily accomplished using the Travis gem above and running: travis encrypt --add deploy.password ``` -### Conditional releases +{% include deploy/shared.md %} -You can deploy only when certain conditions are met. -See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). From 05a6512b69e7382871414d19a68d57193a9a15d5 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Thu, 5 Sep 2019 19:05:44 +0200 Subject: [PATCH 0221/1536] extract more --- _includes/deploy/contributing.md | 14 ++++++++++++++ _includes/deploy/overview.md | 2 ++ _includes/deploy/shared.md | 3 +++ user/deployment-v2.md | 15 +-------------- user/deployment-v2/azure-web-apps.md | 5 +---- 5 files changed, 21 insertions(+), 18 deletions(-) create mode 100644 _includes/deploy/contributing.md diff --git a/_includes/deploy/contributing.md b/_includes/deploy/contributing.md new file mode 100644 index 00000000000..133e9a183ea --- /dev/null +++ b/_includes/deploy/contributing.md @@ -0,0 +1,14 @@ +### Contributing to dpl + +If you contribute to or experiment with [dpl](https://github.com/travis-ci/dpl), our deployment tooling, make sure you use the edge version from GitHub: + +```yaml +deploy: + provider: + edge: + branch: master + source: /dpl # only needed for forks of travis-ci/dpl +``` +{: data-file=".travis.yml"} + +You can find more information about contributing to dpl [here](https://github.com/travis-ci/dpl#contributing-to-dpl). diff --git a/_includes/deploy/overview.md b/_includes/deploy/overview.md index 12e5fe8aa60..658965e0f6f 100644 --- a/_includes/deploy/overview.md +++ b/_includes/deploy/overview.md @@ -6,3 +6,5 @@ {% include deploy/conditional.md %} +{% include deploy/contributing.md %} + diff --git a/_includes/deploy/shared.md b/_includes/deploy/shared.md index 412ce2c8980..8a4263f2976 100644 --- a/_includes/deploy/shared.md +++ b/_includes/deploy/shared.md @@ -3,3 +3,6 @@ {% include deploy/conditional_link.md %} {% include deploy/before_after_deploy.md %} + +{% include deploy/contributing.md %} + diff --git a/user/deployment-v2.md b/user/deployment-v2.md index b86b721d4ff..f82135512a0 100644 --- a/user/deployment-v2.md +++ b/user/deployment-v2.md @@ -19,17 +19,4 @@ Continuous Deployment to the following providers is supported: To deploy to a custom or unsupported provider, use the [after-success build step](/user/deployment/custom/) or [script provider](/user/deployment/script). -### Contributing to dpl - -If you contribute to or experiment with [dpl](https://github.com/travis-ci/dpl), our deployment tooling, make sure you use the edge version from GitHub: - -```yaml -deploy: - provider: - edge: - branch: master - source: /dpl # only needed for forks of travis-ci/dpl -``` -{: data-file=".travis.yml"} - -You can find more information about contributing to dpl [here](https://github.com/travis-ci/dpl#contributing-to-dpl). +{% include deploy/overview.md %} diff --git a/user/deployment-v2/azure-web-apps.md b/user/deployment-v2/azure-web-apps.md index 2f12dfd9668..1c698a0af7c 100644 --- a/user/deployment-v2/azure-web-apps.md +++ b/user/deployment-v2/azure-web-apps.md @@ -62,7 +62,4 @@ deploy: ``` {: data-file=".travis.yml"} - -{% include deploy/branch.md %} - -{% include deploy/before_after_deploy.md %} +{% include deploy/shared.md %} From b2415b74e09cd4cf3a91a27a98f1d8782c88cfef Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Mon, 9 Sep 2019 15:11:00 +0200 Subject: [PATCH 0222/1536] generate known options section, go through all providers --- Gemfile | 6 + Gemfile.lock | 15 ++ _includes/deploy/before_after_deploy.md | 2 +- _includes/deploy/branch.md | 4 +- _includes/deploy/conditional_link.md | 2 +- _includes/deploy/contributing.md | 2 +- _includes/deploy/providers/anynines.md | 19 ++ _includes/deploy/providers/azure_web_apps.md | 17 ++ _includes/deploy/providers/bintray.md | 16 ++ .../deploy/providers/bluemixcloudfoundry.md | 22 ++ _includes/deploy/providers/boxfuse.md | 20 ++ _includes/deploy/providers/cargo.md | 13 + .../deploy/providers/chef_supermarket.md | 10 + _includes/deploy/providers/cloud66.md | 13 + _includes/deploy/providers/cloudfiles.md | 18 ++ _includes/deploy/providers/cloudformation.md | 28 +++ _includes/deploy/providers/cloudfoundry.md | 22 ++ _includes/deploy/providers/codedeploy.md | 27 +++ _includes/deploy/providers/convox.md | 17 ++ _includes/deploy/providers/datica.md | 7 + .../deploy/providers/elasticbeanstalk.md | 24 ++ _includes/deploy/providers/engineyard.md | 19 ++ _includes/deploy/providers/firebase.md | 17 ++ _includes/deploy/providers/gae.md | 13 + _includes/deploy/providers/gcs.md | 21 ++ _includes/deploy/providers/gleis.md | 17 ++ _includes/deploy/providers/hackage.md | 15 ++ _includes/deploy/providers/hephy.md | 18 ++ _includes/deploy/providers/heroku_api.md | 13 + _includes/deploy/providers/heroku_git.md | 16 ++ _includes/deploy/providers/lambda.md | 34 +++ _includes/deploy/providers/launchpad.md | 15 ++ _includes/deploy/providers/netlify.md | 18 ++ _includes/deploy/providers/npm.md | 19 ++ _includes/deploy/providers/openshift.md | 16 ++ _includes/deploy/providers/opsworks.md | 22 ++ _includes/deploy/providers/packagecloud.md | 22 ++ _includes/deploy/providers/pages_api.md | 14 ++ _includes/deploy/providers/pages_git.md | 28 +++ _includes/deploy/providers/puppetforge.md | 15 ++ _includes/deploy/providers/pypi.md | 24 ++ _includes/deploy/providers/releases.md | 27 +++ _includes/deploy/providers/rubygems.md | 19 ++ _includes/deploy/providers/s3.md | 32 +++ _includes/deploy/providers/scalingo.md | 20 ++ _includes/deploy/providers/script.md | 6 + _includes/deploy/providers/snap.md | 15 ++ _includes/deploy/providers/surge.md | 16 ++ _includes/deploy/providers/testfairy.md | 19 ++ _includes/deploy/providers/transifex.md | 17 ++ _includes/deploy/secrets.md | 28 +++ assets/stylesheets/_base.sass | 3 +- assets/stylesheets/_layout.sass | 2 +- lib/dpl/docs.rb | 201 ++++++++++++++++ user/build-stages.md | 2 +- user/deployment-v2/anynines.md | 33 +-- user/deployment-v2/azure-web-apps.md | 45 ++-- user/deployment-v2/bintray.md | 170 +++++++------ user/deployment-v2/bitballoon.md | 37 --- user/deployment-v2/bluemixcloudfoundry.md | 40 +--- user/deployment-v2/boxfuse.md | 66 ++--- user/deployment-v2/cargo.md | 70 +----- user/deployment-v2/chefsupermarket.md | 27 ++- user/deployment-v2/cloud66.md | 14 +- user/deployment-v2/cloudfiles.md | 64 +++-- user/deployment-v2/cloudfoundry.md | 32 +-- user/deployment-v2/codedeploy.md | 89 ++----- user/deployment-v2/custom.md | 2 +- user/deployment-v2/datica.md | 46 ++-- user/deployment-v2/elasticbeanstalk.md | 48 ++-- user/deployment-v2/engineyard.md | 63 ++--- user/deployment-v2/firebase.md | 36 +-- user/deployment-v2/gcs.md | 64 ++--- user/deployment-v2/google-app-engine.md | 94 ++------ user/deployment-v2/hackage.md | 26 +- user/deployment-v2/hephy.md | 26 +- user/deployment-v2/heroku.md | 111 ++++----- user/deployment-v2/lambda.md | 29 +-- user/deployment-v2/launchpad.md | 47 ++-- user/deployment-v2/netlify.md | 35 +++ user/deployment-v2/npm.md | 96 ++------ user/deployment-v2/openshift.md | 98 +++----- user/deployment-v2/opsworks.md | 70 ++---- user/deployment-v2/packagecloud.md | 66 ++--- user/deployment-v2/pages.md | 51 +--- user/deployment-v2/puppetforge.md | 19 +- user/deployment-v2/pypi.md | 46 ++-- user/deployment-v2/releases.md | 225 +++++++----------- user/deployment-v2/rubygems.md | 142 ++++------- user/deployment-v2/s3.md | 204 +++++++--------- user/deployment-v2/scalingo.md | 34 +-- user/deployment-v2/snap.md | 71 ++++++ user/deployment-v2/snaps.md | 81 ------- user/deployment-v2/surge.md | 28 +-- user/deployment-v2/testfairy.md | 63 ++--- user/deployment-v2/transifex.md | 28 +-- user/uploading-artifacts.md | 6 +- 97 files changed, 2042 insertions(+), 1687 deletions(-) create mode 100644 _includes/deploy/providers/anynines.md create mode 100644 _includes/deploy/providers/azure_web_apps.md create mode 100644 _includes/deploy/providers/bintray.md create mode 100644 _includes/deploy/providers/bluemixcloudfoundry.md create mode 100644 _includes/deploy/providers/boxfuse.md create mode 100644 _includes/deploy/providers/cargo.md create mode 100644 _includes/deploy/providers/chef_supermarket.md create mode 100644 _includes/deploy/providers/cloud66.md create mode 100644 _includes/deploy/providers/cloudfiles.md create mode 100644 _includes/deploy/providers/cloudformation.md create mode 100644 _includes/deploy/providers/cloudfoundry.md create mode 100644 _includes/deploy/providers/codedeploy.md create mode 100644 _includes/deploy/providers/convox.md create mode 100644 _includes/deploy/providers/datica.md create mode 100644 _includes/deploy/providers/elasticbeanstalk.md create mode 100644 _includes/deploy/providers/engineyard.md create mode 100644 _includes/deploy/providers/firebase.md create mode 100644 _includes/deploy/providers/gae.md create mode 100644 _includes/deploy/providers/gcs.md create mode 100644 _includes/deploy/providers/gleis.md create mode 100644 _includes/deploy/providers/hackage.md create mode 100644 _includes/deploy/providers/hephy.md create mode 100644 _includes/deploy/providers/heroku_api.md create mode 100644 _includes/deploy/providers/heroku_git.md create mode 100644 _includes/deploy/providers/lambda.md create mode 100644 _includes/deploy/providers/launchpad.md create mode 100644 _includes/deploy/providers/netlify.md create mode 100644 _includes/deploy/providers/npm.md create mode 100644 _includes/deploy/providers/openshift.md create mode 100644 _includes/deploy/providers/opsworks.md create mode 100644 _includes/deploy/providers/packagecloud.md create mode 100644 _includes/deploy/providers/pages_api.md create mode 100644 _includes/deploy/providers/pages_git.md create mode 100644 _includes/deploy/providers/puppetforge.md create mode 100644 _includes/deploy/providers/pypi.md create mode 100644 _includes/deploy/providers/releases.md create mode 100644 _includes/deploy/providers/rubygems.md create mode 100644 _includes/deploy/providers/s3.md create mode 100644 _includes/deploy/providers/scalingo.md create mode 100644 _includes/deploy/providers/script.md create mode 100644 _includes/deploy/providers/snap.md create mode 100644 _includes/deploy/providers/surge.md create mode 100644 _includes/deploy/providers/testfairy.md create mode 100644 _includes/deploy/providers/transifex.md create mode 100644 _includes/deploy/secrets.md create mode 100644 lib/dpl/docs.rb delete mode 100644 user/deployment-v2/bitballoon.md create mode 100644 user/deployment-v2/netlify.md create mode 100644 user/deployment-v2/snap.md delete mode 100644 user/deployment-v2/snaps.md diff --git a/Gemfile b/Gemfile index f67f00dc168..337544dcdca 100644 --- a/Gemfile +++ b/Gemfile @@ -43,3 +43,9 @@ gem 'therubyracer', :platforms => :ruby git 'https://github.com/ably-forks/compass', branch: 'sass-deprecation-warning-fix', ref: '3861c9d' do gem 'compass-core' end + +group :dpl do + # gem 'dpl', git: 'https://github.com/travis-ci/dpl' + gem 'dpl', path: '../dpl' + gem 'cl', path: '../../cl' +end diff --git a/Gemfile.lock b/Gemfile.lock index 5a580c35601..bb33881e69c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -17,6 +17,18 @@ GIT compass-import-once (1.0.5) sass (>= 3.2, < 3.5) +PATH + remote: ../../cl + specs: + cl (1.1.3) + regstry (~> 1.0.3) + +PATH + remote: ../dpl + specs: + dpl (2.0.0.alpha.2) + cl (~> 1.0) + GEM remote: https://rubygems.org/ specs: @@ -181,6 +193,7 @@ GEM rdiscount (2.2.0.1) redcarpet (3.4.0) ref (2.0.0) + regstry (1.0.14) rouge (2.2.1) rubocop (0.57.2) jaro_winkler (~> 1.5.1) @@ -229,7 +242,9 @@ PLATFORMS ruby DEPENDENCIES + cl! compass-core! + dpl! faraday html-proofer (~> 3.0) jekyll (>= 3.1.6) diff --git a/_includes/deploy/before_after_deploy.md b/_includes/deploy/before_after_deploy.md index 65b6f117b6f..55e9e8f7b58 100644 --- a/_includes/deploy/before_after_deploy.md +++ b/_includes/deploy/before_after_deploy.md @@ -1,4 +1,4 @@ -### 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` steps for this. These will only be triggered diff --git a/_includes/deploy/branch.md b/_includes/deploy/branch.md index ebd0ba5a084..1f759e6c0c4 100644 --- a/_includes/deploy/branch.md +++ b/_includes/deploy/branch.md @@ -1,4 +1,4 @@ -### Branch to deploy from +## Branch to deploy from By default, Travis CI will only deploy from your **master** branch. @@ -23,7 +23,7 @@ deploy: Builds triggered from Pull Requests will never trigger a deploy. -### Branches +## Branches By default, Travis CI will only deploy from your `master` branch. You can specify what branch to deploy from with the deploy option `on`: diff --git a/_includes/deploy/conditional_link.md b/_includes/deploy/conditional_link.md index 005cba52e60..796f0f272df 100644 --- a/_includes/deploy/conditional_link.md +++ b/_includes/deploy/conditional_link.md @@ -1,4 +1,4 @@ -### Conditional Deploys +## Conditional Deploys You can deploy only when certain conditions are met. diff --git a/_includes/deploy/contributing.md b/_includes/deploy/contributing.md index 133e9a183ea..6f0d97e8f72 100644 --- a/_includes/deploy/contributing.md +++ b/_includes/deploy/contributing.md @@ -1,4 +1,4 @@ -### Contributing to dpl +## Contributing to dpl If you contribute to or experiment with [dpl](https://github.com/travis-ci/dpl), our deployment tooling, make sure you use the edge version from GitHub: diff --git a/_includes/deploy/providers/anynines.md b/_includes/deploy/providers/anynines.md new file mode 100644 index 00000000000..a82d63e12b9 --- /dev/null +++ b/_includes/deploy/providers/anynines.md @@ -0,0 +1,19 @@ +## Known options + +Use the following options to further configure the deployment: + +| `username` | anynines username — **required**, type: string | +| `password` | anynines password — **required**, **secret**, type: string | +| `organization` | anynines organization — **required**, type: string | +| `space` | anynines space — **required**, type: string | +| `app_name` | Application name — type: string | +| `buildpack` | Custom buildpack name or Git URL — type: string | +| `manifest` | Path to the manifest — type: string | + +## Environment variables + +All options can be given as environment variables if prefixed with `ANYNINES_`. + +For example, `password` can be given as `ANYNINES_PASSWORD=`. + +{% include deploy/secrets.md name="password" env_name="ANYNINES_PASSWORD" %} \ No newline at end of file diff --git a/_includes/deploy/providers/azure_web_apps.md b/_includes/deploy/providers/azure_web_apps.md new file mode 100644 index 00000000000..0fa476e2134 --- /dev/null +++ b/_includes/deploy/providers/azure_web_apps.md @@ -0,0 +1,17 @@ +## Known options + +Use the following options to further configure the deployment: + +| `username` | Web App Deployment Username — **required**, type: string | +| `password` | Web App Deployment Password — **required**, **secret**, type: string | +| `site` | Web App name (e.g. myapp in myapp.azurewebsites.net) — **required**, type: string | +| `slot` | Slot name (if your app uses staging deployment) — type: string | +| `verbose` | Print deployment output from Azure. Warning: If authentication fails, Git prints credentials in clear text. Correct credentials remain hidden. — type: boolean | + +## Environment variables + +All options can be given as environment variables if prefixed with `AZURE_WA_`. + +For example, `password` can be given as `AZURE_WA_PASSWORD=`. + +{% include deploy/secrets.md name="password" env_name="AZURE_WA_PASSWORD" %} \ No newline at end of file diff --git a/_includes/deploy/providers/bintray.md b/_includes/deploy/providers/bintray.md new file mode 100644 index 00000000000..3691941aa3d --- /dev/null +++ b/_includes/deploy/providers/bintray.md @@ -0,0 +1,16 @@ +## Known options + +Use the following options to further configure the deployment: + +| `user` | Bintray user — **required**, type: string | +| `key` | Bintray API key — **required**, **secret**, type: string | +| `file` | Path to a descriptor file for the Bintray upload — **required**, type: string | +| `passphrase` | Passphrase as configured on Bintray (if GPG signing is used) — type: string | + +## Environment variables + +All options can be given as environment variables if prefixed with `BINTRAY_`. + +For example, `key` can be given as `BINTRAY_KEY=`. + +{% include deploy/secrets.md name="key" env_name="BINTRAY_KEY" %} \ No newline at end of file diff --git a/_includes/deploy/providers/bluemixcloudfoundry.md b/_includes/deploy/providers/bluemixcloudfoundry.md new file mode 100644 index 00000000000..30e31061a6c --- /dev/null +++ b/_includes/deploy/providers/bluemixcloudfoundry.md @@ -0,0 +1,22 @@ +## Known options + +Use the following options to further configure the deployment: + +| `username` | Bluemix username — **required**, type: string | +| `password` | Bluemix password — **required**, **secret**, type: string | +| `organization` | Bluemix organization — **required**, type: string | +| `space` | Bluemix space — **required**, type: string | +| `region` | Bluemix region — type: string, default: `ng`, known values: `ng`, `eu-gb`, `eu-de`, `au-syd` | +| `api` | Bluemix api URL — type: string | +| `app_name` | Application name — type: string | +| `buildpack` | Custom buildpack name or Git URL — type: string | +| `manifest` | Path to the manifest — type: string | +| `skip_ssl_validation` | Skip SSL validation — type: boolean | + +## Environment variables + +All options can be given as environment variables if prefixed with `CLOUDFOUNDRY_`. + +For example, `password` can be given as `CLOUDFOUNDRY_PASSWORD=`. + +{% include deploy/secrets.md name="password" env_name="CLOUDFOUNDRY_PASSWORD" %} \ No newline at end of file diff --git a/_includes/deploy/providers/boxfuse.md b/_includes/deploy/providers/boxfuse.md new file mode 100644 index 00000000000..6e59d7c812e --- /dev/null +++ b/_includes/deploy/providers/boxfuse.md @@ -0,0 +1,20 @@ +## Known options + +Use the following options to further configure the deployment: + +| `user` | **required**, type: string | +| `secret` | **required**, **secret**, type: string | +| `payload` | type: string | +| `app` | type: string | +| `version` | type: string | +| `env` | type: string | +| `config_file` | type: string, alias: `configfile` (deprecated, please use `config_file`) | +| `extra_args` | type: string | + +## Environment variables + +All options can be given as environment variables if prefixed with `BOXFUSE_`. + +For example, `secret` can be given as `BOXFUSE_SECRET=`. + +{% include deploy/secrets.md name="secret" env_name="BOXFUSE_SECRET" %} \ No newline at end of file diff --git a/_includes/deploy/providers/cargo.md b/_includes/deploy/providers/cargo.md new file mode 100644 index 00000000000..ad8d39797e1 --- /dev/null +++ b/_includes/deploy/providers/cargo.md @@ -0,0 +1,13 @@ +## Known options + +Use the following options to further configure the deployment: + +| `token` | Cargo registry API token — **required**, **secret**, type: string | + +## Environment variables + +All options can be given as environment variables if prefixed with `CARGO_`. + +For example, `token` can be given as `CARGO_TOKEN=`. + +{% include deploy/secrets.md name="token" env_name="CARGO_TOKEN" %} \ No newline at end of file diff --git a/_includes/deploy/providers/chef_supermarket.md b/_includes/deploy/providers/chef_supermarket.md new file mode 100644 index 00000000000..08a9f940770 --- /dev/null +++ b/_includes/deploy/providers/chef_supermarket.md @@ -0,0 +1,10 @@ +## Known options + +Use the following options to further configure the deployment: + +| `user_id` | Chef Supermarket user name — **required**, type: string | +| `name` | Cookbook name — type: string, alias: `cookbook_name` (deprecated, please use `name`), note: defaults to the name given in metadata.json or metadata.rb | +| `category` | Cookbook category in Supermarket — **required**, type: string, alias: `cookbook_category` (deprecated, please use `category`), see: [https://docs.getchef.com/knife_cookbook_site.html#id12](https://docs.getchef.com/knife_cookbook_site.html#id12) | +| `client_key` | Client API key file name — type: string, default: `client.pem` | +| `dir` | Directory containing the cookbook — type: string, default: `.` | + diff --git a/_includes/deploy/providers/cloud66.md b/_includes/deploy/providers/cloud66.md new file mode 100644 index 00000000000..5de21884cd8 --- /dev/null +++ b/_includes/deploy/providers/cloud66.md @@ -0,0 +1,13 @@ +## Known options + +Use the following options to further configure the deployment: + +| `redeployment_hook` | The redeployment hook URL — **required**, **secret**, type: string | + +## Environment variables + +All options can be given as environment variables if prefixed with `CLOUD66_`. + +For example, `redeployment_hook` can be given as `CLOUD66_REDEPLOYMENT_HOOK=`. + +{% include deploy/secrets.md name="redeployment_hook" env_name="CLOUD66_REDEPLOYMENT_HOOK" %} \ No newline at end of file diff --git a/_includes/deploy/providers/cloudfiles.md b/_includes/deploy/providers/cloudfiles.md new file mode 100644 index 00000000000..c91ba64bdcd --- /dev/null +++ b/_includes/deploy/providers/cloudfiles.md @@ -0,0 +1,18 @@ +## Known options + +Use the following options to further configure the deployment: + +| `username` | Rackspace username — **required**, type: string | +| `api_key` | Rackspace API key — **required**, **secret**, type: string | +| `region` | Cloudfiles region — **required**, type: string, known values: `ord`, `dfw`, `syd`, `iad`, `hkg` | +| `container` | Name of the container that files will be uploaded to — **required**, type: string | +| `glob` | Paths to upload — type: string, default: `**/*` | +| `dot_match` | Upload hidden files starting a dot — type: boolean | + +## Environment variables + +All options can be given as environment variables if prefixed with `CLOUDFILES_`. + +For example, `api_key` can be given as `CLOUDFILES_API_KEY=`. + +{% include deploy/secrets.md name="api_key" env_name="CLOUDFILES_API_KEY" %} \ No newline at end of file diff --git a/_includes/deploy/providers/cloudformation.md b/_includes/deploy/providers/cloudformation.md new file mode 100644 index 00000000000..b3d352c6e3b --- /dev/null +++ b/_includes/deploy/providers/cloudformation.md @@ -0,0 +1,28 @@ +## Known options + +Use the following options to further configure the deployment: + +| `access_key_id` | AWS Access Key ID — **required**, **secret**, type: string | +| `secret_access_key` | AWS Secret Key — **required**, **secret**, type: string | +| `region` | AWS Region to deploy to — type: string, default: `us-east-1` | +| `template` | CloudFormation template file — **required**, type: string, note: can be either a local path or an S3 URL | +| `stack_name` | CloudFormation Stack Name. — **required**, type: string | +| `stack_name_prefix` | CloudFormation Stack Name Prefix. — type: string | +| `promote` | Deploy changes — type: boolean, default: `true`, note: otherwise a change set is created | +| `role_arn` | AWS Role ARN — type: string | +| `sts_assume_role` | AWS Role ARN for cross account deployments (assumed by travis using given AWS credentials). — type: string | +| `capabilities` | CloudFormation allowed capabilities — type: string or array of strings, known values: `CAPABILITY_IAM`, `CAPABILITY_NAMED_IAM`, `CAPABILITY_AUTO_EXPAND`, see: [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html) | +| `wait` | Wait for CloutFormation to finish the stack creation and update — type: boolean, default: `true` | +| `wait_timeout` | How many seconds to wait for stack creation and update. — type: integer, default: `3600` | +| `create_timeout` | How many seconds to wait before the stack status becomes CREATE_FAILED — type: integer, default: `3600`, note: valid only when creating a stack | +| `session_token` | AWS Session Access Token if using STS assume role — type: string, note: Not recommended on CI/CD | +| `parameters` | key=value pairs or ENV var names — type: string or array of strings | +| `output_file` | Path to output file to store CloudFormation outputs to — type: string | + +## Environment variables + +All options can be given as environment variables if prefixed with `AWS_` or `CLOUDFORMATION_`. + +For example, `access_key_id` can be given as `AWS_ACCESS_KEY_ID=` or `CLOUDFORMATION_ACCESS_KEY_ID=`. + +{% include deploy/secrets.md name="access_key_id" env_name="AWS_ACCESS_KEY_ID" %} \ No newline at end of file diff --git a/_includes/deploy/providers/cloudfoundry.md b/_includes/deploy/providers/cloudfoundry.md new file mode 100644 index 00000000000..3693a0b3d6c --- /dev/null +++ b/_includes/deploy/providers/cloudfoundry.md @@ -0,0 +1,22 @@ +## Known options + +Use the following options to further configure the deployment: + +| `username` | Cloud Foundry username — **required**, type: string | +| `password` | Cloud Foundry password — **required**, **secret**, type: string | +| `organization` | Cloud Foundry organization — **required**, type: string | +| `space` | Cloud Foundry space — **required**, type: string | +| `api` | Cloud Foundry api URL — **required**, type: string | +| `app_name` | Application name — type: string | +| `buildpack` | Custom buildpack name or Git URL — type: string | +| `manifest` | Path to the manifest — type: string | +| `skip_ssl_validation` | Skip SSL validation — type: boolean | +| `v3` | Use the v3 API version to push the application — type: boolean | + +## Environment variables + +All options can be given as environment variables if prefixed with `CLOUDFOUNDRY_`. + +For example, `password` can be given as `CLOUDFOUNDRY_PASSWORD=`. + +{% include deploy/secrets.md name="password" env_name="CLOUDFOUNDRY_PASSWORD" %} \ No newline at end of file diff --git a/_includes/deploy/providers/codedeploy.md b/_includes/deploy/providers/codedeploy.md new file mode 100644 index 00000000000..2c9a98f16aa --- /dev/null +++ b/_includes/deploy/providers/codedeploy.md @@ -0,0 +1,27 @@ +## Known options + +Use the following options to further configure the deployment: + +| `access_key_id` | AWS access key — **required**, **secret**, type: string | +| `secret_access_key` | AWS secret access key — **required**, **secret**, type: string | +| `application` | CodeDeploy application name — **required**, type: string | +| `deployment_group` | CodeDeploy deployment group name — type: string | +| `revision_type` | CodeDeploy revision type — type: string, known values: `s3`, `github`, downcase: true | +| `commit_id` | Commit ID in case of GitHub — type: string | +| `repository` | Repository name in case of GitHub — type: string | +| `bucket` | S3 bucket in case of S3 — type: string | +| `region` | AWS availability zone — type: string, default: `us-east-1` | +| `file_exists_behavior` | How to handle files that already exist in a deployment target location — type: string, default: `disallow`, known values: `disallow`, `overwrite`, `retain` | +| `wait_until_deployed` | Wait until the deployment has finished — type: boolean | +| `bundle_type` | type: string | +| `endpoint` | type: string | +| `key` | type: string | +| `description` | type: string | + +## Environment variables + +All options can be given as environment variables if prefixed with `AWS_` or `CODEDEPLOY_`. + +For example, `access_key_id` can be given as `AWS_ACCESS_KEY_ID=` or `CODEDEPLOY_ACCESS_KEY_ID=`. + +{% include deploy/secrets.md name="access_key_id" env_name="AWS_ACCESS_KEY_ID" %} \ No newline at end of file diff --git a/_includes/deploy/providers/convox.md b/_includes/deploy/providers/convox.md new file mode 100644 index 00000000000..196e34bbbbe --- /dev/null +++ b/_includes/deploy/providers/convox.md @@ -0,0 +1,17 @@ +## Known options + +Use the following options to further configure the deployment: + +| `host` | type: string, default: `console.convox.com` | +| `app` | **required**, type: string | +| `rack` | **required**, type: string | +| `password` | **required**, type: string | +| `install_url` | type: string, default: `https://convox.com/cli/linux/convox` | +| `update_cli` | type: boolean | +| `create` | type: boolean | +| `promote` | type: boolean, default: `true` | +| `env` | type: string or array of strings | +| `env_file` | type: string | +| `description` | type: string | +| `generation` | type: integer, default: `2` | + diff --git a/_includes/deploy/providers/datica.md b/_includes/deploy/providers/datica.md new file mode 100644 index 00000000000..569d57dcbe2 --- /dev/null +++ b/_includes/deploy/providers/datica.md @@ -0,0 +1,7 @@ +## Known options + +Use the following options to further configure the deployment: + +| `target` | The git remote repository to deploy to — **required**, type: string | +| `path` | Path to files to deploy — type: string, default: `.` | + diff --git a/_includes/deploy/providers/elasticbeanstalk.md b/_includes/deploy/providers/elasticbeanstalk.md new file mode 100644 index 00000000000..c86b7854e8f --- /dev/null +++ b/_includes/deploy/providers/elasticbeanstalk.md @@ -0,0 +1,24 @@ +## Known options + +Use the following options to further configure the deployment: + +| `access_key_id` | AWS Access Key ID — **required**, **secret**, type: string | +| `secret_access_key` | AWS Secret Key — **required**, **secret**, type: string | +| `region` | AWS Region the Elastic Beanstalk app is running in — type: string, default: `us-east-1` | +| `app` | Elastic Beanstalk application name — type: string, default: `repo name` | +| `env` | Elastic Beanstalk environment name which will be updated — **required**, type: string | +| `bucket` | Bucket name to upload app to — **required**, type: string, alias: `bucket_name` | +| `bucket_path` | Location within Bucket to upload app to — type: string | +| `description` | Description for the application version — type: string | +| `label` | Label for the application version — type: string | +| `zip_file` | The zip file that you want to deploy — type: string | +| `only_create_app_version` | Only create the app version, do not actually deploy it — type: boolean | +| `wait_until_deployed` | Wait until the deployment has finished — type: boolean | + +## Environment variables + +All options can be given as environment variables if prefixed with `AWS_` or `ELASTIC_BEANSTALK_`. + +For example, `access_key_id` can be given as `AWS_ACCESS_KEY_ID=` or `ELASTIC_BEANSTALK_ACCESS_KEY_ID=`. + +{% include deploy/secrets.md name="access_key_id" env_name="AWS_ACCESS_KEY_ID" %} \ No newline at end of file diff --git a/_includes/deploy/providers/engineyard.md b/_includes/deploy/providers/engineyard.md new file mode 100644 index 00000000000..cb4ee6d8f5c --- /dev/null +++ b/_includes/deploy/providers/engineyard.md @@ -0,0 +1,19 @@ +## Known options + +Use the following options to further configure the deployment: + +| `api_key` | Engine Yard API key — **secret**, type: string | +| `email` | Engine Yard account email — type: string | +| `password` | Engine Yard password — **secret**, type: string | +| `app` | Engine Yard application name — type: string, default: `repo name` | +| `env` | Engine Yard application environment — type: string, alias: `environment` | +| `migrate` | Engine Yard migration commands — type: string | +| `account` | Engine Yard account name — type: string | + +## Environment variables + +All options can be given as environment variables if prefixed with `ENGINEYARD_` or `EY_`. + +For example, `api_key` can be given as `ENGINEYARD_API_KEY=` or `EY_API_KEY=`. + +{% include deploy/secrets.md name="api_key" env_name="ENGINEYARD_API_KEY" %} \ No newline at end of file diff --git a/_includes/deploy/providers/firebase.md b/_includes/deploy/providers/firebase.md new file mode 100644 index 00000000000..f02a55dcbe9 --- /dev/null +++ b/_includes/deploy/providers/firebase.md @@ -0,0 +1,17 @@ +## Known options + +Use the following options to further configure the deployment: + +| `token` | Firebase CI access token (generate with firebase login:ci) — **required**, **secret**, type: string | +| `project` | Firebase project to deploy to (defaults to the one specified in your firebase.json) — type: string | +| `message` | Message describing this deployment. — type: string | +| `only` | Firebase services to deploy — type: string, note: can be a comma-separated list | +| `force` | Whether or not to delete Cloud Functions missing from the current working directory — type: boolean | + +## Environment variables + +All options can be given as environment variables if prefixed with `FIREBASE_`. + +For example, `token` can be given as `FIREBASE_TOKEN=`. + +{% include deploy/secrets.md name="token" env_name="FIREBASE_TOKEN" %} \ No newline at end of file diff --git a/_includes/deploy/providers/gae.md b/_includes/deploy/providers/gae.md new file mode 100644 index 00000000000..15191b93cc0 --- /dev/null +++ b/_includes/deploy/providers/gae.md @@ -0,0 +1,13 @@ +## Known options + +Use the following options to further configure the deployment: + +| `project` | Project ID used to identify the project on Google Cloud — **required**, type: string | +| `keyfile` | Path to the JSON file containing your Service Account credentials in JSON Web Token format. To be obtained via the Google Developers Console. Should be handled with care as it contains authorization keys. — type: string, default: `service-account.json` | +| `config` | Path to your service configuration file — type: string or array of strings, default: `app.yaml` | +| `version` | The version of the app that will be created or replaced by this deployment. If you do not specify a version, one will be generated for you — type: string | +| `verbosity` | Adjust the log verbosity — type: string, default: `warning` | +| `promote` | Do not promote the deployed version — type: boolean, default: `true` | +| `stop_previous_version` | Prevent the deployment from stopping a previously promoted version — type: boolean, default: `true` | +| `install_sdk` | Do not install the Google Cloud SDK — type: boolean, default: `true` | + diff --git a/_includes/deploy/providers/gcs.md b/_includes/deploy/providers/gcs.md new file mode 100644 index 00000000000..6a965bfeaa7 --- /dev/null +++ b/_includes/deploy/providers/gcs.md @@ -0,0 +1,21 @@ +## Known options + +Use the following options to further configure the deployment: + +| `access_key_id` | GCS Interoperable Access Key ID — **required**, **secret**, type: string | +| `secret_access_key` | GCS Interoperable Access Secret — **required**, **secret**, type: string | +| `bucket` | GCS Bucket — **required**, type: string | +| `local_dir` | Local directory to upload from — type: string, default: `.` | +| `upload_dir` | GCS directory to upload to — type: string | +| `dot_match` | Upload hidden files starting with a dot — type: boolean | +| `acl` | Access control to set for uploaded objects — type: string, default: `private`, known values: `private`, `public-read`, `public-read-write`, `authenticated-read`, `bucket-owner-read`, `bucket-owner-full-control`, see: [https://cloud.google.com/storage/docs/reference-headers#xgoogacl](https://cloud.google.com/storage/docs/reference-headers#xgoogacl) | +| `detect_encoding` | HTTP header Content-Encoding to set for files compressed with gzip and compress utilities. — type: boolean | +| `cache_control` | HTTP header Cache-Control to suggest that the browser cache the file. — type: string, see: [https://cloud.google.com/storage/docs/xml-api/reference-headers#cachecontrol](https://cloud.google.com/storage/docs/xml-api/reference-headers#cachecontrol) | + +## Environment variables + +All options can be given as environment variables if prefixed with `GCS_`. + +For example, `access_key_id` can be given as `GCS_ACCESS_KEY_ID=`. + +{% include deploy/secrets.md name="access_key_id" env_name="GCS_ACCESS_KEY_ID" %} \ No newline at end of file diff --git a/_includes/deploy/providers/gleis.md b/_includes/deploy/providers/gleis.md new file mode 100644 index 00000000000..74b48446954 --- /dev/null +++ b/_includes/deploy/providers/gleis.md @@ -0,0 +1,17 @@ +## Known options + +Use the following options to further configure the deployment: + +| `app` | Gleis application to upload to — type: string, default: `repo name` | +| `username` | Gleis username — **required**, type: string | +| `password` | Gleis password — **required**, **secret**, type: string | +| `key_name` | Name of the SSH deploy key pushed to Gleis — type: string, default: `dpl_deploy_key` | +| `verbose` | type: boolean | + +## Environment variables + +All options can be given as environment variables if prefixed with `GLEIS_`. + +For example, `password` can be given as `GLEIS_PASSWORD=`. + +{% include deploy/secrets.md name="password" env_name="GLEIS_PASSWORD" %} \ No newline at end of file diff --git a/_includes/deploy/providers/hackage.md b/_includes/deploy/providers/hackage.md new file mode 100644 index 00000000000..94adc721397 --- /dev/null +++ b/_includes/deploy/providers/hackage.md @@ -0,0 +1,15 @@ +## Known options + +Use the following options to further configure the deployment: + +| `username` | Hackage username — **required**, type: string | +| `password` | Hackage password — **required**, **secret**, type: string | +| `publish` | Whether or not to publish the package — type: boolean | + +## Environment variables + +All options can be given as environment variables if prefixed with `HACKAGE_`. + +For example, `password` can be given as `HACKAGE_PASSWORD=`. + +{% include deploy/secrets.md name="password" env_name="HACKAGE_PASSWORD" %} \ No newline at end of file diff --git a/_includes/deploy/providers/hephy.md b/_includes/deploy/providers/hephy.md new file mode 100644 index 00000000000..b715d8af16f --- /dev/null +++ b/_includes/deploy/providers/hephy.md @@ -0,0 +1,18 @@ +## Known options + +Use the following options to further configure the deployment: + +| `controller` | Hephy controller — **required**, type: string, e.g.: hephy.hephyapps.com | +| `username` | Hephy username — **required**, type: string | +| `password` | Hephy password — **required**, **secret**, type: string | +| `app` | Deis app — **required**, type: string | +| `cli_version` | Install a specific Hephy CLI version — type: string, default: `stable` | +| `verbose` | Verbose log output — type: boolean | + +## Environment variables + +All options can be given as environment variables if prefixed with `HEPHY_`. + +For example, `password` can be given as `HEPHY_PASSWORD=`. + +{% include deploy/secrets.md name="password" env_name="HEPHY_PASSWORD" %} \ No newline at end of file diff --git a/_includes/deploy/providers/heroku_api.md b/_includes/deploy/providers/heroku_api.md new file mode 100644 index 00000000000..0c80e25c12d --- /dev/null +++ b/_includes/deploy/providers/heroku_api.md @@ -0,0 +1,13 @@ +## Known options + +Use the following options to further configure the deployment: + +| `api_key` | Heroku API key — **required**, **secret**, type: string | + +## Environment variables + +All options can be given as environment variables if prefixed with `HEROKU_`. + +For example, `api_key` can be given as `HEROKU_API_KEY=`. + +{% include deploy/secrets.md name="api_key" env_name="HEROKU_API_KEY" %} \ No newline at end of file diff --git a/_includes/deploy/providers/heroku_git.md b/_includes/deploy/providers/heroku_git.md new file mode 100644 index 00000000000..2c4864027de --- /dev/null +++ b/_includes/deploy/providers/heroku_git.md @@ -0,0 +1,16 @@ +## Known options + +Use the following options to further configure the deployment: + +| `api_key` | Heroku API key — **secret**, type: string | +| `username` | Heroku username — type: string, alias: `user` | +| `password` | Heroku password — **secret**, type: string | +| `git` | Heroku Git remote URL — type: string | + +## Environment variables + +All options can be given as environment variables if prefixed with `HEROKU_`. + +For example, `api_key` can be given as `HEROKU_API_KEY=`. + +{% include deploy/secrets.md name="api_key" env_name="HEROKU_API_KEY" %} \ No newline at end of file diff --git a/_includes/deploy/providers/lambda.md b/_includes/deploy/providers/lambda.md new file mode 100644 index 00000000000..cc5dfb522fd --- /dev/null +++ b/_includes/deploy/providers/lambda.md @@ -0,0 +1,34 @@ +## Known options + +Use the following options to further configure the deployment: + +| `access_key_id` | AWS access key id — **required**, **secret**, type: string | +| `secret_access_key` | AWS secret key — **required**, **secret**, type: string | +| `region` | AWS region the Lambda function is running in — type: string, default: `us-east-1` | +| `function_name` | Name of the Lambda being created or updated — **required**, type: string | +| `role` | ARN of the IAM role to assign to the Lambda function — type: string, note: required for creating a new function | +| `handler_name` | Function the Lambda calls to begin execution. — type: string, note: required for creating a new function | +| `module_name` | Name of the module that exports the handler — type: string, requires: `handler_name`, default: `index` | +| `description` | Description of the Lambda being created or updated — type: string | +| `timeout` | Function execution time (in seconds) at which Lambda should terminate the function — type: string, default: `3` | +| `memory_size` | Amount of memory in MB to allocate to this Lambda — type: string, default: `128` | +| `subnet_ids` | List of subnet IDs to be added to the function — type: string or array of strings, note: Needs the ec2:DescribeSubnets and ec2:DescribeVpcs permission for the user of the access/secret key to work | +| `security_group_ids` | List of security group IDs to be added to the function — type: string or array of strings, note: Needs the ec2:DescribeSecurityGroups and ec2:DescribeVpcs permission for the user of the access/secret key to work | +| `environment` | List of Environment Variables to add to the function — type: string or array of strings, alias: `environment_variables`, format: `/[\w\-]+=.+/`, note: Can be encrypted for added security | +| `runtime` | Lambda runtime to use — type: string, default: `nodejs8.10`, known values: `java8`, `nodejs8.10`, `nodejs10.x`, `python2.7`, `python3.6`, `python3.7`, `dotnetcore2.1`, `go1.x`, `ruby2.5` | +| `dead_letter_arn` | ARN to an SNS or SQS resource used for the dead letter queue. — type: string | +| `kms_key_arn` | KMS key ARN to use to encrypt environment_variables. — type: string | +| `tracing_mode` | Tracing mode — type: string, default: `PassThrough`, known values: `Active`, `PassThrough`, note: Needs xray:PutTraceSegments xray:PutTelemetryRecords on the role | +| `layers` | Function layer arns — type: string or array of strings | +| `function_tags` | List of tags to add to the function — type: string or array of strings, format: `/[\w\-]+=.+/`, note: Can be encrypted for added security | +| `publish` | Create a new version of the code instead of replacing the existing one. — type: boolean | +| `zip` | Path to a packaged Lambda, a directory to package, or a single file to package — type: string, default: `.` | +| `dot_match` | Include hidden .* files to the zipped archive — type: boolean | + +## Environment variables + +All options can be given as environment variables if prefixed with `AWS_` or `LAMBDA_`. + +For example, `access_key_id` can be given as `AWS_ACCESS_KEY_ID=` or `LAMBDA_ACCESS_KEY_ID=`. + +{% include deploy/secrets.md name="access_key_id" env_name="AWS_ACCESS_KEY_ID" %} \ No newline at end of file diff --git a/_includes/deploy/providers/launchpad.md b/_includes/deploy/providers/launchpad.md new file mode 100644 index 00000000000..47f04995597 --- /dev/null +++ b/_includes/deploy/providers/launchpad.md @@ -0,0 +1,15 @@ +## Known options + +Use the following options to further configure the deployment: + +| `oauth_token` | Launchpad OAuth token — **secret**, type: string | +| `oauth_token_secret` | Launchpad OAuth token secret — **secret**, type: string | +| `slug` | Launchpad project slug — type: string, format: `/^~[^\/]+\/[^\/]+\/[^\/]+$/`, e.g.: ~user-name/project-name/branch-name | + +## Environment variables + +All options can be given as environment variables if prefixed with `LAUNCHPAD_`. + +For example, `oauth_token` can be given as `LAUNCHPAD_OAUTH_TOKEN=`. + +{% include deploy/secrets.md name="oauth_token" env_name="LAUNCHPAD_OAUTH_TOKEN" %} \ No newline at end of file diff --git a/_includes/deploy/providers/netlify.md b/_includes/deploy/providers/netlify.md new file mode 100644 index 00000000000..9e07923435c --- /dev/null +++ b/_includes/deploy/providers/netlify.md @@ -0,0 +1,18 @@ +## Known options + +Use the following options to further configure the deployment: + +| `site` | A site ID to deploy to — **required**, type: string | +| `auth` | An auth token to log in with — **required**, **secret**, type: string | +| `dir` | Specify a folder to deploy — type: string | +| `functions` | Specify a functions folder to deploy — type: string | +| `message` | A message to include in the deploy log — type: string | +| `prod` | Deploy to production — type: boolean | + +## Environment variables + +All options can be given as environment variables if prefixed with `NETLIFY_`. + +For example, `auth` can be given as `NETLIFY_AUTH=`. + +{% include deploy/secrets.md name="auth" env_name="NETLIFY_AUTH" %} \ No newline at end of file diff --git a/_includes/deploy/providers/npm.md b/_includes/deploy/providers/npm.md new file mode 100644 index 00000000000..cd86c17ea8b --- /dev/null +++ b/_includes/deploy/providers/npm.md @@ -0,0 +1,19 @@ +## Known options + +Use the following options to further configure the deployment: + +| `email` | npm account email — type: string | +| `api_token` | npm api token — **required**, **secret**, type: string, alias: `api_key`, note: can be retrieved from your local ~/.npmrc file, see: [https://docs.npmjs.com/creating-and-viewing-authentication-tokens](https://docs.npmjs.com/creating-and-viewing-authentication-tokens) | +| `access` | Access level — type: string, known values: `public`, `private` | +| `registry` | npm registry url — type: string | +| `src` | directory or tarball to publish — type: string, default: `.` | +| `tag` | distribution tags to add — type: string | +| `auth_method` | Authentication method — type: boolean, known values: `auth` | + +## Environment variables + +All options can be given as environment variables if prefixed with `NPM_`. + +For example, `api_token` can be given as `NPM_API_TOKEN=`. + +{% include deploy/secrets.md name="api_token" env_name="NPM_API_TOKEN" %} \ No newline at end of file diff --git a/_includes/deploy/providers/openshift.md b/_includes/deploy/providers/openshift.md new file mode 100644 index 00000000000..35069251537 --- /dev/null +++ b/_includes/deploy/providers/openshift.md @@ -0,0 +1,16 @@ +## Known options + +Use the following options to further configure the deployment: + +| `server` | OpenShift server — **required**, type: string | +| `token` | OpenShift token — **required**, **secret**, type: string | +| `project` | OpenShift project — **required**, type: string | +| `app` | OpenShift application — type: string, default: `repo name` | + +## Environment variables + +All options can be given as environment variables if prefixed with `OPENSHIFT_`. + +For example, `token` can be given as `OPENSHIFT_TOKEN=`. + +{% include deploy/secrets.md name="token" env_name="OPENSHIFT_TOKEN" %} \ No newline at end of file diff --git a/_includes/deploy/providers/opsworks.md b/_includes/deploy/providers/opsworks.md new file mode 100644 index 00000000000..5995821e108 --- /dev/null +++ b/_includes/deploy/providers/opsworks.md @@ -0,0 +1,22 @@ +## Known options + +Use the following options to further configure the deployment: + +| `access_key_id` | AWS access key id — **required**, **secret**, type: string | +| `secret_access_key` | AWS secret key — **required**, **secret**, type: string | +| `app_id` | The app id — **required**, type: string | +| `region` | AWS region — type: string, default: `us-east-1` | +| `instance_ids` | An instance id — type: string or array of strings | +| `layer_ids` | A layer id — type: string or array of strings | +| `migrate` | Migrate the database. — type: boolean | +| `wait_until_deployed` | Wait until the app is deployed and return the deployment status. — type: boolean | +| `update_on_success` | When wait-until-deployed and updated-on-success are both not given, application source is updated to the current SHA. Ignored when wait-until-deployed is not given. — type: boolean, alias: `update_app_on_success` | +| `custom_json` | Custom json options override (overwrites default configuration) — type: string | + +## Environment variables + +All options can be given as environment variables if prefixed with `AWS_` or `OPSWORKS_`. + +For example, `access_key_id` can be given as `AWS_ACCESS_KEY_ID=` or `OPSWORKS_ACCESS_KEY_ID=`. + +{% include deploy/secrets.md name="access_key_id" env_name="AWS_ACCESS_KEY_ID" %} \ No newline at end of file diff --git a/_includes/deploy/providers/packagecloud.md b/_includes/deploy/providers/packagecloud.md new file mode 100644 index 00000000000..68de9c61ff6 --- /dev/null +++ b/_includes/deploy/providers/packagecloud.md @@ -0,0 +1,22 @@ +## Known options + +Use the following options to further configure the deployment: + +| `username` | The packagecloud.io username. — **required**, type: string | +| `token` | The packagecloud.io api token. — **required**, **secret**, type: string | +| `repository` | The repository to push to. — **required**, type: string | +| `local_dir` | The sub-directory of the built assets for deployment. — type: string, default: `.` | +| `dist` | Required for debian, rpm, and node.js packages (use "node" for node.js packages). The complete list of supported strings can be found on the packagecloud.io docs. — type: string | +| `force` | Whether package has to be (re)uploaded / deleted before upload — type: boolean | +| `connect_timeout` | type: integer, default: `60` | +| `read_timeout` | type: integer, default: `60` | +| `write_timeout` | type: integer, default: `180` | +| `package_glob` | type: string or array of strings, default: `["**/*"]` | + +## Environment variables + +All options can be given as environment variables if prefixed with `PACKAGECLOUD_`. + +For example, `token` can be given as `PACKAGECLOUD_TOKEN=`. + +{% include deploy/secrets.md name="token" env_name="PACKAGECLOUD_TOKEN" %} \ No newline at end of file diff --git a/_includes/deploy/providers/pages_api.md b/_includes/deploy/providers/pages_api.md new file mode 100644 index 00000000000..3cc6a870368 --- /dev/null +++ b/_includes/deploy/providers/pages_api.md @@ -0,0 +1,14 @@ +## Known options + +Use the following options to further configure the deployment: + +| `repo` | GitHub repo slug — type: string, default: `repo slug` | +| `token` | GitHub oauth token with repo permission — **required**, **secret**, type: string, alias: `github_token` | + +## Environment variables + +All options can be given as environment variables if prefixed with `GITHUB_` or `PAGES_`. + +For example, `token` can be given as `GITHUB_TOKEN=` or `PAGES_TOKEN=`. + +{% include deploy/secrets.md name="token" env_name="GITHUB_TOKEN" %} \ No newline at end of file diff --git a/_includes/deploy/providers/pages_git.md b/_includes/deploy/providers/pages_git.md new file mode 100644 index 00000000000..211c7179453 --- /dev/null +++ b/_includes/deploy/providers/pages_git.md @@ -0,0 +1,28 @@ +## Known options + +Use the following options to further configure the deployment: + +| `repo` | Repo slug — type: string, default: `repo slug` | +| `token` | GitHub oauth token with repo permission — **secret**, type: string, alias: `github_token` | +| `deploy_key` | Path to a file containing a private deploy key with write access to the repository — type: string, see: [https://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys](https://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys) | +| `target_branch` | Branch to push force to — type: string, default: `gh-pages` | +| `keep_history` | Create incremental commit instead of doing push force — type: boolean, default: `true` | +| `commit_message` | type: string, default: `Deploy %{project_name} to %{url}:%{target_branch}` | +| `allow_empty_commit` | Allow an empty commit to be created — type: boolean, requires: `keep_history` | +| `verbose` | Be verbose about the deploy process — type: boolean | +| `local_dir` | Directory to push to GitHub Pages — type: string, default: `.` | +| `fqdn` | Write the given domain name to the CNAME file — type: string | +| `project_name` | Used in the commit message only (defaults to fqdn or the current repo slug) — type: string | +| `name` | Committer name — type: string, note: defaults to the current git commit author name | +| `email` | Committer email — type: string, note: defaults to the current git commit author email | +| `committer_from_gh` | Use the token's owner name and email for the commit — type: boolean, requires: `github_token` | +| `deployment_file` | Enable creation of a deployment-info file — type: boolean | +| `url` | type: string, alias: `github_url`, default: `github.com` | + +## Environment variables + +All options can be given as environment variables if prefixed with `GITHUB_` or `PAGES_`. + +For example, `token` can be given as `GITHUB_TOKEN=` or `PAGES_TOKEN=`. + +{% include deploy/secrets.md name="token" env_name="GITHUB_TOKEN" %} \ No newline at end of file diff --git a/_includes/deploy/providers/puppetforge.md b/_includes/deploy/providers/puppetforge.md new file mode 100644 index 00000000000..aa64d86ce44 --- /dev/null +++ b/_includes/deploy/providers/puppetforge.md @@ -0,0 +1,15 @@ +## Known options + +Use the following options to further configure the deployment: + +| `username` | Puppet Forge user name — **required**, type: string, alias: `user` | +| `password` | Puppet Forge password — **required**, **secret**, type: string | +| `url` | Puppet Forge URL to deploy to — type: string, default: `https://forgeapi.puppetlabs.com/` | + +## Environment variables + +All options can be given as environment variables if prefixed with `PUPPETFORGE_`. + +For example, `password` can be given as `PUPPETFORGE_PASSWORD=`. + +{% include deploy/secrets.md name="password" env_name="PUPPETFORGE_PASSWORD" %} \ No newline at end of file diff --git a/_includes/deploy/providers/pypi.md b/_includes/deploy/providers/pypi.md new file mode 100644 index 00000000000..c133debb34c --- /dev/null +++ b/_includes/deploy/providers/pypi.md @@ -0,0 +1,24 @@ +## Known options + +Use the following options to further configure the deployment: + +| `username` | PyPI Username — **required**, type: string, alias: `user` | +| `password` | PyPI Password — **required**, **secret**, type: string | +| `server` | Release to a different index — type: string, default: `https://upload.pypi.org/legacy/` | +| `distributions` | Space-separated list of distributions to be uploaded to PyPI — type: string, default: `sdist` | +| `docs_dir` | Path to the directory to upload documentation from — type: string, default: `build/docs` | +| `skip_existing` | Do not overwrite an existing file with the same name on the server. — type: boolean | +| `upload_docs` | Upload documentation — type: boolean, default: `false`, note: most PyPI servers, including upload.pypi.org, do not support uploading documentation | +| `twine_check` | Whether to run twine check — type: boolean, default: `true` | +| `remove_build_dir` | Remove the build dir after the upload — type: boolean, default: `true` | +| `setuptools_version` | type: string, format: `/\A\d+(?:\.\d+)*\z/` | +| `twine_version` | type: string, format: `/\A\d+(?:\.\d+)*\z/` | +| `wheel_version` | type: string, format: `/\A\d+(?:\.\d+)*\z/` | + +## Environment variables + +All options can be given as environment variables if prefixed with `PYPI_`. + +For example, `password` can be given as `PYPI_PASSWORD=`. + +{% include deploy/secrets.md name="password" env_name="PYPI_PASSWORD" %} \ No newline at end of file diff --git a/_includes/deploy/providers/releases.md b/_includes/deploy/providers/releases.md new file mode 100644 index 00000000000..c2193d4acbb --- /dev/null +++ b/_includes/deploy/providers/releases.md @@ -0,0 +1,27 @@ +## Known options + +Use the following options to further configure the deployment: + +| `token` | GitHub oauth token (needs public_repo or repo permission) — **secret**, type: string, alias: `api_key` | +| `username` | GitHub login name — type: string, alias: `user` | +| `password` | GitHub password — **secret**, type: string | +| `repo` | GitHub repo slug — type: string, default: `repo slug` | +| `file` | File or glob to release to GitHub — type: string or array of strings, default: `*` | +| `file_glob` | Interpret files as globs — type: boolean, default: `true` | +| `overwrite` | Overwrite files with the same name — type: boolean | +| `prerelease` | Identify the release as a prerelease — type: boolean | +| `release_number` | Release number (overide automatic release detection) — type: string | +| `release_notes` | Content for the release notes — type: string, alias: `body` | +| `release_notes_file` | Path to a file containing the release notes — type: string, note: will be ignored if --release_notes is given | +| `draft` | Identify the release as a draft — type: boolean | +| `tag_name` | Git tag from which to create the release — type: string | +| `target_commitish` | Commitish value that determines where the Git tag is created from — type: string | +| `name` | Name for the release — type: string | + +## Environment variables + +All options can be given as environment variables if prefixed with `GITHUB_` or `RELEASES_`. + +For example, `token` can be given as `GITHUB_TOKEN=` or `RELEASES_TOKEN=`. + +{% include deploy/secrets.md name="token" env_name="GITHUB_TOKEN" %} \ No newline at end of file diff --git a/_includes/deploy/providers/rubygems.md b/_includes/deploy/providers/rubygems.md new file mode 100644 index 00000000000..3a61fd08822 --- /dev/null +++ b/_includes/deploy/providers/rubygems.md @@ -0,0 +1,19 @@ +## Known options + +Use the following options to further configure the deployment: + +| `api_key` | Rubygems api key — **secret**, type: string | +| `username` | Rubygems user name — type: string, alias: `user` | +| `password` | Rubygems password — **secret**, type: string | +| `gem` | Name of the gem to release — type: string, default: `repo name` | +| `gemspec` | Gemspec file to use to build the gem — type: string | +| `gemspec_glob` | Glob pattern to search for gemspec files when multiple gems are generated in the repository (overrides the gemspec option) — type: string | +| `host` | type: string | + +## Environment variables + +All options can be given as environment variables if prefixed with `RUBYGEMS_`. + +For example, `api_key` can be given as `RUBYGEMS_API_KEY=`. + +{% include deploy/secrets.md name="api_key" env_name="RUBYGEMS_API_KEY" %} \ No newline at end of file diff --git a/_includes/deploy/providers/s3.md b/_includes/deploy/providers/s3.md new file mode 100644 index 00000000000..320cb00acff --- /dev/null +++ b/_includes/deploy/providers/s3.md @@ -0,0 +1,32 @@ +## Known options + +Use the following options to further configure the deployment: + +| `access_key_id` | AWS access key id — **required**, **secret**, type: string | +| `secret_access_key` | AWS secret key — **required**, **secret**, type: string | +| `bucket` | S3 bucket — **required**, type: string | +| `region` | S3 region — type: string, default: `us-east-1` | +| `endpoint` | S3 endpoint — type: string | +| `upload_dir` | S3 directory to upload to — type: string | +| `local_dir` | Local directory to upload from — type: string, default: `.`, e.g.: ~/travis/build (absolute path) or ./build (relative path) | +| `dot_match` | Upload hidden files starting with a dot — type: boolean | +| `acl` | Access control for the uploaded objects — type: string, default: `private`, known values: `private`, `public_read`, `public_read_write`, `authenticated_read`, `bucket_owner_read`, `bucket_owner_full_control` | +| `detect_encoding` | HTTP header Content-Encoding for files compressed with gzip and compress utilities — type: boolean | +| `cache_control` | HTTP header Cache-Control to suggest that the browser cache the file — type: string or array of strings, default: `no-cache`, known values: `/^no-cache.*/`, `/^no-store.*/`, `/^max-age=\d+.*/`, `/^s-maxage=\d+.*/`, `/^no-transform/`, `/^public/`, `/^private/`, note: accepts mapping values to globs | +| `expires` | Date and time that the cached object expires — type: string or array of strings, format: `/^"?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} .+"?.*$/`, note: accepts mapping values to globs | +| `default_text_charset` | Default character set to append to the content-type of text files — type: string | +| `storage_class` | S3 storage class to upload as — type: string, default: `STANDARD`, known values: `STANDARD`, `STANDARD_IA`, `REDUCED_REDUNDANCY` | +| `server_side_encryption` | Use S3 Server Side Encryption (SSE-AES256) — type: boolean | +| `index_document_suffix` | Index document suffix of a S3 website — type: string | +| `overwrite` | Whether or not to overwrite existing files — type: boolean, default: `true` | +| `force_path_style` | Whether to force keeping the bucket name on the path — type: boolean | +| `max_threads` | The number of threads to use for S3 file uploads — type: integer, default: `5`, max: 15 | +| `verbose` | Be verbose about uploading files — type: boolean | + +## Environment variables + +All options can be given as environment variables if prefixed with `AWS_` or `S3_`. + +For example, `access_key_id` can be given as `AWS_ACCESS_KEY_ID=` or `S3_ACCESS_KEY_ID=`. + +{% include deploy/secrets.md name="access_key_id" env_name="AWS_ACCESS_KEY_ID" %} \ No newline at end of file diff --git a/_includes/deploy/providers/scalingo.md b/_includes/deploy/providers/scalingo.md new file mode 100644 index 00000000000..fe1025dc643 --- /dev/null +++ b/_includes/deploy/providers/scalingo.md @@ -0,0 +1,20 @@ +## Known options + +Use the following options to further configure the deployment: + +| `app` | type: string, default: `repo name` | +| `api_token` | Scalingo API token — type: string, alias: `api_key` (deprecated, please use `api_token`) | +| `username` | Scalingo username — type: string | +| `password` | Scalingo password — **secret**, type: string | +| `region` | Scalingo region — type: string, default: `agora-fr1`, known values: `agora-fr1`, `osc-fr1` | +| `remote` | Git remote name — type: string, default: `scalingo-dpl` | +| `branch` | Git branch — type: string, default: `master` | +| `timeout` | Timeout for Scalingo CLI commands — type: integer, default: `60` | + +## Environment variables + +All options can be given as environment variables if prefixed with `SCALINGO_`. + +For example, `password` can be given as `SCALINGO_PASSWORD=`. + +{% include deploy/secrets.md name="password" env_name="SCALINGO_PASSWORD" %} \ No newline at end of file diff --git a/_includes/deploy/providers/script.md b/_includes/deploy/providers/script.md new file mode 100644 index 00000000000..d0a0ae477a2 --- /dev/null +++ b/_includes/deploy/providers/script.md @@ -0,0 +1,6 @@ +## Known options + +Use the following options to further configure the deployment: + +| `script` | The script to execute — **required**, type: string | + diff --git a/_includes/deploy/providers/snap.md b/_includes/deploy/providers/snap.md new file mode 100644 index 00000000000..606831d7c5d --- /dev/null +++ b/_includes/deploy/providers/snap.md @@ -0,0 +1,15 @@ +## Known options + +Use the following options to further configure the deployment: + +| `token` | Snap API token — **required**, **secret**, type: string | +| `snap` | Path to the snap to be pushed (can be a glob) — type: string, default: `**/*.snap` | +| `channel` | Channel into which the snap will be released — type: string, default: `edge` | + +## Environment variables + +All options can be given as environment variables if prefixed with `SNAP_`. + +For example, `token` can be given as `SNAP_TOKEN=`. + +{% include deploy/secrets.md name="token" env_name="SNAP_TOKEN" %} \ No newline at end of file diff --git a/_includes/deploy/providers/surge.md b/_includes/deploy/providers/surge.md new file mode 100644 index 00000000000..cc5122853d9 --- /dev/null +++ b/_includes/deploy/providers/surge.md @@ -0,0 +1,16 @@ +## Known options + +Use the following options to further configure the deployment: + +| `login` | Surge login (the email address you use with Surge) — **required**, type: string | +| `token` | Surge login token (can be retrieved with `surge token`) — **required**, **secret**, type: string | +| `domain` | Domain to publish to. Not required if the domain is set in the CNAME file in the project folder. — type: string | +| `project` | Path to project directory relative to repo root — type: string, default: `.` | + +## Environment variables + +All options can be given as environment variables if prefixed with `SURGE_`. + +For example, `token` can be given as `SURGE_TOKEN=`. + +{% include deploy/secrets.md name="token" env_name="SURGE_TOKEN" %} \ No newline at end of file diff --git a/_includes/deploy/providers/testfairy.md b/_includes/deploy/providers/testfairy.md new file mode 100644 index 00000000000..41df0933964 --- /dev/null +++ b/_includes/deploy/providers/testfairy.md @@ -0,0 +1,19 @@ +## Known options + +Use the following options to further configure the deployment: + +| `api_key` | TestFairy API key — **required**, **secret**, type: string | +| `app_file` | Path to the app file that will be generated after the build (APK/IPA) — **required**, type: string | +| `symbols_file` | Path to the symbols file — type: string | +| `testers_groups` | Tester groups to be notified about this build — type: string, e.g.: e.g. group1,group1 | +| `notify` | Send an email with a changelog to your users — type: boolean | +| `auto_update` | Automaticall upgrade all the previous installations of this app this version — type: boolean | +| `advanced_options` | Comma_separated list of advanced options — type: string, e.g.: option1,option2 | + +## Environment variables + +All options can be given as environment variables if prefixed with `TESTFAIRY_`. + +For example, `api_key` can be given as `TESTFAIRY_API_KEY=`. + +{% include deploy/secrets.md name="api_key" env_name="TESTFAIRY_API_KEY" %} \ No newline at end of file diff --git a/_includes/deploy/providers/transifex.md b/_includes/deploy/providers/transifex.md new file mode 100644 index 00000000000..b29945b1f8f --- /dev/null +++ b/_includes/deploy/providers/transifex.md @@ -0,0 +1,17 @@ +## Known options + +Use the following options to further configure the deployment: + +| `api_token` | Transifex API token — **secret**, type: string | +| `username` | Transifex username — type: string | +| `password` | Transifex password — **secret**, type: string | +| `hostname` | Transifex hostname — type: string, default: `www.transifex.com` | +| `cli_version` | CLI version to install — type: string, default: `>=0.11` | + +## Environment variables + +All options can be given as environment variables if prefixed with `TRANSIFEX_`. + +For example, `api_token` can be given as `TRANSIFEX_API_TOKEN=`. + +{% include deploy/secrets.md name="api_token" env_name="TRANSIFEX_API_TOKEN" %} \ No newline at end of file diff --git a/_includes/deploy/secrets.md b/_includes/deploy/secrets.md new file mode 100644 index 00000000000..8cafda9467f --- /dev/null +++ b/_includes/deploy/secrets.md @@ -0,0 +1,28 @@ +{% unless page.provider == 'script' %} +## Securing secrets + +Secret option values should be given as either encrypted strings in your build +configuration (`.travis.yml` file) or environment variables in your repository +settings. + +Environment variables can be set on the settings page of your repository, or +using `travis env set`: + +```bash +travis env set {{include.env_name}} <{{include.name}}> +``` + +In order to encrypt option values when adding them to your `.travis.yml` file +use `travis encrypt`: + +```bash +travis encrypt <{{include.name}}> +``` + +Or use `--add` to directly add it to your `.travis.yml` file. Note that this command has to be run in your repository's root directory: + +```bash +travis encrypt --add deploy.{{include.name}} <{{include.name}}> +``` + +{% endunless %} diff --git a/assets/stylesheets/_base.sass b/assets/stylesheets/_base.sass index 126a78ebb0d..f2cca859947 100644 --- a/assets/stylesheets/_base.sass +++ b/assets/stylesheets/_base.sass @@ -77,7 +77,8 @@ table width: 100% td, th - padding: 0.8em 0.6em 0.5em + padding: 0.8em 1.2em 0.8em 0 + vertical-align: top tr border-bottom: 1px solid $cream-dark diff --git a/assets/stylesheets/_layout.sass b/assets/stylesheets/_layout.sass index e70c48a6278..848b7229e83 100644 --- a/assets/stylesheets/_layout.sass +++ b/assets/stylesheets/_layout.sass @@ -33,7 +33,7 @@ [data-file] position: relative - padding-top: 1.9em + // padding-top: 1.9em &:before content: attr(data-file) display: inline-block diff --git a/lib/dpl/docs.rb b/lib/dpl/docs.rb new file mode 100644 index 00000000000..3d435d389e4 --- /dev/null +++ b/lib/dpl/docs.rb @@ -0,0 +1,201 @@ +require 'dpl' + +module Dpl + module Docs + extend self + + SKIP = [Cl::Help] + + def write + providers.each do |cmd| + # next unless cmd.registry_key == :s3 + Provider.new(cmd).write + end + end + + def providers + consts = Dpl::Provider.registry.values + consts = consts.uniq.sort_by(&:name) + consts - SKIP + end + + class Provider < Struct.new(:cmd) + def write + puts "writing #{path} ..." + File.write(path, content) + end + + def path + "_includes/deploy/providers/#{cmd.registry_key.to_s.gsub(':', '_')}.md" + end + + def content + parts = [opts.to_s] + parts << env.to_s + parts << secrets if secrets? + parts.join("\n") + end + + def opts + Opts.new(cmd) + end + + def env + @env ||= Env.new(cmd) + end + + def secrets + %({% include deploy/secrets.md name="#{env.opt.name}" env_name="#{env.example_name}" %}) + end + + def secrets? + !!env.opt + end + end + + class Opts < Struct.new(:cmd) + STR = <<~str + ## Known options + + Use the following options to further configure the deployment: + + %s + str + + def to_s + opts = cmd.opts + opts = opts.reject(&:internal?) + opts = opts - cmd.superclass.opts.to_a + opts = opts.map { |opt| "| #{format_opt(opt)} |" } + STR % opts.join("\n") + end + + def format_opt(opt) + ["`#{opt.name}`", Obj.new(opt).format].join(' | ') + end + end + + class Env < Struct.new(:cmd) + STR = <<~str + ## Environment variables + + All options can be given as environment variables if prefixed with %s. + + For example, `%s` can be given as %s. + str + + def opt + @opt ||= cmd.opts.detect { |opt| opt.secret? } + end + + def to_s + opt ? STR % [pattern, opt.name, example] : nil + end + + def pattern + strs = env.strs.map { |str| "#{str}_" } + strs += env.strs if env.opts[:allow_skip_underscore] + strs = strs.map { |str| "`#{str}`" } + sentence(strs) + end + + def example + strs = env.strs.map { |str| format(opt, str, '_') } + strs += env.strs.map { |str| format(opt, str) } if env.opts[:allow_skip_underscore] + sentence(strs) + end + + def example_name + [env.strs.first, opt.name.upcase].join('_') + end + + def format(opt, str, sep = nil) + "`#{str}#{sep}#{opt.name.upcase}=<#{opt.name}>`" + end + + def sentence(strs) + return strs.join if strs.size == 1 + [strs[0..-2].join(', '), strs[-1]].join(' or ') + end + + def env # TODO + cmd.instance_variable_get(:@env) || cmd.superclass.instance_variable_get(:@env) + end + end + + class Obj < Struct.new(:obj) + def format + opts = [] + opts << '**required**' if obj.required? + opts << '**secret**' if obj.secret? + opts << "type: #{type(obj)}" + opts += Opt.new(obj).format if obj.is_a?(Cl::Opt) + opts = opts.join(', ') + opts = "— #{opts}" if obj.description && !opts.empty? + opts = [obj.description, opts] + opts.compact.map(&:strip).join(' ') + end + + def type(obj) + case obj.type + when :flag + :boolean + when :array + 'string or array of strings' + else + obj.type + end + end + end + + class Opt < Struct.new(:opt) + def format + opts = [] + opts << "alias: #{format_aliases(opt)}" if opt.aliases? + opts << "requires: `#{opt.requires.join(', ')}`" if opt.requires? + opts << "default: `#{format_default(opt)}`" if opt.default? + opts << "known values: #{format_enum(opt)}" if opt.enum? + opts << "format: `#{opt.format}`" if opt.format? + opts << "downcase: true" if opt.downcase? + opts << "upcase: true" if opt.upcase? + opts << "min: #{opt.min}" if opt.min? + opts << "max: #{opt.max}" if opt.max? + opts << "e.g.: #{opt.example}" if opt.example? + opts << "note: #{opt.note}" if opt.note? + opts << "see: #{format_see(opt.see)}" if opt.see? + opts << format_deprecated(opt) if opt.deprecated? + opts.compact + end + + def format_aliases(opt) + opt.aliases.map do |name| + strs = ["`#{name}`"] + strs << "(deprecated, please use `#{opt.name}`)" if opt.deprecated[0] == name + strs.join(' ') + end.join(', ') + end + + def format_enum(opt) + opt.enum.map { |value| "`#{format_regex(value)}`" }.join(', ') + end + + def format_default(opt) + opt.default.is_a?(Symbol) ? opt.default.to_s.sub('_', ' ') : opt.default + end + + def format_deprecated(opt) + return "deprecated (#{opt.deprecated[1]})" if opt.deprecated[0] == opt.name + end + + def format_regex(str) + return str unless str.is_a?(Regexp) + "/#{str.to_s.sub('(?-mix:', '').sub(/\)$/, '')}/" + end + + def format_see(see) + see = "[#{see}](#{see})" if see.start_with?('http') + see + end + end + end +end diff --git a/user/build-stages.md b/user/build-stages.md index 3eacb884cb3..d73df2aada2 100644 --- a/user/build-stages.md +++ b/user/build-stages.md @@ -189,7 +189,7 @@ jobs: script: skip # usually you do not want to rerun any tests deploy: &heroku provider: heroku - # ... + # ⋮ ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/anynines.md b/user/deployment-v2/anynines.md index 6a505774a0e..523b6085be2 100644 --- a/user/deployment-v2/anynines.md +++ b/user/deployment-v2/anynines.md @@ -2,41 +2,24 @@ title: anynines Deployment layout: en deploy: v2 - +provider: anynines --- -You now have the amazing ability to deploy directly to [anynines](http://www.anynines.com/) after a successful build on Travis CI - -## The Easy Way - -Go Grab the Travis gem from [GitHub](https://github.com/travis-ci/travis.rb) and run this command: - -`travis setup anynines` - -You will be asked to answer a few simple questions about your anynines setup and Travis will take care of the rest! +You can deploy your application to [anynines](http://www.anynines.com/) after a successful build on Travis CI. -## The Slightly Harder Way - -So you want to write your own `.travis.yml`, fine. Here is the minimum required to get up and running +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: anynines - username: johndoe@example.com - password: secretpassword - organization: myorganization - space: staging - app_name: My app name # (optional) + username: + password: + organization: + space: ``` {: data-file=".travis.yml"} -***Make sure that you encrypt your password before pushing your updated .travis.yml to GitHub.*** - -This can be easily accomplished using the Travis gem above and running: - -``` -travis encrypt --add deploy.password -``` +{% include deploy/providers/anynines.md %} {% include deploy/shared.md %} diff --git a/user/deployment-v2/azure-web-apps.md b/user/deployment-v2/azure-web-apps.md index 1c698a0af7c..bf255c2ae33 100644 --- a/user/deployment-v2/azure-web-apps.md +++ b/user/deployment-v2/azure-web-apps.md @@ -5,32 +5,30 @@ deploy: v2 provider: azure_web_apps --- -Travis CI can automatically deploy your [Azure Web App](https://azure.microsoft.com/en-us/services/app-service/web/) after a successful build. +Travis CI can automatically deploy your [Azure Web App](https://azure.microsoft.com/en-us/services/app-service/web/) +after a successful build. -For a minimal configuration, all you need to do is enable [Local Git Deployment](https://azure.microsoft.com/en-us/documentation/articles/app-service-deploy-local-git/) and add the following to your `.travis.yml`: +For a minimal configuration, all you need to do is enable [Local Git Deployment](https://azure.microsoft.com/en-us/documentation/articles/app-service-deploy-local-git/) +and add the following to your `.travis.yml`: ```yaml deploy: provider: azure_web_apps - username: azure_deployment_user # If AZURE_WA_USERNAME isn't set - password: azure_deployment_password # If AZURE_WA_PASSWORD isn't set - site: azure_deployment_sitename # If AZURE_WA_SITE isn't set - slot: azure_deployment_slotname # (optional) If AZURE_WA_SLOT isn't set + username: + password: + site: ``` {: data-file=".travis.yml"} -It is not recommended that you put your Azure Deployment credentials unencrypted into your `.travis.yml`. Instead, use hidden environment variables or encrypted variables. +{% include deploy/providers/azure_web_apps.md %} -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. As an alternative to the web interface, you can also use the CLI's [`env`](https://github.com/travis-ci/travis.rb#env) command. +## Fetching Deployment Progress and Logs -
        - Travis CI Settings -
        Environment Variables in the Repository Settings
        -
        +The Azure Web App provider can print Azure's deployment progress to your Travis +log using the `verbose` option. -### Fetch Deployment Progress and Logs - -The Azure Web App provider can print Azure's deployment progress to your Travis log using the `verbose` option. However, Git will print your password if the authentication fails (it will not if you provide a correct user/password combination). +However, Git will print your password if the authentication fails (it will not +if you provide a correct user/password combination). ```yaml deploy: @@ -39,26 +37,31 @@ deploy: ``` {: data-file=".travis.yml"} -### Note on `.gitignore` +## Note on .gitignore -As this deployment strategy relies on `git`, be mindful that the deployment will +As this deployment strategy relies on Git, be mindful that the deployment will honor `.gitignore`. If your `.gitignore` file matches something that your build creates, use [`before_deploy`](#running-commands-before-and-after-deploy) to change its content. -### Deploying to slots +## Deploying to slots -You might need to deploy multiple branches to different slots. You can set multiple providers to deploy to specific slots. The following configuration would deploy the `master` branch to the `myapp-staging` slot and the `develop` branch to the `myapp-develop` slot. In order to use slots you'll need to [set up staging environments for web apps in Azure App Service](https://azure.microsoft.com/en-us/documentation/articles/web-sites-staged-publishing/). +You might need to deploy multiple branches to different slots. You can set +multiple providers to deploy to specific slots. The following configuration +would deploy the `master` branch to the `myapp-staging` slot and the `develop` +branch to the `myapp-develop` slot. In order to use slots you'll need to [set +up staging environments for web apps in Azure App +Service](https://azure.microsoft.com/en-us/documentation/articles/web-sites-staged-publishing/). ```yaml deploy: - provider: azure_web_apps slot: myapp-staging - provider: azure_web_apps - slot: myapp-develop - on: develop + slot: myapp-dev + on: dev ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/bintray.md b/user/deployment-v2/bintray.md index 4925b686f50..6fe81402daf 100644 --- a/user/deployment-v2/bintray.md +++ b/user/deployment-v2/bintray.md @@ -5,81 +5,76 @@ deploy: v2 provider: bintray --- -Travis CI can automatically deploy your build artifacts to [Bintray](https://bintray.com/). +Travis CI can automatically upload build artifacts to [Bintray](https://bintray.com/) +after a successful build. -Here is an example `.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: bintray - file: "Path to a descriptor file, containing information for the Bintray upload" - user: "Bintray user" - key: "Bintray API key" - passphrase: "Optional. In case a passphrase is configured on Bintray and GPG signing is used" - skip_cleanup: true # to upload artifacts created during the build + file: + user: + key: ``` {: data-file=".travis.yml"} -### Encrypt your API key +{% include deploy/providers/bintray.md %} -It is recommended that you encrypt your api key. You can encrypt this key using the `travis` command line client and this command: - -```bash -$ travis encrypt --add deploy.key -``` - -Example: - -```bash -$ travis encrypt ab012cd345678901234e456fa7bc89def01a23b4 --add deploy.key -``` - -### Descriptor file example +## Descriptor file The descriptor is in JSON file format in three sections: ```js { - "package": { - "name": "auto-upload", - "repo": "myRepo", - "subject": "myBintrayUser", - "desc": "I was pushed completely automatically", - "website_url": "www.jfrog.com", - "issue_tracker_url": "https://github.com/bintray/bintray-client-java/issues", - "vcs_url": "https://github.com/bintray/bintray-client-java.git", - "github_use_tag_release_notes": true, - "github_release_notes_file": "RELEASE.txt", - "licenses": ["MIT"], - "labels": ["cool", "awesome", "gorilla"], - "public_download_numbers": false, - "public_stats": false, - "attributes": [{"name": "att1", "values" : ["val1"], "type": "string"}, - {"name": "att2", "values" : [1, 2.2, 4], "type": "number"}, - {"name": "att5", "values" : ["2014-12-28T19:43:37+0100"], "type": "date"}] - }, - - "version": { - "name": "0.5", - "desc": "This is a version", - "released": "2015-01-04", - "vcs_tag": "0.5", - "attributes": [{"name": "VerAtt1", "values" : ["VerVal1"], "type": "string"}, - {"name": "VerAtt2", "values" : [1, 3.3, 5], "type": "number"}, - {"name": "VerAtt3", "values" : ["2015-01-01T19:43:37+0100"], "type": "date"}], - "gpgSign": false + "package": { + "name": "auto-upload", + "repo": "myRepo", + "subject": "myBintrayUser", + "desc": "I was pushed completely automatically", + "website_url": "www.jfrog.com", + "issue_tracker_url": "https://github.com/bintray/bintray-client-java/issues", + "vcs_url": "https://github.com/bintray/bintray-client-java.git", + "github_use_tag_release_notes": true, + "github_release_notes_file": "RELEASE.txt", + "licenses": ["MIT"], + "labels": ["cool", "awesome", "gorilla"], + "public_download_numbers": false, + "public_stats": false, + "attributes": [ + { "name": "att1", "values" : ["val1"], "type": "string" }, + { "name": "att2", "values" : [1, 2.2, 4], "type": "number" }, + { "name": "att5", "values" : ["2014-12-28T19:43:37+0100"], "type": "date" } + ] + }, + "version": { + "name": "0.5", + "desc": "This is a version", + "released": "2015-01-04", + "vcs_tag": "0.5", + "attributes": [ + { "name": "VerAtt1", "values" : ["VerVal1"], "type": "string" }, + { "name": "VerAtt2", "values" : [1, 3.3, 5], "type": "number" }, + { "name": "VerAtt3", "values" : ["2015-01-01T19:43:37+0100"], "type": "date" } + ], + "gpgSign": false + }, + "files": [ + { + "includePattern": "build/bin(.*)*/(.*\\.gem)", + "excludePattern": ".*/do-not-deploy/.*", + "uploadPattern": "gems/$2" }, - - "files": - [ - {"includePattern": "build/bin(.*)*/(.*\\.gem)", "excludePattern": ".*/do-not-deploy/.*", "uploadPattern": "gems/$2"}, - {"includePattern": "build/docs/(.*)", "uploadPattern": "docs/$1"} - ], - "publish": true + { + "includePattern": "build/docs/(.*)", + "uploadPattern": "docs/$1" + } + ], + "publish": true } ``` -#### Package Section +### Package Section Bintray package information. The following information is mandatory on open source projects: @@ -89,54 +84,75 @@ Bintray package information. The following information is mandatory on open sour - `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/#_licenses){: data-proofer-ignore=""}, which is a list with at least one item. -#### Version Section +### Version Section Package version information. In case the version already exists on Bintray, only the name field is mandatory. -#### Files Section +### Files Section 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. 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. +* `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, indicate a 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. In the example above, the following files are uploaded: -- All gem files located under `build/bin/` (including sub directories), except for files under a `do-not-deploy` directory. The files will be uploaded to Bintray under the `gems` folder. -- All files under `build/docs`. The files will be uploaded to Bintray under the `docs` folder. +* All gem files located under `build/bin/` (including sub directories), except + for files under a `do-not-deploy` directory. The files will be uploaded to + Bintray under the `gems` folder. +* All files under `build/docs`. The files will be uploaded to Bintray under the + `docs` folder. -**Note:** Regular expressions defined as part of the `includePattern` and `excludePattern` properties must be wrapped with brackets. +**Note:** Regular expressions defined as part of the `includePattern` and +`excludePattern` properties must be wrapped with brackets. -#### Debian Upload +### Debian Upload -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: +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": "pool/main/m/mypackage/$1", +"files": [ + { + "includePattern": "build/bin/(.*\.deb)", + "uploadPattern": "pool/main/m/mypackage/$1", "matrixParams": { - "deb_distribution": "vivid", - "deb_component": "main", - "deb_architecture": "amd64"} + "deb_distribution": "vivid", + "deb_component": "main", + "deb_architecture": "amd64" } + } ] ``` -#### Overwriting Existing Files +### Overwriting Existing Files -If an artifact by a given name already exists in the Bintray repository, then by default it is not overwritten. If you want to replace the existing file, define the `override` key in your matrix properties: +If an artifact by a given name already exists in the Bintray repository, then +by default it is not overwritten. If you want to replace the existing file, +define the `override` key in your matrix properties: ```js -"files": - [{"includePattern": "build/bin/(myfile.bin)", "uploadPattern": "$1", +"files": [ + { + "includePattern": "build/bin/(myfile.bin)", + "uploadPattern": "$1", "matrixParams": { - "override": 1 } + "override": 1 } + } ] ``` diff --git a/user/deployment-v2/bitballoon.md b/user/deployment-v2/bitballoon.md deleted file mode 100644 index bdceda53ace..00000000000 --- a/user/deployment-v2/bitballoon.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: BitBalloon Deployment -layout: en -deploy: v2 -provider: bitballoon ---- - -Travis CI can automatically deploy files to [BitBalloon](https://www.bitballoon.com/) after a successful build. - -To deploy the current directory to BitBalloon, add your encrypted BitBalloon `site-id` and `access-token` to your `.travis.yml`: - -```yaml -deploy: - provider: bitballoon - site-id: - secure: "YOUR ENCRYPTED SITE ID" - access-token: - secure: "YOUR ENCRYPTED ACCESS TOKEN" -``` -{: data-file=".travis.yml"} - -## Deploying a specific directory - -To deploy a specific directory to BitBalloon, use the `local-dir` key: - -```yaml -deploy: - provider: bitballoon - site-id: - secure: "YOUR ENCRYPTED SITE ID" - access-token: - secure: "YOUR ENCRYPTED ACCESS TOKEN" - local-dir: "_build/" -``` -{: data-file=".travis.yml"} - -{% include deploy/shared.md %} diff --git a/user/deployment-v2/bluemixcloudfoundry.md b/user/deployment-v2/bluemixcloudfoundry.md index c06b5a36050..b2dbc87174f 100644 --- a/user/deployment-v2/bluemixcloudfoundry.md +++ b/user/deployment-v2/bluemixcloudfoundry.md @@ -5,45 +5,21 @@ deploy: v2 provider: bluemixcloudfoundry --- -You now have the ability to deploy directly to [IBM Bluemix](http://bluemix.net/) after a successful build on Travis CI. +Travis CI can automatically deploy files to [IBM Bluemix](http://bluemix.net/) +after a successful build. -## The Easy Way - -Go grab [the Travis gem from GitHub](https://github.com/travis-ci/travis.rb) and run this command: - -```bash -travis setup bluemixcloudfoundry -``` - -You will need the following information about your Bluemix environment: username, password, organization, space, and region. Available Bluemix regions are US South (ng) London (eu-gb), and Sydney (au-syd). Travis offers to encrypt your password, and will take care of the rest. Learn more about [managing organizations and spaces](http://bluemix.net/docs/admin/orgs_spaces.html). - -## The Slightly Harder Way - -You can also directly edit your `.travis.yml`. Insert the following to get up and running: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: - edge: true provider: bluemixcloudfoundry - username: brian_knobbs@example.com - password: somewhatsecretpassword - organization: myawesomeorganization - space: staging - manifest: manifest-prod.yml # (optional) Defaults to manifest.yml. - app_name: My app name # (optional) - region: eu-gb # (optional) [ng, eu-gb , au-syd] Defaults to US South region (ng). - api: https://api.ng.bluemix.net # (optional) Overrides region setting if specified for Bluemix local installations. + username: + password: + organization: + space: ``` {: data-file=".travis.yml"} -***Make sure that you encrypt your password before pushing your updated .travis.yml to GitHub.*** - -You can do this using the Travis gem by running: - -```bash -travis encrypt --add deploy.password -``` - -If your password includes symbols (such as braces, parentheses, backslashes, and pipe symbols), [you must escape those symbols before running `travis encrypt`](/user/encryption-keys/#note-on-escaping-certain-symbols). +{% include deploy/providers/bluemixcloudfoundry.md %} {% include deploy/shared.md %} diff --git a/user/deployment-v2/boxfuse.md b/user/deployment-v2/boxfuse.md index c8fbbe53e7e..fc827d6c113 100644 --- a/user/deployment-v2/boxfuse.md +++ b/user/deployment-v2/boxfuse.md @@ -7,82 +7,86 @@ provider: boxfuse Travis CI can automatically deploy your [Boxfuse](https://boxfuse.com/) application after a successful build. -For a minimal configuration, all you need to do is add the following to your `.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: boxfuse - user: "your boxfuse client user" - secret: "your boxfuse client secret" - payload: "your application artifact (typically a jar, war, tar.gz or zip file)" + user: + secret: + payload: # typically a jar, war, tar.gz or zip file ``` {: data-file=".travis.yml"} -We recommended that you encrypt your Boxfuse user and secret. Assuming you have the Travis CI command line client installed, you can do it like this (you will be prompted for values on the command line): +{% include deploy/providers/boxfuse.md %} -```bash -travis encrypt --add deploy.user -travis encrypt --add deploy.secret -``` - -Alternatively you can pass in your credentials using Travis CI [encrypted environment variables](/user/environment-variables/#encrypting-environment-variables) called `BOXFUSE_USER` and `BOXFUSE_SECRET`. You can define these variables either using the Travis CI command line client or directly in the Travis CI repository settings UI. +Finally you can also configure Boxfuse by placing a `boxfuse.conf` file in the +root of your repository. More info about configuration in the +[Boxfuse Command-line Client documentation](https://boxfuse.com/docs/commandline/). -Finally you can also fully configure Boxfuse by placing a `boxfuse.conf` file in the root of your repository. More info about configuration in the [Boxfuse Command-line Client documentation](https://boxfuse.com/docs/commandline/). +### Specifying the app and image version -### Specifying the Boxfuse app and image version +By default Boxfuse will detect the app and the version automatically from the +name of your payload file. -By default Boxfuse will detect the app and the version automatically from the name of your payload file. You can override this like this: +You can override this using the following: ```yaml deploy: provider: boxfuse - user: "your boxfuse client user" - secret: "your boxfuse client secret" - payload: "your application artifact (typically a jar, war, tar.gz or zip file)" - image: "your boxfuse app and version (ex.: myapp:1.23)" + # ⋮ + image: # boxfuse app and version (e.g. myapp:1.23) ``` {: data-file=".travis.yml"} -You can also use Travis CI [environment variables](/user/environment-variables) like `TRAVIS_BUILD_NUMBER` to assign a version to the image. Ex.: `image: "myapp:$TRAVIS_BUILD_NUMBER"` +You can also use Travis CI [environment variables](/user/environment-variables) +like `TRAVIS_BUILD_NUMBER` to assign a version to the image, e.g. +`image: "myapp:$TRAVIS_BUILD_NUMBER"`. + +### Specifying the environment -### Specifying the Boxfuse environment +By default Boxfuse will deploy to your `test` environment. -By default Boxfuse will deploy to your `test` environment. You can override this like this: +You can override this using the following: ```yaml deploy: provider: boxfuse - user: "your boxfuse client user" - secret: "your boxfuse client secret" - payload: "your application artifact (typically a jar, war, tar.gz or zip file)" - env: "your boxfuse environment (default: test)" + # ⋮ + env: ``` {: data-file=".travis.yml"} -### Using alternative configuration files +### Specifying a configuration file -You can also fully configure Boxfuse by placing a `boxfuse.conf` file in the root of your repository. You can specify an alternative configuration file like this: +You can also fully configure Boxfuse by placing a `boxfuse.conf` file in the +root of your repository. You can specify an alternative configuration file like +this: ```yaml deploy: provider: boxfuse - configfile: "your boxfuse configuration file" + # ⋮ + config_file: ./boxfuse-alt.conf ``` {: data-file=".travis.yml"} ### Specifying custom arguments -If the [Boxfuse Client](https://boxfuse.com/docs/commandline) functionality you need is not included here, you can pass additional arguments to the Boxfuse executable by using the `extra_args` parameter: +If the [Boxfuse Client](https://boxfuse.com/docs/commandline) functionality you +need is not included here, you can pass additional arguments to the Boxfuse +executable by using the `extra_args` parameter: ```yaml deploy: provider: boxfuse - extra_args: "extra args (ex.: -X)" + extra_args: # e.g. -X ``` {: data-file=".travis.yml"} ### Further information -Go to the [Boxfuse website](https://boxfuse.com) to learn more about Boxfuse and how to configure it. +Go to the [Boxfuse website](https://boxfuse.com) to learn more about Boxfuse +and how to configure it. {% include deploy/shared.md %} diff --git a/user/deployment-v2/cargo.md b/user/deployment-v2/cargo.md index b8f764e74ac..eebfabc037b 100644 --- a/user/deployment-v2/cargo.md +++ b/user/deployment-v2/cargo.md @@ -5,78 +5,22 @@ deploy: v2 provider: cargo --- -Travis CI can automatically release your Rust crate to [crates.io][] -after a successful build. (Alternative registries may be supported in the -future). +Travis CI can automatically release your Rust crate to [crates.io](https://crates.io) +after a successful build. -A minimal `.travis.yml` configuration for publishing to [crates.io][] looks like: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml language: rust deploy: provider: cargo - token: "YOUR_API_TOKEN" + token: ``` {: data-file=".travis.yml"} -## crates.io API token +The API token can be obtained by logging in to your [crates.io](https://crates.io) +account, and generating a new token at . -An API token can be obtained by logging in to your [crates.io][] account, and -generating a new token at . - -Always [encrypt](/user/encryption-keys/#usage) your API token. Assuming you -have the Travis CI command line client installed, you can do it like this: - -```bash -$ travis encrypt YOUR_API_TOKEN --add deploy.token -``` - -## What to release - -Most likely, you would only want to deploy to crates.io when a new version of -your package is cut. To do this, you can tell Travis CI to only deploy on tagged -commits, like so: - -```yaml -deploy: - ... - on: - tags: true -``` -{: data-file=".travis.yml"} - -If you tag a commit locally, remember to run `git push --tags` to ensure that -your tags are uploaded to GitHub. - -You can explicitly specify the branch to release from with the **on** option: - -```yaml -deploy: - ... - on: - branch: production -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure Travis CI to release from all branches: - -```yaml -deploy: - ... - on: - all_branches: true -``` -{: data-file=".travis.yml"} - -Builds triggered from Pull Requests will never trigger a release. - -## Releasing build artifacts - -After your tests ran and before the release, Travis CI will clean up any -additional files and changes you made. - -This is necessary because Cargo will refuse to publish crates from a dirty -working directory (an option to allow this may be added to this provider in the -future). +{% include deploy/providers/cargo.md %} {% include deploy/shared.md %} diff --git a/user/deployment-v2/chefsupermarket.md b/user/deployment-v2/chefsupermarket.md index d125d37c3fe..56bcef060c3 100644 --- a/user/deployment-v2/chefsupermarket.md +++ b/user/deployment-v2/chefsupermarket.md @@ -5,21 +5,30 @@ deploy: v2 provider: chef_supermarket --- -Travis CI can automatically deploy your cookbook to [Chef -Supermarket](https://supermarket.chef.io/) after a successful build. +Travis CI can automatically deploy your cookbook to [Chef Supermarket](https://supermarket.chef.io/) +after a successful build. -To deploy to Chef Supermarket add your Chef Supermarket `user_id`, your -[encrypted](/user/encrypting-files) Chef Supermarket client key and the -cookbook [`category`](https://docs.getchef.com/knife_cookbook_site.html#id12) -to your `.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: chef_supermarket - user_id: - # the encrypted client key file is decrypted in the before_install step of the build when you add it using the instructions above - category: Others + user_id: + category: ``` {: data-file=".travis.yml"} +Encrypt your client key by running the following command and add it to your +`.travis.yml` file: + +```bash +travis encrypt-file client.pem +``` + +See [Encrypting Files](http://localhost:4000/user/encrypting-files/) for +detailed instructions on how to add encrypted files to your repository and +`.travis.yml` file. + +{% include deploy/providers/chef_supermarket.md %} + {% include deploy/shared.md %} diff --git a/user/deployment-v2/cloud66.md b/user/deployment-v2/cloud66.md index c710bd1f006..32070be53fa 100644 --- a/user/deployment-v2/cloud66.md +++ b/user/deployment-v2/cloud66.md @@ -7,23 +7,17 @@ provider: cloud66 Travis CI can automatically deploy your [Cloud 66](https://www.cloud66.com/) application after a successful build. -For a minimal configuration, all you need to do is add the following to your `.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: cloud66 - redeployment_hook: "your redeployment hook url" + redeployment_hook: ``` {: data-file=".travis.yml"} -You can find the redeployment hook in the information menu within the Cloud 66 portal. +You can find the redeployment hook URL in the information menu within the Cloud 66 portal. -You can also have the `travis` tool set up everything for you: - -```bash -travis setup cloud66 -``` - -Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. +{% include deploy/providers/cloud66.md %} {% include deploy/shared.md %} diff --git a/user/deployment-v2/cloudfiles.md b/user/deployment-v2/cloudfiles.md index c5c04e7ed1d..2561b8282f0 100644 --- a/user/deployment-v2/cloudfiles.md +++ b/user/deployment-v2/cloudfiles.md @@ -7,65 +7,63 @@ provider: cloudfiles Travis CI can automatically upload your build to [Rackspace Cloud Files](https://www.rackspace.com/cloud/files/) after a successful build. -For a minimal configuration, all you need to do is add the following to your `.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: cloudfiles - username: "RACKSPACE USERNAME" - api_key: "RACKSPACE API KEY" - region: "CLOUDFILE REGION" - container: "CLOUDFILES CONTAINER NAME" + username: + api_key: + region: + container: ``` {: data-file=".travis.yml"} -It is recommended that you encrypt your Rackspace api key. Assuming you have the Travis CI command line client installed, you can do it like this: +{% include deploy/providers/cloudfiles.md %} -```bash -travis encrypt --add deploy.api-key -``` - -You will be prompted to enter your api key on the command line. + opt '--glob GLOB', 'Paths to upload', default: '**/*' + opt '--dot_match', 'Upload hidden files starting a dot' -You can also have the `travis` tool set up everything for you: +## Specifying files to upload -```bash -travis setup cloudfiles -``` +Often, you don't want to upload your entire project to Cloud Files. -Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. +You can specify a glob to only include specific directories or files to the upload: -### Deploy To Only One Folder +```yaml +deploy: + provider: cloudfiles + # ⋮ + glob: build/* +``` +{: data-file=".travis.yml"} -Often, you don't want to upload your entire project to Cloud Files. You can tell Travis CI to only upload a single folder to Cloud Files. This example uploads the build directory of your project to Cloud Files: +By default, filenames starting with a dot are excluded. Add the option +`dot_match` to make your `glob` match these, too: ```yaml -before_deploy: "cd build" deploy: provider: cloudfiles - username: "RACKSPACE USERNAME" - api_key: "RACKSPACE API KEY" - region: "CLOUDFILE REGION" - container: "CLOUDFILES CONTAINER NAME" + # ⋮ + glob: build/* + dot_match: true ``` {: data-file=".travis.yml"} -### Deploy to Multiple Containers: +## Deploying to multiple regions or containers: -If you want to upload to multiple containers, you can do this: +If you want to upload to multiple regions or containers, you can do this: ```yaml deploy: - provider: cloudfiles - username: "RACKSPACE USERNAME" - api_key: "RACKSPACE API KEY" - region: "CLOUDFILE REGION" - container: "CLOUDFILES CONTAINER NAME" + # ⋮ + region: + container: - provider: cloudfiles - username: "RACKSPACE USERNAME" - api_key: "RACKSPACE API KEY" - region: "CLOUDFILE REGION" - container: "CLOUDFILES CONTAINER NAME" + # ⋮ + region: + container: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/cloudfoundry.md b/user/deployment-v2/cloudfoundry.md index 033f05acbfe..86b2b158c89 100644 --- a/user/deployment-v2/cloudfoundry.md +++ b/user/deployment-v2/cloudfoundry.md @@ -5,39 +5,21 @@ deploy: v2 provider: cloudfoundry --- -You now have the amazing ability to deploy directly to [CloudFoundry](https://run.pivotal.io/) after a successful build on Travis CI. +Travis CI can automatically upload your build to [CloudFoundry](https://run.pivotal.io/) after a successful build. -## The Easy Way - -Go grab [the Travis gem from GitHub](https://github.com/travis-ci/travis.rb) and run this command: - -`travis setup cloudfoundry` - -You will be asked to answer a few simple questions about your CloudFoundry setup, and Travis will take care of the rest! - -## The Slightly Harder Way - -So you want to write your own `.travis.yml`, fine. Here is the minimum required to get up and running: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: cloudfoundry - username: your@email.com - password: your_password + username: + password: api: https://api.run.pivotal.io - organization: your_organization - space: staging - manifest: manifest-staging.yml # (optional) Defaults to manifest.yml. - app_name: your_app_name # (optional) + organization: + space: ``` {: data-file=".travis.yml"} -***Make sure that you encrypt your password before pushing your updated .travis.yml to GitHub.*** - -You can do this using the Travis gem above and running: - -```bash -travis encrypt --add deploy.password -``` +{% include deploy/providers/cloudfoundry.md %} {% include deploy/shared.md %} diff --git a/user/deployment-v2/codedeploy.md b/user/deployment-v2/codedeploy.md index 655c6b6cbb6..ea6fd5df9ac 100644 --- a/user/deployment-v2/codedeploy.md +++ b/user/deployment-v2/codedeploy.md @@ -5,78 +5,42 @@ deploy: v2 provider: codedeploy --- -Travis CI can automatically trigger a new Deployment on [AWS CodeDeploy](http://aws.amazon.com/documentation/codedeploy/) after a successful build. +Travis CI can automatically upload your build to [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`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: - provider: s3 - # rest of S3 deployment for MyApp.zip + # rest of S3 deployment for .zip # ⋮ - provider: codedeploy - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - bucket: "S3 Bucket" - key: latest/MyApp.zip - application: MyApp - deployment_group: MyDeploymentGroup + access_key_id: + secret_access_key: + bucket: + key: path/to/.zip + application: + deployment_group: ``` {: data-file=".travis.yml"} -Note that in this example, Travis CI will attempt to deploy to an existing CodeDeploy Application called MyApp in AWS Region `us-east-1`. +Note that in this example, Travis CI will attempt to deploy to an existing +CodeDeploy Application called `` in AWS Region `us-east-1`. A complete +example can be found [here](https://github.com/travis-ci/cat-party/blob/master/.travis.yml). -A complete example can be found [here](https://github.com/travis-ci/cat-party/blob/master/.travis.yml). - -You can find your AWS Access Keys [here](https://console.aws.amazon.com/iam/home?#security_credential). It is recommended to encrypt that key. - -If your CodeDeploy application lives in any region other than `us-east-1` please add a region field to `.travis.yml` (see [AWS-region-to-deploy-to](/user/deployment/codedeploy#aws-region-to-deploy-to)). - -Assuming you have the Travis CI command line client installed, you can do it like this: - -```bash -travis encrypt --add deploy.secret_access_key -``` - -You will be prompted to enter your api key on the command line. - -You can also have the `travis` tool set up everything for you: - -```bash -travis setup codedeploy -``` - -Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. - -This command will also offer to set up [S3 deployment](/user/deployment/s3/), if you want to bundle to be uploaded from the Travis CI build. - -## S3 deployment or GitHub deployment - -For a minimal configuration with GitHub, add the following to your `.travis.yml`: - -```yaml -deploy: - - provider: codedeploy - revision_type: github - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - application: "Your Codedeploy application" - deployment_group: "The Deployment group associated with the codedeploy application" - region: "Region in which your ec2 instance is." -``` -{: data-file=".travis.yml"} - -Please note that `region` should match the instance region on which codedeploy is configured. +{% include deploy/providers/codedeploy.md %} ## 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: +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: ```yaml deploy: provider: codedeploy - wait_until_deployed: true # ⋮ + wait_until_deployed: true ``` {: data-file=".travis.yml"} @@ -84,24 +48,21 @@ Travis CI will wait for the deploy to complete, and log whether it succeeded. ## 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 extension of `key` or `s3_key` set in your `.travis.yml`. +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 extension of `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. +If your `.travis.yml` contains both, and they do not match, set `bundle_type` +explicitly to the correct value. -## AWS region to deploy to +## Specifying the AWS region -You can explicitly specify the AWS region to deploy to with the **region** option: +You can explicitly specify the AWS region to deploy to with the `region` option: ```yaml deploy: provider: codedeploy - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - bucket: "S3 Bucket" - key: latest/MyApp.zip - bundle_type: zip - application: MyApp - deployment_group: MyDeploymentGroup + # ⋮ region: us-west-1 ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/custom.md b/user/deployment-v2/custom.md index 01d1964b2a3..ec31d259f73 100644 --- a/user/deployment-v2/custom.md +++ b/user/deployment-v2/custom.md @@ -34,7 +34,7 @@ The env variables `SFTP_USER` and `SFTP_PASSWORD` can also be See [curl(1)](http://curl.haxx.se/docs/manpage.html) for more details on how to use cURL as an SFTP client. -### Git +### ⋮ This should also work with services you can deploy to via git. diff --git a/user/deployment-v2/datica.md b/user/deployment-v2/datica.md index 18416439964..a5e0dd534b8 100644 --- a/user/deployment-v2/datica.md +++ b/user/deployment-v2/datica.md @@ -8,30 +8,34 @@ provider: datica Travis CI can automatically deploy to [Datica](https://datica.com) after a successful build. -Before configuring your `.travis.yml` you need to: +In order to setup a deployment you need to: -### Find your Catalyze git remote +### Find your Git remote -Make sure your Catalyze environment is [associated](https://resources.datica.com/compliant-cloud/articles/initial-setup/#sts=4. Associate to Your Environment). +Make sure your Datica environment is [associated](https://resources.datica.com/compliant-cloud/articles/initial-setup/#sts=4. Associate to Your Environment). -Get the git remote by running `git remote -v`{: #remote} from within the associated repository, and add it to your `.travis.yml` +Get the git remote by running `git remote -v`{: #remote} from within the +associated repository, and add it to your `.travis.yml`. ```yaml deploy: - provider: catalyze + provider: datica target: ssh://git@git.catalyzeapps.com:2222/app1234.git ``` {: data-file=".travis.yml"} ### Set up the repository's key as a deployment key on Datica -Install the Travis CI [command line client](https://github.com/travis-ci/travis.rb), and get the public SSH key for your Travis CI project and save it to a file by running +Install the Travis CI [command line client](https://github.com/travis-ci/travis.rb), +and get the public SSH key for your Travis CI project and save it to a file by +running: ```bash travis pubkey > travis.pub ``` -Add the key as a deploy key using the catalyze command line client within the associated repo. For example: +Add the key as a deploy key using the catalyze command line client within the +associated repo. For example: ```bash catalyze deploy-keys add travisci ./travis.pub your-service @@ -39,30 +43,32 @@ catalyze deploy-keys add travisci ./travis.pub your-service ### Set up Datica as a known host on Travis CI -List your known hosts by running `cat ~/.ssh/known_hosts`, and find and copy the line that includes the git remote found in [Step 1](#remote){: data-proofer-ignore=""}. +List your known hosts by running `cat ~/.ssh/known_hosts`, and find and copy +the line that includes the git remote found in [Step 1](#remote){: +data-proofer-ignore=""}. It'll look something like: - ``` - [git.catalyzeapps.com]:2222 ecdsa-sha2-nistp256 BBBB12abZmKlLXNo... - ``` +``` +[git.catalyzeapps.com]:2222 ecdsa-sha2-nistp256 BBBB12abZmKlLXNo... +``` -Update your `before_deploy` step in `.travis.yml` to update the `known_hosts` file: +Update your `before_deploy` step in `.travis.yml` to update the `known_hosts` +file: - ```yaml - before_deploy: echo "[git.catalyzeapps.com]:2222 ecdsa-sha2-nistp256 BBBB12abZmKlLXNo..." >> ~/.ssh/known_hosts - ``` - {: data-file=".travis.yml"} +```yaml +before_deploy: echo "[git.catalyzeapps.com]:2222 ecdsa-sha2-nistp256 BBBB12abZmKlLXNo..." >> ~/.ssh/known_hosts +``` +{: data-file=".travis.yml"} -### Deploying a subset of your Files +### Specifying a directory to deploy -To only deploy the `build` folder, for example, set `path`: +To only deploy the `build` directory, for example, set `path`: ```yaml deploy: provider: catalyze - target: ssh://git@git.catalyzeapps.com:2222/app1234.git - skip_cleanup: true + # ⋮ path: build ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/elasticbeanstalk.md b/user/deployment-v2/elasticbeanstalk.md index 9810e215a0b..f81e5abfe36 100644 --- a/user/deployment-v2/elasticbeanstalk.md +++ b/user/deployment-v2/elasticbeanstalk.md @@ -5,48 +5,34 @@ deploy: v2 provider: elasticbeanstalk --- -Travis CI can automatically deploy your application to [Elastic Beanstalk](https://aws.amazon.com/documentation/elastic-beanstalk/) after a successful build. +Travis CI can automatically deploy your application to [Elastic Beanstalk](https://aws.amazon.com/documentation/elastic-beanstalk/) +after a successful build. -To deploy to AWS Elastic Beanstalk add the following to your `.travis.yml`: - -* `access_key_id`: [Encrypted](/user/encryption-keys#usage) AWS Access Key ID, obtained from your [AWS Console](https://console.aws.amazon.com/iam/home?#security_credential). -* `secret_access_key`: [Encrypted](/user/encryption-keys#usage) AWS Secret Key, obtained from your [AWS Console](https://console.aws.amazon.com/iam/home?#security_credential). -* `region`: **must** be the region the Elastic Beanstalk application is running on, for example `us-east-1`. -* `app`: Application name. -* `env`: Elastic Beanstalk environment the application will be deployed to. -* `bucket_name`: Bucket name to upload the code of your app to. Elastic Beanstalk will create and deploy an application version from the source bundle in this Amazon S3 bucket. +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: elasticbeanstalk - access_key_id: - secure: "Encrypted access_key_id=" - secret_access_key: - secure: "Encypted secret_access_key=" - region: "us-east-1" - app: "your-app-name" - env: "your-app-environment" - bucket_name: "your-S3-bucket" + access_key_id: + secret_access_key: + region: + env: + bucket: ``` {: data-file=".travis.yml"} -Alternatively, use the Travis CI command line setup tool to add the deployment `travis setup elasticbeanstalk`. +{% include deploy/providers/elasticbeanstalk.md %} ## Creating an application without deploying it -To create an application without deploying it, add `only_create_app_version: "true"` to your `.travis.yml`. - -## Optional settings - -* `zip_file`: The zip file to deploy. You also need to set `skip_cleanup` to prevent Travis CI deleting the zip file at the end of the build. If this is left unspecified, a zip file will be created from all the files that are part of the repository under test (determined with `git ls-files`). -* `bucket_path`: Location within Bucket to upload app to. - -## Environment variables - -The following environment variables are available: +To create an application without deploying it, use `only_create_app_version`: -* `ELASTIC_BEANSTALK_ENV`: Used if the `env` key is not set in your `.travis.yml`. -* `ELASTIC_BEANSTALK_LABEL`: Label name of the new version. -* `ELASTIC_BEANSTALK_DESCRIPTION`: Description of the new version. Defaults to the last commit message. +```yaml +deploy: + provider: elasticbeanstalk + # ⋮ + only_create_app_version: true +``` +{: data-file=".travis.yml"} {% include deploy/shared.md %} diff --git a/user/deployment-v2/engineyard.md b/user/deployment-v2/engineyard.md index 940dabd3e8b..1b7fc098958 100644 --- a/user/deployment-v2/engineyard.md +++ b/user/deployment-v2/engineyard.md @@ -7,62 +7,65 @@ provider: engineyard Travis CI can automatically deploy your [Engine Yard](https://www.engineyard.com/) application after a successful build. -For a minimal configuration, all you need to do is add the following to your `.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: engineyard - api_key: your-api-key + api_key: # or username and password ``` {: data-file=".travis.yml"} -You can also use `email` and `password` instead of `api_key`. It is recommended to encrypt the key/password. - -Optional settings include: `app`, `account`, `environment` and `migrate`. - -You can also have the `travis` tool set up everything for you: - -```bash -$ travis setup engineyard -``` - -Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. +{% include deploy/providers/engineyard.md %} ### Application or Environment to deploy -By default, we will try to deploy to an application by the same name as the repository. For example, if you deploy an application from the GitHub repository [travis-ci/travis-chat](https://github.com/travis-ci/travis-chat) without explicitly specify the name of the application, Travis CI will try to deploy to a Engine Yard app named *travis-chat*. +By default, the application name will be inferred from your repository name. You can explicitly set the name via the **app** option: ```yaml deploy: provider: engineyard - api_key: ... - app: my-app-123 + # ⋮ + app: ``` {: data-file=".travis.yml"} -It is also possible to deploy different branches to different applications: +### Deploying branches to different apps or environments + +In order to choose apps or environments based on the current branch use +separate deploy configurations: ```yaml deploy: - provider: engineyard - api_key: your-api-key - app: - master: my-app - foo: my-foo + - provider: engineyard + # ⋮ + environment: production + on: + branch: master + - provider: engineyard + # ⋮ + environment: staging + on: + branch: staging ``` {: data-file=".travis.yml"} -This branch specific settings are possible for all options (except `on`) and can be very useful for deploying to different environments: +Or using YAML references: ```yaml deploy: - provider: engineyard - api_key: your-api-key - environment: - master: staging - production: production + - &deploy + provider: engineyard + # ⋮ + environment: production + on: + branch: master + - <<: *deploy + environment: staging + on: + branch: staging ``` {: data-file=".travis.yml"} @@ -73,8 +76,8 @@ You can trigger migrations by using the migrate option: ```yaml deploy: provider: engineyard - api_key: your-api-key - migrate: "rake db:migrate" + # ⋮ + migrate: rake db:migrate ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/firebase.md b/user/deployment-v2/firebase.md index c115d973eb9..92a7ea23dd5 100644 --- a/user/deployment-v2/firebase.md +++ b/user/deployment-v2/firebase.md @@ -8,17 +8,18 @@ provider: firebase Travis CI can automatically deploy your application to [Firebase](https://firebase.google.com/) after a successful build. -To use the default configuration, add your [encrypted](/user/encryption-keys/#usage) Firebase [token](/user/deployment/firebase/#generating-your-firebase-token) to your `.travis.yml`, all other information is read from your `firebase.json`: +For a minimal configuration, all you need to do is add the following to your `.travis.yml`: ```yaml deploy: provider: firebase - token: - secure: "your encrypted token" + token: ``` {: data-file=".travis.yml"} -## Generating your Firebase token +{% include deploy/providers/firebase.md %} + +## Generating a Firebase token Generate your Firebase token after [installing the Firebase tools](https://github.com/firebase/firebase-tools#installation) by running: @@ -28,41 +29,28 @@ Run this command to generate a token (e.g. `1/AD7sdasdasdKJA824OvEFc1c89Xz2ilBla firebase login:ci ``` -Encrypt the token: - -``` -travis encrypt "1/AD7sdasdasdKJA824OvEFc1c89Xz2ilBlaBlaBla" --add -``` - -This command may generate a warning ("If you tried to pass the name of the repository as the first argument, you probably won't get the results you wanted"). You can ignore it. - -When using `travis encrypt --add` you are likely to receive `WARNING: The name of the repository is now passed to the command with the -r option` (see https://github.com/travis-ci/travis-ci/issues/7869). The token will be added to your `.travis.yml`, regardless. Inspect and move the token to the `secure:` section of your `.travis.yml` if it isn't added there. - -Remember to [encrypt](/user/encryption-keys/#usage) the token before adding it to your `.travis.yml` - ## Deploying to a custom project -To deploy to a different project than the one specified in the `firebase.json`, use the `project` key in your `.travis.yml`: +To deploy to a different project than the one specified in the `firebase.json`, +use the `project` option: ```yaml deploy: provider: firebase - token: - secure: "YOUR ENCRYPTED token" - project: "myapp-staging" + # ⋮ + project: ``` {: data-file=".travis.yml"} ## Adding a message to a deployment -To add a message to describe the deployment, use the `message` key in your `.travis.yml`: +To add a message to describe the deployment, use the `message` option: ```yaml deploy: provider: firebase - token: - secure: "YOUR ENCRYPTED token" - message: "your message" + # ⋮ + message: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/gcs.md b/user/deployment-v2/gcs.md index e2e8c377d0c..775ebaa752c 100644 --- a/user/deployment-v2/gcs.md +++ b/user/deployment-v2/gcs.md @@ -12,89 +12,53 @@ A minimal configuration is: ```yaml deploy: provider: gcs - access_key_id: "GCS Interoperable Access Key ID" - secret_access_key: "GCS Interoperable Access Secret" + access_key_id: + secret_access_key: bucket: "GCS Bucket" ``` {: data-file=".travis.yml"} -This example is almost certainly not ideal, as you probably want to upload your built binaries and documentation. Set `skip_cleanup` to `true` to prevent Travis CI from deleting your build artifacts. - -```yaml -deploy: - provider: gcs - access_key_id: "GCS Interoperable Access Key ID" - secret_access_key: "GCS Interoperable Access Secret" - bucket: "GCS Bucket" - skip_cleanup: true -``` -{: data-file=".travis.yml"} - You can find your GCS Interoperable Access Keys [here](https://developers.google.com/storage/docs/migrating). -It is recommended to encrypt that key. -Assuming you have the Travis CI command line client installed, you can do it like this: - -```bash -travis encrypt --add deploy.secret_access_key -``` - -You will be prompted to enter your api key on the command line. - -You can also have the `travis` tool set up everything for you: - -```bash -travis setup gcs -``` -Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. +{% include deploy/providers/gcs.md %} -### GCS ACL via option +### Deploying a specific folder -You can set the acl of your uploaded files via the `acl` option like this: +You can set specific directory to be uploaded using `local-dir` option like this: ```yaml deploy: provider: gcs - access_key_id: "GCS Interoperable Access Key ID" - secret_access_key: "GCS Interoperable Access Secret" - bucket: "GCS Bucket" - skip_cleanup: true - acl: public-read + # ⋮ + local_dir: ./build ``` {: data-file=".travis.yml"} -Valid ACL values are: `private`, `public-read`, `public-read-write`, `authenticated-read`, `bucket-owner-read`, `bucket-owner-full-control`. The ACL defaults to `private`. -See the [full documentation on Google Cloud](https://cloud.google.com/storage/docs/reference-headers#xgoogacl). +### Specifiying an ACL -### Deploying a specific folder - -You can set specific directory to be uploaded using `local-dir` option like this: +You can set the acl of your uploaded files via the `acl` option like this: ```yaml deploy: provider: gcs - access_key_id: "GCS Interoperable Access Key ID" - secret_access_key: "GCS Interoperable Access Secret" - bucket: "GCS Bucket" - skip_cleanup: true + # ⋮ acl: public-read - local-dir: directory-name ``` {: data-file=".travis.yml"} -If the `directory-name` is generated during build process, it will be deleted (cleaned up) before deploying, unless `skip_cleanup` is set to true. +See the [full documentation on Google Cloud](https://cloud.google.com/storage/docs/reference-headers#xgoogacl). ### HTTP cache control GCS uploads can optionally set the `Cache-Control` HTTP header. -Set HTTP header `Cache-Control` to suggest that the browser cache the file. Defaults to `no-cache`. Valid options are `no-cache`, `no-store`, `max-age=`, `s-maxage= no-transform`, `public`, `private`. +Set HTTP header `Cache-Control` to suggest that the browser cache the file. ```yaml deploy: provider: gcs - ... - cache_control: "max-age=31536000" + # ⋮ + cache_control: max-age=31536000 ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/google-app-engine.md b/user/deployment-v2/google-app-engine.md index 796f7b98049..ea0e3fa7c1e 100644 --- a/user/deployment-v2/google-app-engine.md +++ b/user/deployment-v2/google-app-engine.md @@ -5,124 +5,82 @@ deploy: v2 provider: gae --- -Travis CI can automatically deploy your [Google App Engine](https://cloud.google.com/appengine/docs) or [Managed VMs](https://cloud.google.com/appengine/docs/managed-vms/) application after a successful build. +Travis CI can automatically deploy to [Google App Engine](https://cloud.google.com/appengine/docs) or [Managed VMs](https://cloud.google.com/appengine/docs/managed-vms/) after a successful build. For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: gae - keyfile: "YOUR SERVICE ACCOUNT JSON FILE" - project: "YOUR PROJECT ID" + keyfile: ``` {: data-file=".travis.yml"} Then go to the [Google Cloud Console Dashboard](http://console.developers.google.com) and: -1. Enable "Google App Engine Admin API", -2. Go to "Credentials", click "Add Credential" and "Service account key", finally click "JSON" to download your Service Account JSON file. +* Enable "Google App Engine Admin API", +* Go to "Credentials", click "Add Credential" and "Service account key", finally click "JSON" to download your Service Account JSON file. -It is *strongly* recommended that you encrypt your key before committing it to a repo. -First make sure you have the [Travis command line tool](https://github.com/travis-ci/travis.rb#readme) installed. -Then execute the following command from the terminal: +Add this file as an [encrypted file](/user/encrypting-files/) to your repository and `.travis.yml` file. -```bash -travis encrypt-file client-secret.json --add -``` - -The `--add` flag automatically adds the decryption step to the .travis file. - -Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. - -More detailed instructions for encrypting keys using Travis can be found [here](/user/encrypting-files/). +{% include deploy/providers/gae.md %} ### Project to deploy -By default, the project will be deployed with the same name as the repository. Usually, you will want to explicilty configure the **project** option to match the project ID found in your Cloud console (note that this is sometimes, but not always, the same as the project name). +By default, the project will be deployed with the same name as the repository. +Usually, you will want to explicilty configure the **project** option to match +the project ID found in your Cloud console (note that this is sometimes, but +not always, the same as the project name). You can explicitly set the project id via the **project** option: ```yaml deploy: provider: gae - keyfile: ... + # ⋮ project: continuous-deployment-demo ``` {: data-file=".travis.yml"} ### Version to deploy -Either the **version** flag or the **default** option must be set. If default is true, the default version will be deployed to, which will be `http://your-project-id.appspot.com`. If the **version** flag is set instead, it will deploy to `http://version-dot-your-project-id.appspot.com`. - -### Branch to deploy from - -By default, Travis will only deploy from your **master** branch. - -You can also explicitly specify the branch to deploy from with the **on** option: - -```yaml -deploy: - provider: gae - keyfile: ... - project: ... - on: production -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure it to deploy from all branches: - -```yaml -deploy: - provider: gae - keyfile: ... - project: ... - on: - all_branches: true -``` -{: data-file=".travis.yml"} - -Builds triggered from Pull Requests will never trigger a deploy. +Either the `version` flag or the `default` option must be set. If default +is true, the default version will be deployed to, which will be +`http://project-id.appspot.com`. If the `version` flag is set instead, it will +deploy to `http://version.project-id.appspot.com`. ### Deploying without Promoting -By default, when your application is deployed it will be promoted to receive all traffic. You can disable that using the `no_promote` option: +By default, when your application is deployed it will be promoted to receive +all traffic. You can disable that using the `no_promote` option: ```yaml deploy: provider: gae - keyfile: ... - project: continuous-deployment-demo + # ⋮ no_promote: true ``` {: data-file=".travis.yml"} -In addition to that, and according to the [Google Cloud SDK changelog](https://cloud.google.com/sdk/release_notes#0981_20151007), *"in a future Cloud SDK release, deployments that promote the new version to receive all traffic will stop the previous version by default"*. +In addition to that, and according to the [Google Cloud SDK changelog](https://cloud.google.com/sdk/release_notes#0981_20151007), +*"in a future Cloud SDK release, deployments that promote the new version to +receive all traffic will stop the previous version by default"*. You can prevent that from happening by setting the option `no_stop_previous_version`: ```yaml deploy: provider: gae - keyfile: ... - project: continuous-deployment-demo + # ⋮ no_stop_previous_version: true ``` {: data-file=".travis.yml"} -### Other Available Configuration Options - -- **project**: [Project ID](https://developers.google.com/console/help/new/#projectnumber) used to identify the project on Google Cloud. -- **keyfile**: Path to the JSON file containing your [Service Account](https://developers.google.com/console/help/new/#serviceaccounts) credentials in [JSON Web Token](https://tools.ietf.org/html/rfc7519) format. To be obtained via the [Google Developers Console](https://console.developers.google.com/project/_/apiui/credential). Defaults to `"service-account.json"`. Note that this file should be handled with care as it contains authorization keys. -- **config**: Path to your module configuration file. Defaults to `"app.yaml"`. This file is runtime dependent ([Go](https://cloud.google.com/appengine/docs/go/config/appconfig), [Java](https://cloud.google.com/appengine/docs/java/config/appconfig), [PHP](https://cloud.google.com/appengine/docs/php/config/appconfig), [Python](https://cloud.google.com/appengine/docs/python/config/appconfig)) -- **version**: The version of the app that will be created or replaced by this deployment. If you do not specify a version, one will be generated for you. See [`gcloud app deploy`](https://cloud.google.com/sdk/gcloud/reference/app/deploy) -- **default**: Flag to set the deployed version to be the default serving version. See [`gcloud app deploy`](https://cloud.google.com/sdk/gcloud/reference/app/deploy) -- **verbosity**: Lets you adjust the verbosity when invoking `"gcloud"`. Defaults to `"warning"`. See [`gcloud`](https://cloud.google.com/sdk/gcloud/reference/). -- **docker_build**: If deploying a Managed VM, specifies where to build your image. Typical values are `"remote"` to build on Google Cloud Engine and `"local"` which requires Docker to be set up properly (to utilize this on Travis CI, read [Using Docker on Travis CI](https://blog.travis-ci.com/2015-08-19-using-docker-on-travis-ci/)). Defaults to `"remote"`. - ### Example Repo -See [this link](https://github.com/googlecloudplatform/continuous-deployment-demo/tree/appengine_travis_deploy) for an example -App Engine app with a Travis deployment configured. See the other branches in the project for Managed VMs examples, and examples -without using this provider. +See [this repository](https://github.com/googlecloudplatform/continuous-deployment-demo/tree/appengine_travis_deploy) +for an example App Engine app with a Travis deployment configured. See the +other branches in the project for Managed VMs examples, and examples without +using this provider. {% include deploy/shared.md %} diff --git a/user/deployment-v2/hackage.md b/user/deployment-v2/hackage.md index 4b4e4ad31c2..31acaa4fd36 100644 --- a/user/deployment-v2/hackage.md +++ b/user/deployment-v2/hackage.md @@ -5,34 +5,18 @@ deploy: v2 provider: hackage --- -Travis CI supports uploading to [Hackage](https://hackage.haskell.org/). +Travis CI can automatically upload to [Hackage](https://hackage.haskell.org/) after a successful build. -A minimal configuration is: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: hackage - username: "Hackage User Name" - password: "Hackage Password" + username: + password: ``` {: data-file=".travis.yml"} -It is recommended to encrypt the password. - -Assuming you have the Travis CI command line client installed, you can do it like this: - -```bash -$ travis encrypt --add deploy.password -``` - -You will be prompted to enter your api key on the command line. - -You can also have the `travis` tool set up everything for you: - -```bash -$ travis setup hackage -``` - -Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. +{% include deploy/providers/hackage.md %} {% include deploy/shared.md %} diff --git a/user/deployment-v2/hephy.md b/user/deployment-v2/hephy.md index 2a5b582f2c8..b9c7926ac3d 100644 --- a/user/deployment-v2/hephy.md +++ b/user/deployment-v2/hephy.md @@ -12,29 +12,13 @@ A minimal configuration is: ```yaml deploy: provider: hephy - controller: hephy.hephyapps.com - username: "Hephy User Name" - password: "Hephy Password" - app: App_name - cli_version: vX.Y.Z # e.g. v2.7.0 being the latest at this time + controller: + username: + password: + app: ``` {: data-file=".travis.yml"} -It is recommended that you encrypt your password. -Assuming you have the Travis CI command line client installed, you can do it like this: - -```bash -$ travis encrypt "YOUR HEPHY PASSWORD" --add deploy.password -``` - -You will be prompted to enter your api key on the command line. - -You can also have the `travis` tool set up everything for you: - -```bash -$ travis setup hephy -``` - -> Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. +{% include deploy/providers/hephy.md %} {% include deploy/shared.md %} diff --git a/user/deployment-v2/heroku.md b/user/deployment-v2/heroku.md index eaa8096fdf1..72e64852026 100644 --- a/user/deployment-v2/heroku.md +++ b/user/deployment-v2/heroku.md @@ -5,100 +5,104 @@ deploy: v2 provider: heroku --- -Travis CI can automatically deploy your [Heroku](https://www.heroku.com/) application after a successful build. +Travis CI can automatically deploy your [Heroku](https://www.heroku.com/) +application after a successful build. -To use the default configuration, add your encrypted Heroku api key to your `.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: heroku - api_key: - secure: "YOUR ENCRYPTED API KEY" + api_key: ``` {: data-file=".travis.yml"} -If you have both the [Heroku](https://devcenter.heroku.com/articles/heroku-cli) and [Travis CI](https://github.com/travis-ci/travis.rb#readme) command line clients installed, you can get your key, encrypt it and add it to your `.travis.yml` by running the following command from your project directory: +{% include deploy/providers/heroku_git.md %} -```bash -travis encrypt $(heroku auth:token) --add deploy.api_key -``` - -`travis` command defaults to using [travis-ci.org](https://travis-ci.org) as the API endpoint. If your build runs on [travis-ci.com](https://travis-ci.com) (even if your repository is public), add `--pro` flag to override this: - -```bash -travis encrypt $(heroku auth:token) --add deploy.api_key --pro -``` -You can also use the Travis CI command line setup tool `travis setup heroku`. +## Specifying the application name -## Deploying Custom Application Names +By default, your repository name will be used as the application name. -By default, we will try to deploy to an application by the same name as the repository. For example, if you deploy an application from the GitHub repository [travis-ci/travis-chat](https://github.com/travis-ci/travis-chat) without explicitly specify the name of the application, Travis CI will try to deploy to a Heroku app named *travis-chat*. - -You can explicitly set the name via the **app** option: +You can set a different application name using the `app` option: ```yaml deploy: provider: heroku - api_key: ... - app: my-app-123 + # ⋮ + app: ``` {: data-file=".travis.yml"} -It is also possible to deploy different branches to different applications: +## Running commands + +In some setups, you might want to run a command on Heroku after a successful +deploy. You can do this with the **run** option: ```yaml deploy: provider: heroku - api_key: ... - app: - master: my-app-staging - production: my-app-production + # ⋮ + run: rake db:migrate ``` {: data-file=".travis.yml"} -If these apps belong to different Heroku accounts, you will have to do the same for the API key: +It also accepts a list of commands: ```yaml deploy: provider: heroku - api_key: - master: ... - production: ... - app: - master: my-app-staging - production: my-app-production + # ⋮ + run: + - rake db:migrate + - rake cleanup ``` {: data-file=".travis.yml"} -## Running Commands +> Take note that Heroku app might not be completely deployed and ready to serve +> requests when we run your commands. To mitigate this situation, you can add a +> `sleep` statement to add a delay before your commands. + +### Deploying branches to different apps -In some setups, you might want to run a command on Heroku after a successful deploy. You can do this with the **run** option: +In order to choose apps based on the current branch use separate deploy +configurations: ```yaml deploy: - provider: heroku - api_key: ... - run: "rake db:migrate" + - provider: heroku + # ⋮ + app: app-production + on: + branch: master + - provider: heroku + # ⋮ + app: app-staging + on: + branch: staging ``` {: data-file=".travis.yml"} -It also accepts a list of commands: +Or using YAML references: ```yaml deploy: - provider: heroku - api_key: ... - run: - - "rake db:migrate" - - "rake cleanup" + - &deploy + provider: heroku + # ⋮ + app: app-production + on: + branch: master + - <<: *deploy + app: app-staging + on: + branch: staging ``` {: data-file=".travis.yml"} -> Take note that Heroku app might not be completely deployed and ready to serve requests when we run your commands. To mitigate this situation, you can add a `sleep` statement to add a delay before your commands. - ### Error Logs for Custom Commands -Custom Heroku commands do not affect the Travis CI build status or trigger Travis CI notifications. +Custom Heroku commands do not affect the Travis CI build status or trigger +Travis CI notifications. Use an addon such as [Papertrail](https://elements.heroku.com/addons/papertrail){: data-proofer-ignore=""} or [Logentries](https://elements.heroku.com/addons/logentries){: data-proofer-ignore=""} to get notifications for `rake db:migrate` or other commands. @@ -106,16 +110,17 @@ These add-ons have email notification systems that can be triggered when certain ### Restarting Applications -Sometimes you want to restart your Heroku application between or after commands. You can easily do so by adding a "restart" command: +Sometimes you want to restart your Heroku application between or after +commands. You can easily do so by adding a "restart" command: ```yaml deploy: provider: heroku - api_key: ... + # ⋮ run: - - "rake db:migrate" + - rake db:migrate - restart - - "rake cleanup" + - rake cleanup ``` {: data-file=".travis.yml"} @@ -131,12 +136,12 @@ It defaults to **api**, but you can change that via the **strategy** option: ```yaml deploy: provider: heroku - api_key: ... + # ⋮ strategy: git ``` {: data-file=".travis.yml"} -#### Using `.gitignore` on `git` strategy +#### Using .gitignore on the Git strategy When you use any of the `git` strategies, be mindful that the deployment will honor `.gitignore`. diff --git a/user/deployment-v2/lambda.md b/user/deployment-v2/lambda.md index e2ab04cc4b3..e9ee9706b21 100644 --- a/user/deployment-v2/lambda.md +++ b/user/deployment-v2/lambda.md @@ -7,34 +7,19 @@ provider: lambda Travis CI supports uploading to [AWS Lambda](https://aws.amazon.com/lambda/). -A minimal configuration is: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: lambda - function_name: "lambda-test" - region: "us-east-1" - role: "arn:aws:iam::0123456789012:role/lambda_basic_execution" - runtime: "nodejs4.3" - handler_name: "handler" + function_name: + handler_name: + role: + runtime: ``` {: data-file=".travis.yml"} -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 -$ travis encrypt "AWS SECRET ACCESS KEY" --add deploy.secret_access_key -``` - -You will be prompted to enter your secret access key on the command line. - -### Optional configuration parameters - -See [documentation](https://github.com/travis-ci/dpl#lambda) for additional -configuration parameters +{% include deploy/providers/lambda.md %} ### AWS permissions @@ -87,7 +72,7 @@ The AWS user that Travis deploys as must have the following IAM permissions in o ``` It does not appear to be possible to wildcard the `DeployCode` statement such -that Travis can deploy any function in a particular region by specifying the +that Travis CI can deploy any function in a particular region by specifying the resource as `arn:aws:lambda:::function:*` but it is possible to limit the deployment permissions on a per function basis by specifying the complete ARN to one or more functions, i.e. diff --git a/user/deployment-v2/launchpad.md b/user/deployment-v2/launchpad.md index 35632351fd2..fca8cc4eacb 100644 --- a/user/deployment-v2/launchpad.md +++ b/user/deployment-v2/launchpad.md @@ -9,47 +9,28 @@ Travis CI can get [Launchpad](https://launchpad.net/) to automatically import yo To automatically trigger an import: -1. [Register](https://launchpad.net/projects/+new) a project on Launchpad and then [import](https://code.launchpad.net/+code-imports/+new) your GitHub project there. -2. [Generate](https://help.launchpad.net/API/SigningRequests) an API **access token** that we can use to trigger a new code import. Please make sure that the `oauth_consumer_key` is set to `Travis Deploy`. -3. Add the following to your `.travis.yml` +* [Register](https://launchpad.net/projects/+new) a project on Launchpad and then [import](https://code.launchpad.net/+code-imports/+new) your GitHub project there. +* [Generate](https://help.launchpad.net/API/SigningRequests) an API **access token** that we can use to trigger a new code import. Please make sure that the `oauth_consumer_key` is set to `Travis Deploy`. + +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: launchpad - slug: "LAUNCHPAD PROJECT SLUG" - oauth_token: "YOUR OAUTH_TOKEN" - oauth_token_secret: "YOUR OAUTH_TOKEN_SECRET" + slug: + oauth_token: + oauth_token_secret: ``` {: data-file=".travis.yml"} -It is recommended to [encrypt both your `oauth_token` and your `oauth_token_secret`](/user/deployment/launchpad/#encrypting-your-oauth-tokens). - -The `slug` contains user or team name, project name, and branch name, and is formatted like `~user-name/project-name/branch-name`. If your project's code is a git repository, the form is `~user-name/project-name/+git/repository-name`. You can find your project's slug in the header (and the url) of its `code.launchpad.net` page. - -
        - Launchpad slug -
        - -### Encrypting your OAUTH tokens - -It is recommended that you encrypt both OAUTH tokens using the Travis CI command line client by removing them from your `travis.yml` above and running the following commands: - -```bash -$ travis encrypt "YOUR OAUTH_TOKEN" --add deploy.oauth_token -$ travis encrypt "YOUR OAUTH_TOKEN_SECRET" --add deploy.oauth_token_secret -``` +The `slug` contains user or team name, project name, and branch name, and is +formatted like `~user-name/project-name/branch-name`. If your project's code is +a git repository, the form is `~user-name/project-name/+git/repository-name`. +You can find your project's slug in the header (and the url) of its +`code.launchpad.net` page. -The resulting `.travis.yml` looks like this: +
        Launchpad slug
        -```yaml -deploy: - provider: launchpad - slug: "LAUNCHPAD PROJECT SLUG" - oauth_token: - secure: KmMdcwTWGubXVRu93/lY1NtyHxrjHK4TzCfemgwjsYzPcZuPmEA+pz+umQBN\n1ZhzUHZwDNsDd2VnBgYq27ZdcS2cRvtyI/IFuM/xJoRi0jpdTn/KsXR47zeE\nr2bFxRqrdY0fERVHSMkBiBrN/KV5T70js4Y6FydsWaQgXCg+WEU= - oauth_token_secret: - secure: jAglFtDjncy4E3upL/RF0ZOcmJ2UMrqHFCLQwU8PBdurhTMBeTw+IO6cXx5z\nU5zqvPYo/ghZ8mMuUhvHiGDM6m6OlMP7+l10VTxH1CoVew2NcQvRdfK3P+4S\nZJ43Hyh/ZLCjft+JK0tBwoa3VbH2+ZTzkRZQjdg54bE16C7Mf1A= -``` -{: data-file=".travis.yml"} +{% include deploy/providers/launchpad.md %} {% include deploy/shared.md %} diff --git a/user/deployment-v2/netlify.md b/user/deployment-v2/netlify.md new file mode 100644 index 00000000000..628acabf5c6 --- /dev/null +++ b/user/deployment-v2/netlify.md @@ -0,0 +1,35 @@ +--- +title: Netlify Drop Deployment +layout: en +deploy: v2 +provider: bitballoon +--- + +Travis CI can automatically deploy files to [Netlify Drop](https://app.netlify.com/drop) +after a successful build. + +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: netlify + site: + auth: +``` +{: data-file=".travis.yml"} + +{% include deploy/providers/netlify.md %} + +## Deploying a specific directory + +To deploy a specific directory, use the `local_dir` key: + +```yaml +deploy: + provider: netlify + # ⋮ + local_dir: "_build/" +``` +{: data-file=".travis.yml"} + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/npm.md b/user/deployment-v2/npm.md index 4c8af3a2671..80dc799da27 100644 --- a/user/deployment-v2/npm.md +++ b/user/deployment-v2/npm.md @@ -6,11 +6,10 @@ provider: npm --- Travis CI can automatically release your npm package to [npmjs.com][npmjs] -or another npm-like registry after a successful build. By default Travis CI -publishes to npmjs.com, however if you have a `publishConfig.registry` key in your -`package.json` then Travis CI publishes to that registry instead. +or another npm-like registry after a successful build. -A minimal `.travis.yml` configuration for publishing to [npmjs.com][npmjs] with npm version 2+ looks like: +For a minimal configuration, add the following to your `.travis.yml` (using NPM +version 2+): ```yaml deploy: @@ -20,97 +19,36 @@ deploy: ``` {: data-file=".travis.yml"} -You can have the `travis` tool set up everything for you: - -```bash -$ travis setup npm -``` - -Keep in mind that the above command has to run in your project directory, so -it can modify the `.travis.yml` for you. - ## NPM auth token -Your NPM Auth Token can be obtained by: +Your NPM Auth Token can be obtained the following ways: -1. Log in to your NPM account, and generate a new token at `https://www.npmjs.com/settings/USER/tokens`, where - `USER` is the name of the user account which is capable of publishing the npm package. -1. Use the NPM CLI command [`npm adduser`](https://docs.npmjs.com/cli/adduser) to create a user, then open the `~/.npmrc` file: - 1. For NPM v2+, use the `authToken` value. - 1. For NPM ~1, use the `auth` value. +Log in to your NPM account, and generate a new token at `https://www.npmjs.com/settings//tokens`, +where `` is the name of your user account. -Always [encrypt](/user/encryption-keys/#usage) your auth token. Assuming you have the Travis CI command line client installed, you can do it like this: +Or use the NPM CLI command [`npm adduser`](https://docs.npmjs.com/cli/adduser) +to create a user, then open the `~/.npmrc` file: -```bash -$ travis encrypt YOUR_AUTH_TOKEN --add deploy.api_key -``` +* For NPM v2+, use the `authToken` value. +* For NPM ~1, use the `auth` value. -## What to release - -Most likely, you would only want to deploy to npm when a new version of your -package is cut. To do this, you can tell Travis CI to only deploy on tagged -commits, like so: - -```yaml -deploy: - ... - on: - tags: true -``` -{: data-file=".travis.yml"} - -If you tag a commit locally, remember to run `git push --tags` to ensure that -your tags are uploaded to GitHub. - -You can explicitly specify the branch to release from with the **on** option: - -```yaml -deploy: - ... - on: - branch: production -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure Travis CI to release from all branches: - -```yaml -deploy: - ... - on: - all_branches: true -``` -{: data-file=".travis.yml"} - -Builds triggered from Pull Requests will never trigger a release. - -## Releasing build artifacts - -After your tests ran and before the release, Travis CI will clean up any additional files and changes you made. - -Maybe that is not what you want, as you might generate some artifacts that are supposed to be released, too. There is now an option to skip the clean up: - -```yaml -deploy: - ... - skip_cleanup: true -``` -{: data-file=".travis.yml"} +{% include deploy/providers/npm.md %} ## Tagging releases -You can automatically add [npm distribution tags](https://docs.npmjs.com/getting-started/using-tags) with the `tag` option: +You can automatically add [npm distribution tags](https://docs.npmjs.com/getting-started/using-tags) +using the `tag` option: ```yaml deploy: - ... + # ⋮ tag: next ``` {: data-file=".travis.yml"} -## Note on `.gitignore` +## Note on .gitignore -Notice that `npm` deployment honors `.gitignore` if `.npmignore` does not exist. +Note that `npm` deployment honors `.gitignore` if `.npmignore` does not exist. This means that if your build creates artifacts in places listed in `.gitignore`, they will not be included in the uploaded package. @@ -124,7 +62,7 @@ to override it. ## Troubleshooting "npm ERR! You need a paid account to perform this action." -npm assumes that [scoped packages](https://docs.npmjs.com/misc/scope) are +`npm` assumes that [scoped packages](https://docs.npmjs.com/misc/scope) are private by default. You can explicitly tell npm your package is a public package and avoid this error by adding the following to your `package.json` file: diff --git a/user/deployment-v2/openshift.md b/user/deployment-v2/openshift.md index ac083416cae..9ce332f59c6 100644 --- a/user/deployment-v2/openshift.md +++ b/user/deployment-v2/openshift.md @@ -5,97 +5,69 @@ deploy: v2 provider: openshift --- -Travis CI can automatically deploy your [OpenShift](https://www.openshift.com/) application after a successful build. +Travis CI can automatically deploy to [OpenShift](https://www.openshift.com/) after a successful build. -For a minimal configuration, all you need to do is add the following to your `.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: openshift - user: "YOU USER NAME" - password: "YOUR PASSWORD" # can be encrypted - domain: "YOUR OPENSHIFT DOMAIN" + server: + token: + project: ``` {: data-file=".travis.yml"} -Currently it is not possible to use a token instead of the password, as these tokens expire too quickly. We are working with the OpenShift team on a solution. +{% include deploy/providers/openshift.md %} -You can also have the `travis` tool set up everything for you: +## Specifying the application name -```bash -travis setup openshift -``` - -Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. - -To provide the best service possible, Travis CI has teamed up with OpenShift as a [partner](https://www.openshift.com/partners) and there is an official [Travis CI QuickStart](https://hub.openshift.com/quickstarts/26-travis-ci) to get you going. - -### Application to deploy - -By default, we will try to deploy to an application by the same name as the repository. For example, if you deploy an application from the GitHub repository [travis-ci/travis-chat](https://github.com/travis-ci/travis-chat) without explicitly specify the name of the application, Travis CI will try to deploy to an OpenShift app named *travis-chat*. - -You can explicitly set the name via the **app** option: - -```yaml -deploy: - provider: openshift - ... - app: my-app-123 -``` -{: data-file=".travis.yml"} +By default, your repository name will be used as the application name. -It is also possible to deploy different branches to different applications: +You can set a different application name using the `app` option: ```yaml deploy: provider: openshift - ... - app: - master: my-app-staging - production: my-app-production + # ⋮ + app: ``` {: data-file=".travis.yml"} -If these apps belong to different OpenShift domains, you will have to do the same for the domain: +### Deploying branches to different projects -```yaml -deploy: - provider: openshift - ... - domain: - master: ... - production: ... - app: - master: my-app-staging - production: my-app-production -``` -{: data-file=".travis.yml"} - -### Deploying build artifacts - -After your tests ran and before the deploy, Travis CI will clean up any additional files and changes you made. - -Maybe that is not what you want, as you might generate some artifacts (think asset compilation) that are supposed to be deployed, too. There is now an option to skip the clean up: +In order to choose projects based on the current branch use separate deploy +configurations: ```yaml deploy: - provider: openshift - ... - skip_cleanup: true + - provider: openshift + # ⋮ + project: + on: + branch: master + - provider: openshift + # ⋮ + project: + on: + branch: staging ``` {: data-file=".travis.yml"} -### Deployment branch - -OpenShift can be configured to deploy from a branch different from the default `master` via `rhc app-configure --deployment-branch mybranch`. - -If you've done this to your application, specify this desired branch with `deployment_branch`: +Or using YAML references: ```yaml deploy: - provider: openshift - ... - deployment_branch: mybranch + - &deploy + provider: openshift + # ⋮ + project: + on: + branch: master + - <<: *deploy + project: + on: + branch: staging ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/opsworks.md b/user/deployment-v2/opsworks.md index 11c3c1bef75..823fc85003f 100644 --- a/user/deployment-v2/opsworks.md +++ b/user/deployment-v2/opsworks.md @@ -7,77 +7,49 @@ provider: opsworks Travis CI can automatically deploy your [AWS OpsWorks](https://aws.amazon.com/en/opsworks/) application after a successful build. -For a minimal configuration, all you need to do is add the following to your `.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: opsworks - access-key-id: ACCESS-KEY-ID - secret-access-key: SECRET-ACCESS-KEY - app-id: APP-ID - region: REGION # (default: us-east-1) + access_key_id: + secret_access_key: + app_id: ``` {: data-file=".travis.yml"} -`region` isn't required but it defaults to `us-east-1`. If your application is located in a different region you will get an error like "OpsWorks service error: Unable to find app with ID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx". +You can obtain your AWS Access Key Id and your AWS Secret Access Key from +[here](https://console.aws.amazon.com/iam/home?#security_credential). -You can obtain your AWS Access Key Id and your AWS Secret Access Key from [here](https://console.aws.amazon.com/iam/home?#security_credential). It is recommended to encrypt your AWS Secret Access Key. Assuming you have the `travis` client installed, you can do it like this: +{% include deploy/providers/opsworks.md %} -```bash -travis encrypt SECRET-ACCESS-KEY --add deploy.secret-access-key -``` - -You can also have the `travis` tool set up everything for you: - -```bash -travis setup opsworks -``` - -Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. Note that the `region` isn't generated by running `travis setup opsworks`. +`region` defaults to `us-east-1`. If your application is located in a different +region you will get an error like "OpsWorks service error: Unable to find app +with ID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx". ### Migrate the Database -If you want to migrate your rails database on travis to AWS OpsWorks, add the `migrate` option to your `.travis.yml`. +If you want to migrate your rails database on travis to AWS OpsWorks, add the `migrate` option: ```yaml deploy: provider: opsworks - access-key-id: ACCESS-KEY-ID - secret-access-key: SECRET-ACCESS-KEY - app-id: APP-ID + # ⋮ migrate: true ``` {: data-file=".travis.yml"} -### Deploying build artifacts - -After your tests run and before the deploy step, Travis CI will clean up any additional files and changes you made. - -Maybe that is not what you want, as you might generate some artifacts (think asset compilation) that are supposed to be deployed, too. There is now an option to skip the clean up: - -```yaml -deploy: - provider: opsworks - access-key-id: ACCESS-KEY-ID - secret-access-key: SECRET-ACCESS-KEY - app-id: APP-ID - skip_cleanup: true -``` -{: data-file=".travis.yml"} - ### Waiting for Deployments By default, the build will continue immediately after triggering an OpsWorks -deploy. To wait for the deploy to complete, use the **wait-until-deployed** +deploy. To wait for the deploy to complete, use the `wait_until_deployed` option: ```yaml deploy: provider: opsworks - access-key-id: ACCESS-KEY-ID - secret-access-key: SECRET-ACCESS-KEY - app-id: APP-ID - wait-until-deployed: true + # ⋮ + wait_until_deployed: true ``` {: data-file=".travis.yml"} @@ -86,19 +58,21 @@ whether it succeeded. ### Updating App Settings after successful Deployments -By default the deploy from Travis CI triggers a deployment on OpsWorks but does not touch any other configuration. To also update the revision in App Settings use the **update-app-on-success** option. In addition you have to set the **wait-until-deployed** option: +By default the deploy from Travis CI triggers a deployment on OpsWorks but does +not touch any other configuration. To also update the revision in App Settings +use the `update_app_on_success` option. In addition you have to set the +`wait_until_deployed` option: ```yaml deploy: provider: opsworks - access-key-id: ACCESS-KEY-ID - secret-access-key: SECRET-ACCESS-KEY - app-id: APP-ID + # ⋮ wait-until-deployed: true update-app-on-success: true ``` {: data-file=".travis.yml"} -Travis CI will wait until the deployment returns successful and only then update the revision in App Settings. +Travis CI will wait until the deployment returns successful and only then +update the revision in App Settings. {% include deploy/shared.md %} diff --git a/user/deployment-v2/packagecloud.md b/user/deployment-v2/packagecloud.md index 7d6fbeceb02..9d6607c7994 100644 --- a/user/deployment-v2/packagecloud.md +++ b/user/deployment-v2/packagecloud.md @@ -8,78 +8,64 @@ provider: packagecloud Travis CI can automatically push your RPM, Deb, Deb source, or RubyGem package build artifacts to [packagecloud.io](https://packagecloud.io/) after a successful build. -For a minimal configuration, all you need to do is add the following to your `.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: packagecloud - repository: "YOUR REPO" - username: "YOUR USERNAME" - token: "YOUR TOKEN" - dist: "YOUR DIST" # like 'ubuntu/precise', or 'centos/5', if pushing deb or rpms + repository: + username: + token: + dist: # required for debian, rpm, and node.js packages, e.g. 'centos/5' ``` {: data-file=".travis.yml"} -Take note that your repository name should not have a forward slash in it. For example if your repository appears as `username / repo` on packagecloud.io, you should only put `repo` in the `repository:` option and put `username` in the `username:` option. +{% include deploy/providers/packagecloud.md %} -You can retrieve your api token by logging in and visiting the [API Token](https://packagecloud.io/api_token) page under Account Settings. +Note that your repository name should not have a forward slash in it: For +example if your repository appears as `username/repo` on packagecloud.io, the +`repository` option is `repo` and the `username` option is `username`. -This is the list of [supported distributions](https://packagecloud.io/docs#os_distro_version) for the 'dist' option. +You can retrieve your api token by logging in and visiting the [API Token](https://packagecloud.io/api_token) +page under Account Settings. -It is recommended to encrypt your auth token. Assuming you have the Travis CI command line client installed, you can do it like this: +The list of supported distributions for the `dist` option can be found +[here](https://packagecloud.io/docs#os_distro_version). -```bash -travis encrypt THE-API-TOKEN --add deploy.token -``` - -You can also have the `travis` tool set up everything for you: - -```bash -travis setup packagecloud -``` +### Specifying a package folder -Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. +By default, the packagecloud provider will scan the current directory and push +all supported packages. -### Releasing build artifacts - -After your tests ran and before the release, Travis CI will clean up any additional files and changes you made. - -Maybe that is not what you want, as you might generate some artifacts that are supposed to be released, too. There is now an option to skip the clean up: +You can specify which directory to scan from with the `local_dir` option. This +example scans from `./build` directory. ```yaml deploy: provider: packagecloud - skip_cleanup: true # ⋮ + local_dir: build ``` {: data-file=".travis.yml"} -### Specify package folder +Alternately, you can specify the `package_glob` argument to restrict +which files to scan. It defaults to `**/*` (recursively finding all package +files) but this may pick up other artifacts you don't want to release. -By default, the packagecloud provider will scan the current directory and push all supported packages. -You can specify which directory to scan from with the `local-dir` option. This example scans from `build` directory of your project. +For example, if you only want to push gems in the top level directory: ```yaml deploy: provider: packagecloud - local-dir: build # ⋮ -``` -{: data-file=".travis.yml"} - -Alternately, you may wish to specify the `package_glob` argument to restrict which files to scan. It defaults to `**/*` (recursively finding all package files) but this may pick up other artifacts you don't want to release. For example, if you only want to push gems in the top level directory: - -```yaml -deploy: - provider: packagecloud package_glob: "*.gem" - # ⋮ ``` {: data-file=".travis.yml"} ### A note about Debian source packages -If the packagecloud provider finds any `.dsc` files, it will scan it and try to locate it's contents within -the `local-dir` directory. Ensure the source package and it's contents are output to the same directory for it to work. +If the packagecloud provider finds any `.dsc` files, it will scan it and try to +locate it's contents within the `local_dir` directory. Ensure the source +package and it's contents are output to the same directory for it to work. {% include deploy/shared.md %} diff --git a/user/deployment-v2/pages.md b/user/deployment-v2/pages.md index d7ff43bfea4..24ed550e77f 100644 --- a/user/deployment-v2/pages.md +++ b/user/deployment-v2/pages.md @@ -5,64 +5,25 @@ deploy: v2 provider: 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. - -You will need to provide a [personal access -token](https://help.github.com/articles/creating-an-access-token-for-command-line-use/) -and set the deployment provider details in `.travis.yml`. +Travis CI can deploy to [GitHub Pages](https://pages.github.com/) after a successful build. For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: pages - skip_cleanup: true - github_token: $GITHUB_TOKEN # Set in the settings page of your repository, as a secure variable - keep_history: true + token: on: branch: master ``` {: data-file=".travis.yml"} -> 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. - -## Setting the GitHub token +{% include deploy/providers/pages.md %} -You'll need to generate a [personal access -token](https://help.github.com/articles/creating-an-access-token-for-command-line-use/) +You can use a [personal access token](https://help.github.com/articles/creating-an-access-token-for-command-line-use/) with the `public_repo` or `repo` scope (`repo` is required for private -repositories). Since the token should be private, -you'll want to pass it to Travis securely in your [repository -settings](/user/environment-variables#defining-variables-in-repository-settings) -or via [encrypted variables in -`.travis.yml`](/user/environment-variables#defining-encrypted-variables-in-travisyml). - -## Further configuration +repositories). -* `local_dir`: Directory to push to GitHub Pages, defaults to current directory. - Can be specified as an absolute path or a relative path from the current directory. -* `repo`: Repo slug, defaults to current repo. **Note:** The slug consists of username and repo name and is formatted like `user/repo-name`. -* `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 you to use the 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`. -* `deployment_file`: Optional, defaults to `false`, enables creation of deployment-info files. +## Setting the GitHub token {% include deploy/shared.md %} diff --git a/user/deployment-v2/puppetforge.md b/user/deployment-v2/puppetforge.md index ea7f33cf4b0..7d2420c57d7 100644 --- a/user/deployment-v2/puppetforge.md +++ b/user/deployment-v2/puppetforge.md @@ -7,31 +7,26 @@ provider: puppetforge Travis CI can automatically deploy your modules to [Puppet Forge ](https://forge.puppet.com/) or to your own Forge instance after a successful build. -To deploy to Puppet Forge, add your Puppet Forge username and your -[encrypted](/user/encryption-keys/#usage) Puppet Forge password to your -`.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: puppetforge - user: "" - password: - secure: "YOUR ENCRYPTED PASSWORD" + user: + password: ``` {: data-file=".travis.yml"} -## Deploying to a custom forge +{% include deploy/providers/puppetforge.md %} -To deploy to your own hosted Forge instance by adding it in the `url` key: +## Deploying to a custom Forge -You can explicitly set the name via the **app** option: +To deploy to your own hosted Forge instance by adding it in the `url` key: ```yaml deploy: provider: puppetforge - user: "" - password: - secure: "YOUR ENCRYPTED PASSWORD" + # ⋮ url: https://forgeapi.example.com/ ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/pypi.md b/user/deployment-v2/pypi.md index dd08031e1c0..a9ef6e04167 100644 --- a/user/deployment-v2/pypi.md +++ b/user/deployment-v2/pypi.md @@ -12,34 +12,17 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: pypi - user: "Your username" - password: "Your password" + username: + password: ``` {: data-file=".travis.yml"} -However, this would expose your PyPI password to the world. -We recommend you [encrypt](/user/encryption-keys/) your password and add it to your .travis.yml by running: +{% include deploy/providers/pypi.md %} -```bash -travis encrypt your-password-here --add deploy.password -``` - -If you are using travis-ci.com and not travis-ci.org, you need to add the `--com` argument to switch the Travis API endpoint: - -```bash -travis encrypt your-password-here --add deploy.password --com -``` - -> Note that if your PyPI password contains [special characters](/user/encryption-keys#note-on-escaping-certain-symbols) you need to escape them before encrypting your password. Some people have [reported difficulties](https://github.com/travis-ci/dpl/issues/377) connecting to PyPI with passwords containing anything except alphanumeric characters. - -```yaml -deploy: - provider: pypi - user: "Your username" - password: - secure: "Your encrypted password" -``` -{: data-file=".travis.yml"} +> Note that if your PyPI password contains [special > characters](/user/encryption-keys#note-on-escaping-certain-symbols) +> you need to escape them before encrypting your password. Some people have [reported +> difficulties](https://github.com/travis-ci/dpl/issues/377) connecting to PyPI +> with passwords containing anything except alphanumeric characters. ## Releasing to a self hosted PyPI @@ -48,8 +31,7 @@ To release to a different PyPI index: ```yaml deploy: provider: pypi - user: ... - password: ... + # ⋮ server: https://mypackageindex.com/index ``` {: data-file=".travis.yml"} @@ -62,8 +44,7 @@ If you would like to upload different distributions, specify them using the `dis ``` deploy: provider: pypi - user: ... - password: ... + # ⋮ distributions: "sdist bdist_wheel" # Your distributions here ``` @@ -71,10 +52,12 @@ If you specify `bdist_wheel` in the distributions, the `wheel` package will auto ## Upload artifacts only once -By default, Travis CI runs the deploy step for each `python` and `environment` that you specify. Many of these will generate competing build artifacts that will fail to upload to pypi with a message something like this: +By default, Travis CI runs the deploy step for each `python` and `environment` +that you specify. Many of these will generate competing build artifacts that +will fail to upload to pypi with a message something like this: ``` -HTTPError: 400 Client Error: File already exists. See https://pypi.org/help/#file-name-reuse for url: https://upload.pypi.org/legacy/ +HTTPError: 400 Client Error: File already exists. ``` To avoid this, use the `skip_existing` flag: @@ -82,8 +65,7 @@ To avoid this, use the `skip_existing` flag: ``` deploy: provider: pypi - user: ... - password: ... + # ⋮ skip_existing: true ``` diff --git a/user/deployment-v2/releases.md b/user/deployment-v2/releases.md index 77769ad2668..2930497c3f3 100644 --- a/user/deployment-v2/releases.md +++ b/user/deployment-v2/releases.md @@ -12,237 +12,180 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: releases - api_key: "GITHUB OAUTH TOKEN" - file: "FILE TO UPLOAD" - skip_cleanup: true + token: + file: on: tags: true ``` {: data-file=".travis.yml"} -This configuration will use the "GITHUB OAUTH TOKEN" to upload "FILE TO UPLOAD" -(relative to the working directory) on tagged builds. +This configuration will use the given GitHub OAuth token to upload the +specified file (relative to the working directory) on tagged builds. -> 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. +{% include deploy/providers/releases.md %} -GitHub Releases works with git tags, so it is important that -you understand how tags affect GitHub Releases. +## Authenticating with an OAuth token + +The recommended way to authenticate is to use a GitHub OAuth token with +the `public_repo` or `repo` scope to upload assets. + +The `public_repo` and `repo` scopes for GitHub oauth tokens grant write access +to all of a user's (public) repositories. For security, it's ideal for `token` +to have write access limited to only repositories where Travis deploys to +GitHub releases. The suggested workaround is to create a [machine +user](https://developer.github.com/v3/guides/managing-deploy-keys/#machine-users) +— a GitHub account that is granted write access on a per repository basis. + +## Authentication with a Username and Password -## Deploying only on tagged builds +You can also authenticate with your GitHub username and password using the +`user` and `password` options. -With [`on.tags: true`](/user/deployment/#conditional-releases-with-on), -your Releases deployment will trigger if and only if the build is a tagged -build. +```yaml +deploy: + provider: releases + user: + password: + # ⋮ +``` +{: data-file=".travis.yml"} ## Regular releases -When the `draft` option is not set to `true` (more on this below), a regular -release is created. -Regular releases require tags. -If you set `on.tags: true` (as the initial example in this document), this -requirement is met. +When the `draft` option is not set to `true` (see below), a regular release is +created. + +Regular releases require tags. If you set `on.tags: true` (as the initial +example in this document), this requirement is met. + +## Draft releases -## Draft releases with `draft: true` With ```yaml deploy: provider: releases - api_key: "GITHUB OAUTH TOKEN" - file: "FILE TO UPLOAD" - skip_cleanup: true + # ⋮ draft: true ``` {: data-file=".travis.yml"} -the resultant deployment is a draft Release that only repository collaborators +the resulting deployment is a draft release that only repository collaborators can see. + This gives you an opportunity to examine and edit the draft release. ## Setting the tag at deployment time GitHub Releases needs the present commit to be tagged at the deployment time. -If you set `on.tags: true`, the commit is guaranteed to have a tag. +If you set `on.tags: true`, the commit is guaranteed to have a tag. Depending +on the workflow, however, this is not desirable. -Depending on the workflow, however, this is not desirable. +In such cases, it is possible to postpone setting the tag until you have all +the information you need. A natural place to do this is `before_deploy`. -In such cases, it is possible to postpone setting the tag until -you have all the information you need. -A natural place to do this is `before_deploy`. For example: ```yaml - 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" - - export TRAVIS_TAG=${TRAVIS_TAG:-$(date +'%Y%m%d%H%M%S')-$(git log --format=%h -1)} - - git tag $TRAVIS_TAG - deploy: - provider: releases - api_key: "GITHUB OAUTH TOKEN" - file: "FILE TO UPLOAD" +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" + - export TRAVIS_TAG=${TRAVIS_TAG:-$(date +'%Y%m%d%H%M%S')-$(git log --format=%h -1)} + - git tag $TRAVIS_TAG +deploy: + provider: releases + # ⋮ ``` {: data-file=".travis.yml"} ### When tag is not set at deployment time -If the tag is still not set at the time of deployment, the deployment -provider attempts to match the current commit with a tag from remote, -and if one is found, uses it. +If the tag is still not set at the time of deployment, the deployment provider +attempts to match the current commit with a tag from remote, and if one is +found, uses it. This could be a problem if multiple tags are assigned to the current commit and the one you want is not matched. + In such a case, assign the tag you need (the method will depend on your use case) to `$TRAVIS_TAG` to get around the problem. -If the build commit does not match any tag at deployment time, GitHub creates one -when the release is created. +If the build commit does not match any tag at deployment time, GitHub creates +one when the release is created. + The GitHub-generated tags are of the form `untagged-*`, where `*` is a random hex string. -Notice that this tag is immediately available on GitHub, and thus -will trigger a new Travis CI build, unless it is prevented by -other means; for instance, by + +Notice that this tag is immediately available on GitHub, and thus will trigger +a new Travis CI build, unless it is prevented by other means; for instance, by [blocklisting `/^untagged/`](/user/customizing-the-build/#safelisting-or-blocklisting-branches). ## Overwrite existing files on the release -If you need to overwrite existing files, add `overwrite: true` to the `deploy` section of your `.travis.yml`. - -## Using Travis CI client to populate initial deployment configuration - -You can also use the [Travis CI command line client](https://github.com/travis-ci/travis.rb#installation) to configure your `.travis.yml`: - -```bash -travis setup releases -``` - -Or, if you're using a private repository or the GitHub Apps integration: - -```bash -travis setup releases --com -``` - -## 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. - -This results in something similar to: +If you need to overwrite existing files, use the option `overwrite`: ```yaml deploy: provider: releases - api_key: - secure: YOUR_API_KEY_ENCRYPTED - file: "FILE TO UPLOAD" - skip_cleanup: true - on: - tags: true -``` -{: data-file=".travis.yml"} - -**Warning:** the `public_repo` and `repo` scopes for GitHub oauth tokens grant write access to all of a user's (public) repositories. For security, it's ideal for `api_key` to have write access limited to only repositories where Travis deploys to GitHub releases. The suggested workaround is to create a [machine user](https://developer.github.com/v3/guides/managing-deploy-keys/#machine-users) — a dummy GitHub account that is granted write access on a per repository basis. - -## Authentication with a Username and Password - -You can also authenticate with your GitHub username and password using the `user` and `password` options. This is not recommended as it allows full access to your GitHub account but is simplest to setup. It is recommended to encrypt your password using `travis encrypt "GITHUB PASSWORD" --add deploy.password`. This example authenticates using a username and password. - -```yaml -deploy: - provider: releases - user: "GITHUB USERNAME" - password: "GITHUB PASSWORD" - file: "FILE TO UPLOAD" - skip_cleanup: true - on: - tags: true + # ⋮ + overwrite: true ``` {: data-file=".travis.yml"} ## Deploying to GitHub Enterprise -If you wish to upload assets to a GitHub Enterprise repository, you must override the `$OCTOKIT_API_ENDPOINT` environment variable with your GitHub Enterprise API endpoint: +In order to upload assets to a GitHub Enterprise repository, override the +`$OCTOKIT_API_ENDPOINT` environment variable with your GitHub Enterprise API +endpoint: ``` http(s)://"GITHUB ENTERPRISE HOSTNAME"/api/v3/ ``` -You can configure this in [Repository Settings](/user/environment-variables/#defining-variables-in-repository-settings) or via your `.travis.yml`: +You can configure this in [Repository Settings](/user/environment-variables/#defining-variables-in-repository-settings) +or via your `.travis.yml`: ```yaml env: global: - - OCTOKIT_API_ENDPOINT="GITHUB ENTERPRISE API ENDPOINT" + - OCTOKIT_API_ENDPOINT= ``` {: data-file=".travis.yml"} ## Uploading Multiple Files -You can upload multiple files using yml array notation. This example uploads two files. +You can upload multiple files using yml array notation. This example uploads +two files. ```yaml deploy: provider: releases - api_key: - secure: YOUR_API_KEY_ENCRYPTED + # ⋮ file: - - "FILE 1" - - "FILE 2" - skip_cleanup: true - on: - tags: true -``` -{: data-file=".travis.yml"} - -You can also enable wildcards by setting `file_glob` to `true`. This example -includes all files in a given directory. - -```yaml -deploy: - provider: releases - api_key: "GITHUB OAUTH TOKEN" - file_glob: true - file: directory/* - skip_cleanup: true - on: - tags: true + - file-1 + - file-2 ``` {: data-file=".travis.yml"} -You can use the glob pattern to recursively find the files: +The option `file` by default takes a glob, so you can express the same as: ```yaml deploy: provider: releases - api_key: "GITHUB OAUTH TOKEN" - file_glob: true - file: directory/**/* - skip_cleanup: true - on: - tags: true + # ⋮ + file: {file-1,file-2} ``` {: data-file=".travis.yml"} -Please note that all paths in `file` are relative to the current working directory, not to [`$TRAVIS_BUILD_DIR`](/user/environment-variables/#default-environment-variables). - -## Advanced options - -Options from `.travis.yml` are passed through to Octokit API's -[#create_release](https://octokit.github.io/octokit.rb/Octokit/Client/Releases.html#create_release-instance_method) -and [#update_release](https://octokit.github.io/octokit.rb/Octokit/Client/Releases.html#update_release-instance_method) methods, -so you can use any valid Octokit option, -unless they are treated separately in this document. - -These include: - -* `name` -* `body` -* `prerelease` (boolean) - -Note that formatting in `body` is [not preserved](https://github.com/travis-ci/dpl/issues/155). +Note that all paths in `file` are relative to the current working directory, not to [`$TRAVIS_BUILD_DIR`](/user/environment-variables/#default-environment-variables). ## Troubleshooting Git Submodules -GitHub Releases executes a number of git commands during deployment. For this reason, it is important that the working directory is set to the one for which the release will be created, which generally isn't a problem, but if you clone another repository during the build or use submodules, it is worth double checking. +GitHub Releases executes a number of git commands during deployment. For this +reason, it is important that the working directory is set to the one for which +the release will be created, which generally isn't a problem, but if you clone +another repository during the build or use submodules, it is worth double +checking. {% include deploy/shared.md %} diff --git a/user/deployment-v2/rubygems.md b/user/deployment-v2/rubygems.md index 91f8772fea6..2dbae8d72a9 100644 --- a/user/deployment-v2/rubygems.md +++ b/user/deployment-v2/rubygems.md @@ -7,7 +7,7 @@ provider: rubygems Travis CI can automatically release your Ruby gem to [RubyGems](https://rubygems.org/) after a successful build. -For a minimal configuration, all you need to do is add the following to your `.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: @@ -16,143 +16,85 @@ deploy: ``` {: data-file=".travis.yml"} -Most likely you would only want to deploy to RubyGems when a new version of -your package is cut. To do this, you can tell Travis CI to only deploy on -tagged commits, like so: +{% include deploy/providers/rubygems.md %} -```yaml -deploy: - provider: rubygems - api_key: "YOUR API KEY" - on: - tags: true -``` -{: data-file=".travis.yml"} - -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. -Assuming you have the Travis CI command line client installed, you can do it like this: - -```bash -travis encrypt --add deploy.api_key -``` - -You will be prompted to enter your api key on the command line. - -You can also have the `travis` tool set up everything for you: - -```bash -travis setup rubygems -``` - -Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. +You can retrieve your api key by following [these instructions](http://guides.rubygems.org/rubygems-org-api). ## 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. - -This gives your gem's users the option to download a newer, possibly more unstable version of your gem. +Instead of releasing for each new version of your gem, you can create a +[prerelease](http://guides.rubygems.org/patterns#prerelease-gems) for each +build. -To enable this, add the following line to your gemspec, underneath your existing `version` line: +This gives your gem's users the option to download a newer, possibly more +unstable version of your gem. To enable this, add the following line to your +gemspec, underneath your existing `version` line: ``` s.version = "#{s.version}-alpha-#{ENV['TRAVIS_BUILD_NUMBER']}" if ENV['TRAVIS'] ``` -If your gem's current version is 1.0.0, then Travis CI will create a prerelease with the version 1.0.0-alpha-20, where `20` is the build number. +If your gem's current version is `1.0.0`, the prerelease version will be +1.0.0-alpha-20, where `20` is the build number. -### Gem to release +### Specifying the gem name -By default, we will try to release a gem by the same name as the repository. For example, if you release a gem from the GitHub repository [travis-ci/travis-chat](https://github.com/travis-ci/travis-chat) without explicitly specify the name of the application, Travis CI will try to release the gem named *travis-chat*. +By default, we will try to release a gem by the same name as the repository name. -You can explicitly set the name via the **gem** option: +You can explicitly set the name via the `gem` option: ```yaml deploy: provider: rubygems - api_key: ... - gem: my-gem-123 + # ⋮ + gem: ``` {: data-file=".travis.yml"} -It is also possible to release different branches to different gems: +In order to release gems based on the current branch use separate deploy +configurations: ```yaml deploy: - provider: rubygems - api_key: ... - gem: - master: my-gem - old: my-gem-old + - provider: rubygems + # ⋮ + gem: + on: + branch: master + - provider: rubygems + # ⋮ + gem: + on: + branch: staging ``` {: data-file=".travis.yml"} -If these gems belong to different RubyGems accounts, you will have to do the same for the API key: - -```yaml -deploy: - provider: rubygems - api_key: - master: ... - old: ... - gem: - master: my-gem - old: my-gem-old -``` -{: data-file=".travis.yml"} - -### Gemspec to use - -If you like, you can specify can alternate option with the `gemspec` option: +Or using YAML references: ```yaml deploy: + - &deploy provider: rubygems - api_key: ... - gemspec: my-gemspec.gemspec + # ⋮ + gem: + on: + branch: master + - <<: *deploy + gem: + on: + branch: staging ``` {: data-file=".travis.yml"} -### Branch to release from - -If you have branch specific options, as [shown above](#gem-to-release), Travis CI will automatically figure out which branches to release from. Otherwise, it will only release from your **master** branch. - -You can also explicitly specify the branch to release from with the **on** option: - -```yaml -deploy: - provider: rubygems - api_key: ... - on: - branch: production -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure it to release from all branches: - -```yaml -deploy: - provider: rubygems - api_key: ... - on: - all_branches: true -``` -{: data-file=".travis.yml"} - -Builds triggered from Pull Requests will never trigger a release. - -### Releasing build artifacts - -After your tests ran and before the release, Travis CI will clean up any additional files and changes you made. +### Specifying the gemspec -Maybe that is not what you want, as you might generate some artifacts that are supposed to be released, too. There is now an option to skip the clean up: +You can specify the gemspec with the `gemspec` option: ```yaml deploy: provider: rubygems - api_key: ... - skip_cleanup: true + # ⋮ + gemspec: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/s3.md b/user/deployment-v2/s3.md index 4e5206f2746..151317d83c5 100644 --- a/user/deployment-v2/s3.md +++ b/user/deployment-v2/s3.md @@ -12,91 +12,63 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: s3 - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" + access_key_id: + secret_access_key: bucket: "S3 Bucket" ``` {: data-file=".travis.yml"} -You can find your [AWS Access Keys](https://console.aws.amazon.com/iam/home?#security_credential) in your Amazon Console. You should probably encrypt the secret key with the Travis CI command line: +You can find your [AWS Access Keys](https://console.aws.amazon.com/iam/home?#security_credential) in your Amazon Console. -```bash -travis encrypt --add deploy.secret_access_key -``` - -The previous example is almost certainly not ideal, as you probably want to upload your built binaries and documentation. Set `skip_cleanup` to `true` to prevent Travis CI from deleting your build artifacts. - -```yaml -deploy: - provider: s3 - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - bucket: "S3 Bucket" - skip_cleanup: true -``` -{: data-file=".travis.yml"} +> Note that deploying to S3 only adds files to your bucket, it does not remove them. If you need to remove outdated files you can do that manually in your Amazon S3 console. -> Note that deploying to S3 only adds files to your bucket, it does not remove them. If you need to remove deprecated files you can do that manually in your Amazon S3 console. +{% include deploy/providers/s3.md %} -Instead of adding your Amazon S3 configuration to your `.travis.yml` you can run the Travis CI command line in your project directory to set it up: - -```bash -$ travis setup s3 -``` - -Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. - -## S3 ACL via option +## Setting an ACL You can set the acl of your uploaded files via the `acl` option like this: ```yaml deploy: provider: s3 - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - bucket: "S3 Bucket" - skip_cleanup: true acl: public_read + # ⋮ ``` {: data-file=".travis.yml"} -Valid ACL values are: `private`, `public_read`, `public_read_write`, `authenticated_read`, `bucket_owner_read`, `bucket_owner_full_control`. The ACL defaults to `private`. +See [Known options](#known-options) for valid ACL values. -Note that, in order to set `acl`, the bucket's policy must allow such operations via the `s3:PutObjectAcl` action. -An example policy might look like this: +Note that, in order to set `acl`, the bucket's policy must allow such +operations via the `s3:PutObjectAcl` action. An example policy might look like +the following. Be sure to set up the principal and resources according to your +needs. ```json { - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "AllowPublicRead", - "Effect": "Allow", - "Principal": { - "AWS": "PRINCIPAL_ID" - }, - "Action": [ - "s3:AbortMultipartUpload", - "s3:DeleteObject", - "s3:GetObject", - "s3:GetObjectAcl", - "s3:PutObject", - "s3:PutObjectAcl" - ], - "Resource": "arn:aws:s3:::BUCKET_NAME/*" - } - ] + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "AllowPublicRead", + "Effect": "Allow", + "Principal": { + "AWS": "PRINCIPAL_ID" + }, + "Action": [ + "s3:AbortMultipartUpload", + "s3:DeleteObject", + "s3:GetObject", + "s3:GetObjectAcl", + "s3:PutObject", + "s3:PutObjectAcl" + ], + "Resource": "arn:aws:s3:::BUCKET_NAME/*" + } + ] } ``` -Be sure to set up the principal and resources according to your needs. - -## S3 ACL with bucket policy - -Another way to set ACL for your artifacts is via a S3 bucket policy. - -This bucket policy grants the public read permission: +Another way to set ACL for your artifacts is via a S3 bucket policy. For +example, the following policy grants the public read permission: ```json { @@ -115,52 +87,48 @@ This bucket policy grants the public read permission: ## S3 bucket regions -By default the region `us-east-1` is used when deploying to S3. If your bucket is hosted in a different region, deploying using the default region results in the following error. +By default the region `us-east-1` is used when deploying to S3. If your bucket +is hosted in a different region, deploying using the default region results in +the following error. ``` The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint. (AWS::S3::Errors::PermanentRedirect) ``` -This can be resolved by specifying your bucket's region using the `region` configuration. For example, this example uses the `eu-west-1` region. +This can be resolved by specifying your bucket's region using the `region` +configuration. For example, this example uses the `eu-west-1` region. ```yaml deploy: provider: s3 - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - bucket: "S3 Bucket" - skip_cleanup: true + # ⋮ region: eu-west-1 ``` {: data-file=".travis.yml"} ## Deploy From Only One Folder -Often, you don't want to upload your entire project to S3. You can tell Travis CI to only upload a single folder to S3. You can use the `local_dir` option to do so. This example uploads the `build` directory of your project to S3: +Often, you don't want to upload your entire project to S3. You can use the +`local_dir` option to only upload a single directory to S3. For example: ```yaml deploy: provider: s3 - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - bucket: "S3 Bucket" - skip_cleanup: true - local_dir: build + # ⋮ + local_dir: ./build ``` {: data-file=".travis.yml"} ## Deploy to a Specific S3 Folder -Often, you want to upload only to a specific S3 Folder. You can use the `upload-dir` option to set the S3 destination folder. This example uploads to the `travis-builds` folder of your s3 bucket. +Often, you want to upload only to a specific S3 Folder. You can use the +`upload-dir` option to set the S3 destination folder. For example: ```yaml deploy: provider: s3 - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - bucket: "S3 Bucket" - skip_cleanup: true + # ⋮ upload-dir: travis-builds ``` {: data-file=".travis.yml"} @@ -172,32 +140,30 @@ To upload to a S3 hosted website, to use this template to upload to your website ```yaml deploy: provider: s3 - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" + access_key_id: + secret_access_key: bucket: "S3 Bucket" - skip_cleanup: true region: "Bucket region" ``` {: data-file=".travis.yml"} -Remember that you need to set the bucket to have an ACL of `public` for anybody to be able to see your website. +Remember that you need to set the bucket to have an ACL of `public` for anybody +to be able to see your website. ## Deploy to Multiple Buckets: -If you want to upload to multiple buckets, you can do this: +If you want to upload to multiple buckets, use multiple deployment configurations: ```yaml deploy: - provider: s3 - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - bucket: "S3 Bucket" - skip_cleanup: true + access_key_id: + secret_access_key: + bucket: "One S3 Bucket" - provider: s3 - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - bucket: "Second S3 Bucket" - skip_cleanup: true + access_key_id: + secret_access_key: + bucket: "Another S3 Bucket" ``` {: data-file=".travis.yml"} @@ -206,76 +172,68 @@ deploy: You can deploy only when certain conditions are met. See [Conditional Releases with `on:`](/user/deployment#conditional-releases-with-on). -## Running commands before and after release - -Sometimes you want to run commands before or after releasing a gem. You can use the `before_deploy` and `after_deploy` steps for this. These will only be triggered if Travis CI is actually pushing a release. - -```yaml - before_deploy: "echo 'ready?'" - deploy: - .. - after_deploy: - - ./after_deploy_1.sh - - ./after_deploy_2.sh -``` -{: data-file=".travis.yml"} - -## Setting `Content-Encoding` header +## Setting the content encoding -S3 uploads can optionally set HTTP header `Content-Encoding`. -This header allows files to be sent compressed while retaining file extensions and -the associated MIME types. +S3 uploads can optionally set the HTTP header `Content-Encoding`. This header +allows files to be sent compressed while retaining file extensions and the +associated MIME types. To enable this feature, add: ```yaml deploy: provider: s3 - .. - detect_encoding: true # <== default is false + # ⋮ + detect_encoding: true ``` {: data-file=".travis.yml"} If the file is compressed with `gzip` or `compress`, it will be uploaded with the appropriate header. -## Setting `charset` on `Content-Type` header +## Setting the charset on the content-type -S3 can take a content-type header. Normally this doesn't include a character set as well. If you would like to add a character set, add the `default_text_charset` option with what you want it to be. For example: +S3 can take a content-type header. Normally this doesn't include a character +set as well. If you would like to add a character set, add the +`default_text_charset` option with what you want it to be. For example: ```yaml deploy: provider: s3 - .. - default_text_charset: 'utf-8' # Default is '' + # ⋮ + default_text_charset: utf-8 ``` {: data-file=".travis.yml"} ## HTTP cache control -S3 uploads can optionally set `Cache-Control` and `Expires` HTTP headers. +S3 uploads can optionally set `Cache-Control` and `Expires` HTTP headers. -Set HTTP header `Cache-Control` to suggest that the browser cache the file. Defaults to `no-cache`. Valid options are `no-cache`, `no-store`, `max-age=`, `s-maxage= no-transform`, `public`, `private`. +Set HTTP header `Cache-Control` to suggest that the browser cache the file. +Defaults to `no-cache`. Valid options are `no-cache`, `no-store`, +`max-age=`, `s-maxage= no-transform`, `public`, `private`. -`Expires` sets the date and time that the cached object is no longer cacheable. Defaults to not set. The date must be in the format `YYYY-MM-DD HH:MM:SS -ZONE`. +`Expires` sets the date and time that the cached object is no longer cacheable. +Defaults to not set. The date must be in the format `YYYY-MM-DD HH:MM:SS +-ZONE`. ```yaml deploy: provider: s3 - .. - cache_control: "max-age=31536000" + # ⋮ + cache_control: max-age=31536000 expires: "2012-12-21 00:00:00 -0000" ``` {: data-file=".travis.yml"} -## Set dot_match flag to upload files starting with a period +## Set upload files starting with a dot S3 uploads can be set to upload all files starting with a `.` ```yaml deploy: provider: s3 - .. + # ⋮ dot_match: true ``` {: data-file=".travis.yml"} @@ -289,7 +247,7 @@ by setting the `endpoint` key. ```yaml deploy: provider: s3 - .. + # ⋮ endpoint: https://nyc3.digitaloceanspaces.com ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/scalingo.md b/user/deployment-v2/scalingo.md index d1c2683597f..aa7337d6bfb 100644 --- a/user/deployment-v2/scalingo.md +++ b/user/deployment-v2/scalingo.md @@ -7,46 +7,24 @@ provider: scalingo Travis CI can automatically deploy your application to [Scalingo](https://scalingo.com/) application after a successful build. -Chose one of two ways to connect to your Scalingo account: - -* Using a [username and password](/user/deployment/scalingo/#connecting-using-a-username-and-password). -* Using an [api key](/user/deployment/scalingo/#connecting-using-an-api-key). - -## Connecting using a username and password - -Add your Scalingo username and your [encrypted](/user/encryption-keys/#usage) -Scalingo password to your `.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: scalingo - user: "" - password: - secure: "YOUR ENCRYPTED PASSWORD" + token: ``` -{: data-file=".travis.yml"} - -## Connecting using an api key -Add your [encrypted](/user/encryption-keys/#usage) -Scalingo `api_key` to your `.travis.yml`: +Alternatively, you can authenticate using a user name and password: ```yaml deploy: provider: scalingo - api_key: - secure: "YOUR ENCRYPTED PASSWORD" + user: + password: ``` {: data-file=".travis.yml"} -## Optional settings - -* `remote`: Remote url or git remote name of your git repository. The default - remote name is "scalingo". -* `branch`: Branch of your git repository to deploy. The default branch name is - "master". -* `app`: Only necessary if your repository does not contain the appropriate - remote. Specifying the `app` will add a remote to your local repository: `git - remote add git@scalingo.com:.git` +{% include deploy/providers/scalingo.md %} {% include deploy/shared.md %} diff --git a/user/deployment-v2/snap.md b/user/deployment-v2/snap.md new file mode 100644 index 00000000000..3b28ae3ac51 --- /dev/null +++ b/user/deployment-v2/snap.md @@ -0,0 +1,71 @@ +--- +title: Snap Store +layout: en +deploy: v2 +provider: snap +--- + +Travis CI can automatically upload and release your app to the [Snap Store](https://snapcraft.io) after a successful build. + +[Snapcraft](https://snapcraft.io/) lets you distribute to all Ubuntu releases +and a [growing set of Linux distributions](https://docs.snapcraft.io/core/install) +with a single artefact. + +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: snap + token: +``` +{: data-file=".travis.yml"} + +The `snap` value should be a string that matches exactly one file when the +deployment starts. If the name of the snap file is not known ahead of time, +you can use a shell glob pattern, e.g. `*.snap`. + +{% include deploy/providers/snap.md %} + +## Obtaining credentials + +If you have not done so already, [enable snap support](https://docs.snapcraft.io/core/install) on your system. + +```bash +sudo snap install snapcraft --classic +``` + +Login tokens can specify how, when, and where they can be used, thus minimising +damage from compromise. + +Export a token that can only upload this snap to the channel you are going to +upload to (in this example, `edge`): + +```bash +snapcraft export-login --snaps my-snap-name --channels edge - +``` + +The token will be printed out. + +> Note: The final `-` requests the login be exported to stdout instead of a file. It is required. + +> Note: The `edge` channel is intended for the bleeding edge: your every commit to master will be built and uploaded. + +## Using uploaded Snaps + +Your community of early-adopters and testers can install your app in any of the +[supported Linux distributions](https://docs.snapcraft.io/core/install) with: + +```bash +sudo snap install my-snap-name --edge +``` + +Each upload gets a monotonically increasing integer. When you're ready, you can +release one of these built commits to the stable channel for public discovery +in the [Snap storefront](https://snapcraft.io/store). For example, you could +promote the very first upload to stable: + +```bash +snapcraft release my-snap-name 1 stable +``` + +{% include deploy/shared.md %} diff --git a/user/deployment-v2/snaps.md b/user/deployment-v2/snaps.md deleted file mode 100644 index 94d02923cc1..00000000000 --- a/user/deployment-v2/snaps.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Snap Store -layout: en -deploy: v2 -provider: snap -permalink: /user/deployment/snaps/ ---- - -Travis CI can automatically upload and release your app to the [Snap Store](https://snapcraft.io) after a successful build. - -[Snapcraft](https://snapcraft.io/) lets you distribute to all Ubuntu releases and a [growing set of Linux distributions](https://docs.snapcraft.io/core/install) with a single artefact. You publish and update at your pace while still reaching everyone; you're not locked to the release cycle of Ubuntu or any other distribution. The updates apply automatically and roll back if anything goes wrong. They're secure; each update is cryptographically signed and is tamper-proof once installed. The applications are locked down using the same container primitives found in Docker and LXD. - -To upload your snap, add the following to your `.travis.yml`: - -```yaml -dist: xenial - -deploy: - provider: snap - snap: my_*.snap - channel: edge - skip_cleanup: true -``` -{: data-file=".travis.yml"} - -The `snap` value should be a string that matches exactly one file when the deployment starts. -If the name of the snap file is not known ahead of time, you can use a shell glob pattern, as shown -in the example above. - -## Providing credentials to upload the snap - -To upload snaps from Travis CI, export a Snap Store login token, and provide it as an environment variable -`$SNAP_TOKEN`. - -If you have not done so already, [enable snap support](https://docs.snapcraft.io/core/install) on your system. - -```bash -sudo snap install snapcraft --classic -``` - -Login tokens can specify how, when, and where they can be used, thus minimising damage from compromise. -For Travis CI, export a token that can only upload this snap to the channel you specified above (in this example, `edge`): - -```bash -snapcraft export-login --snaps my-snap-name --channels edge - -``` - -_Note: The final `-` requests the login be exported to stdout instead of a file. It is required._ - -The token will be printed out. - -_Note: The `edge` channel is intended for the bleeding edge: your every commit to master will be built and uploaded._ - -### Using the CLI client - -Using our [CLI client](https://github.com/travis-ci/travis.rb#readme), define `$SNAP_TOKEN`: - -```bash -# in the repository root -travis env set SNAP_TOKEN "" -``` - -### Using Settings page - -Equivalently, you can do this on the [Settings page](https://docs.travis-ci.com/user/environment-variables#defining-variables-in-repository-settings) of your repository at Travis CI. - -## Using uploaded Snap - -Your community of early-adopters and testers can install your app in any of the [supported Linux distributions](https://docs.snapcraft.io/core/install) with: - -```bash -sudo snap install my-snap-name --edge -``` - -Each upload gets a monotonically increasing integer. When you're ready, you can release one of these built commits to the stable channel for public discovery in the [Snap storefront](https://snapcraft.io/store). For example, you could promote the very first upload to stable: - -```bash -snapcraft release my-snap-name 1 stable -``` - -{% include deploy/shared.md %} diff --git a/user/deployment-v2/surge.md b/user/deployment-v2/surge.md index fd5ff6b8676..aca17a68300 100644 --- a/user/deployment-v2/surge.md +++ b/user/deployment-v2/surge.md @@ -5,30 +5,30 @@ deploy: v2 provider: surge --- -Travis CI can deploy your static files to [Surge.sh](https://surge.sh/) after a successful build. Builds triggered from Pull Requests will never trigger a deploy. +Travis CI can deploy to [Surge.sh](https://surge.sh/) after a successful build. -You will need to set 2 environment variables in your travis settings and set the deployment provider details in `.travis.yml` +For a minimal configuration, add the following to your `.travis.yml`: -### Environment variables - -- **SURGE_LOGIN**: Set it to the email address you use with Surge -- **SURGE_TOKEN**: Set it to your login token (get it by doing a `surge token`) - -### Configuration of `.travis.yml`: +```yaml +deploy: + provider: surge + domain: # required unless a file CNAME exists +``` +{: data-file=".travis.yml"} -- Add `surge` as deployment provider in `.travis.yml` +{% include deploy/providers/surge.md %} -- If your project folder is not the repo root you can set the deploy option `project` to define a path relative to repo root to deploy. +# Specifying a project directory -- If you do not have a `CNAME` file with the name of the domain to publish to you can set the deploy option `domain` with the domain to deploy to. +By default it is assumed that the repository root contains the files to deploy. -Example: +In order to specify a different project directory use the option `project`: ```yaml deploy: provider: surge - project: ./static/ - domain: example.surge.sh + # ⋮ + project: ./static ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/testfairy.md b/user/deployment-v2/testfairy.md index 4120debfd07..914b05d2bde 100644 --- a/user/deployment-v2/testfairy.md +++ b/user/deployment-v2/testfairy.md @@ -7,77 +7,46 @@ provider: testfairy Travis CI can automatically deploy your Android and iOS Apps to [TestFairy](https://www.testfairy.com/). -For a minimal configuration, add the following `deploy` key to your `.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: testfairy - api-key: "TESTFAIRY API KEY" - app-file: Path to the app file (APK/IPA) + api_key: + app_file: # APK/IPA ``` {: data-file=".travis.yml"} -You can find your API key on [TestFairy settings page](https://app.testfairy.com/settings/). - -Always encrypt your api-key. If you have the Travis CI command line client installed, run the following command in your repository directory: +{% include deploy/providers/testfairy.md %} -```bash -$ travis encrypt "YOUR API KEY" --add deploy.api-key -``` +You can find your API key on [TestFairy settings page](https://app.testfairy.com/settings/). ## Symbols file -Attach your symbols mapping file so TestFairy can de-obfuscate and symbolicate crash reports automatically. Set the `symbols-file` key to your `proguard_mapping.txt` file or to a zipped `.dSYM` file. +Attach your symbols mapping file so TestFairy can de-obfuscate and symbolicate +crash reports automatically. Set the `symbols-file` key to your +`proguard_mapping.txt` file or to a zipped `.dSYM` file. ```yaml deploy: provider: testfairy - api-key: "TESTFAIRY API KEY" - app-file: Path to the app file (APK/IPA) - symbols-file: Path to the symbols file + # ⋮ + symbols_file: Path to the symbols file ``` {: data-file=".travis.yml"} ## Invite testers automatically -To automatically invite testers upon build upload, specify a comma-separated list of groups in the `testers-groups` key. Set the `notify` key to `true` if you want to notify them via email: - -```yaml -deploy: - provider: testfairy - api-key: "TESTFAIRY API KEY" - app-file: Path to the app file (APK/IPA) - notify: false - testers-groups: qa-stuff,friends -``` -{: data-file=".travis.yml"} - -## More Options - -- **auto-update**: Upgrade previous installations to this version automatically. -- **max-duration**: Maximum session recording length, eg "60m". Default is "10m". -- **data-only-wifi**: Record video and metrics only when connected to wifi network. -- **video**: If true, Video recording settings "true", "false". Default is "true". -- **video-quality**: Video quality settings, "high", "medium" or "low". Default is "high". -- **screenshot-interval**: Seconds between video frames. Default "1" seconds. -- **record-on-background**: If true, data will be collected while the app on background. -- **metrics**: Comma-separated list of metrics to record. View list on [TestFairy Docs](https://docs.testfairy.com/API/Upload_API.html). - -For example: +To automatically invite testers upon build upload, specify a comma-separated +list of groups in the `testers-groups` key. Set the `notify` key to `true` if +you want to notify them via email: ```yaml deploy: provider: testfairy - api-key: "TESTFAIRY API KEY" - app-file: bin/MainActivity_release.apk - symbols-file: bin/proguard_mapping.txt - testers-groups: qa-stuff,friends - auto-update: true - screenshot-interval: 2 - video: true - video-quality: high - data-only-wifi: true - metrics: cpu,memory,network,phone-signal,logcat,gps,battery + # ⋮ + notify: true + testers_groups: qa-stuff,friends ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/transifex.md b/user/deployment-v2/transifex.md index 5006d8a8395..2012517513c 100644 --- a/user/deployment-v2/transifex.md +++ b/user/deployment-v2/transifex.md @@ -7,34 +7,18 @@ provider: transifex Travis CI supports uploading to [Transifex](https://www.transifex.com/). -A minimal configuration is: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: transifex - controller: transifex.transifexapps.com - username: "Transifex User Name" - password: "Transifex Password" - app: App_name - cli_version: vX.Y.Z # e.g. v2.7.0 being the latest at this time + controller: + username: + password: + app: ``` {: data-file=".travis.yml"} -It is recommended that you encrypt your password. -Assuming you have the Travis CI command line client installed, you can do it like this: - -```bash -$ travis encrypt "YOUR TRANSIFEX PASSWORD" --add deploy.password -``` - -You will be prompted to enter your api key on the command line. - -You can also have the `travis` tool set up everything for you: - -```bash -$ travis setup transifex -``` - -Keep in mind that the above command has to run in your project directory, so it can modify the `.travis.yml` for you. +{% include deploy/providers/testfairy.md %} {% include deploy/shared.md %} diff --git a/user/uploading-artifacts.md b/user/uploading-artifacts.md index 28a151c8773..bbcb2b78b65 100644 --- a/user/uploading-artifacts.md +++ b/user/uploading-artifacts.md @@ -46,7 +46,7 @@ the `addons.artifacts.paths` key like so: ```yaml addons: artifacts: - # ... + # ⋮ paths: - $(git ls-files -o | tr "\n" ":") - $(ls /var/log/*.log | tr "\n" ":") @@ -72,7 +72,7 @@ If you'd like to upload file from a specific directory, you can change your work ```yaml addons: artifacts: - # ... + # ⋮ working_dir: out ``` {: data-file=".travis.yml"} @@ -101,7 +101,7 @@ on debug logging. ```yaml addons: artifacts: - # ... + # ⋮ debug: true ``` {: data-file=".travis.yml"} From b757bff48fbdd5d0305bcb77b8dc7199c68a805c Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Mon, 9 Sep 2019 15:52:08 +0200 Subject: [PATCH 0223/1536] deploy v2 menu --- TODO | 32 +++++++++++++++++++ ...oy_providers_v2.yml => deployments_v2.yml} | 14 ++++---- _includes/sidebar.html | 9 ++++-- user/deployment-v2.md | 3 +- user/deployment-v2/cloudfoundry.md | 4 +-- user/deployment-v2/npm.md | 10 +++--- 6 files changed, 55 insertions(+), 17 deletions(-) create mode 100644 TODO rename _data/{deploy_providers_v2.yml => deployments_v2.yml} (85%) diff --git a/TODO b/TODO new file mode 100644 index 00000000000..8c18a18ebe7 --- /dev/null +++ b/TODO @@ -0,0 +1,32 @@ +- rewrite openshift +- bitballoon -> netlify drop +- pages: fix keep_history + +- check: Cargo will refuse to publish crates from a dirty working directory +- check: Deploy to a S3 hosted website +- check: Custom Heroku commands do not affect the Travis CI build status + +- generate "Shared Options" +- consider removing `run` from all providers except Heroku and Engine Yard +- add a shared note about --cleanup +- normalize and extract talking about secrets and settings +- normalize dasherized options to underscored options +- normalize placeholder values to or + +- for package/registry providers restore the note that they'll probably want to use tags +- discuss what to do with the "easy way" travis.rb setup + + +- add Cloud Files +- add AWS CloudFormation +- add Convox +- add Gleis + +Style: + +* besides the `provider` option, do not repeat options that have been discussed + in previous examples, only add options relevant to the example +* use `# ⋮`, not `# ...` +* use `access_key_id: ` for denoting key value pairs +* do not quote values that are not required to be quoted as per YAML +* use underscored option names, not dasherized option names diff --git a/_data/deploy_providers_v2.yml b/_data/deployments_v2.yml similarity index 85% rename from _data/deploy_providers_v2.yml rename to _data/deployments_v2.yml index 1fefc6482c0..0f3636f3400 100644 --- a/_data/deploy_providers_v2.yml +++ b/_data/deployments_v2.yml @@ -5,15 +5,14 @@ AWS Lambda: "/user/deployment-v2/lambda/" AWS OpsWorks: "/user/deployment-v2/opsworks/" AWS S3: "/user/deployment-v2/s3/" Azure Web Apps: "/user/deployment-v2/azure-web-apps/" -bintray: "/user/deployment-v2/bintray/" -BitBalloon: "/user/deployment-v2/bitballoon/" +Bintray: "/user/deployment-v2/bintray/" Bluemix CloudFoundry: "/user/deployment-v2/bluemixcloudfoundry/" Boxfuse: "/user/deployment-v2/boxfuse/" -Catalyze: "/user/deployment-v2/catalyze/" +Cargo: "/user/deployment-v2/cargo/" Chef Supermarket: "/user/deployment-v2/chefsupermarket/" Cloud 66: "/user/deployment-v2/cloud66/" -CloudFoundry: "/user/deployment-v2/cloudfoundry/" -Cargo: "/user/deployment-v2/cargo/" +Cloud Foundry: "/user/deployment-v2/cloudfoundry/" +Datica: "/user/deployment-v2/datica/" Engine Yard: "/user/deployment-v2/engineyard/" GitHub Pages: "/user/deployment-v2/pages/" GitHub Releases: "/user/deployment-v2/releases/" @@ -24,9 +23,10 @@ Hackage: "/user/deployment-v2/hackage/" Hephy: "/user/deployment-v2/hephy/" Heroku: "/user/deployment-v2/heroku/" Launchpad: "/user/deployment-v2/launchpad/" -npm: "/user/deployment-v2/npm/" +NPM: "/user/deployment-v2/npm/" +Netlify Drop: "/user/deployment-v2/netlify/" OpenShift: "/user/deployment-v2/openshift/" -packagecloud.io: "/user/deployment-v2/packagecloud/" +packagecloud: "/user/deployment-v2/packagecloud/" Puppet Forge: "/user/deployment-v2/puppetforge/" PyPI: "/user/deployment-v2/pypi/" Rackspace Cloud Files: "/user/deployment-v2/cloudfiles/" diff --git a/_includes/sidebar.html b/_includes/sidebar.html index 77c7cef7edf..c56f5effbca 100644 --- a/_includes/sidebar.html +++ b/_includes/sidebar.html @@ -70,7 +70,12 @@

        Programming Languages

        Deployments and Uploads

        diff --git a/user/deployment-v2.md b/user/deployment-v2.md index f82135512a0..05e6b9eeca4 100644 --- a/user/deployment-v2.md +++ b/user/deployment-v2.md @@ -1,6 +1,7 @@ --- title: Deployment (v2) layout: en +deploy: v2 --- >ALPHA This page documents deployments using the next major version dpl v2 which is in a preview release phase. Please see [the announcement blog post](https://blog.travis-ci.com/2019-08-27-deployment-tooling-dpl-v2-preview-release) on details about the release process. Documentation for dpl v1, the current default version, can be found [here](/user/deployment). @@ -11,7 +12,7 @@ layout: en Continuous Deployment to the following providers is supported:
          -{% for provider in site.data.deploy_providers_v2 %} +{% for provider in site.data.deployments_v2 %}
        • {{provider[0]}}
        • {% endfor %}
        diff --git a/user/deployment-v2/cloudfoundry.md b/user/deployment-v2/cloudfoundry.md index 86b2b158c89..267548a2674 100644 --- a/user/deployment-v2/cloudfoundry.md +++ b/user/deployment-v2/cloudfoundry.md @@ -1,11 +1,11 @@ --- -title: CloudFoundry Deployment +title: Cloud Foundry Deployment layout: en deploy: v2 provider: cloudfoundry --- -Travis CI can automatically upload your build to [CloudFoundry](https://run.pivotal.io/) after a successful build. +Travis CI can automatically upload your build to [Cloud Foundry](https://run.pivotal.io/) after a successful build. For a minimal configuration, add the following to your `.travis.yml`: diff --git a/user/deployment-v2/npm.md b/user/deployment-v2/npm.md index 80dc799da27..795a911e433 100644 --- a/user/deployment-v2/npm.md +++ b/user/deployment-v2/npm.md @@ -1,11 +1,11 @@ --- -title: npm Releasing +title: NPM Releases layout: en deploy: v2 provider: npm --- -Travis CI can automatically release your npm package to [npmjs.com][npmjs] +Travis CI can automatically release to [NPM](https://www.npmjs.com) or another npm-like registry after a successful build. For a minimal configuration, add the following to your `.travis.yml` (using NPM @@ -14,14 +14,14 @@ version 2+): ```yaml deploy: provider: npm - email: "YOUR_EMAIL_ADDRESS" - api_key: "YOUR_AUTH_TOKEN" + email: + api_token: ``` {: data-file=".travis.yml"} ## NPM auth token -Your NPM Auth Token can be obtained the following ways: +Your NPM Auth token can be obtained the following ways: Log in to your NPM account, and generate a new token at `https://www.npmjs.com/settings//tokens`, where `` is the name of your user account. From 43ef945efebe08ec3390e5e7ca08235ecebd8bac Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Mon, 9 Sep 2019 16:06:05 +0200 Subject: [PATCH 0224/1536] mention maturity status --- TODO | 2 - _includes/deploy/providers/anynines.md | 3 ++ _includes/deploy/providers/azure_web_apps.md | 3 ++ _includes/deploy/providers/bintray.md | 3 ++ .../deploy/providers/bluemixcloudfoundry.md | 3 ++ _includes/deploy/providers/boxfuse.md | 3 ++ _includes/deploy/providers/cargo.md | 3 ++ .../deploy/providers/chef_supermarket.md | 3 ++ _includes/deploy/providers/cloud66.md | 3 ++ _includes/deploy/providers/cloudfiles.md | 3 ++ _includes/deploy/providers/cloudformation.md | 3 ++ _includes/deploy/providers/cloudfoundry.md | 3 ++ _includes/deploy/providers/codedeploy.md | 3 ++ _includes/deploy/providers/convox.md | 3 ++ _includes/deploy/providers/datica.md | 3 ++ .../deploy/providers/elasticbeanstalk.md | 3 ++ _includes/deploy/providers/engineyard.md | 3 ++ _includes/deploy/providers/firebase.md | 3 ++ _includes/deploy/providers/gae.md | 3 ++ _includes/deploy/providers/gcs.md | 3 ++ _includes/deploy/providers/gleis.md | 3 ++ _includes/deploy/providers/hackage.md | 3 ++ _includes/deploy/providers/hephy.md | 3 ++ _includes/deploy/providers/heroku_api.md | 3 ++ _includes/deploy/providers/heroku_git.md | 3 ++ _includes/deploy/providers/lambda.md | 3 ++ _includes/deploy/providers/launchpad.md | 3 ++ _includes/deploy/providers/netlify.md | 3 ++ _includes/deploy/providers/npm.md | 3 ++ _includes/deploy/providers/openshift.md | 3 ++ _includes/deploy/providers/opsworks.md | 3 ++ _includes/deploy/providers/packagecloud.md | 3 ++ _includes/deploy/providers/pages_api.md | 3 ++ _includes/deploy/providers/pages_git.md | 3 ++ _includes/deploy/providers/puppetforge.md | 3 ++ _includes/deploy/providers/pypi.md | 3 ++ _includes/deploy/providers/releases.md | 3 ++ _includes/deploy/providers/rubygems.md | 3 ++ _includes/deploy/providers/s3.md | 3 ++ _includes/deploy/providers/scalingo.md | 3 ++ _includes/deploy/providers/script.md | 3 ++ _includes/deploy/providers/snap.md | 3 ++ _includes/deploy/providers/surge.md | 3 ++ _includes/deploy/providers/testfairy.md | 3 ++ _includes/deploy/providers/transifex.md | 3 ++ lib/dpl/docs.rb | 41 ++++++++++++++++++- 46 files changed, 172 insertions(+), 3 deletions(-) diff --git a/TODO b/TODO index 8c18a18ebe7..b43d86125ab 100644 --- a/TODO +++ b/TODO @@ -16,8 +16,6 @@ - for package/registry providers restore the note that they'll probably want to use tags - discuss what to do with the "easy way" travis.rb setup - -- add Cloud Files - add AWS CloudFormation - add Convox - add Gleis diff --git a/_includes/deploy/providers/anynines.md b/_includes/deploy/providers/anynines.md index a82d63e12b9..fb2af67d932 100644 --- a/_includes/deploy/providers/anynines.md +++ b/_includes/deploy/providers/anynines.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Anynines is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/azure_web_apps.md b/_includes/deploy/providers/azure_web_apps.md index 0fa476e2134..35917d03635 100644 --- a/_includes/deploy/providers/azure_web_apps.md +++ b/_includes/deploy/providers/azure_web_apps.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Azure Web Apps is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/bintray.md b/_includes/deploy/providers/bintray.md index 3691941aa3d..346b26111b8 100644 --- a/_includes/deploy/providers/bintray.md +++ b/_includes/deploy/providers/bintray.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Bintray is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/bluemixcloudfoundry.md b/_includes/deploy/providers/bluemixcloudfoundry.md index 30e31061a6c..8de48abb766 100644 --- a/_includes/deploy/providers/bluemixcloudfoundry.md +++ b/_includes/deploy/providers/bluemixcloudfoundry.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Bluemix Cloud Foundry is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/boxfuse.md b/_includes/deploy/providers/boxfuse.md index 6e59d7c812e..17c16b88812 100644 --- a/_includes/deploy/providers/boxfuse.md +++ b/_includes/deploy/providers/boxfuse.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Boxfuse is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/cargo.md b/_includes/deploy/providers/cargo.md index ad8d39797e1..23a1a0d6902 100644 --- a/_includes/deploy/providers/cargo.md +++ b/_includes/deploy/providers/cargo.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Cargo is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/chef_supermarket.md b/_includes/deploy/providers/chef_supermarket.md index 08a9f940770..82a02d5a202 100644 --- a/_includes/deploy/providers/chef_supermarket.md +++ b/_includes/deploy/providers/chef_supermarket.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Chef Supermarket is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/cloud66.md b/_includes/deploy/providers/cloud66.md index 5de21884cd8..7d88e76ac0a 100644 --- a/_includes/deploy/providers/cloud66.md +++ b/_includes/deploy/providers/cloud66.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Cloud66 is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/cloudfiles.md b/_includes/deploy/providers/cloudfiles.md index c91ba64bdcd..98f604c99dd 100644 --- a/_includes/deploy/providers/cloudfiles.md +++ b/_includes/deploy/providers/cloudfiles.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Cloud Files is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/cloudformation.md b/_includes/deploy/providers/cloudformation.md index b3d352c6e3b..9149806befb 100644 --- a/_includes/deploy/providers/cloudformation.md +++ b/_includes/deploy/providers/cloudformation.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to AWS CloudFormation is in **development**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/cloudfoundry.md b/_includes/deploy/providers/cloudfoundry.md index 3693a0b3d6c..32b79d5eac6 100644 --- a/_includes/deploy/providers/cloudfoundry.md +++ b/_includes/deploy/providers/cloudfoundry.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Cloud Foundry is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/codedeploy.md b/_includes/deploy/providers/codedeploy.md index 2c9a98f16aa..d0e0eaa31ef 100644 --- a/_includes/deploy/providers/codedeploy.md +++ b/_includes/deploy/providers/codedeploy.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to AWS Code Deploy is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/convox.md b/_includes/deploy/providers/convox.md index 196e34bbbbe..f34363389cc 100644 --- a/_includes/deploy/providers/convox.md +++ b/_includes/deploy/providers/convox.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Convox is in **development**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/datica.md b/_includes/deploy/providers/datica.md index 569d57dcbe2..607d8995ca7 100644 --- a/_includes/deploy/providers/datica.md +++ b/_includes/deploy/providers/datica.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Datica is in **development**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/elasticbeanstalk.md b/_includes/deploy/providers/elasticbeanstalk.md index c86b7854e8f..fe6602857f9 100644 --- a/_includes/deploy/providers/elasticbeanstalk.md +++ b/_includes/deploy/providers/elasticbeanstalk.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to AWS Elastic Beanstalk is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/engineyard.md b/_includes/deploy/providers/engineyard.md index cb4ee6d8f5c..537b6cd5c67 100644 --- a/_includes/deploy/providers/engineyard.md +++ b/_includes/deploy/providers/engineyard.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Engineyard is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/firebase.md b/_includes/deploy/providers/firebase.md index f02a55dcbe9..141dadb528b 100644 --- a/_includes/deploy/providers/firebase.md +++ b/_includes/deploy/providers/firebase.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Firebase is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/gae.md b/_includes/deploy/providers/gae.md index 15191b93cc0..a684877cb55 100644 --- a/_includes/deploy/providers/gae.md +++ b/_includes/deploy/providers/gae.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Google App Engine is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/gcs.md b/_includes/deploy/providers/gcs.md index 6a965bfeaa7..c5a7634e5bd 100644 --- a/_includes/deploy/providers/gcs.md +++ b/_includes/deploy/providers/gcs.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Google Cloud Store is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/gleis.md b/_includes/deploy/providers/gleis.md index 74b48446954..6fb9263ff5e 100644 --- a/_includes/deploy/providers/gleis.md +++ b/_includes/deploy/providers/gleis.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Gleis is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/hackage.md b/_includes/deploy/providers/hackage.md index 94adc721397..fae87d8f353 100644 --- a/_includes/deploy/providers/hackage.md +++ b/_includes/deploy/providers/hackage.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Hackage is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/hephy.md b/_includes/deploy/providers/hephy.md index b715d8af16f..4ffa8d463bf 100644 --- a/_includes/deploy/providers/hephy.md +++ b/_includes/deploy/providers/hephy.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Hephy is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/heroku_api.md b/_includes/deploy/providers/heroku_api.md index 0c80e25c12d..9b103b92cb7 100644 --- a/_includes/deploy/providers/heroku_api.md +++ b/_includes/deploy/providers/heroku_api.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Heroku API is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/heroku_git.md b/_includes/deploy/providers/heroku_git.md index 2c4864027de..4dd01a2e4e5 100644 --- a/_includes/deploy/providers/heroku_git.md +++ b/_includes/deploy/providers/heroku_git.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Heroku Git is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/lambda.md b/_includes/deploy/providers/lambda.md index cc5dfb522fd..255e507ae7f 100644 --- a/_includes/deploy/providers/lambda.md +++ b/_includes/deploy/providers/lambda.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to AWS Lambda is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/launchpad.md b/_includes/deploy/providers/launchpad.md index 47f04995597..1eff45b1ead 100644 --- a/_includes/deploy/providers/launchpad.md +++ b/_includes/deploy/providers/launchpad.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Launchpad is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/netlify.md b/_includes/deploy/providers/netlify.md index 9e07923435c..488303ad0a3 100644 --- a/_includes/deploy/providers/netlify.md +++ b/_includes/deploy/providers/netlify.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Netlify is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/npm.md b/_includes/deploy/providers/npm.md index cd86c17ea8b..24d910f05cc 100644 --- a/_includes/deploy/providers/npm.md +++ b/_includes/deploy/providers/npm.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to npm is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/openshift.md b/_includes/deploy/providers/openshift.md index 35069251537..4e02d123059 100644 --- a/_includes/deploy/providers/openshift.md +++ b/_includes/deploy/providers/openshift.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to OpenShift is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/opsworks.md b/_includes/deploy/providers/opsworks.md index 5995821e108..2171337f28d 100644 --- a/_includes/deploy/providers/opsworks.md +++ b/_includes/deploy/providers/opsworks.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to AWS OpsWorks is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/packagecloud.md b/_includes/deploy/providers/packagecloud.md index 68de9c61ff6..bf2ae671f2d 100644 --- a/_includes/deploy/providers/packagecloud.md +++ b/_includes/deploy/providers/packagecloud.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Packagecloud is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/pages_api.md b/_includes/deploy/providers/pages_api.md index 3cc6a870368..ec1a954531a 100644 --- a/_includes/deploy/providers/pages_api.md +++ b/_includes/deploy/providers/pages_api.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to GitHub Pages (API) is in **development**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/pages_git.md b/_includes/deploy/providers/pages_git.md index 211c7179453..fa3b246b4b4 100644 --- a/_includes/deploy/providers/pages_git.md +++ b/_includes/deploy/providers/pages_git.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to GitHub Pages is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/puppetforge.md b/_includes/deploy/providers/puppetforge.md index aa64d86ce44..906a316c507 100644 --- a/_includes/deploy/providers/puppetforge.md +++ b/_includes/deploy/providers/puppetforge.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Puppet Forge is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/pypi.md b/_includes/deploy/providers/pypi.md index c133debb34c..b93fb589189 100644 --- a/_includes/deploy/providers/pypi.md +++ b/_includes/deploy/providers/pypi.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to PyPI is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/releases.md b/_includes/deploy/providers/releases.md index c2193d4acbb..5ae9384b910 100644 --- a/_includes/deploy/providers/releases.md +++ b/_includes/deploy/providers/releases.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to GitHub Releases is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/rubygems.md b/_includes/deploy/providers/rubygems.md index 3a61fd08822..5a87a9f9316 100644 --- a/_includes/deploy/providers/rubygems.md +++ b/_includes/deploy/providers/rubygems.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Rubygems is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/s3.md b/_includes/deploy/providers/s3.md index 320cb00acff..6a979b8abd1 100644 --- a/_includes/deploy/providers/s3.md +++ b/_includes/deploy/providers/s3.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to AWS S3 is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/scalingo.md b/_includes/deploy/providers/scalingo.md index fe1025dc643..c8afb215520 100644 --- a/_includes/deploy/providers/scalingo.md +++ b/_includes/deploy/providers/scalingo.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Scalingo is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/script.md b/_includes/deploy/providers/script.md index d0a0ae477a2..6e2d1e7797b 100644 --- a/_includes/deploy/providers/script.md +++ b/_includes/deploy/providers/script.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Script is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/snap.md b/_includes/deploy/providers/snap.md index 606831d7c5d..e7859d7fce2 100644 --- a/_includes/deploy/providers/snap.md +++ b/_includes/deploy/providers/snap.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Snap is in **development**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/surge.md b/_includes/deploy/providers/surge.md index cc5122853d9..706608e6854 100644 --- a/_includes/deploy/providers/surge.md +++ b/_includes/deploy/providers/surge.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Surge is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/testfairy.md b/_includes/deploy/providers/testfairy.md index 41df0933964..7875137269d 100644 --- a/_includes/deploy/providers/testfairy.md +++ b/_includes/deploy/providers/testfairy.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to TestFairy is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/_includes/deploy/providers/transifex.md b/_includes/deploy/providers/transifex.md index b29945b1f8f..513119545da 100644 --- a/_includes/deploy/providers/transifex.md +++ b/_includes/deploy/providers/transifex.md @@ -1,3 +1,6 @@ +## Status + +Support for deployments to Transifex is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. ## Known options Use the following options to further configure the deployment: diff --git a/lib/dpl/docs.rb b/lib/dpl/docs.rb index 3d435d389e4..dac6988fe81 100644 --- a/lib/dpl/docs.rb +++ b/lib/dpl/docs.rb @@ -30,12 +30,18 @@ def path end def content - parts = [opts.to_s] + parts = [] + parts << maturity + parts << opts.to_s parts << env.to_s parts << secrets if secrets? parts.join("\n") end + def maturity + "## Status\n\n#{Maturity.new(cmd).to_s}" + end + def opts Opts.new(cmd) end @@ -53,6 +59,39 @@ def secrets? end end + class Maturity < Struct.new(:cmd) + STATUS = %i(dev alpha beta stable deprecated) + + MSG = { + dev: 'Support for deployments to %s is in **development**', + alpha: 'Support for deployments to %s is in **alpha**', + beta: 'Support for deployments to %s is in **beta**', + stable: 'Support for deployments to %s is *stable**', + deprecated: 'Support for deployments to %s is *deprecated**', + pre_stable: 'Please see [Maturity Levels](%s) for details.' + } + + URL = '/user/deployment-v2#maturity-levels' + + def to_s + msg = "#{MSG[status] % name}" + msg << ". #{MSG[:pre_stable] % URL}" if pre_stable? + msg + end + + def pre_stable? + STATUS.index(status) < STATUS.index(:stable) + end + + def name + cmd.full_name + end + + def status + cmd.status.status + end + end + class Opts < Struct.new(:cmd) STR = <<~str ## Known options From 7b1aa2e2c4f7db178573bed832077b1d79bbed8f Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Mon, 9 Sep 2019 16:28:34 +0200 Subject: [PATCH 0225/1536] move provider pages to a sub dir --- _data/deployments_v2.yml | 78 +++++++++---------- _includes/deploy/contributing.md | 2 +- lib/dpl/docs.rb | 1 - .../deployment-v2/{ => providers}/anynines.md | 0 .../{ => providers}/azure-web-apps.md | 0 user/deployment-v2/{ => providers}/bintray.md | 0 .../{ => providers}/bluemixcloudfoundry.md | 0 user/deployment-v2/{ => providers}/boxfuse.md | 0 user/deployment-v2/{ => providers}/cargo.md | 0 .../{ => providers}/chefsupermarket.md | 0 user/deployment-v2/{ => providers}/cloud66.md | 0 .../{ => providers}/cloudfiles.md | 0 .../{ => providers}/cloudfoundry.md | 0 .../{ => providers}/codedeploy.md | 0 user/deployment-v2/{ => providers}/custom.md | 0 user/deployment-v2/{ => providers}/datica.md | 0 .../{ => providers}/elasticbeanstalk.md | 0 .../{ => providers}/engineyard.md | 0 .../deployment-v2/{ => providers}/firebase.md | 0 user/deployment-v2/{ => providers}/gcs.md | 0 .../{ => providers}/google-app-engine.md | 0 user/deployment-v2/{ => providers}/hackage.md | 0 user/deployment-v2/{ => providers}/hephy.md | 0 user/deployment-v2/{ => providers}/heroku.md | 0 user/deployment-v2/{ => providers}/lambda.md | 0 .../{ => providers}/launchpad.md | 0 user/deployment-v2/{ => providers}/netlify.md | 0 user/deployment-v2/{ => providers}/npm.md | 0 .../{ => providers}/openshift.md | 0 .../deployment-v2/{ => providers}/opsworks.md | 0 .../{ => providers}/packagecloud.md | 0 user/deployment-v2/{ => providers}/pages.md | 0 .../{ => providers}/puppetforge.md | 0 user/deployment-v2/{ => providers}/pypi.md | 0 .../deployment-v2/{ => providers}/releases.md | 0 .../deployment-v2/{ => providers}/rubygems.md | 0 user/deployment-v2/{ => providers}/s3.md | 0 .../deployment-v2/{ => providers}/scalingo.md | 0 user/deployment-v2/{ => providers}/script.md | 0 user/deployment-v2/{ => providers}/snap.md | 0 user/deployment-v2/{ => providers}/surge.md | 0 .../{ => providers}/testfairy.md | 0 .../{ => providers}/transifex.md | 0 43 files changed, 40 insertions(+), 41 deletions(-) rename user/deployment-v2/{ => providers}/anynines.md (100%) rename user/deployment-v2/{ => providers}/azure-web-apps.md (100%) rename user/deployment-v2/{ => providers}/bintray.md (100%) rename user/deployment-v2/{ => providers}/bluemixcloudfoundry.md (100%) rename user/deployment-v2/{ => providers}/boxfuse.md (100%) rename user/deployment-v2/{ => providers}/cargo.md (100%) rename user/deployment-v2/{ => providers}/chefsupermarket.md (100%) rename user/deployment-v2/{ => providers}/cloud66.md (100%) rename user/deployment-v2/{ => providers}/cloudfiles.md (100%) rename user/deployment-v2/{ => providers}/cloudfoundry.md (100%) rename user/deployment-v2/{ => providers}/codedeploy.md (100%) rename user/deployment-v2/{ => providers}/custom.md (100%) rename user/deployment-v2/{ => providers}/datica.md (100%) rename user/deployment-v2/{ => providers}/elasticbeanstalk.md (100%) rename user/deployment-v2/{ => providers}/engineyard.md (100%) rename user/deployment-v2/{ => providers}/firebase.md (100%) rename user/deployment-v2/{ => providers}/gcs.md (100%) rename user/deployment-v2/{ => providers}/google-app-engine.md (100%) rename user/deployment-v2/{ => providers}/hackage.md (100%) rename user/deployment-v2/{ => providers}/hephy.md (100%) rename user/deployment-v2/{ => providers}/heroku.md (100%) rename user/deployment-v2/{ => providers}/lambda.md (100%) rename user/deployment-v2/{ => providers}/launchpad.md (100%) rename user/deployment-v2/{ => providers}/netlify.md (100%) rename user/deployment-v2/{ => providers}/npm.md (100%) rename user/deployment-v2/{ => providers}/openshift.md (100%) rename user/deployment-v2/{ => providers}/opsworks.md (100%) rename user/deployment-v2/{ => providers}/packagecloud.md (100%) rename user/deployment-v2/{ => providers}/pages.md (100%) rename user/deployment-v2/{ => providers}/puppetforge.md (100%) rename user/deployment-v2/{ => providers}/pypi.md (100%) rename user/deployment-v2/{ => providers}/releases.md (100%) rename user/deployment-v2/{ => providers}/rubygems.md (100%) rename user/deployment-v2/{ => providers}/s3.md (100%) rename user/deployment-v2/{ => providers}/scalingo.md (100%) rename user/deployment-v2/{ => providers}/script.md (100%) rename user/deployment-v2/{ => providers}/snap.md (100%) rename user/deployment-v2/{ => providers}/surge.md (100%) rename user/deployment-v2/{ => providers}/testfairy.md (100%) rename user/deployment-v2/{ => providers}/transifex.md (100%) diff --git a/_data/deployments_v2.yml b/_data/deployments_v2.yml index 0f3636f3400..d5e554f4216 100644 --- a/_data/deployments_v2.yml +++ b/_data/deployments_v2.yml @@ -1,39 +1,39 @@ -anynines: "/user/deployment-v2/anynines/" -AWS CodeDeploy: "/user/deployment-v2/codedeploy/" -AWS Elastic Beanstalk: "/user/deployment-v2/elasticbeanstalk/" -AWS Lambda: "/user/deployment-v2/lambda/" -AWS OpsWorks: "/user/deployment-v2/opsworks/" -AWS S3: "/user/deployment-v2/s3/" -Azure Web Apps: "/user/deployment-v2/azure-web-apps/" -Bintray: "/user/deployment-v2/bintray/" -Bluemix CloudFoundry: "/user/deployment-v2/bluemixcloudfoundry/" -Boxfuse: "/user/deployment-v2/boxfuse/" -Cargo: "/user/deployment-v2/cargo/" -Chef Supermarket: "/user/deployment-v2/chefsupermarket/" -Cloud 66: "/user/deployment-v2/cloud66/" -Cloud Foundry: "/user/deployment-v2/cloudfoundry/" -Datica: "/user/deployment-v2/datica/" -Engine Yard: "/user/deployment-v2/engineyard/" -GitHub Pages: "/user/deployment-v2/pages/" -GitHub Releases: "/user/deployment-v2/releases/" -Google App Engine: "/user/deployment-v2/google-app-engine/" -Google Cloud Storage: "/user/deployment-v2/gcs/" -Google Firebase: "/user/deployment-v2/firebase/" -Hackage: "/user/deployment-v2/hackage/" -Hephy: "/user/deployment-v2/hephy/" -Heroku: "/user/deployment-v2/heroku/" -Launchpad: "/user/deployment-v2/launchpad/" -NPM: "/user/deployment-v2/npm/" -Netlify Drop: "/user/deployment-v2/netlify/" -OpenShift: "/user/deployment-v2/openshift/" -packagecloud: "/user/deployment-v2/packagecloud/" -Puppet Forge: "/user/deployment-v2/puppetforge/" -PyPI: "/user/deployment-v2/pypi/" -Rackspace Cloud Files: "/user/deployment-v2/cloudfiles/" -RubyGems: "/user/deployment-v2/rubygems/" -Scalingo: "/user/deployment-v2/scalingo/" -Script: "/user/deployment-v2/script/" -Snap Store: "/user/deployment-v2/snaps/" -Surge.sh: "/user/deployment-v2/surge/" -TestFairy: "/user/deployment-v2/testfairy/" -Transifex: "/user/deployment-v2/transifex/" +anynines: "/user/deployment-v2/providers/anynines/" +AWS CodeDeploy: "/user/deployment-v2/providers/codedeploy/" +AWS Elastic Beanstalk: "/user/deployment-v2/providers/elasticbeanstalk/" +AWS Lambda: "/user/deployment-v2/providers/lambda/" +AWS OpsWorks: "/user/deployment-v2/providers/opsworks/" +AWS S3: "/user/deployment-v2/providers/s3/" +Azure Web Apps: "/user/deployment-v2/providers/azure-web-apps/" +Bintray: "/user/deployment-v2/providers/bintray/" +Bluemix CloudFoundry: "/user/deployment-v2/providers/bluemixcloudfoundry/" +Boxfuse: "/user/deployment-v2/providers/boxfuse/" +Cargo: "/user/deployment-v2/providers/cargo/" +Chef Supermarket: "/user/deployment-v2/providers/chefsupermarket/" +Cloud 66: "/user/deployment-v2/providers/cloud66/" +Cloud Foundry: "/user/deployment-v2/providers/cloudfoundry/" +Datica: "/user/deployment-v2/providers/datica/" +Engine Yard: "/user/deployment-v2/providers/engineyard/" +GitHub Pages: "/user/deployment-v2/providers/pages/" +GitHub Releases: "/user/deployment-v2/providers/releases/" +Google App Engine: "/user/deployment-v2/providers/google-app-engine/" +Google Cloud Storage: "/user/deployment-v2/providers/gcs/" +Google Firebase: "/user/deployment-v2/providers/firebase/" +Hackage: "/user/deployment-v2/providers/hackage/" +Hephy: "/user/deployment-v2/providers/hephy/" +Heroku: "/user/deployment-v2/providers/heroku/" +Launchpad: "/user/deployment-v2/providers/launchpad/" +NPM: "/user/deployment-v2/providers/npm/" +Netlify Drop: "/user/deployment-v2/providers/netlify/" +OpenShift: "/user/deployment-v2/providers/openshift/" +packagecloud: "/user/deployment-v2/providers/packagecloud/" +Puppet Forge: "/user/deployment-v2/providers/puppetforge/" +PyPI: "/user/deployment-v2/providers/pypi/" +Rackspace Cloud Files: "/user/deployment-v2/providers/cloudfiles/" +RubyGems: "/user/deployment-v2/providers/rubygems/" +Scalingo: "/user/deployment-v2/providers/scalingo/" +Script: "/user/deployment-v2/providers/script/" +Snap Store: "/user/deployment-v2/providers/snaps/" +Surge.sh: "/user/deployment-v2/providers/surge/" +TestFairy: "/user/deployment-v2/providers/testfairy/" +Transifex: "/user/deployment-v2/providers/transifex/" diff --git a/_includes/deploy/contributing.md b/_includes/deploy/contributing.md index 6f0d97e8f72..1f3836a7e20 100644 --- a/_includes/deploy/contributing.md +++ b/_includes/deploy/contributing.md @@ -1,4 +1,4 @@ -## Contributing to dpl +## Running an edge version If you contribute to or experiment with [dpl](https://github.com/travis-ci/dpl), our deployment tooling, make sure you use the edge version from GitHub: diff --git a/lib/dpl/docs.rb b/lib/dpl/docs.rb index dac6988fe81..f4be28f64ab 100644 --- a/lib/dpl/docs.rb +++ b/lib/dpl/docs.rb @@ -8,7 +8,6 @@ module Docs def write providers.each do |cmd| - # next unless cmd.registry_key == :s3 Provider.new(cmd).write end end diff --git a/user/deployment-v2/anynines.md b/user/deployment-v2/providers/anynines.md similarity index 100% rename from user/deployment-v2/anynines.md rename to user/deployment-v2/providers/anynines.md diff --git a/user/deployment-v2/azure-web-apps.md b/user/deployment-v2/providers/azure-web-apps.md similarity index 100% rename from user/deployment-v2/azure-web-apps.md rename to user/deployment-v2/providers/azure-web-apps.md diff --git a/user/deployment-v2/bintray.md b/user/deployment-v2/providers/bintray.md similarity index 100% rename from user/deployment-v2/bintray.md rename to user/deployment-v2/providers/bintray.md diff --git a/user/deployment-v2/bluemixcloudfoundry.md b/user/deployment-v2/providers/bluemixcloudfoundry.md similarity index 100% rename from user/deployment-v2/bluemixcloudfoundry.md rename to user/deployment-v2/providers/bluemixcloudfoundry.md diff --git a/user/deployment-v2/boxfuse.md b/user/deployment-v2/providers/boxfuse.md similarity index 100% rename from user/deployment-v2/boxfuse.md rename to user/deployment-v2/providers/boxfuse.md diff --git a/user/deployment-v2/cargo.md b/user/deployment-v2/providers/cargo.md similarity index 100% rename from user/deployment-v2/cargo.md rename to user/deployment-v2/providers/cargo.md diff --git a/user/deployment-v2/chefsupermarket.md b/user/deployment-v2/providers/chefsupermarket.md similarity index 100% rename from user/deployment-v2/chefsupermarket.md rename to user/deployment-v2/providers/chefsupermarket.md diff --git a/user/deployment-v2/cloud66.md b/user/deployment-v2/providers/cloud66.md similarity index 100% rename from user/deployment-v2/cloud66.md rename to user/deployment-v2/providers/cloud66.md diff --git a/user/deployment-v2/cloudfiles.md b/user/deployment-v2/providers/cloudfiles.md similarity index 100% rename from user/deployment-v2/cloudfiles.md rename to user/deployment-v2/providers/cloudfiles.md diff --git a/user/deployment-v2/cloudfoundry.md b/user/deployment-v2/providers/cloudfoundry.md similarity index 100% rename from user/deployment-v2/cloudfoundry.md rename to user/deployment-v2/providers/cloudfoundry.md diff --git a/user/deployment-v2/codedeploy.md b/user/deployment-v2/providers/codedeploy.md similarity index 100% rename from user/deployment-v2/codedeploy.md rename to user/deployment-v2/providers/codedeploy.md diff --git a/user/deployment-v2/custom.md b/user/deployment-v2/providers/custom.md similarity index 100% rename from user/deployment-v2/custom.md rename to user/deployment-v2/providers/custom.md diff --git a/user/deployment-v2/datica.md b/user/deployment-v2/providers/datica.md similarity index 100% rename from user/deployment-v2/datica.md rename to user/deployment-v2/providers/datica.md diff --git a/user/deployment-v2/elasticbeanstalk.md b/user/deployment-v2/providers/elasticbeanstalk.md similarity index 100% rename from user/deployment-v2/elasticbeanstalk.md rename to user/deployment-v2/providers/elasticbeanstalk.md diff --git a/user/deployment-v2/engineyard.md b/user/deployment-v2/providers/engineyard.md similarity index 100% rename from user/deployment-v2/engineyard.md rename to user/deployment-v2/providers/engineyard.md diff --git a/user/deployment-v2/firebase.md b/user/deployment-v2/providers/firebase.md similarity index 100% rename from user/deployment-v2/firebase.md rename to user/deployment-v2/providers/firebase.md diff --git a/user/deployment-v2/gcs.md b/user/deployment-v2/providers/gcs.md similarity index 100% rename from user/deployment-v2/gcs.md rename to user/deployment-v2/providers/gcs.md diff --git a/user/deployment-v2/google-app-engine.md b/user/deployment-v2/providers/google-app-engine.md similarity index 100% rename from user/deployment-v2/google-app-engine.md rename to user/deployment-v2/providers/google-app-engine.md diff --git a/user/deployment-v2/hackage.md b/user/deployment-v2/providers/hackage.md similarity index 100% rename from user/deployment-v2/hackage.md rename to user/deployment-v2/providers/hackage.md diff --git a/user/deployment-v2/hephy.md b/user/deployment-v2/providers/hephy.md similarity index 100% rename from user/deployment-v2/hephy.md rename to user/deployment-v2/providers/hephy.md diff --git a/user/deployment-v2/heroku.md b/user/deployment-v2/providers/heroku.md similarity index 100% rename from user/deployment-v2/heroku.md rename to user/deployment-v2/providers/heroku.md diff --git a/user/deployment-v2/lambda.md b/user/deployment-v2/providers/lambda.md similarity index 100% rename from user/deployment-v2/lambda.md rename to user/deployment-v2/providers/lambda.md diff --git a/user/deployment-v2/launchpad.md b/user/deployment-v2/providers/launchpad.md similarity index 100% rename from user/deployment-v2/launchpad.md rename to user/deployment-v2/providers/launchpad.md diff --git a/user/deployment-v2/netlify.md b/user/deployment-v2/providers/netlify.md similarity index 100% rename from user/deployment-v2/netlify.md rename to user/deployment-v2/providers/netlify.md diff --git a/user/deployment-v2/npm.md b/user/deployment-v2/providers/npm.md similarity index 100% rename from user/deployment-v2/npm.md rename to user/deployment-v2/providers/npm.md diff --git a/user/deployment-v2/openshift.md b/user/deployment-v2/providers/openshift.md similarity index 100% rename from user/deployment-v2/openshift.md rename to user/deployment-v2/providers/openshift.md diff --git a/user/deployment-v2/opsworks.md b/user/deployment-v2/providers/opsworks.md similarity index 100% rename from user/deployment-v2/opsworks.md rename to user/deployment-v2/providers/opsworks.md diff --git a/user/deployment-v2/packagecloud.md b/user/deployment-v2/providers/packagecloud.md similarity index 100% rename from user/deployment-v2/packagecloud.md rename to user/deployment-v2/providers/packagecloud.md diff --git a/user/deployment-v2/pages.md b/user/deployment-v2/providers/pages.md similarity index 100% rename from user/deployment-v2/pages.md rename to user/deployment-v2/providers/pages.md diff --git a/user/deployment-v2/puppetforge.md b/user/deployment-v2/providers/puppetforge.md similarity index 100% rename from user/deployment-v2/puppetforge.md rename to user/deployment-v2/providers/puppetforge.md diff --git a/user/deployment-v2/pypi.md b/user/deployment-v2/providers/pypi.md similarity index 100% rename from user/deployment-v2/pypi.md rename to user/deployment-v2/providers/pypi.md diff --git a/user/deployment-v2/releases.md b/user/deployment-v2/providers/releases.md similarity index 100% rename from user/deployment-v2/releases.md rename to user/deployment-v2/providers/releases.md diff --git a/user/deployment-v2/rubygems.md b/user/deployment-v2/providers/rubygems.md similarity index 100% rename from user/deployment-v2/rubygems.md rename to user/deployment-v2/providers/rubygems.md diff --git a/user/deployment-v2/s3.md b/user/deployment-v2/providers/s3.md similarity index 100% rename from user/deployment-v2/s3.md rename to user/deployment-v2/providers/s3.md diff --git a/user/deployment-v2/scalingo.md b/user/deployment-v2/providers/scalingo.md similarity index 100% rename from user/deployment-v2/scalingo.md rename to user/deployment-v2/providers/scalingo.md diff --git a/user/deployment-v2/script.md b/user/deployment-v2/providers/script.md similarity index 100% rename from user/deployment-v2/script.md rename to user/deployment-v2/providers/script.md diff --git a/user/deployment-v2/snap.md b/user/deployment-v2/providers/snap.md similarity index 100% rename from user/deployment-v2/snap.md rename to user/deployment-v2/providers/snap.md diff --git a/user/deployment-v2/surge.md b/user/deployment-v2/providers/surge.md similarity index 100% rename from user/deployment-v2/surge.md rename to user/deployment-v2/providers/surge.md diff --git a/user/deployment-v2/testfairy.md b/user/deployment-v2/providers/testfairy.md similarity index 100% rename from user/deployment-v2/testfairy.md rename to user/deployment-v2/providers/testfairy.md diff --git a/user/deployment-v2/transifex.md b/user/deployment-v2/providers/transifex.md similarity index 100% rename from user/deployment-v2/transifex.md rename to user/deployment-v2/providers/transifex.md From 725d99509c4be6f5c103697454c223ccb221fe1a Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Mon, 9 Sep 2019 16:49:30 +0200 Subject: [PATCH 0226/1536] restructure --- TODO | 24 ++-- _includes/deploy/before_after_deploy.md | 13 +- _includes/deploy/branch.md | 4 +- _includes/deploy/conditional.md | 122 +---------------- _includes/deploy/conditional_link.md | 5 - _includes/deploy/{contributing.md => edge.md} | 0 _includes/deploy/multiple_targets.md | 6 +- _includes/deploy/overview.md | 10 -- _includes/deploy/shared.md | 13 +- _layouts/en.html | 4 +- user/deployment-v2.md | 14 +- user/deployment-v2/conditional.md | 125 ++++++++++++++++++ user/deployment-v2/{providers => }/custom.md | 7 +- user/deployment-v2/providers/pages.md | 2 +- 14 files changed, 175 insertions(+), 174 deletions(-) delete mode 100644 _includes/deploy/conditional_link.md rename _includes/deploy/{contributing.md => edge.md} (100%) create mode 100644 user/deployment-v2/conditional.md rename user/deployment-v2/{providers => }/custom.md (91%) diff --git a/TODO b/TODO index b43d86125ab..fd4842dfcad 100644 --- a/TODO +++ b/TODO @@ -1,19 +1,21 @@ -- rewrite openshift -- bitballoon -> netlify drop -- pages: fix keep_history - -- check: Cargo will refuse to publish crates from a dirty working directory -- check: Deploy to a S3 hosted website -- check: Custom Heroku commands do not affect the Travis CI build status +x bitballoon -> netlify drop +x rewrite openshift +x normalize and extract talking about secrets and settings +x normalize dasherized options to underscored options +x normalize placeholder values to or +x pages: fix keep_history - generate "Shared Options" + - consider removing `run` from all providers except Heroku and Engine Yard -- add a shared note about --cleanup -- normalize and extract talking about secrets and settings -- normalize dasherized options to underscored options -- normalize placeholder values to or +- add cleanup=true to the include on providers where this is relevant - for package/registry providers restore the note that they'll probably want to use tags + +- check: Cargo will refuse to publish crates from a dirty working directory +- check: Deploy to a S3 hosted website +- check: Custom Heroku commands do not affect the Travis CI build status + - discuss what to do with the "easy way" travis.rb setup - add AWS CloudFormation diff --git a/_includes/deploy/before_after_deploy.md b/_includes/deploy/before_after_deploy.md index 55e9e8f7b58..a3d0581ed7a 100644 --- a/_includes/deploy/before_after_deploy.md +++ b/_includes/deploy/before_after_deploy.md @@ -1,13 +1,14 @@ -## Running commands before and after deploy +## Running commands before and after the deploy step -Sometimes you want to run commands before or after deploying. You can use the -`before_deploy` and `after_deploy` steps for this. These will only be triggered -if Travis CI is actually deploying. +Sometimes you want to run commands before or after deploying. + +You can use the `before_deploy` and `after_deploy` steps for this. These will +only be triggered if Travis CI is actually deploying. ```yaml -before_deploy: "echo 'ready?'" +before_deploy: "echo ready?" deploy: - # .. + # ⋮ after_deploy: - ./after_deploy_1.sh - ./after_deploy_2.sh diff --git a/_includes/deploy/branch.md b/_includes/deploy/branch.md index 1f759e6c0c4..89e3c3d29ab 100644 --- a/_includes/deploy/branch.md +++ b/_includes/deploy/branch.md @@ -29,7 +29,7 @@ By default, Travis CI will only deploy from your `master` branch. You can specif ```yaml deploy: - ... + # ⋮ on: myProductionBranch ``` {: data-file=".travis.yml"} @@ -38,7 +38,7 @@ To deploy from all branches set the deploy->on option `all_branches` to `true` ```yaml deploy: - ... + # ⋮ on: all_branches: true ``` diff --git a/_includes/deploy/conditional.md b/_includes/deploy/conditional.md index 6647da77c7f..5f2bbb18ca8 100644 --- a/_includes/deploy/conditional.md +++ b/_includes/deploy/conditional.md @@ -1,121 +1,5 @@ -## Conditional Releases with `on:` - -Set your build to deploy only in specific circumstances by configuring the `on:` key for any deployment provider. - -```yaml -deploy: - provider: s3 - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - bucket: "S3 Bucket" - skip_cleanup: true - on: - branch: release - condition: $MY_ENV = super_awesome -``` -{: data-file=".travis.yml"} - -When *all* conditions specified in the `on:` section are met, your build will deploy. - -Use the following options to configure conditional deployment: - -* `repo`: in the form `owner_name/repo_name`. Deploy only when the build occurs on a particular repository. For example: - - ```yaml - deploy: - provider: s3 - on: - repo: travis-ci/dpl - ``` - {: data-file=".travis.yml"} - -* `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. - -* `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. - -* `condition`: deploy when *a single* bash condition evaluates to `true`. This must be a string value and is equivalent to `if [[ ]]; then ; fi`. For example, `$CC = gcc`. - -* `tags` can be `true`, `false` or any other string: - - * `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. - * `tags: false`: deployment is triggered if and only if `$TRAVIS_TAG` is empty. - This also causes the `branch` condition to be ignored. - * 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 Deployment - -This example deploys to Appfog only from the `staging` branch when the test has run on Node.js version 0.11. - -```yaml -language: node_js -deploy: - provider: appfog - user: ... - api_key: ... - on: - branch: staging - node_js: '0.11' # this should be quoted; otherwise, 0.10 would not work -``` -{: data-file=".travis.yml"} - -The next example deploys using a custom script `deploy.sh`, only for builds on the branches `staging` and `production`. - -```yaml -deploy: - provider: script - script: deploy.sh - on: - all_branches: true - condition: $TRAVIS_BRANCH =~ ^(staging|production)$ -``` -{: data-file=".travis.yml"} - -The next example deploys using custom scripts `deploy_production.sh` and `deploy_staging.sh` depending on the branch that triggered the job. - -```yaml -deploy: - - provider: script - script: deploy_production.sh - on: - branch: production - - provider: script - script: deploy_staging.sh - on: - branch: staging -``` -{: data-file=".travis.yml"} - -The next example deploys to S3 only when `$CC` is set to `gcc`. - -```yaml -deploy: - provider: s3 - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - skip_cleanup: true - bucket: "S3 Bucket" - on: - condition: "$CC = gcc" -``` -{: data-file=".travis.yml"} - -This example deploys to GitHub Releases when a tag is set and the Ruby version is 2.0.0. - -```yaml -deploy: - provider: releases - api_key: "GITHUB OAUTH TOKEN" - file: "FILE TO UPLOAD" - skip_cleanup: true - on: - tags: true - rvm: 2.0.0 -``` -{: data-file=".travis.yml"} +## Conditional Deploys +You can deploy only when certain conditions are met. +See [Conditional Deployments](/user/deployment-v2/conditional). diff --git a/_includes/deploy/conditional_link.md b/_includes/deploy/conditional_link.md deleted file mode 100644 index 796f0f272df..00000000000 --- a/_includes/deploy/conditional_link.md +++ /dev/null @@ -1,5 +0,0 @@ -## Conditional Deploys - -You can deploy only when certain conditions are met. - -See [Conditional Releases with `on:`](/user/deployment-v2#conditional-releases-with-on). diff --git a/_includes/deploy/contributing.md b/_includes/deploy/edge.md similarity index 100% rename from _includes/deploy/contributing.md rename to _includes/deploy/edge.md diff --git a/_includes/deploy/multiple_targets.md b/_includes/deploy/multiple_targets.md index 06ebe789d1b..a9f61326a80 100644 --- a/_includes/deploy/multiple_targets.md +++ b/_includes/deploy/multiple_targets.md @@ -1,4 +1,4 @@ -## Deploying to Multiple Targets +## Deploying to multiple targets Running multiple deployments to different providers (or the same provider with different configurations) is possible by adding configurations to the `deploy` @@ -10,10 +10,10 @@ deploy: - provider: s3 access_key_id: secret_access_key: - # ... + # ⋮ - provider: heroku api_key: - # ... + # ⋮ ``` {: data-file=".travis.yml"} diff --git a/_includes/deploy/overview.md b/_includes/deploy/overview.md index 658965e0f6f..e69de29bb2d 100644 --- a/_includes/deploy/overview.md +++ b/_includes/deploy/overview.md @@ -1,10 +0,0 @@ -{% include deploy/maturity_levels.md %} - -{% include deploy/pull_requests.md %} - -{% include deploy/cleanup.md %} - -{% include deploy/conditional.md %} - -{% include deploy/contributing.md %} - diff --git a/_includes/deploy/shared.md b/_includes/deploy/shared.md index 8a4263f2976..65e94ec5b0b 100644 --- a/_includes/deploy/shared.md +++ b/_includes/deploy/shared.md @@ -1,8 +1,9 @@ -{% include deploy/branch.md %} +{% include deploy/pull_requests.md %} +{% if cleanup %}{% include deploy/cleanup.md %}{% endif %} -{% include deploy/conditional_link.md %} - -{% include deploy/before_after_deploy.md %} - -{% include deploy/contributing.md %} +## See also +* [Making deployments conditional](/user/deployment-v2/conditional) +* [Running commands before and after the deploy step](/user/deployment-v2/#running-commands-before-and-after-the-deploy-step) +* [Deploying to multiple targets](http://localhost:4000/user/deployment-v2/#deploying-to-multiple-targets) +* [Running an edge version](/user/deployment-v2/#running-an-edge-version) diff --git a/_layouts/en.html b/_layouts/en.html index 2b9acbad767..e2666bce1a9 100644 --- a/_layouts/en.html +++ b/_layouts/en.html @@ -28,11 +28,11 @@

        {{ page.title }}

        {% elsif page.deploy == 'v2' %} -
        +

        This page documents deployments using the next major version dpl v2 which currently is in a preview release phase. Please see our blog post - for details. The current default version is dpl v1. + for details. The current default version is dpl v1. Check dpl v1 documentation here.

        diff --git a/user/deployment-v2.md b/user/deployment-v2.md index 05e6b9eeca4..37b9e03ba6a 100644 --- a/user/deployment-v2.md +++ b/user/deployment-v2.md @@ -4,9 +4,6 @@ layout: en deploy: v2 --- ->ALPHA This page documents deployments using the next major version dpl v2 which is in a preview release phase. Please see [the announcement blog post](https://blog.travis-ci.com/2019-08-27-deployment-tooling-dpl-v2-preview-release) on details about the release process. Documentation for dpl v1, the current default version, can be found [here](/user/deployment). -{: .alpha} - ## Supported Providers Continuous Deployment to the following providers is supported: @@ -18,6 +15,13 @@ Continuous Deployment to the following providers is supported:
      To deploy to a custom or unsupported provider, use the [after-success build -step](/user/deployment/custom/) or [script provider](/user/deployment/script). +step](/user/deployment/custom/) or [script provider](/user/deployment/providers/script). -{% include deploy/overview.md %} +{% include deploy/pull_requests.md %} +{% include deploy/maturity_levels.md %} +{% include deploy/conditional.md %} +{% include deploy/cleanup.md %} +{% include deploy/before_after_deploy.md %} +{% include deploy/multiple_targets.md %} +{% include deploy/secrets.md name="password" env_name="_PASSWORD" %} +{% include deploy/edge.md %} diff --git a/user/deployment-v2/conditional.md b/user/deployment-v2/conditional.md new file mode 100644 index 00000000000..d77030124b7 --- /dev/null +++ b/user/deployment-v2/conditional.md @@ -0,0 +1,125 @@ +--- +title: Conditional Deployments +layout: en +deploy: v2 +--- + +Set your build to deploy only in specific circumstances by configuring the `on:` key for any deployment provider. + +```yaml +deploy: + provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + bucket: "S3 Bucket" + skip_cleanup: true + on: + branch: release + condition: $MY_ENV = super_awesome +``` +{: data-file=".travis.yml"} + +When *all* conditions specified in the `on:` section are met, your build will deploy. + +Use the following options to configure conditional deployment: + +* `repo`: in the form `owner_name/repo_name`. Deploy only when the build occurs on a particular repository. For example: + + ```yaml + deploy: + provider: s3 + on: + repo: travis-ci/dpl + ``` + {: data-file=".travis.yml"} + +* `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. + +* `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. + +* `condition`: deploy when *a single* bash condition evaluates to `true`. This must be a string value and is equivalent to `if [[ ]]; then ; fi`. For example, `$CC = gcc`. + +* `tags` can be `true`, `false` or any other string: + + * `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. + * `tags: false`: deployment is triggered if and only if `$TRAVIS_TAG` is empty. + This also causes the `branch` condition to be ignored. + * 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 Deployment + +This example deploys to Appfog only from the `staging` branch when the test has run on Node.js version 0.11. + +```yaml +language: node_js +deploy: + provider: appfog + user: ... + api_key: ... + on: + branch: staging + node_js: '0.11' # this should be quoted; otherwise, 0.10 would not work +``` +{: data-file=".travis.yml"} + +The next example deploys using a custom script `deploy.sh`, only for builds on the branches `staging` and `production`. + +```yaml +deploy: + provider: script + script: deploy.sh + on: + all_branches: true + condition: $TRAVIS_BRANCH =~ ^(staging|production)$ +``` +{: data-file=".travis.yml"} + +The next example deploys using custom scripts `deploy_production.sh` and `deploy_staging.sh` depending on the branch that triggered the job. + +```yaml +deploy: + - provider: script + script: deploy_production.sh + on: + branch: production + - provider: script + script: deploy_staging.sh + on: + branch: staging +``` +{: data-file=".travis.yml"} + +The next example deploys to S3 only when `$CC` is set to `gcc`. + +```yaml +deploy: + provider: s3 + access_key_id: "YOUR AWS ACCESS KEY" + secret_access_key: "YOUR AWS SECRET KEY" + skip_cleanup: true + bucket: "S3 Bucket" + on: + condition: "$CC = gcc" +``` +{: data-file=".travis.yml"} + +This example deploys to GitHub Releases when a tag is set and the Ruby version is 2.0.0. + +```yaml +deploy: + provider: releases + api_key: "GITHUB OAUTH TOKEN" + file: "FILE TO UPLOAD" + skip_cleanup: true + on: + tags: true + rvm: 2.0.0 +``` +{: data-file=".travis.yml"} + + diff --git a/user/deployment-v2/providers/custom.md b/user/deployment-v2/custom.md similarity index 91% rename from user/deployment-v2/providers/custom.md rename to user/deployment-v2/custom.md index ec31d259f73..faf219c4296 100644 --- a/user/deployment-v2/providers/custom.md +++ b/user/deployment-v2/custom.md @@ -2,7 +2,6 @@ title: Custom Deployment layout: en deploy: v2 - --- You can deploy to your own server the way you would deploy from your local @@ -22,9 +21,9 @@ env: after_success: - echo "${SFTP_KEY}" | base64 --decode >/tmp/sftp_rsa - curl --ftp-create-dirs - -T filename - --key /tmp/sftp_rsa - sftp://${SFTP_USER}:${SFTP_PASSWORD}@example.com/directory/filename + -T filename + --key /tmp/sftp_rsa + sftp://${SFTP_USER}:${SFTP_PASSWORD}@example.com/directory/filename ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/pages.md b/user/deployment-v2/providers/pages.md index 24ed550e77f..809f3973ccc 100644 --- a/user/deployment-v2/providers/pages.md +++ b/user/deployment-v2/providers/pages.md @@ -18,7 +18,7 @@ deploy: ``` {: data-file=".travis.yml"} -{% include deploy/providers/pages.md %} +{% include deploy/providers/pages_git.md %} You can use a [personal access token](https://help.github.com/articles/creating-an-access-token-for-command-line-use/) with the `public_repo` or `repo` scope (`repo` is required for private From 8a89f69dbf6775ca20765ee2acd7e12d49b1b346 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Tue, 10 Sep 2019 14:43:45 +0200 Subject: [PATCH 0227/1536] more restructure, add shared options --- TODO | 7 +-- _includes/deploy/providers/anynines.md | 5 +++ _includes/deploy/providers/azure_web_apps.md | 5 +++ _includes/deploy/providers/bintray.md | 5 +++ .../deploy/providers/bluemixcloudfoundry.md | 5 +++ _includes/deploy/providers/boxfuse.md | 5 +++ _includes/deploy/providers/cargo.md | 5 +++ .../deploy/providers/chef_supermarket.md | 5 +++ _includes/deploy/providers/cloud66.md | 5 +++ _includes/deploy/providers/cloudfiles.md | 5 +++ _includes/deploy/providers/cloudformation.md | 5 +++ _includes/deploy/providers/cloudfoundry.md | 5 +++ _includes/deploy/providers/codedeploy.md | 5 +++ _includes/deploy/providers/convox.md | 5 +++ _includes/deploy/providers/datica.md | 5 +++ .../deploy/providers/elasticbeanstalk.md | 5 +++ _includes/deploy/providers/engineyard.md | 5 +++ _includes/deploy/providers/firebase.md | 5 +++ _includes/deploy/providers/gae.md | 5 +++ _includes/deploy/providers/gcs.md | 5 +++ _includes/deploy/providers/gleis.md | 5 +++ _includes/deploy/providers/hackage.md | 5 +++ _includes/deploy/providers/hephy.md | 5 +++ _includes/deploy/providers/heroku_api.md | 7 +++ _includes/deploy/providers/heroku_git.md | 7 +++ _includes/deploy/providers/lambda.md | 5 +++ _includes/deploy/providers/launchpad.md | 5 +++ _includes/deploy/providers/netlify.md | 5 +++ _includes/deploy/providers/npm.md | 5 +++ _includes/deploy/providers/openshift.md | 5 +++ _includes/deploy/providers/opsworks.md | 5 +++ _includes/deploy/providers/packagecloud.md | 5 +++ _includes/deploy/providers/pages_api.md | 6 +++ _includes/deploy/providers/pages_git.md | 6 +++ _includes/deploy/providers/puppetforge.md | 5 +++ _includes/deploy/providers/pypi.md | 5 +++ _includes/deploy/providers/releases.md | 5 +++ _includes/deploy/providers/rubygems.md | 5 +++ _includes/deploy/providers/s3.md | 5 +++ _includes/deploy/providers/scalingo.md | 5 +++ _includes/deploy/providers/script.md | 5 +++ _includes/deploy/providers/snap.md | 5 +++ _includes/deploy/providers/surge.md | 5 +++ _includes/deploy/providers/testfairy.md | 5 +++ _includes/deploy/providers/transifex.md | 5 +++ _includes/deploy/shared.md | 3 +- _includes/deploy/tags.md | 18 ++++++++ _includes/sidebar.html | 1 + lib/dpl/docs.rb | 45 ++++++++++++++++--- .../deployment-v2/providers/azure-web-apps.md | 8 +++- user/deployment-v2/providers/cargo.md | 2 +- user/deployment-v2/providers/hackage.md | 2 +- user/deployment-v2/providers/npm.md | 3 +- user/deployment-v2/providers/pypi.md | 9 ++-- user/deployment-v2/providers/rubygems.md | 3 +- 55 files changed, 309 insertions(+), 18 deletions(-) create mode 100644 _includes/deploy/tags.md diff --git a/TODO b/TODO index fd4842dfcad..fc9cff12397 100644 --- a/TODO +++ b/TODO @@ -4,13 +4,14 @@ x normalize and extract talking about secrets and settings x normalize dasherized options to underscored options x normalize placeholder values to or x pages: fix keep_history - -- generate "Shared Options" +x for package/registry providers restore the note that they'll probably want to use tags +x generate "Shared Options" - consider removing `run` from all providers except Heroku and Engine Yard - add cleanup=true to the include on providers where this is relevant -- for package/registry providers restore the note that they'll probably want to use tags + +- merge various conditions/branches sections into the conditions page - check: Cargo will refuse to publish crates from a dirty working directory - check: Deploy to a S3 hosted website diff --git a/_includes/deploy/providers/anynines.md b/_includes/deploy/providers/anynines.md index fb2af67d932..a42fc74b79d 100644 --- a/_includes/deploy/providers/anynines.md +++ b/_includes/deploy/providers/anynines.md @@ -13,6 +13,11 @@ Use the following options to further configure the deployment: | `buildpack` | Custom buildpack name or Git URL — type: string | | `manifest` | Path to the manifest — type: string | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `ANYNINES_`. diff --git a/_includes/deploy/providers/azure_web_apps.md b/_includes/deploy/providers/azure_web_apps.md index 35917d03635..32eafdb1c93 100644 --- a/_includes/deploy/providers/azure_web_apps.md +++ b/_includes/deploy/providers/azure_web_apps.md @@ -11,6 +11,11 @@ Use the following options to further configure the deployment: | `slot` | Slot name (if your app uses staging deployment) — type: string | | `verbose` | Print deployment output from Azure. Warning: If authentication fails, Git prints credentials in clear text. Correct credentials remain hidden. — type: boolean | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `AZURE_WA_`. diff --git a/_includes/deploy/providers/bintray.md b/_includes/deploy/providers/bintray.md index 346b26111b8..fffa7c297b6 100644 --- a/_includes/deploy/providers/bintray.md +++ b/_includes/deploy/providers/bintray.md @@ -10,6 +10,11 @@ Use the following options to further configure the deployment: | `file` | Path to a descriptor file for the Bintray upload — **required**, type: string | | `passphrase` | Passphrase as configured on Bintray (if GPG signing is used) — type: string | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `BINTRAY_`. diff --git a/_includes/deploy/providers/bluemixcloudfoundry.md b/_includes/deploy/providers/bluemixcloudfoundry.md index 8de48abb766..246291a0b12 100644 --- a/_includes/deploy/providers/bluemixcloudfoundry.md +++ b/_includes/deploy/providers/bluemixcloudfoundry.md @@ -16,6 +16,11 @@ Use the following options to further configure the deployment: | `manifest` | Path to the manifest — type: string | | `skip_ssl_validation` | Skip SSL validation — type: boolean | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `CLOUDFOUNDRY_`. diff --git a/_includes/deploy/providers/boxfuse.md b/_includes/deploy/providers/boxfuse.md index 17c16b88812..2d213e9c5cf 100644 --- a/_includes/deploy/providers/boxfuse.md +++ b/_includes/deploy/providers/boxfuse.md @@ -14,6 +14,11 @@ Use the following options to further configure the deployment: | `config_file` | type: string, alias: `configfile` (deprecated, please use `config_file`) | | `extra_args` | type: string | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `BOXFUSE_`. diff --git a/_includes/deploy/providers/cargo.md b/_includes/deploy/providers/cargo.md index 23a1a0d6902..fd755ccfaae 100644 --- a/_includes/deploy/providers/cargo.md +++ b/_includes/deploy/providers/cargo.md @@ -7,6 +7,11 @@ Use the following options to further configure the deployment: | `token` | Cargo registry API token — **required**, **secret**, type: string | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `CARGO_`. diff --git a/_includes/deploy/providers/chef_supermarket.md b/_includes/deploy/providers/chef_supermarket.md index 82a02d5a202..280c298bcee 100644 --- a/_includes/deploy/providers/chef_supermarket.md +++ b/_includes/deploy/providers/chef_supermarket.md @@ -11,3 +11,8 @@ Use the following options to further configure the deployment: | `client_key` | Client API key file name — type: string, default: `client.pem` | | `dir` | Directory containing the cookbook — type: string, default: `.` | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + diff --git a/_includes/deploy/providers/cloud66.md b/_includes/deploy/providers/cloud66.md index 7d88e76ac0a..c8354bda2a5 100644 --- a/_includes/deploy/providers/cloud66.md +++ b/_includes/deploy/providers/cloud66.md @@ -7,6 +7,11 @@ Use the following options to further configure the deployment: | `redeployment_hook` | The redeployment hook URL — **required**, **secret**, type: string | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `CLOUD66_`. diff --git a/_includes/deploy/providers/cloudfiles.md b/_includes/deploy/providers/cloudfiles.md index 98f604c99dd..2b7202a0017 100644 --- a/_includes/deploy/providers/cloudfiles.md +++ b/_includes/deploy/providers/cloudfiles.md @@ -12,6 +12,11 @@ Use the following options to further configure the deployment: | `glob` | Paths to upload — type: string, default: `**/*` | | `dot_match` | Upload hidden files starting a dot — type: boolean | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `CLOUDFILES_`. diff --git a/_includes/deploy/providers/cloudformation.md b/_includes/deploy/providers/cloudformation.md index 9149806befb..68260e5db86 100644 --- a/_includes/deploy/providers/cloudformation.md +++ b/_includes/deploy/providers/cloudformation.md @@ -22,6 +22,11 @@ Use the following options to further configure the deployment: | `parameters` | key=value pairs or ENV var names — type: string or array of strings | | `output_file` | Path to output file to store CloudFormation outputs to — type: string | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `AWS_` or `CLOUDFORMATION_`. diff --git a/_includes/deploy/providers/cloudfoundry.md b/_includes/deploy/providers/cloudfoundry.md index 32b79d5eac6..69d230a0299 100644 --- a/_includes/deploy/providers/cloudfoundry.md +++ b/_includes/deploy/providers/cloudfoundry.md @@ -16,6 +16,11 @@ Use the following options to further configure the deployment: | `skip_ssl_validation` | Skip SSL validation — type: boolean | | `v3` | Use the v3 API version to push the application — type: boolean | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `CLOUDFOUNDRY_`. diff --git a/_includes/deploy/providers/codedeploy.md b/_includes/deploy/providers/codedeploy.md index d0e0eaa31ef..ff325dd0e07 100644 --- a/_includes/deploy/providers/codedeploy.md +++ b/_includes/deploy/providers/codedeploy.md @@ -21,6 +21,11 @@ Use the following options to further configure the deployment: | `key` | type: string | | `description` | type: string | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `AWS_` or `CODEDEPLOY_`. diff --git a/_includes/deploy/providers/convox.md b/_includes/deploy/providers/convox.md index f34363389cc..89196415b0c 100644 --- a/_includes/deploy/providers/convox.md +++ b/_includes/deploy/providers/convox.md @@ -18,3 +18,8 @@ Use the following options to further configure the deployment: | `description` | type: string | | `generation` | type: integer, default: `2` | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + diff --git a/_includes/deploy/providers/datica.md b/_includes/deploy/providers/datica.md index 607d8995ca7..d9c59785349 100644 --- a/_includes/deploy/providers/datica.md +++ b/_includes/deploy/providers/datica.md @@ -8,3 +8,8 @@ Use the following options to further configure the deployment: | `target` | The git remote repository to deploy to — **required**, type: string | | `path` | Path to files to deploy — type: string, default: `.` | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + diff --git a/_includes/deploy/providers/elasticbeanstalk.md b/_includes/deploy/providers/elasticbeanstalk.md index fe6602857f9..4d41b9dd92f 100644 --- a/_includes/deploy/providers/elasticbeanstalk.md +++ b/_includes/deploy/providers/elasticbeanstalk.md @@ -18,6 +18,11 @@ Use the following options to further configure the deployment: | `only_create_app_version` | Only create the app version, do not actually deploy it — type: boolean | | `wait_until_deployed` | Wait until the deployment has finished — type: boolean | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `AWS_` or `ELASTIC_BEANSTALK_`. diff --git a/_includes/deploy/providers/engineyard.md b/_includes/deploy/providers/engineyard.md index 537b6cd5c67..e3ffbbb6707 100644 --- a/_includes/deploy/providers/engineyard.md +++ b/_includes/deploy/providers/engineyard.md @@ -13,6 +13,11 @@ Use the following options to further configure the deployment: | `migrate` | Engine Yard migration commands — type: string | | `account` | Engine Yard account name — type: string | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `ENGINEYARD_` or `EY_`. diff --git a/_includes/deploy/providers/firebase.md b/_includes/deploy/providers/firebase.md index 141dadb528b..1f3bace4410 100644 --- a/_includes/deploy/providers/firebase.md +++ b/_includes/deploy/providers/firebase.md @@ -11,6 +11,11 @@ Use the following options to further configure the deployment: | `only` | Firebase services to deploy — type: string, note: can be a comma-separated list | | `force` | Whether or not to delete Cloud Functions missing from the current working directory — type: boolean | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `FIREBASE_`. diff --git a/_includes/deploy/providers/gae.md b/_includes/deploy/providers/gae.md index a684877cb55..143e56c38ed 100644 --- a/_includes/deploy/providers/gae.md +++ b/_includes/deploy/providers/gae.md @@ -14,3 +14,8 @@ Use the following options to further configure the deployment: | `stop_previous_version` | Prevent the deployment from stopping a previously promoted version — type: boolean, default: `true` | | `install_sdk` | Do not install the Google Cloud SDK — type: boolean, default: `true` | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + diff --git a/_includes/deploy/providers/gcs.md b/_includes/deploy/providers/gcs.md index c5a7634e5bd..14cd8676205 100644 --- a/_includes/deploy/providers/gcs.md +++ b/_includes/deploy/providers/gcs.md @@ -15,6 +15,11 @@ Use the following options to further configure the deployment: | `detect_encoding` | HTTP header Content-Encoding to set for files compressed with gzip and compress utilities. — type: boolean | | `cache_control` | HTTP header Cache-Control to suggest that the browser cache the file. — type: string, see: [https://cloud.google.com/storage/docs/xml-api/reference-headers#cachecontrol](https://cloud.google.com/storage/docs/xml-api/reference-headers#cachecontrol) | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `GCS_`. diff --git a/_includes/deploy/providers/gleis.md b/_includes/deploy/providers/gleis.md index 6fb9263ff5e..039f899469c 100644 --- a/_includes/deploy/providers/gleis.md +++ b/_includes/deploy/providers/gleis.md @@ -11,6 +11,11 @@ Use the following options to further configure the deployment: | `key_name` | Name of the SSH deploy key pushed to Gleis — type: string, default: `dpl_deploy_key` | | `verbose` | type: boolean | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `GLEIS_`. diff --git a/_includes/deploy/providers/hackage.md b/_includes/deploy/providers/hackage.md index fae87d8f353..0caccd0f1b1 100644 --- a/_includes/deploy/providers/hackage.md +++ b/_includes/deploy/providers/hackage.md @@ -9,6 +9,11 @@ Use the following options to further configure the deployment: | `password` | Hackage password — **required**, **secret**, type: string | | `publish` | Whether or not to publish the package — type: boolean | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `HACKAGE_`. diff --git a/_includes/deploy/providers/hephy.md b/_includes/deploy/providers/hephy.md index 4ffa8d463bf..d30b21a170d 100644 --- a/_includes/deploy/providers/hephy.md +++ b/_includes/deploy/providers/hephy.md @@ -12,6 +12,11 @@ Use the following options to further configure the deployment: | `cli_version` | Install a specific Hephy CLI version — type: string, default: `stable` | | `verbose` | Verbose log output — type: boolean | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `HEPHY_`. diff --git a/_includes/deploy/providers/heroku_api.md b/_includes/deploy/providers/heroku_api.md index 9b103b92cb7..4b33ebec4a6 100644 --- a/_includes/deploy/providers/heroku_api.md +++ b/_includes/deploy/providers/heroku_api.md @@ -7,6 +7,13 @@ Use the following options to further configure the deployment: | `api_key` | Heroku API key — **required**, **secret**, type: string | +### Shared options + +| `strategy` | Heroku deployment strategy — type: string, default: `api`, known values: `api`, `git` | +| `app` | Heroku app name — type: string, default: `repo name` | +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `HEROKU_`. diff --git a/_includes/deploy/providers/heroku_git.md b/_includes/deploy/providers/heroku_git.md index 4dd01a2e4e5..3802b7ef081 100644 --- a/_includes/deploy/providers/heroku_git.md +++ b/_includes/deploy/providers/heroku_git.md @@ -10,6 +10,13 @@ Use the following options to further configure the deployment: | `password` | Heroku password — **secret**, type: string | | `git` | Heroku Git remote URL — type: string | +### Shared options + +| `strategy` | Heroku deployment strategy — type: string, default: `api`, known values: `api`, `git` | +| `app` | Heroku app name — type: string, default: `repo name` | +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `HEROKU_`. diff --git a/_includes/deploy/providers/lambda.md b/_includes/deploy/providers/lambda.md index 255e507ae7f..7068aeb7449 100644 --- a/_includes/deploy/providers/lambda.md +++ b/_includes/deploy/providers/lambda.md @@ -28,6 +28,11 @@ Use the following options to further configure the deployment: | `zip` | Path to a packaged Lambda, a directory to package, or a single file to package — type: string, default: `.` | | `dot_match` | Include hidden .* files to the zipped archive — type: boolean | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `AWS_` or `LAMBDA_`. diff --git a/_includes/deploy/providers/launchpad.md b/_includes/deploy/providers/launchpad.md index 1eff45b1ead..0a9d8feadb6 100644 --- a/_includes/deploy/providers/launchpad.md +++ b/_includes/deploy/providers/launchpad.md @@ -9,6 +9,11 @@ Use the following options to further configure the deployment: | `oauth_token_secret` | Launchpad OAuth token secret — **secret**, type: string | | `slug` | Launchpad project slug — type: string, format: `/^~[^\/]+\/[^\/]+\/[^\/]+$/`, e.g.: ~user-name/project-name/branch-name | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `LAUNCHPAD_`. diff --git a/_includes/deploy/providers/netlify.md b/_includes/deploy/providers/netlify.md index 488303ad0a3..0d46273daed 100644 --- a/_includes/deploy/providers/netlify.md +++ b/_includes/deploy/providers/netlify.md @@ -12,6 +12,11 @@ Use the following options to further configure the deployment: | `message` | A message to include in the deploy log — type: string | | `prod` | Deploy to production — type: boolean | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `NETLIFY_`. diff --git a/_includes/deploy/providers/npm.md b/_includes/deploy/providers/npm.md index 24d910f05cc..ee1b45daa92 100644 --- a/_includes/deploy/providers/npm.md +++ b/_includes/deploy/providers/npm.md @@ -13,6 +13,11 @@ Use the following options to further configure the deployment: | `tag` | distribution tags to add — type: string | | `auth_method` | Authentication method — type: boolean, known values: `auth` | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `NPM_`. diff --git a/_includes/deploy/providers/openshift.md b/_includes/deploy/providers/openshift.md index 4e02d123059..e06b611a610 100644 --- a/_includes/deploy/providers/openshift.md +++ b/_includes/deploy/providers/openshift.md @@ -10,6 +10,11 @@ Use the following options to further configure the deployment: | `project` | OpenShift project — **required**, type: string | | `app` | OpenShift application — type: string, default: `repo name` | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `OPENSHIFT_`. diff --git a/_includes/deploy/providers/opsworks.md b/_includes/deploy/providers/opsworks.md index 2171337f28d..2379f8d9ad2 100644 --- a/_includes/deploy/providers/opsworks.md +++ b/_includes/deploy/providers/opsworks.md @@ -16,6 +16,11 @@ Use the following options to further configure the deployment: | `update_on_success` | When wait-until-deployed and updated-on-success are both not given, application source is updated to the current SHA. Ignored when wait-until-deployed is not given. — type: boolean, alias: `update_app_on_success` | | `custom_json` | Custom json options override (overwrites default configuration) — type: string | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `AWS_` or `OPSWORKS_`. diff --git a/_includes/deploy/providers/packagecloud.md b/_includes/deploy/providers/packagecloud.md index bf2ae671f2d..be0be0e3ce5 100644 --- a/_includes/deploy/providers/packagecloud.md +++ b/_includes/deploy/providers/packagecloud.md @@ -16,6 +16,11 @@ Use the following options to further configure the deployment: | `write_timeout` | type: integer, default: `180` | | `package_glob` | type: string or array of strings, default: `["**/*"]` | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `PACKAGECLOUD_`. diff --git a/_includes/deploy/providers/pages_api.md b/_includes/deploy/providers/pages_api.md index ec1a954531a..7c7bb4780c2 100644 --- a/_includes/deploy/providers/pages_api.md +++ b/_includes/deploy/providers/pages_api.md @@ -8,6 +8,12 @@ Use the following options to further configure the deployment: | `repo` | GitHub repo slug — type: string, default: `repo slug` | | `token` | GitHub oauth token with repo permission — **required**, **secret**, type: string, alias: `github_token` | +### Shared options + +| `strategy` | GitHub Pages deployment strategy — type: string, default: `git`, known values: `api`, `git` | +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `GITHUB_` or `PAGES_`. diff --git a/_includes/deploy/providers/pages_git.md b/_includes/deploy/providers/pages_git.md index fa3b246b4b4..ad9557fda84 100644 --- a/_includes/deploy/providers/pages_git.md +++ b/_includes/deploy/providers/pages_git.md @@ -22,6 +22,12 @@ Use the following options to further configure the deployment: | `deployment_file` | Enable creation of a deployment-info file — type: boolean | | `url` | type: string, alias: `github_url`, default: `github.com` | +### Shared options + +| `strategy` | GitHub Pages deployment strategy — type: string, default: `git`, known values: `api`, `git` | +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `GITHUB_` or `PAGES_`. diff --git a/_includes/deploy/providers/puppetforge.md b/_includes/deploy/providers/puppetforge.md index 906a316c507..9bca702535f 100644 --- a/_includes/deploy/providers/puppetforge.md +++ b/_includes/deploy/providers/puppetforge.md @@ -9,6 +9,11 @@ Use the following options to further configure the deployment: | `password` | Puppet Forge password — **required**, **secret**, type: string | | `url` | Puppet Forge URL to deploy to — type: string, default: `https://forgeapi.puppetlabs.com/` | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `PUPPETFORGE_`. diff --git a/_includes/deploy/providers/pypi.md b/_includes/deploy/providers/pypi.md index b93fb589189..b99e819fbaf 100644 --- a/_includes/deploy/providers/pypi.md +++ b/_includes/deploy/providers/pypi.md @@ -18,6 +18,11 @@ Use the following options to further configure the deployment: | `twine_version` | type: string, format: `/\A\d+(?:\.\d+)*\z/` | | `wheel_version` | type: string, format: `/\A\d+(?:\.\d+)*\z/` | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `PYPI_`. diff --git a/_includes/deploy/providers/releases.md b/_includes/deploy/providers/releases.md index 5ae9384b910..3250c95853a 100644 --- a/_includes/deploy/providers/releases.md +++ b/_includes/deploy/providers/releases.md @@ -21,6 +21,11 @@ Use the following options to further configure the deployment: | `target_commitish` | Commitish value that determines where the Git tag is created from — type: string | | `name` | Name for the release — type: string | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `GITHUB_` or `RELEASES_`. diff --git a/_includes/deploy/providers/rubygems.md b/_includes/deploy/providers/rubygems.md index 5a87a9f9316..f56997021af 100644 --- a/_includes/deploy/providers/rubygems.md +++ b/_includes/deploy/providers/rubygems.md @@ -13,6 +13,11 @@ Use the following options to further configure the deployment: | `gemspec_glob` | Glob pattern to search for gemspec files when multiple gems are generated in the repository (overrides the gemspec option) — type: string | | `host` | type: string | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `RUBYGEMS_`. diff --git a/_includes/deploy/providers/s3.md b/_includes/deploy/providers/s3.md index 6a979b8abd1..b5565293620 100644 --- a/_includes/deploy/providers/s3.md +++ b/_includes/deploy/providers/s3.md @@ -26,6 +26,11 @@ Use the following options to further configure the deployment: | `max_threads` | The number of threads to use for S3 file uploads — type: integer, default: `5`, max: 15 | | `verbose` | Be verbose about uploading files — type: boolean | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `AWS_` or `S3_`. diff --git a/_includes/deploy/providers/scalingo.md b/_includes/deploy/providers/scalingo.md index c8afb215520..3453c39185e 100644 --- a/_includes/deploy/providers/scalingo.md +++ b/_includes/deploy/providers/scalingo.md @@ -14,6 +14,11 @@ Use the following options to further configure the deployment: | `branch` | Git branch — type: string, default: `master` | | `timeout` | Timeout for Scalingo CLI commands — type: integer, default: `60` | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `SCALINGO_`. diff --git a/_includes/deploy/providers/script.md b/_includes/deploy/providers/script.md index 6e2d1e7797b..da2ec294f7d 100644 --- a/_includes/deploy/providers/script.md +++ b/_includes/deploy/providers/script.md @@ -7,3 +7,8 @@ Use the following options to further configure the deployment: | `script` | The script to execute — **required**, type: string | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + diff --git a/_includes/deploy/providers/snap.md b/_includes/deploy/providers/snap.md index e7859d7fce2..64644a297c6 100644 --- a/_includes/deploy/providers/snap.md +++ b/_includes/deploy/providers/snap.md @@ -9,6 +9,11 @@ Use the following options to further configure the deployment: | `snap` | Path to the snap to be pushed (can be a glob) — type: string, default: `**/*.snap` | | `channel` | Channel into which the snap will be released — type: string, default: `edge` | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `SNAP_`. diff --git a/_includes/deploy/providers/surge.md b/_includes/deploy/providers/surge.md index 706608e6854..db8a7136268 100644 --- a/_includes/deploy/providers/surge.md +++ b/_includes/deploy/providers/surge.md @@ -10,6 +10,11 @@ Use the following options to further configure the deployment: | `domain` | Domain to publish to. Not required if the domain is set in the CNAME file in the project folder. — type: string | | `project` | Path to project directory relative to repo root — type: string, default: `.` | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `SURGE_`. diff --git a/_includes/deploy/providers/testfairy.md b/_includes/deploy/providers/testfairy.md index 7875137269d..964fcd76494 100644 --- a/_includes/deploy/providers/testfairy.md +++ b/_includes/deploy/providers/testfairy.md @@ -13,6 +13,11 @@ Use the following options to further configure the deployment: | `auto_update` | Automaticall upgrade all the previous installations of this app this version — type: boolean | | `advanced_options` | Comma_separated list of advanced options — type: string, e.g.: option1,option2 | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `TESTFAIRY_`. diff --git a/_includes/deploy/providers/transifex.md b/_includes/deploy/providers/transifex.md index 513119545da..7cbf765b93b 100644 --- a/_includes/deploy/providers/transifex.md +++ b/_includes/deploy/providers/transifex.md @@ -11,6 +11,11 @@ Use the following options to further configure the deployment: | `hostname` | Transifex hostname — type: string, default: `www.transifex.com` | | `cli_version` | CLI version to install — type: string, default: `>=0.11` | +### Shared options + +| `cleanup` | Clean up build artifacts from the Git working directory before the deployment — type: boolean | +| `run` | Commands to execute after the deployment finished successfully — type: string or array of strings | + ## Environment variables All options can be given as environment variables if prefixed with `TRANSIFEX_`. diff --git a/_includes/deploy/shared.md b/_includes/deploy/shared.md index 65e94ec5b0b..5668873299e 100644 --- a/_includes/deploy/shared.md +++ b/_includes/deploy/shared.md @@ -1,5 +1,6 @@ +{% if include.tags %}{% include deploy/tags.md %}{% endif %} {% include deploy/pull_requests.md %} -{% if cleanup %}{% include deploy/cleanup.md %}{% endif %} +{% if include.cleanup %}{% include deploy/cleanup.md %}{% endif %} ## See also diff --git a/_includes/deploy/tags.md b/_includes/deploy/tags.md new file mode 100644 index 00000000000..8dd6a2f3734 --- /dev/null +++ b/_includes/deploy/tags.md @@ -0,0 +1,18 @@ +## Deploying tags + +Most likely, you would only want to deploy when a new version of your +package is cut. + +To do this, you can include a `tags` condition like do: + +```yaml +deploy: + provider: {{ page.provider }} + # ⋮ + on: + tags: true +``` +{: data-file=".travis.yml"} + +If you tag a commit locally, remember to run `git push --tags` to ensure that +your tags are uploaded to GitHub. diff --git a/_includes/sidebar.html b/_includes/sidebar.html index c56f5effbca..26b1220708c 100644 --- a/_includes/sidebar.html +++ b/_includes/sidebar.html @@ -71,6 +71,7 @@

      Deployments and Uploads

      • Overview
      • {% if page.deploy == 'v2' %} +
      • Conditional Deployments
      • {% assign deployments = site.data.deployments_v2 %} {% else %} {% assign deployments = site.data.deployments %} diff --git a/lib/dpl/docs.rb b/lib/dpl/docs.rb index f4be28f64ab..b3daf3a05b8 100644 --- a/lib/dpl/docs.rb +++ b/lib/dpl/docs.rb @@ -32,6 +32,7 @@ def content parts = [] parts << maturity parts << opts.to_s + parts << shared.to_s parts << env.to_s parts << secrets if secrets? parts.join("\n") @@ -45,6 +46,10 @@ def opts Opts.new(cmd) end + def shared + Opts.new(cmd, true) + end + def env @env ||= Env.new(cmd) end @@ -91,8 +96,8 @@ def status end end - class Opts < Struct.new(:cmd) - STR = <<~str + class Opts < Struct.new(:cmd, :shared?) + KNOWN = <<~str ## Known options Use the following options to further configure the deployment: @@ -100,12 +105,40 @@ class Opts < Struct.new(:cmd) %s str + SHARED = <<~str + ### Shared options + + %s + str + + + SKIP = %i(help) + def to_s - opts = cmd.opts - opts = opts.reject(&:internal?) - opts = opts - cmd.superclass.opts.to_a + opts = self.opts.reject(&:internal?) + opts = opts.reject { |opt| SKIP.include?(opt.name) } opts = opts.map { |opt| "| #{format_opt(opt)} |" } - STR % opts.join("\n") + str = shared? ? SHARED : KNOWN + str % opts.join("\n") + end + + def opts + shared? ? shared : cmd.opts.to_a - shared + end + + def shared + opts = [] + const = cmd + until const == Cl::Cmd + opts.append(*opts_from(const.superclass)) + const = const.superclass + end + opts + end + + def opts_from(const) + return [] unless const.respond_to?(:opts) + const.opts.to_a - opts_from(const.superclass) end def format_opt(opt) diff --git a/user/deployment-v2/providers/azure-web-apps.md b/user/deployment-v2/providers/azure-web-apps.md index bf255c2ae33..8c4b4b0500e 100644 --- a/user/deployment-v2/providers/azure-web-apps.md +++ b/user/deployment-v2/providers/azure-web-apps.md @@ -33,6 +33,7 @@ if you provide a correct user/password combination). ```yaml deploy: provider: azure_web_apps + # ⋮ verbose: true ``` {: data-file=".travis.yml"} @@ -58,10 +59,15 @@ Service](https://azure.microsoft.com/en-us/documentation/articles/web-sites-stag ```yaml deploy: - provider: azure_web_apps + # ⋮ slot: myapp-staging + on: + branch: master - provider: azure_web_apps + # ⋮ slot: myapp-dev - on: dev + on: + branch: dev ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/cargo.md b/user/deployment-v2/providers/cargo.md index eebfabc037b..f32fba87655 100644 --- a/user/deployment-v2/providers/cargo.md +++ b/user/deployment-v2/providers/cargo.md @@ -23,4 +23,4 @@ account, and generating a new token at . {% include deploy/providers/cargo.md %} -{% include deploy/shared.md %} +{% include deploy/shared.md tags=true %} diff --git a/user/deployment-v2/providers/hackage.md b/user/deployment-v2/providers/hackage.md index 31acaa4fd36..3b057dd8e14 100644 --- a/user/deployment-v2/providers/hackage.md +++ b/user/deployment-v2/providers/hackage.md @@ -19,4 +19,4 @@ deploy: {% include deploy/providers/hackage.md %} -{% include deploy/shared.md %} +{% include deploy/shared.md tags=true %} diff --git a/user/deployment-v2/providers/npm.md b/user/deployment-v2/providers/npm.md index 795a911e433..d9d70d4642c 100644 --- a/user/deployment-v2/providers/npm.md +++ b/user/deployment-v2/providers/npm.md @@ -72,4 +72,5 @@ and avoid this error by adding the following to your `package.json` file: }, ``` -{% include deploy/shared.md %} +{% include deploy/shared.md tags=true %} + diff --git a/user/deployment-v2/providers/pypi.md b/user/deployment-v2/providers/pypi.md index a9ef6e04167..2bd27f888c2 100644 --- a/user/deployment-v2/providers/pypi.md +++ b/user/deployment-v2/providers/pypi.md @@ -41,12 +41,13 @@ deploy: By default, only a source distribution ('sdist') will be uploaded to PyPI. If you would like to upload different distributions, specify them using the `distributions` option, like this: -``` +```yaml deploy: provider: pypi # ⋮ distributions: "sdist bdist_wheel" # Your distributions here ``` +{: data-file=".travis.yml"} If you specify `bdist_wheel` in the distributions, the `wheel` package will automatically be installed. @@ -62,11 +63,13 @@ HTTPError: 400 Client Error: File already exists. To avoid this, use the `skip_existing` flag: -``` +```yaml deploy: provider: pypi # ⋮ skip_existing: true ``` +{: data-file=".travis.yml"} + +{% include deploy/shared.md tags=true %} -{% include deploy/shared.md %} diff --git a/user/deployment-v2/providers/rubygems.md b/user/deployment-v2/providers/rubygems.md index 2dbae8d72a9..af67046da13 100644 --- a/user/deployment-v2/providers/rubygems.md +++ b/user/deployment-v2/providers/rubygems.md @@ -98,4 +98,5 @@ deploy: ``` {: data-file=".travis.yml"} -{% include deploy/shared.md %} +{% include deploy/shared.md tags=true %} + From 6c511e93863ddf26c92396a98a1944a4faefe362 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Tue, 10 Sep 2019 14:49:04 +0200 Subject: [PATCH 0228/1536] move todo to the PR --- TODO | 33 --------------------------------- 1 file changed, 33 deletions(-) delete mode 100644 TODO diff --git a/TODO b/TODO deleted file mode 100644 index fc9cff12397..00000000000 --- a/TODO +++ /dev/null @@ -1,33 +0,0 @@ -x bitballoon -> netlify drop -x rewrite openshift -x normalize and extract talking about secrets and settings -x normalize dasherized options to underscored options -x normalize placeholder values to or -x pages: fix keep_history -x for package/registry providers restore the note that they'll probably want to use tags -x generate "Shared Options" - -- consider removing `run` from all providers except Heroku and Engine Yard - -- add cleanup=true to the include on providers where this is relevant - -- merge various conditions/branches sections into the conditions page - -- check: Cargo will refuse to publish crates from a dirty working directory -- check: Deploy to a S3 hosted website -- check: Custom Heroku commands do not affect the Travis CI build status - -- discuss what to do with the "easy way" travis.rb setup - -- add AWS CloudFormation -- add Convox -- add Gleis - -Style: - -* besides the `provider` option, do not repeat options that have been discussed - in previous examples, only add options relevant to the example -* use `# ⋮`, not `# ...` -* use `access_key_id: ` for denoting key value pairs -* do not quote values that are not required to be quoted as per YAML -* use underscored option names, not dasherized option names From ef27a7156f80dc0efbd52024440524e17fa70c44 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Tue, 10 Sep 2019 14:55:18 +0200 Subject: [PATCH 0229/1536] use --- user/deployment-v2/providers/anynines.md | 2 +- user/deployment-v2/providers/azure-web-apps.md | 2 +- user/deployment-v2/providers/bintray.md | 2 +- user/deployment-v2/providers/bluemixcloudfoundry.md | 2 +- user/deployment-v2/providers/boxfuse.md | 2 +- user/deployment-v2/providers/cargo.md | 2 +- user/deployment-v2/providers/cloud66.md | 2 +- user/deployment-v2/providers/cloudfiles.md | 2 +- user/deployment-v2/providers/cloudfoundry.md | 2 +- user/deployment-v2/providers/codedeploy.md | 4 ++-- user/deployment-v2/providers/elasticbeanstalk.md | 4 ++-- user/deployment-v2/providers/engineyard.md | 2 +- user/deployment-v2/providers/firebase.md | 2 +- user/deployment-v2/providers/gcs.md | 4 ++-- user/deployment-v2/providers/hackage.md | 2 +- user/deployment-v2/providers/hephy.md | 2 +- user/deployment-v2/providers/heroku.md | 2 +- user/deployment-v2/providers/lambda.md | 2 ++ user/deployment-v2/providers/launchpad.md | 4 ++-- user/deployment-v2/providers/netlify.md | 2 +- user/deployment-v2/providers/npm.md | 2 +- user/deployment-v2/providers/openshift.md | 2 +- user/deployment-v2/providers/opsworks.md | 4 ++-- user/deployment-v2/providers/packagecloud.md | 2 +- user/deployment-v2/providers/pages.md | 2 +- user/deployment-v2/providers/puppetforge.md | 2 +- user/deployment-v2/providers/pypi.md | 2 +- user/deployment-v2/providers/releases.md | 2 +- user/deployment-v2/providers/rubygems.md | 2 +- user/deployment-v2/providers/s3.md | 4 ++-- user/deployment-v2/providers/scalingo.md | 4 ++-- user/deployment-v2/providers/snap.md | 2 +- user/deployment-v2/providers/surge.md | 2 ++ user/deployment-v2/providers/testfairy.md | 2 +- user/deployment-v2/providers/transifex.md | 2 +- 35 files changed, 44 insertions(+), 40 deletions(-) diff --git a/user/deployment-v2/providers/anynines.md b/user/deployment-v2/providers/anynines.md index 523b6085be2..0855546081b 100644 --- a/user/deployment-v2/providers/anynines.md +++ b/user/deployment-v2/providers/anynines.md @@ -13,7 +13,7 @@ For a minimal configuration, add the following to your `.travis.yml`: deploy: provider: anynines username: - password: + password: organization: space: ``` diff --git a/user/deployment-v2/providers/azure-web-apps.md b/user/deployment-v2/providers/azure-web-apps.md index 8c4b4b0500e..84c825ab7b8 100644 --- a/user/deployment-v2/providers/azure-web-apps.md +++ b/user/deployment-v2/providers/azure-web-apps.md @@ -15,7 +15,7 @@ and add the following to your `.travis.yml`: deploy: provider: azure_web_apps username: - password: + password: site: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/bintray.md b/user/deployment-v2/providers/bintray.md index 6fe81402daf..3792bbbf7e7 100644 --- a/user/deployment-v2/providers/bintray.md +++ b/user/deployment-v2/providers/bintray.md @@ -15,7 +15,7 @@ deploy: provider: bintray file: user: - key: + key: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/bluemixcloudfoundry.md b/user/deployment-v2/providers/bluemixcloudfoundry.md index b2dbc87174f..497981b20b8 100644 --- a/user/deployment-v2/providers/bluemixcloudfoundry.md +++ b/user/deployment-v2/providers/bluemixcloudfoundry.md @@ -14,7 +14,7 @@ For a minimal configuration, add the following to your `.travis.yml`: deploy: provider: bluemixcloudfoundry username: - password: + password: organization: space: ``` diff --git a/user/deployment-v2/providers/boxfuse.md b/user/deployment-v2/providers/boxfuse.md index fc827d6c113..bb6c7c21cad 100644 --- a/user/deployment-v2/providers/boxfuse.md +++ b/user/deployment-v2/providers/boxfuse.md @@ -13,7 +13,7 @@ For a minimal configuration, add the following to your `.travis.yml`: deploy: provider: boxfuse user: - secret: + secret: payload: # typically a jar, war, tar.gz or zip file ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/cargo.md b/user/deployment-v2/providers/cargo.md index f32fba87655..b6f74ad625d 100644 --- a/user/deployment-v2/providers/cargo.md +++ b/user/deployment-v2/providers/cargo.md @@ -14,7 +14,7 @@ For a minimal configuration, add the following to your `.travis.yml`: language: rust deploy: provider: cargo - token: + token: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/cloud66.md b/user/deployment-v2/providers/cloud66.md index 32070be53fa..071ab68ac0f 100644 --- a/user/deployment-v2/providers/cloud66.md +++ b/user/deployment-v2/providers/cloud66.md @@ -12,7 +12,7 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: cloud66 - redeployment_hook: + redeployment_hook: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/cloudfiles.md b/user/deployment-v2/providers/cloudfiles.md index 2561b8282f0..4cacea6c4c8 100644 --- a/user/deployment-v2/providers/cloudfiles.md +++ b/user/deployment-v2/providers/cloudfiles.md @@ -13,7 +13,7 @@ For a minimal configuration, add the following to your `.travis.yml`: deploy: provider: cloudfiles username: - api_key: + api_key: region: container: ``` diff --git a/user/deployment-v2/providers/cloudfoundry.md b/user/deployment-v2/providers/cloudfoundry.md index 267548a2674..ad357c0e87a 100644 --- a/user/deployment-v2/providers/cloudfoundry.md +++ b/user/deployment-v2/providers/cloudfoundry.md @@ -13,7 +13,7 @@ For a minimal configuration, add the following to your `.travis.yml`: deploy: provider: cloudfoundry username: - password: + password: api: https://api.run.pivotal.io organization: space: diff --git a/user/deployment-v2/providers/codedeploy.md b/user/deployment-v2/providers/codedeploy.md index ea6fd5df9ac..962de9c22ac 100644 --- a/user/deployment-v2/providers/codedeploy.md +++ b/user/deployment-v2/providers/codedeploy.md @@ -15,8 +15,8 @@ deploy: # rest of S3 deployment for .zip # ⋮ - provider: codedeploy - access_key_id: - secret_access_key: + access_key_id: + secret_access_key: bucket: key: path/to/.zip application: diff --git a/user/deployment-v2/providers/elasticbeanstalk.md b/user/deployment-v2/providers/elasticbeanstalk.md index f81e5abfe36..e17ecc629de 100644 --- a/user/deployment-v2/providers/elasticbeanstalk.md +++ b/user/deployment-v2/providers/elasticbeanstalk.md @@ -13,8 +13,8 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: elasticbeanstalk - access_key_id: - secret_access_key: + access_key_id: + secret_access_key: region: env: bucket: diff --git a/user/deployment-v2/providers/engineyard.md b/user/deployment-v2/providers/engineyard.md index 1b7fc098958..dc98a509fd3 100644 --- a/user/deployment-v2/providers/engineyard.md +++ b/user/deployment-v2/providers/engineyard.md @@ -12,7 +12,7 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: engineyard - api_key: # or username and password + api_key: # or username and password ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/firebase.md b/user/deployment-v2/providers/firebase.md index 92a7ea23dd5..31d308344f2 100644 --- a/user/deployment-v2/providers/firebase.md +++ b/user/deployment-v2/providers/firebase.md @@ -13,7 +13,7 @@ For a minimal configuration, all you need to do is add the following to your `.t ```yaml deploy: provider: firebase - token: + token: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/gcs.md b/user/deployment-v2/providers/gcs.md index 775ebaa752c..25099518abf 100644 --- a/user/deployment-v2/providers/gcs.md +++ b/user/deployment-v2/providers/gcs.md @@ -12,8 +12,8 @@ A minimal configuration is: ```yaml deploy: provider: gcs - access_key_id: - secret_access_key: + access_key_id: + secret_access_key: bucket: "GCS Bucket" ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/hackage.md b/user/deployment-v2/providers/hackage.md index 3b057dd8e14..ea36621ff4c 100644 --- a/user/deployment-v2/providers/hackage.md +++ b/user/deployment-v2/providers/hackage.md @@ -13,7 +13,7 @@ For a minimal configuration, add the following to your `.travis.yml`: deploy: provider: hackage username: - password: + password: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/hephy.md b/user/deployment-v2/providers/hephy.md index b9c7926ac3d..a6a1e2177f1 100644 --- a/user/deployment-v2/providers/hephy.md +++ b/user/deployment-v2/providers/hephy.md @@ -14,7 +14,7 @@ deploy: provider: hephy controller: username: - password: + password: app: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/heroku.md b/user/deployment-v2/providers/heroku.md index 72e64852026..f188b5f4ee1 100644 --- a/user/deployment-v2/providers/heroku.md +++ b/user/deployment-v2/providers/heroku.md @@ -13,7 +13,7 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: heroku - api_key: + api_key: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/lambda.md b/user/deployment-v2/providers/lambda.md index e9ee9706b21..1927d6aa213 100644 --- a/user/deployment-v2/providers/lambda.md +++ b/user/deployment-v2/providers/lambda.md @@ -12,6 +12,8 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: lambda + access_key_id: + secret_access_key: function_name: handler_name: role: diff --git a/user/deployment-v2/providers/launchpad.md b/user/deployment-v2/providers/launchpad.md index fca8cc4eacb..ba82bd201f6 100644 --- a/user/deployment-v2/providers/launchpad.md +++ b/user/deployment-v2/providers/launchpad.md @@ -18,8 +18,8 @@ For a minimal configuration, add the following to your `.travis.yml`: deploy: provider: launchpad slug: - oauth_token: - oauth_token_secret: + oauth_token: + oauth_token_secret: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/netlify.md b/user/deployment-v2/providers/netlify.md index 628acabf5c6..4d8243183e5 100644 --- a/user/deployment-v2/providers/netlify.md +++ b/user/deployment-v2/providers/netlify.md @@ -14,7 +14,7 @@ For a minimal configuration, add the following to your `.travis.yml`: deploy: provider: netlify site: - auth: + auth: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/npm.md b/user/deployment-v2/providers/npm.md index d9d70d4642c..1ad605a188d 100644 --- a/user/deployment-v2/providers/npm.md +++ b/user/deployment-v2/providers/npm.md @@ -15,7 +15,7 @@ version 2+): deploy: provider: npm email: - api_token: + api_token: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/openshift.md b/user/deployment-v2/providers/openshift.md index 9ce332f59c6..a239fc34d22 100644 --- a/user/deployment-v2/providers/openshift.md +++ b/user/deployment-v2/providers/openshift.md @@ -13,7 +13,7 @@ For a minimal configuration, add the following to your `.travis.yml`: deploy: provider: openshift server: - token: + token: project: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/opsworks.md b/user/deployment-v2/providers/opsworks.md index 823fc85003f..fcd8a06504e 100644 --- a/user/deployment-v2/providers/opsworks.md +++ b/user/deployment-v2/providers/opsworks.md @@ -12,8 +12,8 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: opsworks - access_key_id: - secret_access_key: + access_key_id: + secret_access_key: app_id: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/packagecloud.md b/user/deployment-v2/providers/packagecloud.md index 9d6607c7994..84d94e7a6d1 100644 --- a/user/deployment-v2/providers/packagecloud.md +++ b/user/deployment-v2/providers/packagecloud.md @@ -15,7 +15,7 @@ deploy: provider: packagecloud repository: username: - token: + token: dist: # required for debian, rpm, and node.js packages, e.g. 'centos/5' ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/pages.md b/user/deployment-v2/providers/pages.md index 809f3973ccc..4f3204e6234 100644 --- a/user/deployment-v2/providers/pages.md +++ b/user/deployment-v2/providers/pages.md @@ -12,7 +12,7 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: pages - token: + token: on: branch: master ``` diff --git a/user/deployment-v2/providers/puppetforge.md b/user/deployment-v2/providers/puppetforge.md index 7d2420c57d7..5f8b7ee391c 100644 --- a/user/deployment-v2/providers/puppetforge.md +++ b/user/deployment-v2/providers/puppetforge.md @@ -13,7 +13,7 @@ For a minimal configuration, add the following to your `.travis.yml`: deploy: provider: puppetforge user: - password: + password: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/pypi.md b/user/deployment-v2/providers/pypi.md index 2bd27f888c2..71f5e439691 100644 --- a/user/deployment-v2/providers/pypi.md +++ b/user/deployment-v2/providers/pypi.md @@ -13,7 +13,7 @@ For a minimal configuration, add the following to your `.travis.yml`: deploy: provider: pypi username: - password: + password: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/releases.md b/user/deployment-v2/providers/releases.md index 2930497c3f3..e7a12c03287 100644 --- a/user/deployment-v2/providers/releases.md +++ b/user/deployment-v2/providers/releases.md @@ -12,7 +12,7 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: releases - token: + token: file: on: tags: true diff --git a/user/deployment-v2/providers/rubygems.md b/user/deployment-v2/providers/rubygems.md index af67046da13..05603fad32f 100644 --- a/user/deployment-v2/providers/rubygems.md +++ b/user/deployment-v2/providers/rubygems.md @@ -12,7 +12,7 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: rubygems - api_key: "YOUR API KEY" + api_key: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/s3.md b/user/deployment-v2/providers/s3.md index 151317d83c5..780abbcaa92 100644 --- a/user/deployment-v2/providers/s3.md +++ b/user/deployment-v2/providers/s3.md @@ -12,8 +12,8 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: s3 - access_key_id: - secret_access_key: + access_key_id: + secret_access_key: bucket: "S3 Bucket" ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/scalingo.md b/user/deployment-v2/providers/scalingo.md index aa7337d6bfb..2f60dd7d0d1 100644 --- a/user/deployment-v2/providers/scalingo.md +++ b/user/deployment-v2/providers/scalingo.md @@ -12,7 +12,7 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: scalingo - token: + token: ``` Alternatively, you can authenticate using a user name and password: @@ -21,7 +21,7 @@ Alternatively, you can authenticate using a user name and password: deploy: provider: scalingo user: - password: + password: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/snap.md b/user/deployment-v2/providers/snap.md index 3b28ae3ac51..856d4ea5221 100644 --- a/user/deployment-v2/providers/snap.md +++ b/user/deployment-v2/providers/snap.md @@ -16,7 +16,7 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: snap - token: + token: ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/surge.md b/user/deployment-v2/providers/surge.md index aca17a68300..da82635e9cb 100644 --- a/user/deployment-v2/providers/surge.md +++ b/user/deployment-v2/providers/surge.md @@ -12,6 +12,8 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: surge + login: + token: domain: # required unless a file CNAME exists ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/testfairy.md b/user/deployment-v2/providers/testfairy.md index 914b05d2bde..69aa10ac516 100644 --- a/user/deployment-v2/providers/testfairy.md +++ b/user/deployment-v2/providers/testfairy.md @@ -12,7 +12,7 @@ For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: provider: testfairy - api_key: + api_key: app_file: # APK/IPA ``` {: data-file=".travis.yml"} diff --git a/user/deployment-v2/providers/transifex.md b/user/deployment-v2/providers/transifex.md index 2012517513c..fdfc06e8895 100644 --- a/user/deployment-v2/providers/transifex.md +++ b/user/deployment-v2/providers/transifex.md @@ -14,7 +14,7 @@ deploy: provider: transifex controller: username: - password: + password: app: ``` {: data-file=".travis.yml"} From a858040e059090e8bd5226a77a45fde71573ffcb Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Tue, 10 Sep 2019 15:29:47 +0200 Subject: [PATCH 0230/1536] merge conditions content --- _includes/deploy/branch.md | 45 ---------- _includes/deploy/overview.md | 0 user/deployment-v2/conditional.md | 136 +++++++++++++++++------------- 3 files changed, 79 insertions(+), 102 deletions(-) delete mode 100644 _includes/deploy/branch.md delete mode 100644 _includes/deploy/overview.md diff --git a/_includes/deploy/branch.md b/_includes/deploy/branch.md deleted file mode 100644 index 89e3c3d29ab..00000000000 --- a/_includes/deploy/branch.md +++ /dev/null @@ -1,45 +0,0 @@ -## Branch to deploy from - -By default, Travis CI will only deploy from your **master** branch. - -You can explicitly specify the branch to deploy from with the **on** option: - -```yaml -deploy: - provider: {{ page.provider }} - on: production -``` -{: data-file=".travis.yml"} - -Alternatively, you can also configure it to deploy from all branches: - -```yaml -deploy: - provider: {{ page.provider }} - on: - all_branches: true -``` -{: data-file=".travis.yml"} - -Builds triggered from Pull Requests will never trigger a deploy. - -## Branches - -By default, Travis CI will only deploy from your `master` branch. You can specify what branch to deploy from with the deploy option `on`: - -```yaml -deploy: - # ⋮ - on: myProductionBranch -``` -{: data-file=".travis.yml"} - -To deploy from all branches set the deploy->on option `all_branches` to `true` - -```yaml -deploy: - # ⋮ - on: - all_branches: true -``` -{: data-file=".travis.yml"} diff --git a/_includes/deploy/overview.md b/_includes/deploy/overview.md deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/user/deployment-v2/conditional.md b/user/deployment-v2/conditional.md index d77030124b7..991a37efc1e 100644 --- a/user/deployment-v2/conditional.md +++ b/user/deployment-v2/conditional.md @@ -4,7 +4,8 @@ layout: en deploy: v2 --- -Set your build to deploy only in specific circumstances by configuring the `on:` key for any deployment provider. +Set your build to deploy only in specific circumstances by using the `on` +option for any deployment provider. ```yaml deploy: @@ -15,59 +16,96 @@ deploy: skip_cleanup: true on: branch: release - condition: $MY_ENV = super_awesome + condition: $MY_ENV = value ``` {: data-file=".travis.yml"} -When *all* conditions specified in the `on:` section are met, your build will deploy. +If *all* conditions specified in the `on` section are met, your build will deploy. -Use the following options to configure conditional deployment: +The following conditions are available: -* `repo`: in the form `owner_name/repo_name`. Deploy only when the build occurs on a particular repository. For example: +### Repo - ```yaml - deploy: - provider: s3 - on: - repo: travis-ci/dpl - ``` - {: data-file=".travis.yml"} +To deploy only when the build occurs on a particular repository, add `repo` in the form `owner_name/repo_name`: -* `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. +```yaml +deploy: + provider: s3 + on: + repo: travis-ci/dpl +``` +{: data-file=".travis.yml"} -* `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. +### Branch -* `condition`: deploy when *a single* bash condition evaluates to `true`. This must be a string value and is equivalent to `if [[ ]]; then ; fi`. For example, `$CC = gcc`. +By default, deployments will only happen on the `master` branch. You can overwrite this by using the `branch` and `all_branches` options. -* `tags` can be `true`, `false` or any other string: +For example, to deploy on the `production` branch only use: - * `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. - * `tags: false`: deployment is triggered if and only if `$TRAVIS_TAG` is empty. - This also causes the `branch` condition to be ignored. - * 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. + ```yaml + deploy: + provider: s3 + on: + branch: production + ``` + {: data-file=".travis.yml"} -### Examples of Conditional Deployment +In order to deploy from all branches: -This example deploys to Appfog only from the `staging` branch when the test has run on Node.js version 0.11. +```yaml +deploy: + provider: s3 + on: + all_branch: true +``` +{: data-file=".travis.yml"} + +### Condition + +You can specify a single Bash `condition` that needs to evaluate to `true` in +order for the deployment to happen. + +This must be a string value and is going to be wrapped into `if [[ ]]; then ; fi`. + +For example, in order to only deploy if `$CC` is `gcc` use: ```yaml -language: node_js deploy: - provider: appfog - user: ... - api_key: ... + provider: s3 on: - branch: staging - node_js: '0.11' # this should be quoted; otherwise, 0.10 would not work + condition: $CC = gcc ``` {: data-file=".travis.yml"} -The next example deploys using a custom script `deploy.sh`, only for builds on the branches `staging` and `production`. +### Tag + +You can specify whether or not to deploy on tag builds using the option `tags`. +If set to to `true` the deployment will only happen on tag builds, if set to +`false` it will not happen on tag builds. + +For example, in order to deploy on tag builds only: + +```yaml +deploy: + provider: s3 + on: + tags: true +``` +{: data-file=".travis.yml"} + +* `tags` can be `true`, `false` or any other string: + +This will check if the environment variable `$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. + +Setting `tags` to `true` causes the `branch` condition to be ignored, otherwise +`$TRAVIS_TAG` is ignored, and the `branch` condition is considered. + +### Examples for conditional deployments + +This deploys using a custom script `deploy.sh`, only for builds on the branches +`staging` and `production`. ```yaml deploy: @@ -79,7 +117,8 @@ deploy: ``` {: data-file=".travis.yml"} -The next example deploys using custom scripts `deploy_production.sh` and `deploy_staging.sh` depending on the branch that triggered the job. +This deploys using custom scripts `deploy_production.sh` and +`deploy_staging.sh` depending on the branch that triggered the job. ```yaml deploy: @@ -94,32 +133,15 @@ deploy: ``` {: data-file=".travis.yml"} -The next example deploys to S3 only when `$CC` is set to `gcc`. +This deploys to S3 only when `$CC` is set to `gcc`. ```yaml deploy: provider: s3 - access_key_id: "YOUR AWS ACCESS KEY" - secret_access_key: "YOUR AWS SECRET KEY" - skip_cleanup: true - bucket: "S3 Bucket" - on: - condition: "$CC = gcc" -``` -{: data-file=".travis.yml"} - -This example deploys to GitHub Releases when a tag is set and the Ruby version is 2.0.0. - -```yaml -deploy: - provider: releases - api_key: "GITHUB OAUTH TOKEN" - file: "FILE TO UPLOAD" - skip_cleanup: true + access_key_id: + secret_access_key: + bucket: on: - tags: true - rvm: 2.0.0 + condition: $CC = gcc ``` {: data-file=".travis.yml"} - - From 969aa44085a34b283fc54ac5a05f5caaaa209326 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Tue, 10 Sep 2019 18:03:42 +0200 Subject: [PATCH 0231/1536] use released gems, remove website section from s3, link to the heroku issue for commands exit code --- Gemfile | 5 ++--- Gemfile.lock | 17 +++++++---------- _includes/deploy/providers/cargo.md | 1 + user/deployment-v2/providers/azure-web-apps.md | 3 +-- user/deployment-v2/providers/heroku.md | 12 +++++++++--- user/deployment-v2/providers/s3.md | 17 ----------------- 6 files changed, 20 insertions(+), 35 deletions(-) diff --git a/Gemfile b/Gemfile index 337544dcdca..10c975efafb 100644 --- a/Gemfile +++ b/Gemfile @@ -45,7 +45,6 @@ git 'https://github.com/ably-forks/compass', branch: 'sass-deprecation-warning-f end group :dpl do - # gem 'dpl', git: 'https://github.com/travis-ci/dpl' - gem 'dpl', path: '../dpl' - gem 'cl', path: '../../cl' + gem 'dpl', git: 'https://github.com/travis-ci/dpl' + gem 'cl' end diff --git a/Gemfile.lock b/Gemfile.lock index bb33881e69c..740b42f40df 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -17,16 +17,11 @@ GIT compass-import-once (1.0.5) sass (>= 3.2, < 3.5) -PATH - remote: ../../cl - specs: - cl (1.1.3) - regstry (~> 1.0.3) - -PATH - remote: ../dpl +GIT + remote: https://github.com/travis-ci/dpl + revision: 7be003d29fb804ca599a3a993ec700eb13118091 specs: - dpl (2.0.0.alpha.2) + dpl (2.0.0.alpha.4) cl (~> 1.0) GEM @@ -47,6 +42,8 @@ GEM rack-test (>= 0.5.4) xpath (~> 2.0) chunky_png (1.3.10) + cl (1.1.5) + regstry (~> 1.0.3) coderay (1.1.2) coffee-script (2.4.1) coffee-script-source @@ -242,7 +239,7 @@ PLATFORMS ruby DEPENDENCIES - cl! + cl compass-core! dpl! faraday diff --git a/_includes/deploy/providers/cargo.md b/_includes/deploy/providers/cargo.md index fd755ccfaae..f864e5f5a15 100644 --- a/_includes/deploy/providers/cargo.md +++ b/_includes/deploy/providers/cargo.md @@ -6,6 +6,7 @@ Support for deployments to Cargo is in **alpha**. Please see [Maturity Levels](/ Use the following options to further configure the deployment: | `token` | Cargo registry API token — **required**, **secret**, type: string | +| `allow_dirty` | Allow cargo to publish from a dirty git working directory — type: boolean | ### Shared options diff --git a/user/deployment-v2/providers/azure-web-apps.md b/user/deployment-v2/providers/azure-web-apps.md index 84c825ab7b8..808d8ad0ce4 100644 --- a/user/deployment-v2/providers/azure-web-apps.md +++ b/user/deployment-v2/providers/azure-web-apps.md @@ -8,8 +8,7 @@ provider: azure_web_apps Travis CI can automatically deploy your [Azure Web App](https://azure.microsoft.com/en-us/services/app-service/web/) after a successful build. -For a minimal configuration, all you need to do is enable [Local Git Deployment](https://azure.microsoft.com/en-us/documentation/articles/app-service-deploy-local-git/) -and add the following to your `.travis.yml`: +For a minimal configuration, add the following to your `.travis.yml`: ```yaml deploy: diff --git a/user/deployment-v2/providers/heroku.md b/user/deployment-v2/providers/heroku.md index f188b5f4ee1..3ce2640d3ff 100644 --- a/user/deployment-v2/providers/heroku.md +++ b/user/deployment-v2/providers/heroku.md @@ -102,11 +102,17 @@ deploy: ### Error Logs for Custom Commands Custom Heroku commands do not affect the Travis CI build status or trigger -Travis CI notifications. +Travis CI notifications, because Heroku's CLI [always exits](https://github.com/heroku/cli/issues/1319) +with `0`, even if the command failed. -Use an addon such as [Papertrail](https://elements.heroku.com/addons/papertrail){: data-proofer-ignore=""} or [Logentries](https://elements.heroku.com/addons/logentries){: data-proofer-ignore=""} to get notifications for `rake db:migrate` or other commands. +As an alternative, you can use an addon such as [Papertrail](https://elements.heroku.com/addons/papertrail){: data-proofer-ignore=""} +or [Logentries](https://elements.heroku.com/addons/logentries){: data-proofer-ignore=""} +to get notifications for `rake db:migrate` or other commands. -These add-ons have email notification systems that can be triggered when certain string matches occur in your Heroku logs. For example you could trigger an e-mail notification if the log contains "this and all later migrations canceled". +These add-ons have email notification systems that can be triggered when +certain string matches occur in your Heroku logs. For example you could trigger +an e-mail notification if the log contains "this and all later migrations +canceled" or similar messages. ### Restarting Applications diff --git a/user/deployment-v2/providers/s3.md b/user/deployment-v2/providers/s3.md index 780abbcaa92..7ce239c42e3 100644 --- a/user/deployment-v2/providers/s3.md +++ b/user/deployment-v2/providers/s3.md @@ -133,23 +133,6 @@ deploy: ``` {: data-file=".travis.yml"} -## Deploy to a S3 hosted website: - -To upload to a S3 hosted website, to use this template to upload to your website. - -```yaml -deploy: - provider: s3 - access_key_id: - secret_access_key: - bucket: "S3 Bucket" - region: "Bucket region" -``` -{: data-file=".travis.yml"} - -Remember that you need to set the bucket to have an ACL of `public` for anybody -to be able to see your website. - ## Deploy to Multiple Buckets: If you want to upload to multiple buckets, use multiple deployment configurations: From 02eed86472f69921981413b631fa0166dbb9a587 Mon Sep 17 00:00:00 2001 From: Sven Fuchs Date: Tue, 10 Sep 2019 20:14:42 +0200 Subject: [PATCH 0232/1536] autogenerate minimal config examples --- Gemfile | 3 +- Gemfile.lock | 5 +- _data/deployments_v2.yml | 2 +- _includes/deploy/providers/anynines.md | 21 +++- _includes/deploy/providers/azure_web_apps.md | 18 +++- _includes/deploy/providers/bintray.md | 18 +++- .../deploy/providers/bluemixcloudfoundry.md | 21 +++- _includes/deploy/providers/boxfuse.md | 17 +++- _includes/deploy/providers/cargo.md | 16 ++- .../deploy/providers/chef_supermarket.md | 16 +++ _includes/deploy/providers/cloud66.md | 16 ++- _includes/deploy/providers/cloudfiles.md | 19 +++- _includes/deploy/providers/cloudformation.md | 22 ++++- _includes/deploy/providers/cloudfoundry.md | 23 ++++- _includes/deploy/providers/codedeploy.md | 29 +++++- _includes/deploy/providers/convox.md | 17 ++++ _includes/deploy/providers/datica.md | 15 +++ .../deploy/providers/elasticbeanstalk.md | 22 ++++- _includes/deploy/providers/engineyard.md | 28 +++++- _includes/deploy/providers/firebase.md | 16 ++- _includes/deploy/providers/gae.md | 15 +++ _includes/deploy/providers/gcs.md | 18 +++- _includes/deploy/providers/gleis.md | 17 +++- _includes/deploy/providers/hackage.md | 17 +++- _includes/deploy/providers/hephy.md | 19 +++- _includes/deploy/providers/heroku_api.md | 16 ++- _includes/deploy/providers/heroku_git.md | 25 ++++- _includes/deploy/providers/lambda.md | 27 ++++- _includes/deploy/providers/launchpad.md | 16 ++- _includes/deploy/providers/netlify.md | 17 +++- _includes/deploy/providers/npm.md | 16 ++- _includes/deploy/providers/openshift.md | 18 +++- _includes/deploy/providers/opsworks.md | 21 +++- _includes/deploy/providers/packagecloud.md | 18 +++- _includes/deploy/providers/pages_api.md | 19 +++- _includes/deploy/providers/pages_git.md | 27 ++++- _includes/deploy/providers/puppetforge.md | 17 +++- _includes/deploy/providers/pypi.md | 17 +++- _includes/deploy/providers/releases.md | 28 +++++- _includes/deploy/providers/rubygems.md | 25 ++++- _includes/deploy/providers/s3.md | 21 +++- _includes/deploy/providers/scalingo.md | 25 ++++- _includes/deploy/providers/script.md | 15 +++ _includes/deploy/providers/snap.md | 16 ++- _includes/deploy/providers/surge.md | 17 +++- _includes/deploy/providers/testfairy.md | 17 +++- _includes/deploy/providers/transifex.md | 25 ++++- lib/dpl/docs.rb | 99 ++++++++++++++++++- user/deployment-v2.md | 2 +- user/deployment-v2/conditional.md | 34 ++++--- user/deployment-v2/providers/anynines.md | 12 --- .../deployment-v2/providers/azure-web-apps.md | 11 --- user/deployment-v2/providers/bintray.md | 11 --- .../providers/bluemixcloudfoundry.md | 13 --- user/deployment-v2/providers/boxfuse.md | 30 +++--- user/deployment-v2/providers/cargo.md | 19 +--- .../providers/chefsupermarket.md | 15 +-- user/deployment-v2/providers/cloud66.md | 15 +-- user/deployment-v2/providers/cloudfiles.md | 15 --- user/deployment-v2/providers/cloudfoundry.md | 13 --- user/deployment-v2/providers/codedeploy.md | 11 ++- .../providers/elasticbeanstalk.md | 13 --- user/deployment-v2/providers/engineyard.md | 9 -- user/deployment-v2/providers/firebase.md | 11 +-- .../{google-app-engine.md => gae.md} | 2 +- user/deployment-v2/providers/gcs.md | 17 +--- user/deployment-v2/providers/hackage.md | 11 --- user/deployment-v2/providers/hephy.md | 13 --- user/deployment-v2/providers/heroku.md | 9 -- user/deployment-v2/providers/lambda.md | 14 --- user/deployment-v2/providers/launchpad.md | 29 ++---- user/deployment-v2/providers/netlify.md | 10 -- user/deployment-v2/providers/npm.md | 13 +-- user/deployment-v2/providers/openshift.md | 11 --- user/deployment-v2/providers/opsworks.md | 24 ++--- user/deployment-v2/providers/packagecloud.md | 36 +++---- user/deployment-v2/providers/pages.md | 20 +--- user/deployment-v2/providers/puppetforge.md | 10 -- user/deployment-v2/providers/pypi.md | 24 ++--- user/deployment-v2/providers/releases.md | 2 +- user/deployment-v2/providers/rubygems.md | 9 -- user/deployment-v2/providers/s3.md | 15 +-- user/deployment-v2/providers/scalingo.md | 19 ---- user/deployment-v2/providers/snap.md | 19 ++-- user/deployment-v2/providers/surge.md | 11 --- user/deployment-v2/providers/testfairy.md | 10 -- user/deployment-v2/providers/transifex.md | 15 +-- 87 files changed, 1033 insertions(+), 516 deletions(-) rename user/deployment-v2/providers/{google-app-engine.md => gae.md} (98%) diff --git a/Gemfile b/Gemfile index 10c975efafb..f344d35e741 100644 --- a/Gemfile +++ b/Gemfile @@ -45,6 +45,7 @@ git 'https://github.com/ably-forks/compass', branch: 'sass-deprecation-warning-f end group :dpl do - gem 'dpl', git: 'https://github.com/travis-ci/dpl' + # gem 'dpl', git: 'https://github.com/travis-ci/dpl' + gem 'dpl', path: '../dpl' gem 'cl' end diff --git a/Gemfile.lock b/Gemfile.lock index 740b42f40df..8dbd3af654b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -17,9 +17,8 @@ GIT compass-import-once (1.0.5) sass (>= 3.2, < 3.5) -GIT - remote: https://github.com/travis-ci/dpl - revision: 7be003d29fb804ca599a3a993ec700eb13118091 +PATH + remote: ../dpl specs: dpl (2.0.0.alpha.4) cl (~> 1.0) diff --git a/_data/deployments_v2.yml b/_data/deployments_v2.yml index d5e554f4216..e7a764583b8 100644 --- a/_data/deployments_v2.yml +++ b/_data/deployments_v2.yml @@ -33,7 +33,7 @@ Rackspace Cloud Files: "/user/deployment-v2/providers/cloudfiles/" RubyGems: "/user/deployment-v2/providers/rubygems/" Scalingo: "/user/deployment-v2/providers/scalingo/" Script: "/user/deployment-v2/providers/script/" -Snap Store: "/user/deployment-v2/providers/snaps/" +Snap Store: "/user/deployment-v2/providers/snap/" Surge.sh: "/user/deployment-v2/providers/surge/" TestFairy: "/user/deployment-v2/providers/testfairy/" Transifex: "/user/deployment-v2/providers/transifex/" diff --git a/_includes/deploy/providers/anynines.md b/_includes/deploy/providers/anynines.md index a42fc74b79d..69a07b50dc7 100644 --- a/_includes/deploy/providers/anynines.md +++ b/_includes/deploy/providers/anynines.md @@ -1,3 +1,21 @@ +{% unless include.minimal == false %} +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: anynines + username: + password: + organization: + space: +``` +{: data-file=".travis.yml"} + + + +{{ include.content }} +{% endunless %} + ## Status Support for deployments to Anynines is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. @@ -10,7 +28,7 @@ Use the following options to further configure the deployment: | `organization` | anynines organization — **required**, type: string | | `space` | anynines space — **required**, type: string | | `app_name` | Application name — type: string | -| `buildpack` | Custom buildpack name or Git URL — type: string | +| `buildpack` | Buildpack name or Git URL — type: string | | `manifest` | Path to the manifest — type: string | ### Shared options @@ -23,5 +41,4 @@ Use the following options to further configure the deployment: All options can be given as environment variables if prefixed with `ANYNINES_`. For example, `password` can be given as `ANYNINES_PASSWORD=`. - {% include deploy/secrets.md name="password" env_name="ANYNINES_PASSWORD" %} \ No newline at end of file diff --git a/_includes/deploy/providers/azure_web_apps.md b/_includes/deploy/providers/azure_web_apps.md index 32eafdb1c93..9ea845f4f73 100644 --- a/_includes/deploy/providers/azure_web_apps.md +++ b/_includes/deploy/providers/azure_web_apps.md @@ -1,3 +1,20 @@ +{% unless include.minimal == false %} +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: azure_web_apps + username: + password: + site: +``` +{: data-file=".travis.yml"} + + + +{{ include.content }} +{% endunless %} + ## Status Support for deployments to Azure Web Apps is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. @@ -21,5 +38,4 @@ Use the following options to further configure the deployment: All options can be given as environment variables if prefixed with `AZURE_WA_`. For example, `password` can be given as `AZURE_WA_PASSWORD=`. - {% include deploy/secrets.md name="password" env_name="AZURE_WA_PASSWORD" %} \ No newline at end of file diff --git a/_includes/deploy/providers/bintray.md b/_includes/deploy/providers/bintray.md index fffa7c297b6..03cdbcb512e 100644 --- a/_includes/deploy/providers/bintray.md +++ b/_includes/deploy/providers/bintray.md @@ -1,3 +1,20 @@ +{% unless include.minimal == false %} +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: bintray + user: + key: + file: +``` +{: data-file=".travis.yml"} + + + +{{ include.content }} +{% endunless %} + ## Status Support for deployments to Bintray is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. @@ -20,5 +37,4 @@ Use the following options to further configure the deployment: All options can be given as environment variables if prefixed with `BINTRAY_`. For example, `key` can be given as `BINTRAY_KEY=`. - {% include deploy/secrets.md name="key" env_name="BINTRAY_KEY" %} \ No newline at end of file diff --git a/_includes/deploy/providers/bluemixcloudfoundry.md b/_includes/deploy/providers/bluemixcloudfoundry.md index 246291a0b12..5176486d89a 100644 --- a/_includes/deploy/providers/bluemixcloudfoundry.md +++ b/_includes/deploy/providers/bluemixcloudfoundry.md @@ -1,3 +1,21 @@ +{% unless include.minimal == false %} +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: bluemixcloudfoundry + username: + password: + organization: + space: +``` +{: data-file=".travis.yml"} + + + +{{ include.content }} +{% endunless %} + ## Status Support for deployments to Bluemix Cloud Foundry is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. @@ -12,7 +30,7 @@ Use the following options to further configure the deployment: | `region` | Bluemix region — type: string, default: `ng`, known values: `ng`, `eu-gb`, `eu-de`, `au-syd` | | `api` | Bluemix api URL — type: string | | `app_name` | Application name — type: string | -| `buildpack` | Custom buildpack name or Git URL — type: string | +| `buildpack` | Buildpack name or Git URL — type: string | | `manifest` | Path to the manifest — type: string | | `skip_ssl_validation` | Skip SSL validation — type: boolean | @@ -26,5 +44,4 @@ Use the following options to further configure the deployment: All options can be given as environment variables if prefixed with `CLOUDFOUNDRY_`. For example, `password` can be given as `CLOUDFOUNDRY_PASSWORD=`. - {% include deploy/secrets.md name="password" env_name="CLOUDFOUNDRY_PASSWORD" %} \ No newline at end of file diff --git a/_includes/deploy/providers/boxfuse.md b/_includes/deploy/providers/boxfuse.md index 2d213e9c5cf..948646618fb 100644 --- a/_includes/deploy/providers/boxfuse.md +++ b/_includes/deploy/providers/boxfuse.md @@ -1,3 +1,19 @@ +{% unless include.minimal == false %} +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: boxfuse + user: + secret: +``` +{: data-file=".travis.yml"} + + + +{{ include.content }} +{% endunless %} + ## Status Support for deployments to Boxfuse is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. @@ -24,5 +40,4 @@ Use the following options to further configure the deployment: All options can be given as environment variables if prefixed with `BOXFUSE_`. For example, `secret` can be given as `BOXFUSE_SECRET=`. - {% include deploy/secrets.md name="secret" env_name="BOXFUSE_SECRET" %} \ No newline at end of file diff --git a/_includes/deploy/providers/cargo.md b/_includes/deploy/providers/cargo.md index f864e5f5a15..6b8662e2a9d 100644 --- a/_includes/deploy/providers/cargo.md +++ b/_includes/deploy/providers/cargo.md @@ -1,3 +1,18 @@ +{% unless include.minimal == false %} +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: cargo + token: +``` +{: data-file=".travis.yml"} + + + +{{ include.content }} +{% endunless %} + ## Status Support for deployments to Cargo is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. @@ -18,5 +33,4 @@ Use the following options to further configure the deployment: All options can be given as environment variables if prefixed with `CARGO_`. For example, `token` can be given as `CARGO_TOKEN=`. - {% include deploy/secrets.md name="token" env_name="CARGO_TOKEN" %} \ No newline at end of file diff --git a/_includes/deploy/providers/chef_supermarket.md b/_includes/deploy/providers/chef_supermarket.md index 280c298bcee..a654d087d44 100644 --- a/_includes/deploy/providers/chef_supermarket.md +++ b/_includes/deploy/providers/chef_supermarket.md @@ -1,3 +1,19 @@ +{% unless include.minimal == false %} +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: chef_supermarket + user_id: + category: +``` +{: data-file=".travis.yml"} + + + +{{ include.content }} +{% endunless %} + ## Status Support for deployments to Chef Supermarket is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. diff --git a/_includes/deploy/providers/cloud66.md b/_includes/deploy/providers/cloud66.md index c8354bda2a5..3bc480fdf17 100644 --- a/_includes/deploy/providers/cloud66.md +++ b/_includes/deploy/providers/cloud66.md @@ -1,3 +1,18 @@ +{% unless include.minimal == false %} +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: cloud66 + redeployment_hook: +``` +{: data-file=".travis.yml"} + + + +{{ include.content }} +{% endunless %} + ## Status Support for deployments to Cloud66 is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. @@ -17,5 +32,4 @@ Use the following options to further configure the deployment: All options can be given as environment variables if prefixed with `CLOUD66_`. For example, `redeployment_hook` can be given as `CLOUD66_REDEPLOYMENT_HOOK=`. - {% include deploy/secrets.md name="redeployment_hook" env_name="CLOUD66_REDEPLOYMENT_HOOK" %} \ No newline at end of file diff --git a/_includes/deploy/providers/cloudfiles.md b/_includes/deploy/providers/cloudfiles.md index 2b7202a0017..364f61820f4 100644 --- a/_includes/deploy/providers/cloudfiles.md +++ b/_includes/deploy/providers/cloudfiles.md @@ -1,3 +1,21 @@ +{% unless include.minimal == false %} +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: cloudfiles + username: + api_key: + region: + container: +``` +{: data-file=".travis.yml"} + + + +{{ include.content }} +{% endunless %} + ## Status Support for deployments to Cloud Files is in **alpha**. Please see [Maturity Levels](/user/deployment-v2#maturity-levels) for details. @@ -22,5 +40,4 @@ Use the following options to further configure the deployment: All options can be given as environment variables if prefixed with `CLOUDFILES_`. For example, `api_key` can be given as `CLOUDFILES_API_KEY=`. - {% include deploy/secrets.md name="api_key" env_name="CLOUDFILES_API_KEY" %} \ No newline at end of file diff --git a/_includes/deploy/providers/cloudformation.md b/_includes/deploy/providers/cloudformation.md index 68260e5db86..1e88a49b512 100644 --- a/_includes/deploy/providers/cloudformation.md +++ b/_includes/deploy/providers/cloudformation.md @@ -1,3 +1,21 @@ +{% unless include.minimal == false %} +For a minimal configuration, add the following to your `.travis.yml`: + +```yaml +deploy: + provider: cloudformation + access_key_id: + secret_access_key: + template:
      Authorization header requirement
      repository visibility and locationRepository visibility and location API server API v1 API v3