Build Configuration
Control when builds are triggered, how they are tracked, and when they need approval
Table of contents
- How ButterStack Thinks About Builds
- The Three-Step Build Model
- Build Triggers
- Jenkins Job Configuration
- Commit Processing Settings
- Approval Triggers
- Working With a Build Run
- Agentic Build-Failure Investigation
- AI Analysis Settings
- Testing Your Configuration
- Troubleshooting
- Next Steps
How ButterStack Thinks About Builds
ButterStack does not run your builds
Jenkins or GitHub Actions runs them. ButterStack decides when to ask for a build, watches it happen, ties it back to the commits and assets that went into it, and gates it on approval when your rules say it needs one.That distinction shapes everything on this page. There is no ButterStack build script, no runner pool, no YAML pipeline definition, and no build cache to configure. Those all live in your existing CI system, and you configure them there exactly as you do today.
What you configure in ButterStack is the layer around the build:
| You configure here | You configure in Jenkins / GitHub Actions |
|---|---|
| Which commits should cause a build | What the build actually does |
| Which job to trigger, and with what parameters | Compilation, cooking, packaging, tests |
| Which commits need human approval first | Runner hardware, caching, artifact storage |
| Which commits link to which tasks | Build scripts and environment variables |
The Three-Step Build Model
Every build run in ButterStack is tracked as three steps:
| Step | What it covers |
|---|---|
| External build | The Jenkins job or GitHub Actions workflow itself |
| Assets | The assets produced or changed by the build |
| Approval | Human sign-off, when your approval rules require it |
Each step carries its own status: pending, in_progress, success, failed, cancelled, or skipped. The build run then rolls those up into an overall status of pending, in_progress, success, failed, cancelled, or mixed.
mixed is the interesting one. It means the steps disagree, for example the external build succeeded but approval was rejected. A green Jenkins job is not automatically a green build run.
The build run itself also has a lifecycle status: queued, preparing, building, completed, failed, cancelled, or passed_pending_approval.
Build Triggers
Commit message tags
ButterStack triggers a build when a commit message contains one of your trigger tags. This is the primary mechanism, and it is deliberately opt-in so that not every commit burns a build.
git commit -m "Fix character shader #ci"
#ci works everywhere. If you only remember one tag, remember that one.
Perforce changelist descriptions and Git commit monitoring accept a wider set, matched case-insensitively anywhere in the message:
| Style | Tags |
|---|---|
| Hash | #ci, #build, #jenkins |
| Bracket | [ci], [build], [jenkins] |
| Colon | ci:, build:, jenkins: |
| Flag | --ci, --build, --jenkins |
To target a specific Jenkins job from a single commit, without changing your integration settings:
git commit -m "Rebuild lighting #ci:NightlyLightmaps"
Skip tags
Skip tags do not currently suppress builds
The Skip CI Tags setting exists under Project → Settings and your value is saved, but no trigger path reads it yet. A commit carrying#skip-ci and #ci will still build. Until this is wired up, the reliable way to avoid a build is simply to leave the trigger tag off the commit, since triggering is opt-in.Defaults are #skip-ci, [skip ci], and #skipci. Configure them now if you want them in place for when the behavior lands, but do not rely on them today.
Customizing trigger tags
Trigger tags are set per integration, under Project → Integrations → your source control integration:
| Field | Purpose | Default |
|---|---|---|
| Branch | Branch to monitor for changes | main |
| Build Triggers | Comma-separated commit tags that trigger builds | #ci, #build, [ci] |
Skip tags are set per project, under Project → Settings (see Commit Processing Settings below).
A note on where each list applies
The per-integration Build Triggers field is honored by the Diversion integration. The Perforce changelist sync and Git commit monitor match against the built-in tag set listed above rather than this field, so narrowing it there will not stop them from triggering. Because triggering is opt-in, the dependable way to keep a commit from building is to omit the trigger tag.What is not supported
ButterStack has no build scheduler and no manual "run build" button. There are no nightly or cron-based triggers, and you cannot start a build from the ButterStack UI. Builds start from commits. If you want a nightly build, schedule it in Jenkins as you normally would; ButterStack will still observe and record the result.Jenkins Job Configuration
Under Project → Integrations → Jenkins:
| Field | Notes |
|---|---|
| Jenkins URL | For example https://jenkins.company.com |
| Job Name | Required. The exact job to trigger. |
| Build Parameters (JSON) | Optional parameters passed to the job, for example {"BRANCH": "main", "CONFIGURATION": "Development"} |
| Webhook Secret | Optional, for signature validation on inbound webhooks |
Job Name is not optional
Without it, commits are received and no build starts. The integration reports "No Jenkins job name configured. Edit your Jenkins integration to set a job name, or use#ci:JobName in your commit message." This is the most common reason a correctly-tagged commit produces no build.Commit Processing Settings
Under Project → Settings, the Commit Processing Settings section controls how ButterStack reads your commit messages.
Approval Tags
Comma-separated tags that flag a commit as needing approval.
Default: #approval, #approve, #review, #approvals
Skip CI Tags
Comma-separated tags intended to suppress a build. Not currently consulted by any trigger path - see Skip tags above. Your value is saved, but has no effect today.
Default: #skip-ci, [skip ci], #skipci
Task Linking Patterns
Comma-separated regular expressions that link a commit to a task. This is what connects a build back to the work item it came from.
Default patterns and what they match:
| Pattern | Matches |
|---|---|
task:(\w+) | task:123 |
task:([A-Z]+-\d+) | task:ART-42 |
#(\d+) | #456 |
TASK-(\w+) | TASK-ABC |
fixes #(\d+) | fixes #789 |
closes #(\d+) | closes #789 |
Approval Triggers
Under Project → Settings, the Approval Triggers section decides when a commit needs human sign-off before its build run can go green.
Trigger modes
| Setting | Behavior |
|---|---|
| Require approval tag in commit message | Only commits carrying an approval tag need sign-off. On by default. |
| Always require approval for all commits | Every commit needs sign-off. Overrides the tag requirement. Off by default. |
Content-based rules
Approval can also be required based on what a commit touches, which is usually how art and audio pipelines want it:
| Setting | Default |
|---|---|
| File Extensions Requiring Approval | .fbx, .png, .wav, .uasset |
| Paths Requiring Approval | /Content/, /Art/, /Audio/ |
| Paths to Exclude from Approval | Configurable; carve out generated or vendored directories here |
A build run whose approval step is outstanding sits at passed_pending_approval rather than completed, even when Jenkins reported success.
Working With a Build Run
Open a build run from Project → Builds. From there you can:
| Action | Notes |
|---|---|
| Approve / Reject | Resolves the approval step |
| Cancel | Stops an in-flight build |
| Refresh | Re-pulls current status from Jenkins, useful if a webhook was missed |
| Logs | The build’s output log |
| Artifacts | Artifacts hot-linked from Jenkins; ButterStack does not store them itself |
| Run investigation | AI triage of a failure, see below |
Agentic Build-Failure Investigation
For a failed build run, ButterStack can run an AI investigation that reads the build context and reports a likely cause.
Requirements:
- The Team plan or higher
- Available credits, and the account’s daily investigation limit not yet reached
- The build run must have actually failed. The action is unavailable on passing builds.
- Agentic investigation must be enabled on both the account and the project
Enabling investigations
The account-level and project-level flags are not currently exposed as a settings toggle in the app. If you are on Team or above and want investigations turned on, contact support@butterstack.com.Investigations consume credits. The cost is reserved against your balance when the investigation starts, and you will be told up front if your balance is insufficient.
AI Analysis Settings
Under Project → Settings, the AI Analysis Settings section lets a single project override the account-level AI configuration:
- Provider and Model, left blank to inherit the account default
- Anthropic API Key or OpenAI API Key, to run analysis against your own account
Leave all of this alone unless you have a specific reason to pin a model or bill AI usage to your own provider account.
Testing Your Configuration
- Confirm the integration is healthy. Open the integration and click Test Connection. Fix a red result before anything else.
- Confirm the webhook is registered. ButterStack does not poll. Check recent deliveries in your Git provider, or your Perforce trigger log.
- Commit with a trigger tag. Use
#ciand watch Project → Builds for a new run. - Check the three steps individually. A
mixedoverall status means one step disagrees with the others, most often an outstanding or rejected approval.
Troubleshooting
A tagged commit produced no build
- Job Name is not set on the Jenkins integration. Most common cause by a wide margin.
- The webhook never fired. No delivery in your provider’s log means ButterStack never heard about the commit.
- The commit was on a branch you are not monitoring. Check the Branch field on the integration.
- The tag does not match. Compare the commit message against the recognized tag set. Note that a skip tag is not a cause here, since skip tags are not currently consulted.
The build passed in Jenkins but is not green in ButterStack
Check the approval step. A run sitting at passed_pending_approval is waiting on a human, and a run at mixed has at least one step that did not succeed.
Approvals are being requested for everything
Check Always require approval for all commits in Approval Triggers, then check whether your File Extensions and Paths Requiring Approval rules are broader than you intended. Add generated or vendored directories to Paths to Exclude from Approval.
Status is stale
Click Refresh on the build run to re-pull from Jenkins. If it happens repeatedly, a webhook is being dropped rather than a status being mis-read.
Next Steps
- Set Up Steam Deployment - Track releases to Steam
- Configure Discord Notifications - Get build alerts
- Unreal Build Setup - Engine-specific build guidance
- Add More Integrations - Connect additional tools
Need Help? Contact support@butterstack.com or join our Discord community.