Error viewing report from Terrafrom plan in Merge Request
What are you seeing, and how does that differ from what you expect to see?
When generating a terraform report as an artifact in .gitlab-ci.yml
the report cannot be loaded into the merge request. I expect to see some sort of report embedded in the merge request showing output from the plan.
Instead, I see:
! A terraform report was generated in your pipelines. Changes are unknown.
I also see a red banner:
An error occurred while loading terraform report
Related documentation
The artifacts:reports:terraform
documentation is extremely brief.
Version
I am on gitlab.com
running the prerelease 13.0.0
in a private repository, using shared runners.
The feature says it is introduced in version 13.0
by Add terraform report to merge request widget (#207528) · Issues · GitLab.org / GitLab · GitLab
CI configuration
The job in concern is
plan:
stage: plan
script:
- terraform plan -input=false -out=tfplan tfbackend
- terraform show -json tfplan > tfplan.json
artifacts:
reports:
terraform: tfplan.json
paths:
- tfplan.json
expire_in: 5 days
only:
- merge_requests
- staging
- master
Troublehsooting steps
I have tried several different combinations. terraform plan -out=tfplan
outputs a binary plan. Giving that to the report yielded the same error.
What I currently have produces a good JSON artifact that can be downloaded and viewed, but nothing is embedded in the Merge Request.
Add tfplan conversion script to Terraform.gitlab-ci.yml template (#207526) · Issues · GitLab.org / GitLab · GitLab seems relevant, but I am having a hard time figuring out what is in progress and what I should expect to work.
1 Like
Hi!
There’s an example you can view here: https://gitlab.com/emilyring/terraform-test/-/merge_requests/4/diffs
And some docs that are being created here: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31821/diffs
Are you able to see what your JSON file contains?
Thanks!
1 Like
Thank you for the resources, I will give them a try!! I didn’t realize I needed my own jq
alias
Yes, I am able to see what the JSON contains - it is essentially the summary that plan
displays in the terminal.
@byarbrough Yeah, the jq alias is needed so we can exclude any potential secrets from the plan output. The resulting JSON should look something like:
{
"create": 0,
"update": 0,
"delete": 0
}
Let us know how it goes!
1 Like
I was able to get this working locally, but am still having trouble with the pipeline.
Here is what I output in my local pine container after following the exact same script:
{
"create": 4,
"update": 0,
"delete": 0
}
Unfortunately, in the pipeline I get this error. I am using python:3.8-alpine3.11
as my base image and manually installing Terraform.
$ alias
alias convert_report='jq -r '\''([.resource_changes[]?.change.actions?]|flatten)|{"create":(map(select(.=="create"))|length),"update":(map(select(.=="update"))|length),"delete":(map(select(.=="delete"))|length)}'\'''
$ terraform show --json $PLAN | convert_report > $PLAN_JSON
/bin/bash: line 141: convert_report: command not found
This seems more like an error on my end, so I am continuing to debug.
Some things I noticed!
- The example @emilyring provided does not contain
apk add jq
- There is a discrepancy of a
?
between the documentation and the example file. I used the command from the documentation.
Good catch! The command from the documentation should be correct, the command was updated in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30002 and should be part of 13.0.
The apk --no-cache add jq
is being done here: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/31821/diffs#985e5d840b3f82c46efcb6eebc74ffc83cdb7444_159_184
And it’s also done in the Dockerfile that generates the registry.gitlab.com/gitlab-org/gitlab-build-images:terraform
image that the default Terraform.gitlab-ci.yml
template will be using in 13.0.
For your image, since it’s also alpine based, I think it should work the same, so I’m curious what’s happening that is causing the alias to not be defined. Maybe it’s a quoting issue with the string?
1 Like
Thank you for all the help!
I never was able to get the alias
working, even after trying it on an Ubuntu container. I ended up just echoing the command into a shell script and then calling that. Thrilled with having the summary in our merge requests!
Also, I mentioned the merge request and related issue in a related Terraform issue: https://github.com/hashicorp/terraform/issues/10507
@byarbrough definitely! I’m glad you got it working for your pipeline! Maybe in future we can move that alias into a command available inside the build image, that way you could just use it from the image:
or make your custom image from it, that way you wouldn’t have to deal with echoing it to a script. Always glad to see how we can improve things!
Looks like the issue I was having with the alias not working was due to shell options. See this comment. This fixed it!
before_script:
- shopt -s expand_aliases
3 Likes