These deployment procedures mainly concern the Cypress binary and cypress
npm module.
Independent @cypress/
packages that live inside the npm
directory are automatically published to npm (with semantic-release
) upon being merged into master. You can read more about this in CONTRIBUTING.md
Anyone can build the binary and npm package, but you can only deploy the Cypress application and publish the npm module cypress
if you are a member of the cypress
npm organization.
ℹ️ See the publishing section for how to build, test and publish a new official version of the binary and
cypress
npm package.
⚠️ Note: The steps in this section are automated in CI, and you should not need to do them yourself when publishing.
Building a new npm package is very quick.
- Increment the version in the root
package.json
yarn build --scope cypress
The steps above:
- Build the
cypress
npm package - Transpile the code into ES5 to be compatible with the common Node versions
- Put the result into the
cli/build
folder.
⚠️ Note: The steps in this section are automated in CI, and you should not need to do them yourself when publishing.
The npm package requires a corresponding binary of the same version. In production, it will try to retrieve the binary from the Cypress CDN if it is not cached locally.
You can build the Cypress binary locally by running yarn binary-build
. You can use Docker to build a Linux binary by running yarn binary-build-linux
.
yarn binary-zip
can be used to zip the built binary together.
-
Ensure you have the following permissions set up:
- An AWS account with permission to create AWS access keys for the Cypress CDN.
- Permissions for your npm account to publish the
cypress
package. - Permissions to modify environment variables for
cypress
on CircleCI and AppVeyor. - Permissions to update releases in ZenHub.
-
Set up the following environment variables:
- Cypress AWS access key and secret in
aws_credentials_json
, which looks like this:aws_credentials_json={"bucket":"cdn.cypress.io","folder":"desktop","key":"...","secret":"..."}
- A GitHub token, a CircleCI token,
and a
cypress-io
account-specific AppVeyor token inci_json
:ci_json={"githubToken":"...","circleToken":"...","appVeyorToken":"..."}
- You'll also need to put the GitHub token under its own variable and get a ZenHub API token for the
release-automations
step.GITHUB_TOKEN="..." ZENHUB_API_TOKEN="..."
- The
cypress-bot
GitHub app credentials are also needed. Ask another team member who has done a deploy for those. - Tip: Use as-a to manage environment variables for different situations.
- Cypress AWS access key and secret in
In order to publish a new cypress
package to the npm registry, we must build and test it across multiple platforms and test projects. This makes publishing directly into the npm registry impossible. Instead, we have CI set up to do the following on every commit to develop
:
- Build the npm package with the new target version baked in.
- Build the Linux/Mac binaries on CircleCI and build Windows on AppVeyor.
- Upload the binaries and the new npm package to
cdn.cypress.io
under the "beta" folder. - Launch the test projects like cypress-test-node-versions and cypress-test-example-repos using the newly-uploaded package & binary instead of installing from the npm registry. That installation looks like this:
export CYPRESS_INSTALL_BINARY=https://cdn.../binary/<new version>/<commit hash>/cypress.zip npm i https://cdn.../npm/<new version>/<commit hash>/cypress.tgz
Multiple test projects are launched for each target operating system and the results are reported back to GitHub using status checks so that you can see if a change has broken real-world usage of Cypress. You can see the progress of the test projects by opening the status checks on GitHub:
Once the develop
branch for all test projects are reliably passing with the new changes, publishing can proceed.
In the following instructions, "X.Y.Z" is used to denote the version of Cypress being published.
-
develop
should contain all of the changes made inmaster
. However, this occasionally may not be the case. Ensure thatmaster
does not have any additional commits that are not ondevelop
and all auto-generated pull requests designed to merge master into develop have been successfully merged. -
If there is a new
cypress-example-kitchensink
version, update the corresponding dependency inpackages/example
to that new version. -
Use the
move-binaries
script to move the binaries for<commit sha>
frombeta
to thedesktop
folder for<new target version>
yarn move-binaries --sha <commit sha> --version <new target version>
-
Publish the new npm package under the
dev
tag, using your personal npm account.- To find the link to the package file
cypress.tgz
: - Publish to the npm registry straight from the URL:
npm publish https://cdn.../npm/X.Y.Z/<long sha>/cypress.tgz --tag dev
- To find the link to the package file
-
Double-check that the new version has been published under the
dev
tag usingnpm info cypress
or available-versions.latest
should still point to the previous version. Example output:dist-tags: dev: 3.4.0 latest: 3.3.2
-
Test
cypress@X.Y.Z
to make sure everything is working.- Install the new version:
npm install -g cypress@X.Y.Z
- Run a quick, manual smoke test:
cypress open
- Go into a project, run a quick test, make sure things look right
- Optionally, do more thorough tests:
- Trigger test projects from the command line (if you have the appropriate permissions)
node scripts/test-other-projects.js --npm cypress@X.Y.Z --binary X.Y.Z
- Test the new version of Cypress against the Cypress dashboard repo.
- Install the new version:
-
Deploy the release-specific documentation and changelog in cypress-documentation.
- If there is not already a release-specific PR open, create one. You can use
release-automations
'sissues-in-release
tool to generate a starting point for the changelog, based off of ZenHub:cd packages/issues-in-release yarn do:changelog --release <release label>
- Ensure the changelog is up-to-date and has the correct date.
- Merge any release-specific documentation changes into the main release PR.
- Merging this PR into
develop
will deploy todocs-staging
and then a PR will be automatically created againstmaster
. It will be automatically merged after it passes and will deploy to production.
- If there is not already a release-specific PR open, create one. You can use
-
Make the new npm version the "latest" version by updating the dist-tag
latest
to point to the new version:npm dist-tag add cypress@X.Y.Z
-
Run
binary-release
to update the download server's manifest and set the next CI version:yarn run binary-release --version X.Y.Z
Note: Currently, there is an issue setting the next CI version that will cause this command to fail after setting the download manifest. You will need to manually update NEXT_DEV_VERSION by logging in to CircleCI and AppVeyor. This is noted in Step 16 below.
-
If needed, push out any updated changes to the links manifest to
on.cypress.io
. -
If needed, deploy the updated
cypress-example-kitchensink
toexample.cypress.io
by following these instructions under "Deployment". -
Update the releases in ZenHub:
- Close the current release in ZenHub.
- Create a new patch release (and a new minor release, if this is a minor release) in ZenHub, and schedule them both to be completed 2 weeks from the current date.
- Move all issues that are still open from the current release to the appropriate future release.
-
Bump
version
inpackage.json
, commit it todevelop
, tag it with the version, and push the tag up:git commit -am "release X.Y.Z [skip ci]" git log --pretty=oneline # copy sha of the previous commit git tag -a vX.Y.Z <sha> git push origin vX.Y.Z
-
Merge
develop
intomaster
and push both branches up. Note: pushing tomaster
will automatically publish any independent npm packages that have not yet been published.git push origin develop git checkout master git merge develop git push origin master
-
Inside of cypress-io/release-automations:
- Publish GitHub release to cypress-io/cypress/releases using package
set-releases
:cd packages/set-releases && npm run release-log -- --version X.Y.Z
- Add a comment to each GH issue that has been resolved with the new published version using package
issues-in-release
:cd packages/issues-in-release && npm run do:comment -- --release X.Y.Z
- Publish GitHub release to cypress-io/cypress/releases using package
-
Publish a new docker image in
cypress-docker-images
underincluded
for the new cypress version. -
Decide on the next version that we will work on. For example, if we have just released
3.7.0
we probably will work on3.7.1
next. Set it on CI machines. -
Update example projects to the new version. For most projects, you can go to the Renovate dependency issue and check the box next to
Update dependency cypress to X.Y.Z
. It will automatically create a PR. Once it passes, you can merge it. Try updating at least the following projects:- cypress-example-todomvc
- cypress-example-todomvc-redux
- cypress-example-realworld
- cypress-example-recipes
- cypress-example-api-testing
- angular-pizza-creator
- cypress-fiddle
- cypress-example-piechopper
- cypress-documentation
- cypress-example-docker-compose - Doesn't have a Renovate issue, but will auto-create and auto-merge non-major Cypress updates as long as the tests pass.
-
Check if any test or example repositories have a branch for testing the features or fixes from the newly published version
x.y.z
. The branch should also be namedx.y.z
. Check allcypress-test-*
andcypress-example-*
repositories, and if there is a branch namedx.y.z
, merge it intomaster
.Test Repos
- cypress-test-tiny
- cypress-test-nested-projects
- cypress-test-example-repos
- cypress-test-node-versions
- cypress-test-module-api
- cypress-test-ci-environments
Example Repos
Take a break, you deserve it! 😎