Gitflow
What is Gitflow?
Section titled “What is Gitflow?”Gitflow is a popular branching model for Git that helps teams organize feature development, releases, and hotfixes. It defines clear roles for branches and a structured process for integrating changes.
Gitflow Branching Model
Section titled “Gitflow Branching Model”The Gitflow branching model consists of the following main branches:
main (or master)
Section titled “main (or master)”Represents the production-ready state of your infrastructure.
develop
Section titled “develop”Serves as the integration branch for feature development and acts as a staging area before merging changes into main.
feature/*
Section titled “feature/*”Used for developing new features or enhancements. Each feature branch is created from develop and merged back into develop when complete.
release/*
Section titled “release/*”Used for preparing a new release. Release branches are created from develop, and once they are stable, they are merged into both main and develop.
hotfix/*
Section titled “hotfix/*”Used for addressing critical issues in production. Hotfix branches are created from main, and once the fix is complete, they are merged into both main and develop.
gitGraph commit id: "main" branch dev commit id: "develop" branch feature/add-new-resource commit id: "feature" checkout dev merge feature/add-new-resource branch release/1.0 commit id: "release" checkout main merge release/1.0 branch hotfix/fix-critical-bug commit id: "hotfix" checkout main merge hotfix/fix-critical-bug checkout dev merge hotfix/fix-critical-bug
Configuring Terrateam for Gitflow
Section titled “Configuring Terrateam for Gitflow”To implement a Gitflow-style workflow with Terrateam, you’ll use the tags, destination_branches, and workflows sections in your .terrateam/config.yml.
Below, each section is explained in detail:
1. Tags
Section titled “1. Tags”Define tags to identify destination branches using regular expressions:
tags: dest_branch: main: '^main$' staging: '^staging$' dev: '^dev$'What it does:
- This creates a
dest_branchtag that matches your main, staging, and dev branches.
2. Destination Branches
Section titled “2. Destination Branches”Specify which source branches are allowed to open pull requests into each destination branch:
destination_branches: - branch: main source_branches: ['staging'] - branch: staging source_branches: ['dev'] - branch: dev source_branches: ['*', '!main', '!staging']What it does:
- Only
stagingcan merge intomain. - Only
devcan merge intostaging. - Any branch except
mainorstagingcan merge intodev(e.g., features).
3. Workflows
Section titled “3. Workflows”Define different workflows for each destination branch:
workflows: - tag_query: 'dest_branch:main' plan: - type: env method: source cmd: ['echo', 'main'] - type: init - type: plan apply: - type: env method: source cmd: ['echo', 'main'] - type: init - type: apply - tag_query: 'dest_branch:staging' plan: - type: env method: source cmd: ['echo', 'staging'] - type: init - type: plan apply: - type: env method: source cmd: ['echo', 'staging'] - type: init - type: apply - tag_query: 'dest_branch:dev' plan: - type: env method: source cmd: ['echo', 'dev'] - type: init - type: plan apply: - type: env method: source cmd: ['echo', 'dev'] - type: init - type: applyWhat it does:
- Runs different Terraform workflows depending on the destination branch.
- Sets an environment variable for each environment, then runs
init,plan, andapplyas appropriate.
Full Example: Complete .terrateam/config.yml for Gitflow
tags: dest_branch: main: '^main$' staging: '^staging$' dev: '^dev$'destination_branches: - branch: main source_branches: ['staging'] - branch: staging source_branches: ['dev'] - branch: dev source_branches: ['*', '!main', '!staging']workflows: - tag_query: 'dest_branch:main' plan: - type: env method: source cmd: ['echo', 'main'] - type: init - type: plan apply: - type: env method: source cmd: ['echo', 'main'] - type: init - type: apply - tag_query: 'dest_branch:staging' plan: - type: env method: source cmd: ['echo', 'staging'] - type: init - type: plan apply: - type: env method: source cmd: ['echo', 'staging'] - type: init - type: apply - tag_query: 'dest_branch:dev' plan: - type: env method: source cmd: ['echo', 'dev'] - type: init - type: plan apply: - type: env method: source cmd: ['echo', 'dev'] - type: init - type: applyWorkflow Example
Section titled “Workflow Example”Let’s walk through an example of how the Gitflow workflow can be implemented with Terrateam using the above configuration:
- Create a new feature branch from
dev:feature/add-new-resource - Make the necessary changes to your Terraform code in the feature branch
- Open a pull request from
feature/add-new-resourcetodev - Terrateam will run plans on the pull request, allowing you to review the proposed changes in the
devenvironment - After the pull request is approved and merged, the changes will be incorporated into
dev
- When you’re ready to deploy the changes to staging, create a pull request from
devtostaging - Terrateam will run plans and applies on the staging environment, ensuring that the infrastructure is properly provisioned
- If any issues are found during the staging deployment, fix them directly in the
devbranch and repeat the process - Once the changes are stable in staging, merge the pull request into
staging
- When you’re ready to release the changes to production, create a pull request from
stagingtomain - Terrateam will run plans and applies on the production environment, ensuring that the changes are properly deployed
- If any issues are found during the production release, fix them directly in the
stagingbranch and repeat the process - Once the changes are stable in production, merge the pull request into
main
- If a critical issue is discovered in production, create a new hotfix branch from
main:hotfix/fix-critical-bug - Make the necessary fixes in the hotfix branch
- Open a pull request from
hotfix/fix-critical-bugtomain - Terrateam will run plans and applies on the production environment, ensuring that the fix is properly implemented
- After the pull request is approved and merged, the hotfix will be deployed to production
- Merge the hotfix branch back into
devto ensure that the fix is included in future releases
Best Practices
Section titled “Best Practices”When implementing a Gitflow workflow with Terrateam, consider the following best practices:
- Ensure that your destination branches and tags configuration accurately reflects your desired branching model and workflow.
- Use descriptive and meaningful names for your branches, following the Gitflow naming conventions.
- Regularly update your
devbranch with the latest changes frommainto keep it in sync.