Configuration
Connecting Buildkite takes about five minutes and three things: a Buildkite API token, your organization slug, and a one-time GitHub permission acknowledgement. This guide walks through all three — plus an optional step for organizations that restrict who can trigger builds.
Step 1: Create a Buildkite API token
We recommend minting the token from a dedicated service-account user rather than a personal account — see the callout in the overview for why. Log in to Buildkite as that user, then:
Go to Personal Settings → API Access Tokens (
https://buildkite.com/user/api-access-tokens).Click New API Access Token.
Give it a recognizable name, e.g.
nullify-ci-feedback.Scope it to the single organization Nullify should see.
Enable these three required scopes:
read_organizationsread_buildsread_build_logs
write_buildsis optional. It is only needed if Nullify gate annotations are enabled for your organization. Gate annotations are off by default.Click Create Token and copy the value. Buildkite API tokens are in the form
bkua_….
Step 2: Connect Buildkite in Nullify
In the current dashboard, open Settings → Connectors (legacy: Configure → Connectors).
Find Buildkite and open its connection flow.
Enter the API token, then use Find organizations and select the organization it can access. The stored organization slug identifies
buildkite.com/<org-slug>; older forms let you enter it directly.Click Save changes.
The Buildkite card now shows Active with your organization name, and unlocks Autofix CI Feedback.
Step 3: Make sure Buildkite reports to GitHub
Nullify learns about your builds through the commit status Buildkite posts to GitHub. If that status isn't being published, Nullify has nothing to react to.
In Buildkite, go to Organization Settings → Repository Providers → GitHub.
Confirm the Buildkite GitHub App is installed (not the legacy OAuth integration).
In each relevant pipeline's settings, confirm Publish commit statuses (under GitHub settings) is enabled.
You can sanity-check this independently of Nullify: open any recent pull request that triggered a build and confirm a buildkite/… status check appears on it.
Step 4: Acknowledge the GitHub App permission
To receive those commit-status events, Nullify's GitHub App needs two things:
Repository permission: Commit statuses → Read-only.
Event subscription: the Status event.
These are already configured on the Nullify GitHub App. The only action on your side is a one-time acknowledgement: GitHub asks each organization owner to accept the updated permissions, shown as an email and a banner on your organization's installed-apps page.
Step 5: Let Nullify's commits trigger builds
Skip this step unless your Buildkite organization restricts who can trigger builds. Some orgs gate builds by the creator's team — for example an agent environment hook or a pipeline conditional that checks BUILDKITE_BUILD_CREATOR_TEAMS (or build.creator.teams) and fails any build whose creator isn't on an allowed team. If your org runs every push regardless of who created it, jump to Step 6.
When Nullify opens an autofix pull request, the commit is authored by Nullify's GitHub App, using the email <id>+nullify[bot]@users.noreply.github.com. Buildkite maps that commit author to a Buildkite user by email and fills BUILDKITE_BUILD_CREATOR_TEAMS from that user's teams. So in a gated org, Nullify's Buildkite user must exist in your org and sit on an allowed team — otherwise the build is blocked before it starts, no commit status is posted, and the autofix loop never sees your CI (even though the connector shows Active).
Invite the Nullify user. Invite
integrations-bot@nullify.aito your Buildkite organization. It is a Buildkite-managed service account, like Dependabot or Renovate: it auto-accepts the invite, skips billing, and cannot log in.Add it to an allowed, non-private team. Put the user on the team(s) your build-creator gate accepts. The team must be non-private —
BUILDKITE_BUILD_CREATOR_TEAMSonly lists non-private team slugs, so membership of a private team won't satisfy the check.
Step 6: Verify
End-to-end, the simplest way to confirm everything works:
Push a commit to an open pull request so Buildkite runs a build.
Confirm the
buildkite/…status appears on the GitHub PR (this proves Steps 3–4).If a build fails on a Nullify autofix PR, watch Nullify pick up the failure and push a follow-up commit — that confirms log fetching and iteration are working.
Troubleshooting
Autofix PR opened, but Buildkite never runs a build on Nullify's commits
Your org gates build creators by team, and Nullify's Buildkite user isn't invited, isn't on an allowed team, or is on a private team. See Step 5.
Connector saved but autofix never reacts to Buildkite failures
The GitHub permission acknowledgement (Step 4) is still pending, or commit statuses aren't being published (Step 3). Check both.
No buildkite/… status on the GitHub PR
The Buildkite GitHub App isn't installed, or the pipeline doesn't have Publish commit statuses enabled. See Step 3.
Setup rejects the token naming missing scopes
Add the named scopes to the token in Buildkite (or mint a new one) and save again.
Builds are detected but logs aren't fetched
The token is missing the read_build_logs scope, or it was created in the wrong organization. Re-check Step 1 and rotate the token if needed.
Status shows Active but nothing happens
The token and organization were verified when saved. Check the GitHub permission acknowledgement and commit-status publishing in Steps 3–4, then run the end-to-end check in Step 6.
Token was created by someone who has since left
The token stops working when their account is deactivated. Re-mint it from a dedicated service-account user (see the overview) and update it in Step 2.
Rotating the token
Create a new token in Buildkite (Step 1) — from the same service-account user.
In Nullify, open Settings → Connectors → Buildkite, enter the new token, and select Save changes.
Revoke the old token in Buildkite.
There's no downtime: Nullify uses the new token as soon as you save it.
Removing the integration
Go to Settings → Connectors → Buildkite.
Click Disconnect.
This removes your stored token and organization slug from Nullify, stopping authenticated build-status reads, log retrieval, and any gate annotations through this connection. It does not delete your Buildkite pipelines.
Last updated