1. Resources
  2. /
  3. Examples
  4. /
  5. Linear Issue Pipeline

Buildkite Linear Issue Pipeline Example

This example demonstrates an AI-powered issue analysis pipeline built with Buildkite dynamic pipelines and Claude Code. When a Linear issue gets a specific label, a Buildkite pipeline kicks off an AI agent to analyse the issue and start working on it.

How it works

  1. A Linear issue is created or updated with the buildkite-analyze label
  2. Linear sends a webhook to Buildkite, which starts a build
  3. The first step evaluates the webhook payload — if it’s not a create/update action or the label doesn’t match, the build exits early
  4. A TypeScript handler reads the Linear webhook payload, extracts the issue ID, title, and description
  5. The handler uses the Buildkite SDK to dynamically generate an analysis step and uploads it with buildkite-agent pipeline upload
  6. That step launches Claude Code in a Docker container with access to the codebase, Linear (via the Linear CLI), and GitHub (via gh CLI) to analyse and work on the issue

The handler pattern

The core of the handler is short — read the webhook payload from build metadata, evaluate whether to act, and generate a step with the Buildkite SDK:

// 1. Read the webhook payload that Buildkite stored as build metadata
const payload = JSON.parse(
  execSync("buildkite-agent meta-data get buildkite:webhook").toString(),
);

// 2. Evaluate the condition — create/update action with a matching label?
const labels = (payload.data.labels ?? []).map((l) => l.name);
if (!["create", "update"].includes(payload.action) || !labels.includes(process.env.TRIGGER_ON_LABEL)) {
  process.exit(0);
}

// 3. Generate a step with the Buildkite SDK and pipe it into `pipeline upload`
const pipeline = new Pipeline();
pipeline.addStep({ label: ":linear: Analyse the issue", command: "scripts/claude.sh" });
execSync("buildkite-agent pipeline upload", { input: pipeline.toYAML() });

The real handler extracts the issue ID, title, and description between steps 2 and 3 so Claude has them on process.env — see scripts/handler.ts.

The key Buildkite features at play:

  • buildkite-agent pipeline upload — adding steps to a running build based on runtime conditions
  • buildkite-agent meta-data — reading webhook payloads stored as build metadata
  • @buildkite/buildkite-sdk — programmatically generating pipeline YAML in TypeScript
  • Buildkite webhooks — triggering builds from external events (Linear, not just GitHub)
  • Buildkite Hosted Models — proxying LLM requests through Buildkite’s model provider endpoint

What’s interesting about this?

This example shows that dynamic pipelines aren’t limited to GitHub workflows. Any webhook source — Linear, Jira, PagerDuty, your own services — can trigger a Buildkite build that evaluates the payload and dynamically decides what to do. The handler pattern (read metadata → evaluate conditions → generate and upload steps) works the same regardless of where the webhook comes from.

Setup

To run this yourself, you’ll need:

  1. Fork this repo
  2. Create a Buildkite pipeline pointing to your fork with webhook support enabled
  3. In Linear, create a webhook pointing to your Buildkite pipeline’s webhook URL, sending Issue events
  4. Set up the required secrets: GITHUB_TOKEN, BUILDKITE_API_TOKEN, and LINEAR_API_TOKEN
  5. Add the buildkite-analyze label to any Linear issue

Credits

Originally built by Grant Colegate and Christian Nunciato as a demo for AWS re:Invent.

License

See LICENSE (MIT)

More examples

Start turning complexity into an advantage

Create an account to get started for free.

Buildkite Pipelines

Platform

  1. Pipelines
  2. Public pipelines
  3. Test Engine
  4. Package Registries
  5. Mobile Delivery Cloud
  6. Pricing

Hosting options

  1. Self-hosted agents
  2. Mac hosted agents
  3. Linux hosted agents

Resources

  1. Docs
  2. Blog
  3. Changelog
  4. Example pipelines
  5. Plugins
  6. Webinars
  7. Case studies
  8. Events
  9. Migration Services
  10. CI/CD perspectives

Company

  1. About
  2. Careers
  3. Press
  4. Security
  5. Brand assets
  6. Contact

Solutions

  1. Replace Jenkins
  2. Workflows for MLOps
  3. Testing at scale
  4. Monorepo mojo
  5. Bazel orchestration

Legal

  1. Terms of Service
  2. Acceptable Use Policy
  3. Privacy Policy
  4. Subprocessors
  5. Service Level Agreement
  6. Supplier Code of Conduct
  7. Modern Slavery Statement

Support

  1. System status
  2. Forum
© Buildkite Pty Ltd 2026