Each project that has medium complexity should have a clear deployment process in order to allow launch a new release in a reliable and quick way. With a correct deployment process you can detect bugs before introducing it to a production environment.
Version Control System
Every project must use a Version control systems (VCS). VCS are useful to track the changes we made in our code and facilitates team collaboration. Git is our preferred VCS. We use GitHub for open-source projects and GitLab for proprietary projects.
GitFlow is a branching model for Git. It has attracted a lot of attention because it is very well suited to collaboration and scaling the development team. You can learn more about it reading this blog post.
When you are developing a new application commonly you will have many environments with differents versions. Each environment has a specific propouse and a owner. We recommend the definition of 5 enviroments.
- The development environment is local to each developer and usually are deployed locally in a developer machine, instead of in the cloud.
- A development instance exists in each developer machine, which contains in development code of the features being worked.
- The stage Staging is based on the dev branch. It has the latest developed features as soon as they are finished and tested by the Development team. It is used for demos about features before they are rolled into the Release Candidate.
- The owner of this environment is the Development Team. They are able to upgrade it whenever they consider necesary.
- We recommend host this application with the same technology that uses production in order to prevent problems.
- Release Candidate (RC):
- The RC environment has stable features and it is generally updated when a development cycle (for example a sprint) ends.
- This environment is meant to be used by the product owner during the development to test and validate features released.
- The owner of this environment is the product owner, so it should be updated after he/her approves the features included in a version.