Link
GitHub Get Started

Build Configuration

Control when builds are triggered, how they are tracked, and when they need approval


Table of contents

  1. How ButterStack Thinks About Builds
  2. The Three-Step Build Model
  3. Build Triggers
    1. Commit message tags
    2. Skip tags
    3. Customizing trigger tags
  4. Jenkins Job Configuration
  5. Commit Processing Settings
    1. Approval Tags
    2. Skip CI Tags
    3. Task Linking Patterns
  6. Approval Triggers
    1. Trigger modes
    2. Content-based rules
  7. Working With a Build Run
  8. Agentic Build-Failure Investigation
  9. AI Analysis Settings
  10. Testing Your Configuration
  11. Troubleshooting
    1. A tagged commit produced no build
    2. The build passed in Jenkins but is not green in ButterStack
    3. Approvals are being requested for everything
    4. Status is stale
  12. 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 hereYou configure in Jenkins / GitHub Actions
Which commits should cause a buildWhat the build actually does
Which job to trigger, and with what parametersCompilation, cooking, packaging, tests
Which commits need human approval firstRunner hardware, caching, artifact storage
Which commits link to which tasksBuild scripts and environment variables

The Three-Step Build Model

Every build run in ButterStack is tracked as three steps:

StepWhat it covers
External buildThe Jenkins job or GitHub Actions workflow itself
AssetsThe assets produced or changed by the build
ApprovalHuman 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:

StyleTags
Hash#ci, #build, #jenkins
Bracket[ci], [build], [jenkins]
Colonci:, 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:

FieldPurposeDefault
BranchBranch to monitor for changesmain
Build TriggersComma-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:

FieldNotes
Jenkins URLFor example https://jenkins.company.com
Job NameRequired. The exact job to trigger.
Build Parameters (JSON)Optional parameters passed to the job, for example {"BRANCH": "main", "CONFIGURATION": "Development"}
Webhook SecretOptional, 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:

PatternMatches
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

SettingBehavior
Require approval tag in commit messageOnly commits carrying an approval tag need sign-off. On by default.
Always require approval for all commitsEvery 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:

SettingDefault
File Extensions Requiring Approval.fbx, .png, .wav, .uasset
Paths Requiring Approval/Content/, /Art/, /Audio/
Paths to Exclude from ApprovalConfigurable; 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:

ActionNotes
Approve / RejectResolves the approval step
CancelStops an in-flight build
RefreshRe-pulls current status from Jenkins, useful if a webhook was missed
LogsThe build’s output log
ArtifactsArtifacts hot-linked from Jenkins; ButterStack does not store them itself
Run investigationAI 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

  1. Confirm the integration is healthy. Open the integration and click Test Connection. Fix a red result before anything else.
  2. Confirm the webhook is registered. ButterStack does not poll. Check recent deliveries in your Git provider, or your Perforce trigger log.
  3. Commit with a trigger tag. Use #ci and watch Project → Builds for a new run.
  4. Check the three steps individually. A mixed overall status means one step disagrees with the others, most often an outstanding or rejected approval.

Troubleshooting

A tagged commit produced no build

  1. Job Name is not set on the Jenkins integration. Most common cause by a wide margin.
  2. The webhook never fired. No delivery in your provider’s log means ButterStack never heard about the commit.
  3. The commit was on a branch you are not monitoring. Check the Branch field on the integration.
  4. 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

  1. Set Up Steam Deployment - Track releases to Steam
  2. Configure Discord Notifications - Get build alerts
  3. Unreal Build Setup - Engine-specific build guidance
  4. Add More Integrations - Connect additional tools

Need Help? Contact support@butterstack.com or join our Discord community.

Copyright © 2026 ButterStack. All rights reserved.

Esc
Type to search the documentation