├── .github └── workflows │ ├── adiciona_issues_project_mentoriaiac.yaml │ ├── ansible_valida_role.yaml │ ├── docker_build.yaml │ ├── terraform.yaml │ ├── terraform_valida_modulo.yaml │ ├── test_terraform.yml │ └── versioning.yaml ├── CHANGELOG.md ├── LICENSE.txt ├── README.md ├── docs ├── ansible_valida_role.md ├── docker_build.md ├── img │ └── token-github.png ├── terraform.md └── terraform_valida_modulo.md └── tests └── terraform ├── test-required-version ├── test-001 │ └── main.tf ├── test-002 │ └── main.tf ├── test-003 │ ├── main.tf │ └── versions.tf └── test-004 │ └── main.tf └── workspace-plan-apply ├── .gitignore ├── .terraform └── environment ├── main.tf ├── terraform.tfstate └── terraform.tfstate.d └── dev └── terraform.tfstate /.github/workflows/adiciona_issues_project_mentoriaiac.yaml: -------------------------------------------------------------------------------- 1 | name: "Adiciona Issues em Projects Beta GitHub" 2 | 3 | on: 4 | issues: 5 | types: 6 | - opened 7 | 8 | jobs: 9 | add-to-project: 10 | name: Add issue to project 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/add-to-project@v0.3.0 14 | with: 15 | project-url: https://github.com/orgs/mentoriaiac/projects/6 16 | github-token: ${{ secrets.API_TOKEN_GITHUB }} 17 | -------------------------------------------------------------------------------- /.github/workflows/ansible_valida_role.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: "Valida Roles Ansible" 3 | 4 | on: 5 | workflow_call: 6 | inputs: 7 | python_version: 8 | description: "Versão do python" 9 | required: false 10 | type: string 11 | default: '3.9' 12 | os_version: 13 | description: "Versão do sistema operacional" 14 | required: false 15 | default: "ubuntu-20.04" 16 | type: string 17 | secrets: 18 | token: 19 | required: true 20 | jobs: 21 | linter: 22 | runs-on: ${{ inputs.os_version }} 23 | steps: 24 | - uses: actions/checkout@v2 25 | - name: Set up Python ${{ inputs.python_version }} 26 | uses: actions/setup-python@v2 27 | with: 28 | python-version: ${{ inputs.python_version }} 29 | - name: Install dependencies 30 | run: | 31 | python3 -m pip install --upgrade pip 32 | python3 -m pip install -r requirements.txt 33 | - name: Run Linters 34 | run: | 35 | ansible-lint 36 | 37 | molecule: 38 | runs-on: ${{ inputs.os_version }} 39 | strategy: 40 | matrix: 41 | molecule_distro: [ubuntu1804, ubuntu2004] 42 | steps: 43 | - uses: actions/checkout@v2 44 | - name: Set up Python ${{ inputs.python_version }} 45 | uses: actions/setup-python@v2 46 | with: 47 | python-version: ${{ inputs.python_version }} 48 | - name: Install dependencies 49 | run: | 50 | python3 -m pip install --upgrade pip 51 | python3 -m pip install -r requirements.txt 52 | - name: Force GitHub Actions' docker daemon to use vfs. 53 | run: | 54 | sudo systemctl stop docker 55 | echo '{"cgroup-parent":"/actions_job","storage-driver":"vfs"}' | sudo tee /etc/docker/daemon.json 56 | sudo systemctl start docker 57 | - name: Test with molecule 58 | run: | 59 | molecule test --all 60 | env: 61 | PY_COLORS: '1' 62 | ANSIBLE_FORCE_COLOR: '1' 63 | # Mudar a cor de mensagens de debug para aparecer melhor no fundo 64 | # escuro dos logs do GitHub Action. 65 | ANSIBLE_COLOR_DEBUG: "bright gray" 66 | MOLECULE_DISTRO: ${{ matrix.molecule_distro }} 67 | -------------------------------------------------------------------------------- /.github/workflows/docker_build.yaml: -------------------------------------------------------------------------------- 1 | name: "Docker Build Tag Push" 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | os_version: 7 | description: "Versão do sistema operacional" 8 | required: false 9 | default: "ubuntu-20.04" 10 | type: string 11 | image: 12 | description: "Nome da imagem docker" 13 | required: true 14 | type: string 15 | hadolint_version: 16 | description: "versão do hadolint" 17 | required: false 18 | default: v2.9.2 19 | type: string 20 | trivy_severity: 21 | description: "nível de severidade para scan" 22 | required: false 23 | default: "CRITICAL,HIGH" 24 | type: string 25 | trivy_exit_code: 26 | description: "Saída de erro em caso do trivy encontrar problemas" 27 | required: false 28 | default: "1" 29 | type: string 30 | push_image: 31 | description: "escolha se deve ser feito push da imagem" 32 | required: false 33 | default: false 34 | type: boolean 35 | secrets: 36 | docker_user: 37 | description: "usuário do repositório de imagem docker. Obrigatório se push_image for true" 38 | required: false 39 | docker_password: 40 | description: "senha do repositório de imagem docker. Obrigatório se push_image for true" 41 | required: false 42 | jobs: 43 | docker: 44 | name: Docker Build Tag Push 45 | runs-on: ${{inputs.os_version}} 46 | steps: 47 | - uses: actions/checkout@v3 48 | - name: Lint 49 | run: | 50 | docker container run \ 51 | --mount type=bind,source=$PWD,target=/repo,readonly \ 52 | --workdir /repo/ \ 53 | --interactive \ 54 | hadolint/hadolint:${{inputs.hadolint_version}} hadolint Dockerfile 55 | - name: Build 56 | run: | 57 | docker image build --tag ${{inputs.image}}:${{ github.sha }} . 58 | - name: Rodar Scan de vulnerabilidade Trivy 59 | uses: aquasecurity/trivy-action@master 60 | with: 61 | image-ref: ${{inputs.image}}:${{ github.sha }} 62 | format: 'table' 63 | exit-code: ${{inputs.trivy_exit_code}} 64 | severity: ${{inputs.trivy_severity}} 65 | - name: Push da imagem 66 | if: ${{inputs.push_image}} 67 | run: | 68 | docker login --username ${{secrets.docker_user}} --password ${{secrets.docker_password}} 69 | docker tag ${{inputs.image}}:${{ github.sha }} ${{inputs.image}}:${GITHUB_REF#refs/*/} 70 | docker image push ${{inputs.image}}:${GITHUB_REF#refs/*/} 71 | -------------------------------------------------------------------------------- /.github/workflows/terraform.yaml: -------------------------------------------------------------------------------- 1 | name: "Terraform Executa Modulo" 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | os_version: 7 | description: "Versão do sistema operacional" 8 | required: false 9 | default: "ubuntu-20.04" 10 | type: string 11 | workspace: 12 | description: "Define o workspace em que o modulo será executado" 13 | required: false 14 | default: "" 15 | type: string 16 | plan: 17 | description: "Define se será executado ou não o step Terraform Plan" 18 | required: false 19 | default: false 20 | type: boolean 21 | apply: 22 | description: "Define se será executado ou não o step Terraform Apply" 23 | required: false 24 | default: false 25 | type: boolean 26 | working_directory: 27 | description: "Diretório onde a pipeline irá atuar" 28 | required: false 29 | default: "." 30 | type: string 31 | 32 | jobs: 33 | terraform: 34 | name: Terraform workflow 35 | runs-on: ${{ inputs.os_version }} 36 | defaults: 37 | run: 38 | working-directory: ${{ inputs.working_directory }} 39 | steps: 40 | - name: Checkout 41 | uses: actions/checkout@v2 42 | 43 | # É esperado que secrets sejam herdados do repositório que está chamando 44 | # a pipeline e que esses secrets serão usados para configurar providers 45 | # to Terraform usando variáveis de ambiente. 46 | # Esse step irá export todos os secrets disponíveis como variáveis de 47 | # ambiente para os passos seguintes. 48 | - uses: mentoriaiac/secrets-to-env-action@v1 49 | with: 50 | secrets: ${{ toJSON(secrets) }} 51 | 52 | - name: Lê versão do Terraform 53 | id: tf-version 54 | run: | 55 | TF_VERSION=$(sed -nr 's/\s*required_version\s+=\s+"(.*)"/\1/p' *.tf) 56 | echo "::set-output name=version::$TF_VERSION" 57 | 58 | - name: Setup Terraform 59 | uses: hashicorp/setup-terraform@v1 60 | with: 61 | terraform_version: ${{ steps.tf-version.outputs.version }} 62 | 63 | - name: Terraform Version 64 | run: terraform version 65 | 66 | - name: Terraform Format 67 | run: terraform fmt -check -diff 68 | 69 | - name: Terraform Workspace 70 | if: ${{ inputs.workspace != '' }} 71 | run: terraform workspace select ${{ inputs.workspace }} 72 | 73 | - name: Terraform Init 74 | run: terraform init 75 | 76 | - name: Terraform Validate 77 | run: terraform validate 78 | 79 | - name: Validação do tfsec 80 | run: | 81 | docker run --rm -v $PWD:/app -w /app tfsec/tfsec . 82 | 83 | - name: Terraform Plan 84 | if: ${{ inputs.plan }} 85 | run: terraform plan -out tfplan 86 | 87 | - name: Terraform Apply 88 | if: ${{ inputs.plan && inputs.apply }} 89 | run: terraform apply tfplan 90 | -------------------------------------------------------------------------------- /.github/workflows/terraform_valida_modulo.yaml: -------------------------------------------------------------------------------- 1 | name: "Terraform Valida Modulo" 2 | 3 | on: 4 | workflow_call: 5 | inputs: 6 | os_version: 7 | description: "Versão do sistema operacional" 8 | required: false 9 | default: "ubuntu-20.04" 10 | type: string 11 | working_directory: 12 | description: "Diretório onde a pipeline irá atuar" 13 | required: false 14 | default: "." 15 | type: string 16 | 17 | jobs: 18 | jobs_terraform: 19 | name: Terraform workflow 20 | runs-on: ${{ inputs.os_version }} 21 | defaults: 22 | run: 23 | working-directory: ${{ inputs.working_directory }} 24 | 25 | steps: 26 | - name: Checkout 27 | uses: actions/checkout@v2 28 | 29 | - name: Lê versão do Terraform 30 | id: tf-version 31 | run: | 32 | TF_VERSION=$(sed -nr 's/\s*required_version\s+=\s+"(.*)"/\1/p' *.tf) 33 | echo "::set-output name=version::$TF_VERSION" 34 | 35 | - name: Setup Terraform 36 | uses: hashicorp/setup-terraform@v1 37 | with: 38 | terraform_version: ${{ steps.tf-version.outputs.version }} 39 | 40 | - name: Terraform Version 41 | run: terraform version 42 | 43 | - name: Terraform Format 44 | run: terraform fmt -check -diff 45 | 46 | - name: Terraform Init 47 | run: terraform init 48 | 49 | - name: Terraform Validate 50 | run: terraform validate -no-color 51 | 52 | - name: Validação do tfsec 53 | run: | 54 | docker run --rm -v $PWD:/app -w /app tfsec/tfsec . 55 | -------------------------------------------------------------------------------- /.github/workflows/test_terraform.yml: -------------------------------------------------------------------------------- 1 | name: Testes para pipeline Terraform 2 | 3 | on: 4 | push: 5 | 6 | jobs: 7 | test-terraform-required-version-001: 8 | uses: "./.github/workflows/terraform_valida_modulo.yaml" 9 | with: 10 | working_directory: tests/terraform/test-required-version/test-001 11 | test-terraform-required-version-002: 12 | uses: "./.github/workflows/terraform_valida_modulo.yaml" 13 | with: 14 | working_directory: tests/terraform/test-required-version/test-002 15 | test-terraform-required-version-003: 16 | uses: "./.github/workflows/terraform_valida_modulo.yaml" 17 | with: 18 | working_directory: tests/terraform/test-required-version/test-003 19 | test-terraform-required-version-004: 20 | uses: "./.github/workflows/terraform_valida_modulo.yaml" 21 | with: 22 | working_directory: tests/terraform/test-required-version/test-004 23 | test-terraform: 24 | uses: "./.github/workflows/terraform.yaml" 25 | with: 26 | working_directory: tests/terraform/workspace-plan-apply 27 | test-terraform-plan: 28 | uses: "./.github/workflows/terraform.yaml" 29 | with: 30 | working_directory: tests/terraform/workspace-plan-apply 31 | plan: true 32 | test-terraform-plan-apply: 33 | uses: "./.github/workflows/terraform.yaml" 34 | with: 35 | working_directory: tests/terraform/workspace-plan-apply 36 | plan: true 37 | apply: true 38 | test-terraform-plan-apply-workspace: 39 | uses: "./.github/workflows/terraform.yaml" 40 | with: 41 | working_directory: tests/terraform/workspace-plan-apply 42 | plan: true 43 | apply: true 44 | workspace: "dev" 45 | -------------------------------------------------------------------------------- /.github/workflows/versioning.yaml: -------------------------------------------------------------------------------- 1 | name: Criar tags major e latest para cada release 2 | 3 | on: 4 | release: 5 | types: [published, edited] 6 | 7 | jobs: 8 | actions-tagger: 9 | name: "Aplicando a major version e latest tag" 10 | runs-on: "ubuntu-20.04" 11 | steps: 12 | - uses: Actions-R-Us/actions-tagger@latest 13 | with: 14 | publish_latest_tag: true 15 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | Todas as mudanças importantes neste projeto serão documentas neste arquivo. 4 | 5 | O formato é baseado no [Mantenha um Changelog](https://keepachangelog.com/pt-BR/1.0.0/), 6 | e este projeto segue o [Versionamento Semântico](https://semver.org/lang/pt-BR/spec/v2.0.0.html). 7 | 8 | ## [Não publicado] 9 | 10 | ## [0.1.0] - 2022-04-24 11 | ### Adicionado 12 | - terraform: Pipeline para analise estática de módulos Terraform [[GH-3](https://github.com/mentoriaiac/cicd_centralizado/pull/3)] 13 | 14 | [Não publicado]: https://github.com/mentoriaiac/cicd_centralizado/compare/v0.1.0...HEAD 15 | [0.1.0]: https://github.com/mentoriaiac/cicd_centralizado/releases/tag/v0.1.0 16 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2022 Mentoria IaC 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CI/CD Centralizado 2 | Repositório para pipelines reutilizáveis do Github Actions 3 | 4 | ### Github actions reutilizáveis para projetos Ansible 5 | - [Valida role Ansible](./docs/ansible_valida_role.md) 6 | 7 | ### Github actions reutilizáveis para projetos Terraform 8 | - [Valida modulo Terraform](./docs/terraform_valida_modulo.md) 9 | 10 | ### Github actions reutilizáveis para Projects Beta Github 11 | - [Adiciona ](./docs/add_issues_projects.md) 12 | -------------------------------------------------------------------------------- /docs/ansible_valida_role.md: -------------------------------------------------------------------------------- 1 | # Ansible Valida Role 2 | Github Actions para ser reutilizado nos projetos de Ansible. Faz a validação da sintaxe da role Ansible. 3 | 4 | ## Inputs 5 | | Nome | Descrição | Requirida |Default | 6 | |------|-----------|-----------|--------| 7 | |`python_version` | Versão do python | não | 3.9 | 8 | |`os_version` | Versão do sistema operacional | não | ubuntu-20.04 | 9 | 10 | 11 | ## Utilizando 12 | Criar a seguintes estrutura de diretórios: 13 | 14 | `.github/workflows/.yml` 15 | 16 | Utilize o exemplo abaixo para seu pipeline de CI: 17 | 18 | ```yaml 19 | name: "Valida role ansible" 20 | 21 | on: 22 | push: 23 | branches: 24 | - main 25 | pull_request: 26 | jobs: 27 | valida: 28 | uses: "mentoriaiac/cicd_centralizado/.github/workflows/ansible_valida_role.yaml@v1" 29 | secrets: 30 | token: ${{ secrets.TOKEN }} 31 | ``` 32 | -------------------------------------------------------------------------------- /docs/docker_build.md: -------------------------------------------------------------------------------- 1 | # Build, Lint, Scan e Push de imagem Docker 2 | Github Actions para ser reutilizado nos projetos de Imagem Docker. Faz a processo de build, lint, scan e push da imagem. 3 | 4 | 5 | ## Inputs 6 | | Nome | Descrição | Requirida |Default | Type | 7 | |------|-----------|-----------|--------|------| 8 | | image | nome da imagem docker | sim | N/A | string | 9 | | os_version | Versão do sistema operacional | não | ubuntu-20.04 | string | 10 | | hadolint_version | versão do hadolint | não | v2.9.2 | string | 11 | | trivy_ignore | arquivo .trivyignore | não | "" | string | 12 | | trivy_severity | nível de severidade para scan | não | "CRITICAL,HIGH" | string | 13 | | push_image | escolha se deve ser feito push da imagem | não | não | boolean | 14 | 15 | 16 | ## Utilizando 17 | Criar a seguintes estrutura de diretórios: 18 | 19 | `.github/workflows/.yml` 20 | 21 | Utilize o exemplo abaixo para seu pipeline de CI: 22 | 23 | ```yaml 24 | name: "Pipeline para build de imagem docker" 25 | on: 26 | push: 27 | release: 28 | types: [created] 29 | jobs: 30 | docker: 31 | uses: "mentoriaiac/cicd_centralizado/.github/workflows/docker_build.yaml@docker/v1" 32 | with: 33 | image: USUARIO/REPOSITORIO_DOCKER 34 | 35 | push_image: ${{github.event_name == 'release'}} 36 | secrets: 37 | docker_user: ${{secrets.DOCKER_LOGIN}} 38 | docker_password: ${{secrets.TOKEN_DOCKERHUB}} 39 | ``` 40 | -------------------------------------------------------------------------------- /docs/img/token-github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mentoriaiac/cicd_centralizado/6f3918f1bd06df84288ffdf8ec56fec863ba9566/docs/img/token-github.png -------------------------------------------------------------------------------- /docs/terraform.md: -------------------------------------------------------------------------------- 1 | # Terraform Executa Modulo 2 | 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. 3 | 4 | ## Inputs 5 | | Nome | Descrição | Requirida | Default | 6 | |------|-----------|-----------|---------| 7 | | `apply` | Define se o step terraform apply será executado | não | `false` | 8 | | `os_version` | Versão do sistema operacional | não | `"ubuntu-20.04"` | 9 | | `plan` | Define se o step terraform plan será executado | não | `false` | 10 | | `working_directory` | Define o diretório onde a pipeline irá atuar | não | `"."` | 11 | | `workspace` | Seleciona o Workspace | não | `""` | 12 | 13 | ## Secrets 14 | 15 | 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. 16 | 17 | ## Utilizando 18 | Criar a seguintes estrutura de diretórios: 19 | 20 | `.github/workflows/.yml` 21 | 22 | Utilize o exemplo abaixo para seu pipeline de CI: 23 | 24 | ```yaml 25 | name: "Terraform Valida e Executa Modulo" 26 | 27 | on: 28 | push: 29 | branches: 30 | - main 31 | 32 | jobs: 33 | terraform: 34 | uses: "mentoriaiac/cicd_centralizado/.github/workflows/terraform.yaml@v1" 35 | with: 36 | plan: true 37 | apply: true 38 | workspace: "prod" 39 | secrets: inherit 40 | ``` 41 | -------------------------------------------------------------------------------- /docs/terraform_valida_modulo.md: -------------------------------------------------------------------------------- 1 | # Terraform Valida Módulo 2 | Github Actions para ser reutilizado nos projetos de Terraform. Faz a validação da sintaxe do código terraform. 3 | 4 | - terraform init 5 | - terraform fmt 6 | - terraform validate 7 | - validação tfsec 8 | 9 | ## Inputs 10 | | Nome | Descrição | Requirida |Default | 11 | |------|-----------|-----------|--------| 12 | | `os_version` | Versão do sistema operacional | não | ubuntu-20.04 | 13 | | `working_directory` | Diretório onde a pipeline irá atuar | não | . | 14 | 15 | 16 | ## Utilizando 17 | Criar a seguintes estrutura de diretórios: 18 | 19 | `.github/workflows/.yml` 20 | 21 | Utilize o exemplo abaixo para seu pipeline de CI: 22 | 23 | ```yaml 24 | name: "Terraform Valida Modulo" 25 | 26 | on: 27 | push: 28 | branches: 29 | - main 30 | pull_request: 31 | 32 | jobs: 33 | terraform: 34 | uses: "mentoriaiac/cicd_centralizado/.github/workflows/terraform_valida_modulo.yaml@v1" 35 | with: 36 | os_version: "ubuntu-20.04" 37 | working_directory: "./terraform" 38 | ``` 39 | -------------------------------------------------------------------------------- /tests/terraform/test-required-version/test-001/main.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_version = "1.1.0" 3 | } 4 | 5 | resource "null_resource" "test" {} 6 | -------------------------------------------------------------------------------- /tests/terraform/test-required-version/test-002/main.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_version = ">= 0.12" 3 | } 4 | 5 | resource "null_resource" "test" {} 6 | -------------------------------------------------------------------------------- /tests/terraform/test-required-version/test-003/main.tf: -------------------------------------------------------------------------------- 1 | resource "null_resource" "test" {} 2 | -------------------------------------------------------------------------------- /tests/terraform/test-required-version/test-003/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_version = "> 1.1.0, < 1.2.0" 3 | } 4 | -------------------------------------------------------------------------------- /tests/terraform/test-required-version/test-004/main.tf: -------------------------------------------------------------------------------- 1 | resource "null_resource" "test" {} 2 | -------------------------------------------------------------------------------- /tests/terraform/workspace-plan-apply/.gitignore: -------------------------------------------------------------------------------- 1 | .terraform.lock.hcl 2 | .terraform/providers/ 3 | **/terraform.tfstate.backup 4 | -------------------------------------------------------------------------------- /tests/terraform/workspace-plan-apply/.terraform/environment: -------------------------------------------------------------------------------- 1 | default -------------------------------------------------------------------------------- /tests/terraform/workspace-plan-apply/main.tf: -------------------------------------------------------------------------------- 1 | resource "null_resource" "global" {} 2 | 3 | resource "null_resource" "only_dev" { 4 | count = terraform.workspace == "dev" ? 1 : 0 5 | } 6 | -------------------------------------------------------------------------------- /tests/terraform/workspace-plan-apply/terraform.tfstate: -------------------------------------------------------------------------------- 1 | { 2 | "version": 4, 3 | "terraform_version": "1.1.4", 4 | "serial": 3, 5 | "lineage": "bf85634d-9a64-50be-9be5-f3c9e6855883", 6 | "outputs": {}, 7 | "resources": [] 8 | } 9 | -------------------------------------------------------------------------------- /tests/terraform/workspace-plan-apply/terraform.tfstate.d/dev/terraform.tfstate: -------------------------------------------------------------------------------- 1 | { 2 | "version": 4, 3 | "terraform_version": "1.1.4", 4 | "serial": 4, 5 | "lineage": "d56b2b0b-d036-d2e0-7814-daca9c040ad4", 6 | "outputs": {}, 7 | "resources": [] 8 | } 9 | --------------------------------------------------------------------------------