Continuous Integration & Automated Deployment (CI/CD)3 min readUpdated September 2026

Running CI/CD Inside an Accredited Enclave for Federal Work

A federal or defense contractor's CI/CD pipeline has to answer a question most engineering teams never face: is the platform you're about to use even allowed to touch this data at all. Getting that wrong isn't a bug, it's a finding in your next assessment.

This runbook walks through the steps a contractor should take before assuming a standard GitHub Actions or GitLab CI setup is appropriate for controlled unclassified information or higher.

Vendors Covered in this Article

Disclosure: We may earn a commission if you buy through some links on this page. It doesn't change what we recommend.

Step 1: are hosted runners allowed for this data at all?

A standard GitHub-hosted or GitLab-hosted shared runner processes your code on infrastructure outside your own accredited boundary, which is a non-starter for a lot of federal work involving controlled unclassified information. Before setting up any pipeline, confirm with your ISSO or compliance lead what data classification the project involves and whether that classification permits a hosted runner at all.

This is a compliance question, not an engineering preference, and it needs an answer before the first workflow file gets written, not after a pipeline's already been running for months.

Step 2: how do you build self-hosted runners inside your enclave?

When hosted runners aren't appropriate, both GitHub Actions and GitLab CI support self-hosted runners you can place entirely inside your own accredited environment, including AWS GovCloud or an equivalent enclave, so the actual build and test execution never leaves your authorization boundary. The CI platform's control plane, scheduling the job and reporting results, may still be a cloud service outside the boundary, but the code and data processing itself happens on infrastructure you control.

Work through this distinction carefully with your compliance team, since where the control plane sits versus where the actual processing happens are two different questions that can each need their own answer.

Step 3: treat your pipeline itself as part of the system boundary

A pipeline that builds and deploys a system handling controlled data is part of that system's authorization boundary, and it needs its own documented controls, not a blanket assumption that it's covered by the application's own ATO. Document who can trigger a pipeline run, how runner credentials are managed, and how build artifacts are stored and transmitted, since an assessor will ask about all three specifically.

Change failure rate1 is a useful internal metric here too, since a federal system where deployed changes frequently cause incidents suggests the pipeline's own controls, not just the application code, need a closer look.

Step 4: generate a software bill of materials as a build artifact

Federal guidance increasingly expects a software bill of materials documenting the components in a delivered system, and generating it manually after the fact is both slower and less reliable than producing it as an automated pipeline step on every build. Both GitHub Actions and GitLab CI can run SBOM generation tooling as part of the build process, attaching the resulting document to the build artifact automatically.

Treat a missing or stale SBOM the same way you'd treat a failed test: a build that doesn't produce a current one shouldn't be considered complete.

Step 5: keep the ATO package's evidence current, not just accurate at approval time

An authorization to operate reflects the system's controls at a point in time, and a pipeline that drifts from what was documented, a new integration added without updating the boundary documentation, say, quietly invalidates that picture without anyone deciding to. Review your pipeline's actual configuration against the ATO package on a fixed schedule, not just when a reassessment forces the question.

A pipeline is one of the more frequently changed parts of a federal system's infrastructure, which makes it one of the more likely places for documentation to drift out of sync with reality if nobody's specifically watching for it.

The runbook in order:

  1. Confirm whether hosted runners are allowed at all for the data classification involved, before assuming a standard setup is appropriate.
  2. Build self-hosted runners inside your own accredited enclave when hosted runners are not appropriate.
  3. Treat the pipeline itself as part of the system boundary, with its own documented controls.
  4. Generate a software bill of materials as a build artifact so it is tied to each delivered build.
  5. Keep the authorization package's evidence current as the pipeline changes, not only accurate on approval day.

Working with a subcontractor's own CI/CD setup

On a teamed contract, a subcontractor may bring its own CI/CD tooling and its own assumptions about what's permitted, which can create a mismatch if the prime contractor's boundary and the subcontractor's pipeline aren't clearly delineated. Settle explicitly, in writing, whose accredited environment a given piece of work runs in, rather than assuming it's obvious from the org chart.

This is worth resolving during contract kickoff rather than during an assessment, since untangling a boundary question after code has already been running for months is a much harder conversation to have cleanly. Put the agreed boundary in the subcontract itself, not just in an email thread that's easy to lose track of later, and revisit it whenever the contract's scope changes enough to shift where the actual processing happens, since a boundary that was correct at kickoff can quietly stop being accurate as the work evolves.

Executive Capability Standard

What Good Looks Like

Good looks like a documented answer to whether hosted runners are permitted for each project's data classification, self-hosted runners inside your accredited boundary where they're not, and an SBOM generated automatically on every build.

Building The Capability (5-Stage Skill Ladder)

1. Learn:Have your ISSO or compliance lead brief the engineering team on which data classifications on your current contracts permit hosted CI runners and which don't.
2. Do Manually:Stand up your first self-hosted runner inside your accredited enclave by hand, documenting exactly what's inside versus outside the boundary before automating anything further.
3. Delegate:Assign a specific engineer to own SBOM generation and its accuracy, since a stale or incomplete SBOM tends to surface as a finding rather than get caught internally first.
4. Automate:Automate SBOM generation as a required pipeline step on every build, and automate a scheduled check comparing pipeline configuration against the current ATO package.
5. Buy:For contractors managing this across multiple contracts and boundaries, a dedicated compliance monitoring platform can reduce how much of this evidence-gathering falls on engineering time directly.

How to Get Started

Disclosure: We may earn a commission if you buy through some links on this page. It doesn't change what we recommend.

Frequently Asked Questions

Can we use a hosted GitHub Actions or GitLab CI runner for unclassified public-facing code?

Often yes, but confirm this with your compliance lead rather than assuming based on the data classification of a different project. Even within one contract, some repositories may be eligible for hosted runners while others handling controlled data are not.

Does a self-hosted runner inside GovCloud fully resolve the compliance question?

It resolves where the processing happens, but not necessarily where the pipeline's control plane and metadata live. Confirm both pieces with your compliance team, since a self-hosted runner alone doesn't automatically mean every part of the pipeline stays inside your boundary.

How often should we regenerate a software bill of materials?

On every build that produces a deliverable artifact, not on a periodic schedule separate from your release cadence. An SBOM tied to a specific build is far more useful during an assessment than one generated at some earlier, disconnected point in time.

Sources

Where we quote a benchmark, we show its source. Other figures in this guide are estimates or general guidance, so check them against your own numbers.

  1. Change failure rate by DORA performance cluster. DORA Accelerate State of DevOps 2024 (Google Cloud), cluster table via Octopus Deploy analysis, 2024.

Related Guides