Periodically, our team takes stock of the services we leverage in order to improve upon the solutions we have in place. We recently did this with our continuous integration and deployment processes/services, which resulted in us migrating to Bitbucket Pipelines.
While there were a number of reasons for this decision, here are a few that stood out to us:
- We're already heavily invested in the Atlassian ecosystem, making use of Jira, Confluence, and Bitbucket.
- Support for both automated and push-button deployments, with the ability to promote between environments.
- Native docker support.
- Unrestricted service definitions that leverage the build container's network, so you have access to them via localhost.
- No limit on parallelization: you pay for minutes, not containers.
- Fantastic caching for numerous technology stacks to help speed up workflow steps.
- Great support for creating and sharing artifacts between build steps.
Not only are our workflows cleaner, but we've seen a reduction in deployment times from 4+ minutes down to an average of 2:31. Our feedback loop has never been faster.
It's pretty impressive, when you think about everything the workflow is doing: from the point of check-in, running unit and acceptance tests, analyzing the code coverage, building and pushing the new docker image to the repository and, finally, updating the Kubernetes cluster to use the new image on our staging environment. All within 2:31.
When we’re ready to go live on production, we simply promote the changes from staging to production using the push-button deployment features built into the UI.
In the coming weeks, we'll be sharing some findings that helped us decrease the overall time it takes to go through the workflow, as well as a few techniques we applied to make sustaining the workflow yml file a little easier.