Skip to content

feat: fetch GitHub App credentials from AWS Secrets Manager via OIDC#119

Draft
derekmisler wants to merge 4 commits intodocker:mainfrom
derekmisler:feat/oidc-secrets-manager
Draft

feat: fetch GitHub App credentials from AWS Secrets Manager via OIDC#119
derekmisler wants to merge 4 commits intodocker:mainfrom
derekmisler:feat/oidc-secrets-manager

Conversation

@derekmisler
Copy link
Contributor

@derekmisler derekmisler commented Mar 26, 2026

Related Issues

Closes: https://github.com/docker/gordon/issues/330
Depends on: https://github.com/docker/infra-terraform/pull/11303

Summary

Replaces the three org-level GitHub secrets (CAGENT_REVIEWER_APP_ID, CAGENT_REVIEWER_APP_PRIVATE_KEY, CAGENT_ORG_MEMBERSHIP_TOKEN) with OIDC-based lookups from AWS Secrets Manager across all 5 reusable workflows. Consumer repos no longer need those secrets configured — the only change they need is adding id-token: write to their job permissions.

This eliminates secret sprawl across ~40 consumer repos: credentials now live in one place (docker-agent-action/github-app in Secrets Manager), so rotations happen once and propagate instantly.

Changes

  • All 5 workflows (review-pr.yml, reply-to-feedback.yml, pr-describe.yml, security-scan.yml, self-review-pr.yml): added id-token: write permission, replaced the HAS_APP_SECRETS env-var guard pattern with two new steps at the top of each job:
    • Configure AWS credentials — assumes docker-agent-action-* IAM role via GitHub OIDC using aws-actions/configure-aws-credentials@v4
    • Fetch GitHub App credentials — retrieves docker-agent-action/github-app from Secrets Manager, validates all three fields, masks them with ::add-mask::, and emits them as step outputs (using a random heredoc delimiter for the multi-line private key)
  • AI API key fallback: a second secret (docker-agent-action/ai-api-keys) is fetched similarly; anthropic-api-key and openai-api-key inputs now use ${{ secrets.X || steps.ai-api-keys.outputs.x }} so consumer-supplied secrets still take precedence
  • tibdex/github-app-token steps: if: env.HAS_APP_SECRETS == 'true' guards removed — token generation now runs unconditionally (still continue-on-error: true)
  • CAGENT_ORG_MEMBERSHIP_TOKEN usages in membership-check steps updated to ${{ secrets.CAGENT_ORG_MEMBERSHIP_TOKEN || steps.app-credentials.outputs.org-membership-token }}

⚠️ Blocked on Terraform

TODO_ROLE_ARN appears in all 5 workflow files and must be replaced with the actual IAM role ARN before this PR is merged. The ARN is produced by the companion Terraform PR: docker/infra-terraform#11303.

Do not merge until:

  1. The Terraform PR is applied and the role ARN is known
  2. All 5 TODO_ROLE_ARN placeholders are replaced with the real ARN

Tip

Comment /review to trigger the PR Reviewer agent for automated feedback.
Comment /describe to generate a PR description.

@derekmisler derekmisler requested a review from a team as a code owner March 26, 2026 23:27
Replace org-secret lookups with OIDC + Secrets Manager in all reusable
consumer-facing workflows. Each affected job now:

1. Assumes the docker-agent-action IAM role via OIDC (id-token: write)
2. Fetches { app_id, private_key, org_membership_token } from the
   docker-agent-action/github-app Secrets Manager secret
3. Passes those values to downstream steps instead of inherited secrets

Affected workflows:
  - review-pr.yml       (auto-review, manual-review, reply-to-feedback jobs)
  - reply-to-feedback.yml (reply job)
  - pr-describe.yml     (generate-description job)
  - security-scan.yml   (security-scan job)
  - self-review-pr.yml  (auto-review, manual-review jobs)

HAS_APP_SECRETS env var changed from dynamic secret check to hardcoded
'true' — credentials are always available via Secrets Manager.

Existing secrets: declarations on workflow_call kept as required: false
for backward compatibility with consumer repos not yet migrated.

TODO_ROLE_ARN must be replaced with the actual IAM role ARN after the
Terraform in docker/infra-terraform is applied.

Assisted-By: docker-agent

refactor: remove HAS_APP_SECRETS — credentials are always available via OIDC

Assisted-By: docker-agent
@derekmisler derekmisler force-pushed the feat/oidc-secrets-manager branch from f45ef15 to d950f6c Compare March 26, 2026 23:29
@derekmisler derekmisler self-assigned this Mar 26, 2026
@derekmisler derekmisler marked this pull request as draft March 26, 2026 23:29
@docker-agent

This comment was marked as outdated.

docker-agent[bot]

This comment was marked as resolved.

Move ANTHROPIC_API_KEY and OPENAI_API_KEY out of GitHub secrets and
into AWS Secrets Manager (docker-agent-action/ai-api-keys). Keys are
now fetched at runtime via the existing OIDC role, consistent with how
GitHub App credentials are already fetched.

Affected workflows: review-pr.yml, reply-to-feedback.yml,
self-review-pr.yml, security-scan.yml, pr-describe.yml

Assisted-By: docker-agent
For ANTHROPIC_API_KEY, OPENAI_API_KEY, and CAGENT_ORG_MEMBERSHIP_TOKEN,
apply precedence: consumer-defined GitHub secret wins; Secrets Manager
value is used only if the consumer hasn't provided one.

Uses GitHub Actions || short-circuit: secrets.X || steps.y.outputs.x

Assisted-By: docker-agent
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant