{"id":30690241,"url":"https://github.com/followtheprocess/terraform-actions","last_synced_at":"2026-05-14T23:32:17.471Z","repository":{"id":311479769,"uuid":"1006447050","full_name":"FollowTheProcess/terraform-actions","owner":"FollowTheProcess","description":"Consistent, high quality, and configurable GitHub Actions for managing infrastructure with Terraform 🏗️","archived":false,"fork":false,"pushed_at":"2025-08-24T17:50:52.000Z","size":15,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-24T22:01:14.708Z","etag":null,"topics":["continuous-deployment","github-actions","terraform"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FollowTheProcess.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-22T09:41:34.000Z","updated_at":"2025-08-24T17:50:53.000Z","dependencies_parsed_at":"2025-08-24T22:01:33.526Z","dependency_job_id":"b9714b4f-43e0-45a8-8425-b07d190e8f65","html_url":"https://github.com/FollowTheProcess/terraform-actions","commit_stats":null,"previous_names":["followtheprocess/terraform-actions"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/FollowTheProcess/terraform-actions","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FollowTheProcess%2Fterraform-actions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FollowTheProcess%2Fterraform-actions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FollowTheProcess%2Fterraform-actions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FollowTheProcess%2Fterraform-actions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FollowTheProcess","download_url":"https://codeload.github.com/FollowTheProcess/terraform-actions/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FollowTheProcess%2Fterraform-actions/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273218437,"owners_count":25065915,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-02T02:00:09.530Z","response_time":77,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["continuous-deployment","github-actions","terraform"],"created_at":"2025-09-02T02:10:28.738Z","updated_at":"2026-05-14T23:32:17.459Z","avatar_url":"https://github.com/FollowTheProcess.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Terraform Actions\n\n[![License](https://img.shields.io/github/license/FollowTheProcess/terraform-actions)](https://github.com/FollowTheProcess/terraform-actions)\n[![GitHub](https://img.shields.io/github/v/release/FollowTheProcess/terraform-actions?logo=github\u0026sort=semver)](https://github.com/FollowTheProcess/terraform-actions)\n\nConsistent, high quality, and configurable GitHub Actions for managing infrastructure with Terraform 🏗️\n\n- [Terraform Actions](#terraform-actions)\n  - [Plan](#plan)\n    - [Description](#description)\n    - [Inputs](#inputs)\n    - [Outputs](#outputs)\n    - [Runs](#runs)\n    - [Usage](#usage)\n  - [Apply](#apply)\n    - [Description](#description-1)\n    - [Inputs](#inputs-1)\n    - [Runs](#runs-1)\n    - [Usage](#usage-1)\n\n## Plan\n\nAll Terraform things should start with a plan!\n\n\u003c!-- Docs below generated by action-docs --\u003e\n\n\u003c!-- action-docs-all source=\"plan/action.yml\" project=\"FollowTheProcess/terraform-actions/plan\" version=\"v1\" --\u003e\n### Description\n\nGitHub Actions to produce a Terraform plan\n\n### Inputs\n\n| name | description | required | default |\n| --- | --- | --- | --- |\n| `terraform-version` | \u003cp\u003eThe version of Terraform to install and run\u003c/p\u003e | `false` | `latest` |\n| `backend-config` | \u003cp\u003eOptional path to a .tfbackend file (relative to \u003ccode\u003ecwd\u003c/code\u003e) to use for initialisation\u003c/p\u003e | `false` | `\"\"` |\n| `var-file` | \u003cp\u003eOptional path to a .tfvars file (relative to \u003ccode\u003ecwd\u003c/code\u003e) to pass to terraform for the plan\u003c/p\u003e | `false` | `\"\"` |\n| `plan-artifact-name` | \u003cp\u003eExplicit name for the uploaded plan artifact. When empty (the default), the name is auto-generated from \u003ccode\u003ecwd\u003c/code\u003e, \u003ccode\u003egithub.sha\u003c/code\u003e, \u003ccode\u003egithub.run_id\u003c/code\u003e, and \u003ccode\u003egithub.run_attempt\u003c/code\u003e. Pass this when you want a deterministic, caller-controlled artifact name — typically to keep plan → apply wiring simple inside matrix jobs, where passing \u003ccode\u003eneeds.\u0026lt;job\u0026gt;.outputs.*\u003c/code\u003e between matrix entries is awkward. The matching \u003ccode\u003eapply\u003c/code\u003e action already accepts \u003ccode\u003eplan-artifact-name\u003c/code\u003e as an input.\u003c/p\u003e | `false` | `\"\"` |\n| `cwd` | \u003cp\u003eThe working directory to be in for the duration of the action\u003c/p\u003e | `false` | `.` |\n\n\n### Outputs\n\n| name | description |\n| --- | --- |\n| `plan-artifact-name` | \u003cp\u003eThe name of the uploaded artifact, can be passed to actions/download-artifact as \u003ccode\u003ename\u003c/code\u003e\u003c/p\u003e |\n| `plan-artifact-id` | \u003cp\u003eThe GitHub ID of the Terraform Plan artifact, can be used by the REST API\u003c/p\u003e |\n| `plan-download-url` | \u003cp\u003eThe URL to download the produced Terraform Plan\u003c/p\u003e |\n| `plan-filename` | \u003cp\u003eThe filename of the produced .tfplan file, can be passed to actions/download-artifact as \u003ccode\u003epath\u003c/code\u003e\u003c/p\u003e |\n| `run-id` | \u003cp\u003eThe ID of the GitHub Actions run publishing the plan, can be used by other actions to retrieve it\u003c/p\u003e |\n\n\n### Runs\n\nThis action is a `composite` action.\n\n### Usage\n\n```yaml\n- uses: FollowTheProcess/terraform-actions/plan@v1\n  with:\n    terraform-version:\n    # The version of Terraform to install and run\n    #\n    # Required: false\n    # Default: latest\n\n    backend-config:\n    # Optional path to a .tfbackend file (relative to `cwd`) to use for initialisation\n    #\n    # Required: false\n    # Default: \"\"\n\n    var-file:\n    # Optional path to a .tfvars file (relative to `cwd`) to pass to terraform for the plan\n    #\n    # Required: false\n    # Default: \"\"\n\n    plan-artifact-name:\n    # Explicit name for the uploaded plan artifact. When empty (the default), the name is auto-generated\n    # from `cwd`, `github.sha`, `github.run_id`, and `github.run_attempt`.\n    # Pass this when you want a deterministic, caller-controlled artifact name — typically to keep plan → apply\n    # wiring simple inside matrix jobs, where passing `needs.\u003cjob\u003e.outputs.*` between matrix entries is awkward.\n    # The matching `apply` action already accepts `plan-artifact-name` as an input.\n    #\n    # Required: false\n    # Default: \"\"\n\n    cwd:\n    # The working directory to be in for the duration of the action\n    #\n    # Required: false\n    # Default: .\n```\n\u003c!-- action-docs-all source=\"plan/action.yml\" project=\"FollowTheProcess/terraform-actions/plan\" version=\"v1\" --\u003e\n\n## Apply\n\n\u003c!-- Docs below generated by action-docs --\u003e\n\n\u003c!-- action-docs-all source=\"apply/action.yml\" project=\"FollowTheProcess/terraform-actions/apply\" version=\"v1\" --\u003e\n### Description\n\nGitHub Actions to apply Terraform infrastructure changes\n\n### Inputs\n\n| name | description | required | default |\n| --- | --- | --- | --- |\n| `terraform-version` | \u003cp\u003eThe version of Terraform to install and run\u003c/p\u003e | `false` | `latest` |\n| `backend-config` | \u003cp\u003eOptional path to a .tfbackend file (relative to \u003ccode\u003ecwd\u003c/code\u003e) to use for initialisation\u003c/p\u003e | `false` | `\"\"` |\n| `plan-artifact-name` | \u003cp\u003eName of a plan artifact (produced by the \u003ccode\u003eplan\u003c/code\u003e action in an earlier job) to download and apply. This is the recommended way to chain plan → apply across jobs. Mutually exclusive with \u003ccode\u003eplan-filename\u003c/code\u003e and \u003ccode\u003evar-file\u003c/code\u003e.\u003c/p\u003e | `false` | `\"\"` |\n| `plan-filename` | \u003cp\u003ePath to a previously produced terraform plan file that is already present on disk in \u003ccode\u003ecwd\u003c/code\u003e (e.g. because you downloaded the artifact yourself). For the cross-job case prefer \u003ccode\u003eplan-artifact-name\u003c/code\u003e. Mutually exclusive with \u003ccode\u003eplan-artifact-name\u003c/code\u003e and \u003ccode\u003evar-file\u003c/code\u003e.\u003c/p\u003e | `false` | `\"\"` |\n| `var-file` | \u003cp\u003eThe path to a .tfvars file to use for the apply. Mutually exclusive with \u003ccode\u003eplan-artifact-name\u003c/code\u003e and \u003ccode\u003eplan-filename\u003c/code\u003e.\u003c/p\u003e | `false` | `\"\"` |\n| `cwd` | \u003cp\u003eThe working directory to be in for the duration of the action\u003c/p\u003e | `false` | `.` |\n\n\n### Runs\n\nThis action is a `composite` action.\n\n### Usage\n\n```yaml\n- uses: FollowTheProcess/terraform-actions/apply@v1\n  with:\n    terraform-version:\n    # The version of Terraform to install and run\n    #\n    # Required: false\n    # Default: latest\n\n    backend-config:\n    # Optional path to a .tfbackend file (relative to `cwd`) to use for initialisation\n    #\n    # Required: false\n    # Default: \"\"\n\n    plan-artifact-name:\n    # Name of a plan artifact (produced by the `plan` action in an earlier job) to download and apply.\n    # This is the recommended way to chain plan → apply across jobs.\n    # Mutually exclusive with `plan-filename` and `var-file`.\n    #\n    # Required: false\n    # Default: \"\"\n\n    plan-filename:\n    # Path to a previously produced terraform plan file that is already present on disk in `cwd`\n    # (e.g. because you downloaded the artifact yourself). For the cross-job case prefer `plan-artifact-name`.\n    # Mutually exclusive with `plan-artifact-name` and `var-file`.\n    #\n    # Required: false\n    # Default: \"\"\n\n    var-file:\n    # The path to a .tfvars file to use for the apply. Mutually exclusive with `plan-artifact-name` and `plan-filename`.\n    #\n    # Required: false\n    # Default: \"\"\n\n    cwd:\n    # The working directory to be in for the duration of the action\n    #\n    # Required: false\n    # Default: .\n```\n\u003c!-- action-docs-all source=\"apply/action.yml\" project=\"FollowTheProcess/terraform-actions/apply\" version=\"v1\" --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffollowtheprocess%2Fterraform-actions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffollowtheprocess%2Fterraform-actions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffollowtheprocess%2Fterraform-actions/lists"}