setup-terraform/.github/workflows/setup-terraform.yml
Oliver Ford 4dff81de7e
Fix output malformed when wrapper enabled (#367)
* Fix output malformed when wrapper enabled

Presently using a command such as `terraform output -json | jq` does not
work with the wrapper enabled, as it is by default.

In order to consume terraform's output having set it up with this
Action, it is necessary either to disable the wrapper (`with:
terraform_wrapper: false`) or run it in its own Actions step with an
explicit `id` (e.g. `id: foo`) so that it can be referred to and consumed
(`${{steps.foo.outputs.stdout}}` et al.) in later steps.

This seems to be the result of much confusion (issues passim) and is not
at all easy (#338) to debug/diagnose and come to the realisation that
it's due to the wrapper, or even that such a thing exists.

@austinvalle identified the issue as being due to the `@actions/exec`
package writing the spawned command to stdout (along with then its
actual stdout). This has previously been reported upstream in
actions/toolkit#649; I've proposed actions/toolkit#1573 to fix it.

This commit aims to address the issue for `setup-terraform` in the
meantime by silencing `@actions/exec` and then writing out to stdout &
stderr from the listener buffers, which it writes to without this
additional logging.

Closes #20, #80, #85, #149, #338, and probably more.

* add test for stdout with jq

* update test name

* remove debug lines and add changelog

* add additional note about the bug fix to wrapper

---------

Co-authored-by: Austin Valle <austinvalle@gmail.com>
2023-10-27 14:05:58 -04:00

372 lines
10 KiB
YAML

name: 'setup-terraform tests'
on:
push:
branches:
- main
pull_request:
defaults:
run:
shell: bash
jobs:
terraform-versions:
name: 'Terraform Versions'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
terraform-versions: [0.11.14, latest]
steps:
- name: Checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
- name: Setup Terraform - ${{ matrix['terraform-versions'] }}
uses: ./
with:
terraform_version: ${{ matrix['terraform-versions'] }}
- name: Validate Teraform Version - ${{ matrix['terraform-versions'] }}
if: ${{ matrix['terraform-versions'] != 'latest' }}
run: terraform version | grep ${{ matrix['terraform-versions']}}
- name: Validate Teraform Version - ${{ matrix['terraform-versions'] }}
if: ${{ matrix['terraform-versions'] == 'latest' }}
run: terraform version | grep 'Terraform v'
terraform-versions-no-wrapper:
name: 'Terraform Versions No Wrapper'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
terraform-versions: [0.11.14, latest]
steps:
- name: Checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
- name: Setup Terraform (no wrapper) - ${{ matrix['terraform-versions'] }}
uses: ./
with:
terraform_version: ${{ matrix['terraform-versions'] }}
terraform_wrapper: false
- name: Validate Teraform Version - ${{ matrix['terraform-versions'] }}
if: ${{ matrix['terraform-versions'] != 'latest' }}
run: terraform version | grep ${{ matrix['terraform-versions']}}
- name: Validate Teraform Version - ${{ matrix['terraform-versions'] }}
if: ${{ matrix['terraform-versions'] == 'latest' }}
run: terraform version | grep 'Terraform v'
terraform-versions-constraints:
name: 'Terraform Versions Constraints'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
terraform-versions: [~0.12, 0.12.x, <0.13.0]
steps:
- name: Checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
- name: Setup Terraform - ${{ matrix['terraform-versions'] }}
uses: ./
with:
terraform_version: ${{ matrix['terraform-versions'] }}
- name: Validate Teraform Version - ${{ matrix['terraform-versions'] }}
run: terraform version | grep 'Terraform v0\.12'
terraform-versions-constraints-no-wrapper:
name: 'Terraform Versions Constraints No Wrapper'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
terraform-versions: [~0.12, 0.12.x, <0.13.0]
steps:
- name: Checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
- name: Setup Terraform (no wrapper) - ${{ matrix['terraform-versions'] }}
uses: ./
with:
terraform_version: ${{ matrix['terraform-versions'] }}
terraform_wrapper: false
- name: Validate Teraform Version - ${{ matrix['terraform-versions'] }}
run: terraform version | grep 'Terraform v0\.12'
terraform-credentials-cloud:
name: 'Terraform Cloud Credentials'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
env:
TF_CLOUD_API_TOKEN: 'XXXXXXXXXXXXXX.atlasv1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
steps:
- name: Checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
- name: Setup Terraform
uses: ./
with:
cli_config_credentials_token: ${{ env.TF_CLOUD_API_TOKEN }}
- name: Validate Terraform Credentials (Windows)
if: runner.os == 'Windows'
run: |
cat ${APPDATA}/terraform.rc | grep 'credentials "app.terraform.io"'
cat ${APPDATA}/terraform.rc | grep 'token = "${{ env.TF_CLOUD_API_TOKEN }}"'
- name: Validate Teraform Credentials (Linux & macOS)
if: runner.os != 'Windows'
run: |
cat ${HOME}/.terraformrc | grep 'credentials "app.terraform.io"'
cat ${HOME}/.terraformrc | grep 'token = "${{ env.TF_CLOUD_API_TOKEN }}"'
terraform-credentials-enterprise:
name: 'Terraform Enterprise Credentials'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
env:
TF_CLOUD_API_TOKEN: 'XXXXXXXXXXXXXX.atlasv1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
steps:
- name: Checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
- name: Setup Terraform
uses: ./
with:
cli_config_credentials_hostname: 'terraform.example.com'
cli_config_credentials_token: ${{ env.TF_CLOUD_API_TOKEN }}
- name: Validate Terraform Credentials (Windows)
if: runner.os == 'Windows'
run: |
cat ${APPDATA}/terraform.rc | grep 'credentials "terraform.example.com"'
cat ${APPDATA}/terraform.rc | grep 'token = "${{ env.TF_CLOUD_API_TOKEN }}"'
- name: Validate Teraform Credentials (Linux & macOS)
if: runner.os != 'Windows'
run: |
cat ${HOME}/.terraformrc | grep 'credentials "terraform.example.com"'
cat ${HOME}/.terraformrc | grep 'token = "${{ env.TF_CLOUD_API_TOKEN }}"'
terraform-credentials-none:
name: 'Terraform No Credentials'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- name: Checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
- name: Setup Terraform
uses: ./
- name: Validate Terraform Credentials (Windows)
if: runner.os == 'Windows'
run: |
[[ -f ${APPDATA}/terraform.rc ]] || exit 0
- name: Validate Teraform Credentials (Linux & macOS)
if: runner.os != 'Windows'
run: |
[[ -f ${HOME}/.terraformrc ]] || exit 0
terraform-arguments:
name: 'Terraform Arguments'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- name: Checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
- name: Setup Terraform
uses: ./
- name: Check No Arguments
run: terraform || exit 0
- name: Check Single Argument
run: terraform help || exit 0
- name: Check Single Argument Hyphen
run: terraform -help
- name: Check Single Argument Double Hyphen
run: terraform --help
- name: Check Single Argument Subcommand
run: terraform fmt -check
- name: Check Multiple Arguments Subcommand
run: terraform fmt -check -list=true -no-color
terraform-arguments-no-wrapper:
name: 'Terraform Arguments No Wrapper'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- name: Checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
- name: Setup Terraform
uses: ./
with:
terraform_wrapper: false
- name: Check No Arguments
run: terraform || exit 0
- name: Check Single Argument
run: terraform help || exit 0
- name: Check Single Argument Hyphen
run: terraform -help
- name: Check Single Argument Double Hyphen
run: terraform --help
- name: Check Single Argument Subcommand
run: terraform fmt -check
- name: Check Multiple Arguments Subcommand
run: terraform fmt -check -list=true -no-color
terraform-run-local:
name: 'Terraform Run Local'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
defaults:
run:
shell: bash
working-directory: ./.github/workflows/data/local
steps:
- name: Checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
- name: Setup Terraform
uses: ./
- name: Terraform Init
run: terraform init
- name: Terraform Format
run: terraform fmt -check
- name: Terraform Plan
id: plan
run: terraform plan
- name: Print Terraform Plan
run: echo "${{ steps.plan.outputs.stdout }}"
terraform-run-local-no-wrapper:
name: 'Terraform Run Local No Wrapper'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
defaults:
run:
shell: bash
working-directory: ./.github/workflows/data/local
steps:
- name: Checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
- name: Setup Terraform
uses: ./
with:
terraform_wrapper: false
- name: Terraform Init
run: terraform init
- name: Terraform Format
run: terraform fmt -check
- name: Terraform Plan
id: plan
run: terraform plan
terraform-stdout-wrapper:
name: 'Terraform STDOUT'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
defaults:
run:
shell: bash
working-directory: ./.github/workflows/data/local
steps:
- name: Checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
- name: Setup Terraform
uses: ./
with:
terraform_wrapper: true
- name: Terraform Init
run: terraform init
- name: Terraform Format
run: terraform fmt -check
- name: Terraform Apply
id: apply
run: terraform apply -auto-approve
- name: Terraform Output to JQ
id: output
run: terraform output -json | jq '.pet.value'
terraform-stdout-no-wrapper:
name: 'Terraform STDOUT No Wrapper'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
defaults:
run:
shell: bash
working-directory: ./.github/workflows/data/local
steps:
- name: Checkout
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
- name: Setup Terraform
uses: ./
with:
terraform_wrapper: false
- name: Terraform Init
run: terraform init
- name: Terraform Format
run: terraform fmt -check
- name: Terraform Apply
id: apply
run: terraform apply -auto-approve
- name: Terraform Output to JQ
id: output
run: terraform output -json | jq '.pet.value'