You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Action中带断言的Terratest执行失败问题求助

Terratest在GitHub Action中运行断言时出错的排查与解决

本地运行带断言的Terratest完全正常,但通过GitHub Action执行时出现错误,移除断言后Terratest可正常运行。错误日志如下:

TestTerraform 2022-07-27T08:34:49Z logger.go:66: ::set-output name=exitcode::0
    output.go:19: 
            Error Trace:    output.go:19
                                        terraform_test.go:24
            Error:          Received unexpected error:
                            invalid character 'c' looking for beginning of value
            Test:           TestTerraform

对应的Terratest代码:

package test

import (
    "github.com/gruntwork-io/terratest/modules/terraform"
    "github.com/stretchr/testify/assert"
    "testing"
)

func TestTerraform(t *testing.T) {

    iam_arn_expected := "arn:aws:iam::xxx:role/terratest_iam"
    terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{
        TerraformDir: "../examples/simple",
        Vars: map[string]interface{}{
            "iam_name": "terratest_iam",
            "region":   "eu-west-2",
        },
    })

    defer terraform.Destroy(t, terraformOptions)

    terraform.InitAndApply(t, terraformOptions)

    iam_arn := terraform.Output(t, terraformOptions, "iam_arn")

    assert.Equal(t, iam_arn_expected, iam_arn)
}

GitHub Action配置:

jobs:
  terratest:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-go@v3.2.1
      - name: Install tfenv
        run: |
          git clone https://github.com/tfutils/tfenv.git ~/.tfenv
          echo "$HOME/.tfenv/bin" >> $GITHUB_PATH
      - name: Install Terraform
        working-directory: .
        run: |
          pwd
          tfenv install
          terraform --version
      - name: Download Go Modules
        working-directory: test
        run: go mod download
      - name: Run Terratest
        working-directory: test
        run: go test -v
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_PLAYGROUND_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_PLAYGROUND_KEY }}

排查与解决步骤

1. 定位错误根源

错误信息invalid character 'c' looking for beginning of value表明:Terratest在解析Terraform输出时,将混入了非JSON内容的结果当成JSON处理。GitHub Action环境中,Terraform的输出可能被额外的日志(比如::set-output这类GitHub Action命令)污染,导致解析失败。

2. 改用原始输出获取方法

默认的terraform.Output会自动尝试解析JSON格式输出,改用terraform.OutputRaw获取原始字符串,避免自动解析逻辑干扰:

// 替换原有的terraform.Output调用
iam_arn := terraform.OutputRaw(t, terraformOptions, "iam_arn")
// 将interface{}类型转为string
iam_arn_str, ok := iam_arn.(string)
if !ok {
    t.Fatalf("Failed to convert output to string")
}
assert.Equal(t, iam_arn_expected, iam_arn_str)

3. 过滤GitHub Action额外输出

在GitHub Action的测试运行步骤中,过滤掉::开头的GitHub Action命令行,避免其混入Terraform输出:

- name: Run Terratest
  working-directory: test
  run: go test -v 2>&1 | grep -v "::"
  env:
    AWS_ACCESS_KEY_ID: ${{ secrets.AWS_PLAYGROUND_ID }}
    AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_PLAYGROUND_KEY }}

4. 验证Terraform输出格式

检查Terraform代码中的iam_arn输出定义,确保输出是纯字符串,无额外字符:

output "iam_arn" {
  value = aws_iam_role.terratest_iam.arn
  # 若设置了sensitive = true,需确认是否导致输出被掩码(一般不会引发解析错误,但可临时关闭验证)
}

内容的提问来源于stack exchange,提问作者Staggerlee011

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 11:24:10