diff --git a/.github/workflows/terraform.yaml b/.github/workflows/terraform.yaml new file mode 100644 index 0000000..c181711 --- /dev/null +++ b/.github/workflows/terraform.yaml @@ -0,0 +1,89 @@ +name: "Terraform Executa Modulo" + +on: + workflow_call: + inputs: + os_version: + description: "Versão do sistema operacional" + required: false + default: "ubuntu-20.04" + type: string + workspace: + description: "Define o workspace em que o modulo será executado" + required: false + default: "" + type: string + plan: + description: "Define se será executado ou não o step Terraform Plan" + required: false + default: false + type: boolean + apply: + description: "Define se será executado ou não o step Terraform Apply" + required: false + default: false + type: boolean + working_directory: + description: "Diretório onde a pipeline irá atuar" + required: false + default: "." + type: string + +jobs: + terraform: + name: Terraform workflow + runs-on: ${{ inputs.os_version }} + defaults: + run: + working-directory: ${{ inputs.working_directory }} + steps: + - name: Checkout + uses: actions/checkout@v2 + + # É esperado que secrets sejam herdados do repositório que está chamando + # a pipeline e que esses secrets serão usados para configurar providers + # to Terraform usando variáveis de ambiente. + # Esse step irá export todos os secrets disponíveis como variáveis de + # ambiente para os passos seguintes. + - uses: mentoriaiac/secrets-to-env-action@v1 + with: + secrets: ${{ toJSON(secrets) }} + + - name: Lê versão do Terraform + id: tf-version + run: | + TF_VERSION=$(sed -nr 's/\s*required_version\s+=\s+"(.*)"/\1/p' *.tf) + echo "::set-output name=version::$TF_VERSION" + + - name: Setup Terraform + uses: hashicorp/setup-terraform@v1 + with: + terraform_version: ${{ steps.tf-version.outputs.version }} + + - name: Terraform Version + run: terraform version + + - name: Terraform Format + run: terraform fmt -check -diff + + - name: Terraform Workspace + if: ${{ inputs.workspace != '' }} + run: terraform workspace select ${{ inputs.workspace }} + + - name: Terraform Init + run: terraform init + + - name: Terraform Validate + run: terraform validate + + - name: Validação do tfsec + run: | + docker run --rm -v $PWD:/app -w /app tfsec/tfsec . + + - name: Terraform Plan + if: ${{ inputs.plan }} + run: terraform plan -out tfplan + + - name: Terraform Apply + if: ${{ inputs.plan && inputs.apply }} + run: terraform apply tfplan diff --git a/.github/workflows/terraform_executa_modulo_aws.yaml b/.github/workflows/terraform_executa_modulo_aws.yaml deleted file mode 100644 index 51b97a4..0000000 --- a/.github/workflows/terraform_executa_modulo_aws.yaml +++ /dev/null @@ -1,66 +0,0 @@ -name: "Terraform Executa Modulo" - -on: - workflow_call: - inputs: - os_version: - description: "Versão do sistema operacional" - required: false - default: "ubuntu-20.04" - type: string - aws_region: - description: "Define a região AWS para a configuração das credenciais" - required: true - type: string - tf_workspace: - description: "Define o workspace em que o modulo será executado" - required: false - default: "default" - type: string - secrets: - AWS_ACCESS_KEY_ID: - description: "Credencial AWS" - required: true - AWS_SECRET_ACCESS_KEY: - description: "Credencial AWS" - required: true - -jobs: - jobs_terraform: - name: Terraform workflow - runs-on: ${{ inputs.os_version }} - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: ${{ inputs.aws_region }} - - - name: Lê versão do Terraform - id: tf-version - run: | - TF_VERSION=$(sed -nr 's/\s*required_version\s+=\s+"(.*)"/\1/p' *.tf) - echo "::set-output name=version::$TF_VERSION" - - - name: Setup Terraform - uses: hashicorp/setup-terraform@v1 - with: - terraform_version: ${{ steps.tf-version.outputs.version }} - - - name: Terraform Init - run: terraform init - - - name: Terraform Workspace - run: | - [ "${{ inputs.tf_workspace }}" != default ] && terraform workspace select ${{ inputs.tf_workspace }} || echo "executando no workspace default" - - - name: Terraform Plan - run: terraform plan -out tfplan -no-color - - - name: Terraform Apply - run: terraform apply "tfplan" diff --git a/.github/workflows/test_terraform.yml b/.github/workflows/test_terraform.yml index 3c18c85..b0ec496 100644 --- a/.github/workflows/test_terraform.yml +++ b/.github/workflows/test_terraform.yml @@ -20,3 +20,25 @@ jobs: uses: "./.github/workflows/terraform_valida_modulo.yaml" with: working_directory: tests/terraform/test-required-version/test-004 + test-terraform: + uses: "./.github/workflows/terraform.yaml" + with: + working_directory: tests/terraform/workspace-plan-apply + test-terraform-plan: + uses: "./.github/workflows/terraform.yaml" + with: + working_directory: tests/terraform/workspace-plan-apply + plan: true + test-terraform-plan-apply: + uses: "./.github/workflows/terraform.yaml" + with: + working_directory: tests/terraform/workspace-plan-apply + plan: true + apply: true + test-terraform-plan-apply-workspace: + uses: "./.github/workflows/terraform.yaml" + with: + working_directory: tests/terraform/workspace-plan-apply + plan: true + apply: true + workspace: "dev" diff --git a/docs/terraform.md b/docs/terraform.md new file mode 100644 index 0000000..f7d2afa --- /dev/null +++ b/docs/terraform.md @@ -0,0 +1,40 @@ +# Terraform Executa Modulo +Github Actions para ser reutilizado nos projetos que utilizam Terraform, com a finalidade de validar a sintaxe do código e/ou criar uma infra baseada em um modulo. + +## Inputs +| Nome | Descrição | Requirida | Default | +|------|-----------|-----------|---------| +| `apply` | Define se o step terraform apply será executado | não | `false` | +| `os_version` | Versão do sistema operacional | não | `"ubuntu-20.04"` | +| `plan` | Define se o step terraform plan será executado | não | `false` | +| `working_directory` | Define o diretório onde a pipeline irá atuar | não | `"."` | +| `workspace` | Seleciona o Workspace | não | `""` | + +## Secrets + +Herda a secrets existentes no repositório que utiliza este workflow. A principal função é configurar as variáveis de ambientes necessárias para executar o modulo terraform. + +## Utilizando +Criar a seguintes estrutura de diretórios: + +`.github/workflows/.yml` + +Utilize o exemplo abaixo para seu pipeline de CI: + +```yaml +name: "Terraform Valida e Executa Modulo" + +on: + push: + branches: + - main + +jobs: + terraform: + uses: "mentoriaiac/cicd_centralizado/.github/workflows/terraform.yaml@v1" + with: + plan: true + apply: true + workspace: "prod" + secrets: inherit +``` diff --git a/docs/terraform_executa_modulo_aws.md b/docs/terraform_executa_modulo_aws.md deleted file mode 100644 index 09d3433..0000000 --- a/docs/terraform_executa_modulo_aws.md +++ /dev/null @@ -1,42 +0,0 @@ -# Terraform Executa Modulo -Github Actions para ser reutilizado nos projetos que utilizam Terraform, com a finalidade de criar uma infra baseada em um modulo. - -## Inputs -| Nome | Descrição | Requirida | Default | -|------|-----------|-----------|---------| -| `aws_region` | Região AWS | sim | N/A | -| `os_version` | Versão do sistema operacional | não | ubuntu-20.04 | -| `tf_workspace` | Seleciona o Workspace | não | default | - -## Secrets - -| Nome | Descrição | Requerida | Default | -|------|-----------|-----------|---------| -| `AWS_ACCESS_KEY_ID` | Credencial AWS | Sim | N/A | -| `AWS_SECRET_ACCESS_KEY` | Credencial AWS | Sim | N/A | - -## Utilizando -Criar a seguintes estrutura de diretórios: - -`.github/workflows/.yml` - -Utilize o exemplo abaixo para seu pipeline de CI: - -```yaml -name: "Terraform Executa Modulo" - -on: - push: - branches: - - main - -jobs: - terraform: - uses: "mentoriaiac/cicd_centralizado/.github/workflows/terraform_executa_modulo_aws.yaml@v1" - with: - aws_region: "us-east-1" - tf_workspace: "default" - secrets: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} -``` diff --git a/tests/terraform/workspace-plan-apply/.gitignore b/tests/terraform/workspace-plan-apply/.gitignore new file mode 100644 index 0000000..784533a --- /dev/null +++ b/tests/terraform/workspace-plan-apply/.gitignore @@ -0,0 +1,3 @@ +.terraform.lock.hcl +.terraform/providers/ +**/terraform.tfstate.backup diff --git a/tests/terraform/workspace-plan-apply/.terraform/environment b/tests/terraform/workspace-plan-apply/.terraform/environment new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/tests/terraform/workspace-plan-apply/.terraform/environment @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/tests/terraform/workspace-plan-apply/main.tf b/tests/terraform/workspace-plan-apply/main.tf new file mode 100644 index 0000000..9925890 --- /dev/null +++ b/tests/terraform/workspace-plan-apply/main.tf @@ -0,0 +1,5 @@ +resource "null_resource" "global" {} + +resource "null_resource" "only_dev" { + count = terraform.workspace == "dev" ? 1 : 0 +} diff --git a/tests/terraform/workspace-plan-apply/terraform.tfstate b/tests/terraform/workspace-plan-apply/terraform.tfstate new file mode 100644 index 0000000..fdedb03 --- /dev/null +++ b/tests/terraform/workspace-plan-apply/terraform.tfstate @@ -0,0 +1,8 @@ +{ + "version": 4, + "terraform_version": "1.1.4", + "serial": 3, + "lineage": "bf85634d-9a64-50be-9be5-f3c9e6855883", + "outputs": {}, + "resources": [] +} diff --git a/tests/terraform/workspace-plan-apply/terraform.tfstate.d/dev/terraform.tfstate b/tests/terraform/workspace-plan-apply/terraform.tfstate.d/dev/terraform.tfstate new file mode 100644 index 0000000..4479944 --- /dev/null +++ b/tests/terraform/workspace-plan-apply/terraform.tfstate.d/dev/terraform.tfstate @@ -0,0 +1,8 @@ +{ + "version": 4, + "terraform_version": "1.1.4", + "serial": 4, + "lineage": "d56b2b0b-d036-d2e0-7814-daca9c040ad4", + "outputs": {}, + "resources": [] +}