Open johankees opened 2 years ago
I've also encountered this same behavior with github_actions_environment_secret
.
resource "github_actions_environment_secret" "placeholder" {
repository = "test"
environment = "test"
secret_name = "TEST"
plaintext_value = "" # placeholder value, secrets mgmt not implemented yet
lifecycle {
ignore_changes = [
plaintext_value
]
}
}
After the secret is created, I edit it by hand to put a value in place. However, upon the next terraform run the secret is recreated with an empty value.
+1
Yes please help fix!
Please help to fix. Looking forward.
Even selecting all won't work (using the same example from @wadells
resource "github_actions_environment_secret" "placeholder" {
repository = "test"
environment = "test"
secret_name = "TEST"
plaintext_value = "" # placeholder value, secrets mgmt not implemented yet
lifecycle {
ignore_changes = all
}
It looks like in cases of both creating and updating, we call CreateOrUpdateOrgSecret
which routes to this API reference.
Is the suggestion that the provider avoids making this call in some scenarios on updating?
@kfcampbell In the particular scenario where the below is set, because we're explicitly asking terraform to not update these secrets.
lifecycle {
ignore_changes = all
}
or
lifecycle {
ignore_changes = [
plaintext_value
]
}
or
lifecycle {
ignore_changes = [
encrypted_value
]
}
or similar
@kfcampbell @nickfloyd Any ideas if this is going to be worked on soon?
@GabrielFerrarini unfortunately GitHub's SDK team generally doesn't have the bandwidth to work on this type of issue directly. Do you have the interest or inclination to open up a PR for this behavior?
Any news ??
So this is the logic that is responsible for this behaviour:
if updatedAt, ok := d.GetOk("updated_at"); ok && updatedAt != secret.UpdatedAt.String() {
log.Printf("[INFO] The secret %s has been externally updated in GitHub", d.Id())
d.SetId("")
} else if !ok {
if err = d.Set("updated_at", secret.UpdatedAt.String()); err != nil {
return err
}
}
Wouldn't this solve our issue, but keep the original functionality as well?
if updatedAt, ok := d.GetOk("updated_at"); ok && updatedAt != secret.UpdatedAt.String() {
log.Printf("[INFO] The secret %s has been externally updated in GitHub", d.Id())
d.Set("encrypted_value", "")
d.Set("plaintext_value", "")
} else if !ok {
if err = d.Set("updated_at", secret.UpdatedAt.String()); err != nil {
return err
}
}
Terraform Version
Run
terraform -v
to show the version. If you are not running the latest version of Terraform, please upgrade because your issue may have already been fixed.Affected Resource(s)
Terraform Configuration Files
Debug Output
State file
Panic Output
N/A
Expected Behavior
The secret should not be recreated nor updated. I.e. terraform runs should be idempotent.
Actual Behavior
The secret gets recreated resetting the value of the secret to an empty string.
It looks like the id gets changed when the value was manually set in GitHub, hence the provider lost track of the resource. The state file does have the correct information. (see Debug output)
The linked issue (#974) mentions the use of
ignore_changes
lifecycle. This doesn't resolve the issue. Tested by addingupdated_at
, but this field is ignored.Steps to Reproduce
Please list the steps required to reproduce the issue, for example:
terraform apply
terraform apply
Important Factoids
N/A
References
974