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
相关产品推荐
相关产品推荐

