integrations / integrations/terraform-provider-github

[BUG]: sha_pinning_required = false is silently ignored due to d.GetOk() zero-value bug

Open
#3,223 1 comment 3 reactions 0 assignees View on GitHub
r/actions_organization_permissions r/actions_repository_permissions Status: Triage Type: Bug vNext
Dominant language
Go
Stars
1.2k
Forks
1k
Avg merge
1d 14h
Merged PRs (30d)
8

Description

### Expected Behavior

Setting `sha_pinning_required = false` on `github_actions_organization_permissions` (or `github_actions_repository_permissions`) should send `false` to the GitHub API and disable SHA pinning enforcement.

After `terraform apply`, the state should converge and subsequent `terraform plan` should show no changes.

### Actual Behavior

Setting `sha_pinning_required = false` is silently ignored. The `if v, ok := d.GetOk("sha_pinning_required"); ok` guard in `resourceGithubActionsOrganizationPermissionsCreateOrUpdate` returns `ok = false` when the value is `false` (the zero value for `bool`), so `SHAPinningRequired` is never set on the API request payload. The GitHub API receives no value and leaves the existing setting unchanged.

This causes **perpetual drift**: every `terraform plan` shows `sha_pinning_required = true -> false`, but `terraform apply` never actually changes it.

The same bug exists in `resource_github_actions_repository_permissions.go` with the identical `d.GetOk` pattern.

### Terraform Version

```
Terraform v1.14.3
on darwin_arm64
+ provider registry.terraform.io/integrations/github v6.11.0
```

### Affected Resource(s)

- `github_actions_organization_permissions`
- `github_actions_repository_permissions`

### Terraform Configuration Files

```hcl
resource "github_actions_organization_permissions" "actions_permissions" {
allowed_actions = "all"
enabled_repositories = "all"
sha_pinning_required = false
}
```

### Steps to Reproduce

1. Have an organization where `sha_pinning_required` is currently `true` (e.g. set via the UI or a previous apply with `true`).
2. Set `sha_pinning_required = false` in the Terraform configuration.
3. Run `terraform plan` — it correctly shows `sha_pinning_required = true -> false`.
4. Run `terraform apply` — it reports success.
5. Run `terraform plan` again — it shows the same `true -> false` diff again (perpetual drift).

### Debug Output

The root cause is in [`resource_github_actions_organization_permissions.go`](https://github.com/integrations/terraform-provider-github/blob/v6.11.0/github/resource_github_actions_organization_permissions.go#L156-L158) (introduced in #2870):

```go
// Bug: d.GetOk() returns ok=false for zero-value bools (false),
// so sha_pinning_required=false is never sent to the API.
if v, ok := d.GetOk("sha_pinning_required"); ok {
actionsPermissions.SHAPinningRequired = github.Ptr(v.(bool))
}
```

This is the well-known Terraform SDK `GetOk` + zero-value footgun. A fix would be:

```go
if d.HasChange("sha_pinning_required") || d.IsNewResource() {
actionsPermissions.SHAPinningRequired = github.Ptr(d.Get("sha_pinning_required").(bool))
}
```

The identical pattern exists in [`resource_github_actions_repository_permissions.go`](https://github.com/integrations/terraform-provider-github/blob/v6.11.0/github/resource_github_actions_repository_permissions.go#L134-L136) and needs the same fix.

### Panic Output

### Code of Conduct

- [X] I agree to follow this project's Code of Conduct

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.