Created
December 22, 2022 03:42
-
-
Save emmeowzing/999e0b94ca256865902f6d6573f28906 to your computer and use it in GitHub Desktop.
Run Terraform in different environments and cloud providers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
stages: | |
- init | |
- validate | |
- plan | |
- apply | |
- destroy | |
workflow: | |
rules: | |
- if: $CI_PIPELINE_SOURCE == "merge_request_event" | |
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS | |
when: never | |
- if: $CI_COMMIT_BRANCH | |
- if: $CI_COMMIT_TAG | |
## Templates | |
.terraform-base: | |
interruptible: true | |
rules: | |
- changes: | |
paths: | |
- environments/${_PATH}/**/*.tf | |
image: | |
name: hashicorp/terraform:1.3.6 | |
entrypoint: [""] | |
cache: | |
key: terraform-${_PATH} | |
paths: | |
- environments/${_PATH}/.terraform/ | |
- environments/${_PATH}/.terraform.plan | |
when: on_success | |
tags: | |
- docker | |
.terraform-base-development: | |
extends: .terraform-base | |
parallel: | |
matrix: | |
- _PATH: development/aws | |
_STATE: development-aws | |
- _PATH: development/azure | |
_STATE: development-azure | |
- _PATH: development/gcp | |
_STATE: development-gcp | |
- _PATH: development/on-premise | |
_STATE: development-on-premise | |
.terraform-base-load: | |
extends: .terraform-base | |
parallel: | |
matrix: | |
- _PATH: load/aws | |
_STATE: load-aws | |
- _PATH: load/azure | |
_STATE: load-azure | |
- _PATH: load/gcp | |
_STATE: load-gcp | |
- _PATH: load/on-premise | |
_STATE: load-on-premise | |
.terraform-base-production: | |
extends: .terraform-base | |
parallel: | |
matrix: | |
- _PATH: production/aws | |
_STATE: production-aws | |
- _PATH: production/azure | |
_STATE: production-azure | |
- _PATH: production/gcp | |
_STATE: production-gcp | |
- _PATH: production/on-premise | |
_STATE: production-on-premise | |
.terraform-base-staging: | |
extends: .terraform-base | |
parallel: | |
matrix: | |
- _PATH: staging/aws | |
_STATE: staging-aws | |
- _PATH: staging/azure | |
_STATE: staging-azure | |
- _PATH: staging/gcp | |
_STATE: staging-gcp | |
- _PATH: staging/on-premise | |
_STATE: staging-on-premise | |
## Stages | |
# init | |
terraform-init-development: | |
extends: .terraform-base-development | |
stage: init | |
script: | |
# https://git.ops.sbe-vision.com/help/user/infrastructure/iac/terraform_state#set-up-the-initial-backend | |
- terraform -chdir="environments/$_PATH" init -no-color | |
-backend-config=address=${TF_ADDRESS}/${_STATE} | |
-backend-config=lock_address=${TF_ADDRESS}/${_STATE}/lock | |
-backend-config=unlock_address=${TF_ADDRESS}/${_STATE}/lock | |
-backend-config=username=${TF_USERNAME} | |
-backend-config=password=${TF_PASSWORD} | |
-backend-config=lock_method=POST | |
-backend-config=unlock_method=DELETE | |
-backend-config=retry_wait_min=5 | |
-migrate-state | |
-force-copy | |
terraform-init-load: | |
extends: .terraform-base-load | |
stage: init | |
script: | |
- terraform -chdir="environments/$_PATH" init -no-color | |
-backend-config=address=${TF_ADDRESS}/${_STATE} | |
-backend-config=lock_address=${TF_ADDRESS}/${_STATE}/lock | |
-backend-config=unlock_address=${TF_ADDRESS}/${_STATE}/lock | |
-backend-config=username=${TF_USERNAME} | |
-backend-config=password=${TF_PASSWORD} | |
-backend-config=lock_method=POST | |
-backend-config=unlock_method=DELETE | |
-backend-config=retry_wait_min=5 | |
-migrate-state | |
-force-copy | |
terraform-init-production: | |
extends: .terraform-base-production | |
stage: init | |
script: | |
- terraform -chdir="environments/$_PATH" init -no-color | |
-backend-config=address=${TF_ADDRESS}/${_STATE} | |
-backend-config=lock_address=${TF_ADDRESS}/${_STATE}/lock | |
-backend-config=unlock_address=${TF_ADDRESS}/${_STATE}/lock | |
-backend-config=username=${TF_USERNAME} | |
-backend-config=password=${TF_PASSWORD} | |
-backend-config=lock_method=POST | |
-backend-config=unlock_method=DELETE | |
-backend-config=retry_wait_min=5 | |
-migrate-state | |
-force-copy | |
terraform-init-staging: | |
extends: .terraform-base-staging | |
stage: init | |
script: | |
- terraform -chdir="environments/$_PATH" init -no-color | |
-backend-config=address=${TF_ADDRESS}/${_STATE} | |
-backend-config=lock_address=${TF_ADDRESS}/${_STATE}/lock | |
-backend-config=unlock_address=${TF_ADDRESS}/${_STATE}/lock | |
-backend-config=username=${TF_USERNAME} | |
-backend-config=password=${TF_PASSWORD} | |
-backend-config=lock_method=POST | |
-backend-config=unlock_method=DELETE | |
-backend-config=retry_wait_min=5 | |
-migrate-state | |
-force-copy | |
# validate | |
terraform-validate-development: | |
extends: .terraform-base-development | |
stage: validate | |
script: | |
- terraform -chdir="environments/$_PATH" validate -no-color | |
terraform-validate-load: | |
extends: .terraform-base-load | |
stage: validate | |
script: | |
- terraform -chdir="environments/$_PATH" validate -no-color | |
terraform-validate-production: | |
extends: .terraform-base-production | |
stage: validate | |
script: | |
- terraform -chdir="environments/$_PATH" validate -no-color | |
terraform-validate-staging: | |
extends: .terraform-base-staging | |
stage: validate | |
script: | |
- terraform -chdir="environments/$_PATH" validate -no-color | |
shellcheck: | |
stage: validate | |
interruptible: true | |
image: | |
name: cimg/base:stable | |
before_script: | |
- | | |
scversion="stable" # or "v0.4.7", or "latest" | |
wget -qO- "https://github.com/koalaman/shellcheck/releases/download/${scversion?}/shellcheck-${scversion?}.linux.x86_64.tar.xz" | tar -xJv | |
sudo install "shellcheck-${scversion}/shellcheck" /usr/bin/shellcheck | |
shellcheck --version | |
script: | |
- find scripts/ -type f -name "*.sh" | xargs shellcheck -x | |
rules: | |
- changes: | |
paths: | |
- scripts/**/*.sh | |
tags: | |
- docker | |
# plan | |
terraform-plan-development: | |
extends: .terraform-base-development | |
stage: plan | |
script: | |
- terraform -chdir="environments/$_PATH" plan -no-color -out=.terraform.plan | |
-var=gcp-sbe-develop-credentials='${DEVELOPMENT_GCP_ACCOUNT_KEY}' | |
terraform-plan-load: | |
extends: .terraform-base-load | |
stage: plan | |
script: | |
- terraform -chdir="environments/$_PATH" plan -no-color -out=.terraform.plan | |
terraform-plan-production: | |
extends: .terraform-base-production | |
stage: plan | |
script: | |
- terraform -chdir="environments/$_PATH" plan -no-color -out=.terraform.plan | |
terraform-plan-staging: | |
extends: .terraform-base-staging | |
stage: plan | |
script: | |
- terraform -chdir="environments/$_PATH" plan -no-color -out=.terraform.plan | |
# apply | |
terraform-apply-development: | |
extends: .terraform-base-development | |
stage: apply | |
script: | |
- terraform -chdir "environments/$_PATH" apply -auto-approve -no-color .terraform.plan | |
rules: | |
- changes: | |
paths: | |
- environments/${_PATH}/**/*.tf | |
if: $CI_COMMIT_REF_NAME == "master" | |
terraform-apply-load: | |
extends: .terraform-base-load | |
stage: apply | |
script: | |
- terraform -chdir "environments/$_PATH" apply -auto-approve -no-color .terraform.plan | |
rules: | |
- changes: | |
paths: | |
- environments/${_PATH}/**/*.tf | |
if: $CI_COMMIT_REF_NAME == "master" | |
terraform-apply-production: | |
extends: .terraform-base-production | |
stage: apply | |
script: | |
- terraform -chdir "environments/$_PATH" apply -auto-approve -no-color .terraform.plan | |
rules: | |
- changes: | |
paths: | |
- environments/${_PATH}/**/*.tf | |
if: $CI_COMMIT_REF_NAME == "master" | |
terraform-apply-staging: | |
extends: .terraform-base-staging | |
stage: apply | |
script: | |
- terraform -chdir "environments/$_PATH" apply -auto-approve -no-color .terraform.plan | |
rules: | |
- changes: | |
paths: | |
- environments/${_PATH}/**/*.tf | |
if: $CI_COMMIT_REF_NAME == "master" | |
# destroy | |
## | |
# Manual destroy. | |
# terraform-destroy: | |
# when: manual | |
# extends: .terraform-base | |
# stage: destroy | |
# script: | |
# - terraform -chdir "$_PATH" apply -destroy -auto-approve |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment