# Optimizing Self-Hosted GitHub Actions Runner Costs
URL: https://www.warpbuild.com/blog/optimizing-self-hosted-runner-costs
Description: Checklist of strategies to cut self-hosted GitHub Actions costs with networking, caching, autoscaling, and compliance-friendly patterns.

---
title: "Optimizing Self-Hosted GitHub Actions Runner Costs"
excerpt: "Checklist of strategies to cut self-hosted GitHub Actions costs with networking, caching, autoscaling, and compliance-friendly patterns."
description: "Checklist of strategies to cut self-hosted GitHub Actions costs with networking, caching, autoscaling, and compliance-friendly patterns."
author: surya_oruganti
cover: "/images/blog/optimizing-self-hosted-runner-costs/cover.png"
date: "2025-10-21"
---

import { Step, Steps } from 'fumadocs-ui/components/steps';

Running CI is essential, but your self-hosted runner bill doesn't have to be. This guide contains strategies to reduce costs without sacrificing reliability or compliance. We cite primary sources throughout so you can validate assumptions and adapt them to your environment to keep things vendor-neutral.

Treat this post as a checklist - going through each item and applying the best practices to your environment will help you reduce costs.

<Callout title="Start with visibility" type="note">
  Before optimizing, baseline your usage and costs:

  - GitHub billing and usage: <a href="https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions">About billing</a>, <a href="https://docs.github.com/en/billing/managing-billing-for-github-actions/viewing-your-github-actions-usage">Viewing usage</a>, <a href="https://docs.github.com/en/rest/actions/workflow-runs?apiVersion=2022-11-28#get-workflow-run-usage">Run usage API</a>
  - Cloud cost explorers: AWS Cost Explorer, GCP Cloud Billing, Azure Cost Management
</Callout>

## Core cost optimization strategies

### Infrastructure optimization

- <strong>Spot/Preemptible capacity:</strong> Typically 60-90% cheaper, but interruptible. Use job retries and checkpointing; isolate long-lived state from runners.
  - <strong>AWS EC2 Spot:</strong> capacity-optimized allocation; interruption notices. See <a href="https://aws.amazon.com/ec2/spot/">EC2 Spot</a> and <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-best-practices.html">best practices</a>.
  - <strong>GCP Preemptible/Spot VMs:</strong> <a href="https://cloud.google.com/compute/docs/instances/spot">GCP Preemptible/Spot VMs</a>
  - <strong>Azure Spot VMs:</strong> <a href="https://learn.microsoft.com/azure/virtual-machines/spot-vms">Azure Spot VMs</a>
- <strong>Autoscaling:</strong> Scale-to-zero when queues are empty; scale quickly when demand spikes. Combine queue depth, pending job counts, and target start SLOs.
- <strong>Right-sizing:</strong> Measure CPU, memory, I/O. Choose the knee of the performance-cost curve, not the max spec.
- <strong>Commitments:</strong> Reserved/Committed use discounts work for steady baselines; keep burst on spot.

```mermaid
flowchart LR
  Q["Queued jobs?"] -->|No| Z["Scale to zero"]
  Q -->|Yes| T{"Target start SLO met?"}
  T -- No --> Up["Scale up"]
  T -- Yes --> K["Keep size"]
  Up --> R{"Budget guardrails?"}
  R -- Exceeded --> Fan["Reduce fan-out or size"]
  R -- OK --> Mon["Monitor"]
```

### Ephemeral vs reusable runners

Ephemeral runners (one job, then teardown) provide a guaranteed clean state and stronger isolation. Reusable runners keep state and caches across jobs to cut minutes but need hygiene.

- <strong>Ephemeral:</strong> best for untrusted code, stricter compliance, and multi-tenant orgs. Trade-off: less cache reuse, potentially more minutes but lower security/ops risk. Most importantly, it leads to reproducible builds. This is highly recommended for CI.
- <strong>Reusable:</strong> best for trusted repos and cache-heavy builds. Trade-off: requires cleanup to avoid state bleed; consider periodic reimage. Do this only if you have a good reason to keep the state.

```mermaid
flowchart TD
  A["Repo trust: org-internal?"] -->|No| E["Use ephemeral"]
  A -->|Yes| C{"Cache hit rate high?"}
  C -- Yes --> R["Consider reusable"]
  C -- No --> E
  R --> H{"Compliance strict?<br/>(PCI/HIPAA)"}
  H -- Yes --> E
  H -- No --> O{"High ops maturity<br/>& ok with risk?"}
  O -- Yes --> RU["Use reusable"]
  O -- No --> E
```

<Callout title="Useful configurations" type="note">
  - <strong>GitHub runner `--ephemeral`</strong> for one-job-per-runner: <a href="https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/using-self-hosted-runners-in-a-workflow">docs</a>
  - <strong>actions-runner-controller RunnerScaleSet</strong> with ephemeral pods and scale-to-zero: <a href="https://github.com/actions/actions-runner-controller">ARC</a>
  - <strong>Terraform AWS GitHub Runner module</strong> supports ephemeral, autoscaled runners on AWS: <a href="https://github.com/github-aws-runners/terraform-aws-github-runner">repo</a>
</Callout>

### Caching and storage

- <strong>Local dependency caches</strong> (npm, pip, gradle, cargo, etc.) via <a href="https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows">GitHub Actions cache</a>.
- <strong>Docker layer caching</strong>: Use Buildx and a registry/cache near compute via <a href="https://docs.docker.com/build/ci/github-actions/cache/">Docker Buildx cache</a>.
- <strong>Artifacts</strong>: Upload only what's needed, compress, and reduce retention.

Example (Docker Buildx with GitHub cache backend):

```yaml
- uses: docker/setup-buildx-action@v3
- uses: docker/build-push-action@v6
  with:
    push: false
    cache-from: type=gha
    cache-to: type=gha,mode=max
```

<Callout title="Cost comparison (indicative)" type="note">

| Strategy | Typical impact | Notes |
| --- | --- | --- |
| Dependency cache | 20-60% faster | Stable lockfiles help maximize hits |
| Docker layer cache | 20-70% faster | Co-locate cache/registry with runners |
| Artifact retention 7-14d | 80-90% storage reduction | From GitHub default 90d |
| Reusable runners | Up to 40x faster | Depends on the size of the runner and the amount of state kept, requires periodic cleanup |
</Callout>

### Networking optimization

<Callout title="The NAT gateway trap" type="warning">
  Private subnets often require NAT for egress. NAT gateways typically charge hourly + per-GB processed. Heavy egress can dwarf compute savings. Prefer endpoints and keep traffic in-region.
</Callout>

<Steps>
  <Step>
    Public runners have direct internet egress (cheapest); private require NAT (higher cost but better control). Use hybrid: public for general CI, private for sensitive workloads.
  </Step>
  <Step>
    Use gateway endpoints (AWS S3, GCP Private Google Access, Azure service endpoints) to bypass NAT and reduce egress costs.
  </Step>
  <Step>
    Keep runners, registries, caches, and buckets in the same region/AZ to minimize cross-region and cross-AZ transfer charges.
  </Step>
  <Step>
    Use regional repos; avoid cross-region pulls.
  </Step>
</Steps>

```mermaid
flowchart TB
  subgraph Region
    subgraph VPC["VPC / VNet"]
      Runners["Runners<br/>(ASG/VMSS or K8s nodes)"]
      NAT["NAT<br/>(only if needed)"]
      Endp["Endpoints:<br/>S3/GCS/Storage,<br/>ECR/AR/ACR"]
    end
    Cross-Account[("Cross-Account<br/>Storage and Access")]
  end
  Runners --> Endp
  Runners --> Cross-Account
  Runners -.-> NAT
```

---

## Open-source and free tools

- <a href="https://github.com/actions/actions-runner-controller">actions-runner-controller (ARC)</a>: Kubernetes operator for autoscaling GitHub runners. 
- <a href="https://github.com/github-aws-runners/terraform-aws-github-runner">Terraform AWS GitHub Runner module</a>: Serverless, autoscaling self-hosted runners on AWS. 
- <a href="https://www.infracost.io/docs/integrations/cicd/">Infracost</a>: Cost impact in PRs. 
- <a href="https://aws.amazon.com/aws-cost-management/aws-cost-explorer/">AWS Cost Explorer</a>, <a href="https://cloud.google.com/billing/docs/reports">GCP Cloud Billing</a>, <a href="https://learn.microsoft.com/azure/cost-management-billing/costs/quick-acm-cost-analysis">Azure Cost Management</a>.

---

## Cloud-specific optimization

Use this accordion for provider details. Keep the rest of this guide cloud-agnostic.

<Accordions type="single">
  <Accordion title="AWS" value="aws">
    <p>
      <strong>Compute</strong>
    </p>
    <ul>
      <li>EC2 Spot with capacity-optimized allocation; test multiple instance types. <a href="https://aws.amazon.com/ec2/spot/">EC2 Spot</a></li>
      <li>EKS + ARC for scale-to-zero runners; consider Karpenter for node right-sizing.</li>
    </ul>
    <p>
      <strong>Networking</strong>
    </p>
    <ul>
      <li>Prefer Gateway Endpoints for S3 and DynamoDB to avoid NAT traversal. <a href="https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints.html">VPC endpoints</a></li>
      <li>Use Interface Endpoints for ECR API and ECR DKR (image pulls) to keep traffic private. <a href="https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html">ECR endpoints</a></li>
      <li>NAT choices: gateway (hourly + per-GB) vs NAT instance for low throughput; place one NAT per AZ to avoid cross-AZ data charges. <a href="https://aws.amazon.com/vpc/pricing/">NAT pricing</a></li>
    </ul>
    <p>
      <strong>Storage/Registry</strong>
    </p>
    <ul>
      <li>S3 lifecycle policies and storage classes (IA/Glacier) for artifacts. <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html">S3 lifecycle</a></li>
      <li>ECR repos in the same region; replicate only if needed. <a href="https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry-settings.html">ECR</a></li>
    </ul>
    <p>
      <strong>Terraform examples</strong>
    </p>
    <Tabs items={["S3 Gateway Endpoint","ECR Interface Endpoints"]}>
      <Tab value="S3 Gateway Endpoint">

```hcl
resource "aws_vpc_endpoint" "s3" {
  vpc_id            = var.vpc_id
  service_name      = "com.amazonaws.${var.region}.s3"
  vpc_endpoint_type = "Gateway"
  route_table_ids   = var.route_table_ids
}
```

      </Tab>
      <Tab value="ECR Interface Endpoints">

```hcl
resource "aws_vpc_endpoint" "ecr_api" {
  vpc_id              = var.vpc_id
  service_name        = "com.amazonaws.${var.region}.ecr.api"
  vpc_endpoint_type   = "Interface"
  subnet_ids          = var.private_subnet_ids
  security_group_ids  = [aws_security_group.endpoints.id]
  private_dns_enabled = true
}

resource "aws_vpc_endpoint" "ecr_dkr" {
  vpc_id              = var.vpc_id
  service_name        = "com.amazonaws.${var.region}.ecr.dkr"
  vpc_endpoint_type   = "Interface"
  subnet_ids          = var.private_subnet_ids
  security_group_ids  = [aws_security_group.endpoints.id]
  private_dns_enabled = true
}
```

      </Tab>
    </Tabs>
    <p>References: <a href="https://aws.amazon.com/ec2/pricing/">EC2 pricing</a>, <a href="https://aws.amazon.com/ec2/spot/">Spot</a>, <a href="https://aws.amazon.com/vpc/pricing/">NAT pricing</a>, <a href="https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints.html">VPC endpoints</a>, <a href="https://aws.amazon.com/s3/pricing/">S3 pricing</a></p>
  </Accordion>
  <Accordion title="GCP" value="gcp">
    <p>
      <strong>Compute</strong>
    </p>
    <ul>
      <li>Spot/Preemptible VMs in Managed Instance Groups with multiple machine types. <a href="https://cloud.google.com/compute/docs/instances/spot">docs</a></li>
      <li>GKE (Autopilot or Standard) with ARC; right-size node pools.</li>
    </ul>
    <p>
      <strong>Networking</strong>
    </p>
    <ul>
      <li>Enable Private Google Access so private VMs reach GCS/Artifact Registry without public egress. <a href="https://cloud.google.com/vpc/docs/private-google-access">docs</a></li>
      <li>Cloud NAT sized appropriately; avoid cross-region pulls. <a href="https://cloud.google.com/nat/pricing">Cloud NAT pricing</a></li>
    </ul>
    <p>
      <strong>Storage/Registry</strong>
    </p>
    <ul>
      <li>Artifact Registry regional repos in the same region as runners. <a href="https://cloud.google.com/artifact-registry/docs">docs</a></li>
      <li>GCS lifecycle rules for artifacts. <a href="https://cloud.google.com/storage/docs/lifecycle">docs</a></li>
    </ul>
    <p>
      <strong>Examples</strong>
    </p>
    <Tabs items={["Private Google Access","Cloud NAT"]}>
      <Tab value="Private Google Access">

```hcl
resource "google_compute_subnetwork" "subnet" {
  name                     = "ci-private"
  ip_cidr_range            = var.cidr
  network                  = var.network
  region                   = var.region
  private_ip_google_access = true
}
```

      </Tab>
      <Tab value="Cloud NAT">

```hcl
resource "google_compute_router" "router" {
  name    = "ci-router"
  network = var.network
  region  = var.region
}

resource "google_compute_router_nat" "nat" {
  name                               = "ci-nat"
  router                             = google_compute_router.router.name
  region                             = var.region
  nat_ip_allocate_option             = "AUTO_ONLY"
  source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS"

  subnetwork {
    name                    = google_compute_subnetwork.subnet.name
    source_ip_ranges_to_nat = ["ALL_IP_RANGES"]
  }
}
```

      </Tab>
    </Tabs>
    <p>References: <a href="https://cloud.google.com/compute/all-pricing">Compute pricing</a>, <a href="https://cloud.google.com/compute/docs/instances/spot">Spot/Preemptible</a>, <a href="https://cloud.google.com/vpc/docs/private-google-access">Private Google Access</a>, <a href="https://cloud.google.com/nat/pricing">Cloud NAT pricing</a>, <a href="https://cloud.google.com/artifact-registry/pricing">Artifact Registry</a></p>
  </Accordion>
  <Accordion title="Azure" value="azure">
    <p>
      <strong>Compute</strong>
    </p>
    <ul>
      <li>Spot VMs in VM Scale Sets; consider capacity reservations for stability. <a href="https://learn.microsoft.com/azure/virtual-machines/spot-vms">docs</a></li>
      <li>AKS with ARC; autoscaling node pools and right-sized SKUs.</li>
    </ul>
    <p>
      <strong>Networking</strong>
    </p>
    <ul>
      <li>NAT Gateway vs per-VM public IPs; model hourly + per-GB costs. <a href="https://learn.microsoft.com/azure/nat-gateway/nat-gateway-resource">docs</a></li>
      <li>Use Service Endpoints or Private Endpoints for Storage and ACR. <a href="https://learn.microsoft.com/azure/virtual-network/virtual-network-service-endpoints-overview">Service Endpoints</a>, <a href="https://learn.microsoft.com/azure/private-link/private-endpoint-overview">Private Endpoints</a></li>
    </ul>
    <p>
      <strong>Storage/Registry</strong>
    </p>
    <ul>
      <li>ACR in-region with runners; enable geo-replication only if required. <a href="https://learn.microsoft.com/azure/container-registry/">docs</a></li>
      <li>Blob Storage lifecycle rules for artifacts. <a href="https://learn.microsoft.com/azure/storage/blobs/lifecycle-management-overview">docs</a></li>
    </ul>
    <p>
      <strong>Examples</strong>
    </p>
    <Tabs items={["Service Endpoint (Storage)","Private Endpoint (ACR)"]}>
      <Tab value="Service Endpoint (Storage)">

```hcl
resource "azurerm_subnet_service_endpoint_storage_policy" "storage" {
  name                 = "allow-storage"
  resource_group_name  = var.rg
  virtual_network_name = var.vnet
  subnet_name          = var.subnet
  storage_accounts     = [azurerm_storage_account.artifacts.id]
}
```

      </Tab>
      <Tab value="Private Endpoint (ACR)">

```hcl
resource "azurerm_private_endpoint" "acr" {
  name                = "acr-pe"
  location            = var.location
  resource_group_name = var.rg
  subnet_id           = azurerm_subnet.private.id

  private_service_connection {
    name                           = "acr"
    private_connection_resource_id = azurerm_container_registry.acr.id
    is_manual_connection           = false
    subresource_names              = ["registry"]
  }
}
```

      </Tab>
    </Tabs>
    <p>References: <a href="https://azure.microsoft.com/pricing/details/virtual-machines/">VM pricing</a>, <a href="https://learn.microsoft.com/azure/virtual-machines/spot-vms">Spot</a>, <a href="https://azure.microsoft.com/pricing/details/nat-gateway/">NAT pricing</a>, <a href="https://learn.microsoft.com/azure/private-link/private-endpoint-overview">Private Endpoints</a>, <a href="https://learn.microsoft.com/azure/container-registry/">ACR</a></p>
  </Accordion>
</Accordions>

---

## Industry-specific considerations

### Financial services

- SOC 2 and PCI-DSS drive stricter isolation and auditability. Prefer ephemeral runners for untrusted code; ensure logs are centralized (not as long-lived artifacts).
- Use OIDC and short-lived credentials for cloud access; scope IAM roles tightly.
- Keep sensitive builds in private subnets behind endpoints; avoid cross-region traffic.

References: <a href="https://www.aicpa-cima.com/resources/article/soc-2-faqs">SOC 2</a>, <a href="https://www.pcisecuritystandards.org/document_library">PCI-DSS</a>

### Healthcare

- HIPAA requires administrative, physical, and technical safeguards; do not store PHI in CI logs or artifacts.
- Sign a BAA with your cloud provider; choose compliant regions; encrypt at rest and in transit.
- Favor ephemeral runners and minimal artifact retention.

References: <a href="https://www.hhs.gov/hipaa/for-professionals/security/laws-regulations/index.html">HIPAA Security Rule</a>, provider guidance for HIPAA on <a href="https://aws.amazon.com/compliance/hipaa-compliance/">AWS</a>, <a href="https://cloud.google.com/security/compliance/hipaa">GCP</a>, <a href="https://learn.microsoft.com/azure/compliance/offerings/offering-hipaa-hitech">Azure</a>

---

## Monitoring and cost tracking

- <strong>Dashboards:</strong> minutes, spend, queue time, runner utilization, cache hit rates.
- <strong>Alerts:</strong> budget thresholds, anomaly detection.
- <strong>APIs:</strong> GitHub run usage API, cloud billing exports.

```bash
# Org billing summary (requires org admin)
gh api -H "Accept: application/vnd.github+json" /orgs/OWNER/settings/billing/actions | jq

# Run timing (billable minutes)
gh api -H "Accept: application/vnd.github+json" /repos/OWNER/REPO/actions/runs/123456/timing | jq
```

---

## Advanced optimization strategies

### Ephemeral runners deep dive

- <strong>CI reproducibility:</strong> ephemeral runners lead to reproducible builds. This is extremely important for CI.
- <strong>Security-first:</strong> one job per VM/pod; automatic teardown eliminates drift.
- <strong>Cost knobs:</strong> rely on remote/registry caches and artifact pruning to offset cache losses.
- <strong>ARC RunnerScaleSet</strong> and <strong>Terraform AWS GitHub Runner module</strong> support ephemeral patterns out-of-the-box.

### Job batching and scheduling

- <strong>Batching:</strong> batch nightly jobs and low-priority tasks in off-peak windows; restrict <code>max-parallel</code> to contain burst costs.
- <strong>Spot-friendly pipelines:</strong> persist caches early, checkpoint long jobs to resume.

```mermaid
flowchart TD
  S["Non-critical job?"] -->|Yes| Off["Schedule off-peak"]
  S -->|No| Now["Run now"]
  Off --> Spot["Prefer Spot/Preemptible"]
  Now --> Guard["Apply concurrency + timeouts"]
```

### Workflow-level cost controls

- Conditional execution (<code>paths</code>/<code>paths-ignore</code>), concurrency cancellation, timeouts, matrix throttling.
- Keep storage cheap: compress artifacts, shorten retention, upload minimal logs.

---

## Cost comparison and ROI

| Monthly workload | Hosted Linux x64 | Self-hosted on-demand | Self-hosted spot | Notes |
| --- | --- | --- | --- | --- |
| 10,000 min | $$ | $ | $ | Depends on instance type, cache hits, NAT/egress |
| 100,000 min | $$$ | $$ | $-$$ | Maintenance overhead more salient |

<Callout title="Interpreting tables" type="note">
  Exact numbers vary by region, instance type, cache effectiveness, and egress. Use cloud calculators and your actual run data.
</Callout>

---

## Implementation checklist

<Accordions type="single">
  <Accordion title="Quick wins" value="quick">
    <Steps>
      <Step>Enable concurrency cancellation and job timeouts</Step>
      <Step>Reduce artifact retention to 7-14 days; compress logs</Step>
      <Step>Co-locate runners, registry, and artifacts in the same region</Step>
      <Step>Add storage/registry endpoints to avoid NAT traversal</Step>
    </Steps>
  </Accordion>
  <Accordion title="Medium-term" value="mid">
    <Steps>   
      <Step>Introduce spot/preemptible runners with safe retry policies</Step>
      <Step>Migrate to ephemeral runners for untrusted code paths</Step>
      <Step>Adopt ARC or Terraform AWS GitHub Runner module for autoscaling</Step>
      <Step>Right-size instance SKUs based on utilization</Step>
    </Steps>
  </Accordion>
  <Accordion title="Long-term" value="long">
      <Steps>
      <Step>Implement per-team cost allocation and budgets</Step>
      <Step>Consolidate NAT and endpoint topology; reduce cross-AZ traffic</Step>
      <Step>Establish image baking with pre-baked caches</Step>
    </Steps>
  </Accordion>
</Accordions>

---

## References

- GitHub Actions billing and usage: <a href="https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions">billing</a>, <a href="https://docs.github.com/en/billing/managing-billing-for-github-actions/viewing-your-github-actions-usage">usage</a>, <a href="https://docs.github.com/en/rest/actions/workflow-runs?apiVersion=2022-11-28#get-workflow-run-usage">run usage API</a>
- AWS: <a href="https://aws.amazon.com/ec2/pricing/">EC2 pricing</a>, <a href="https://aws.amazon.com/ec2/spot/">Spot</a>, <a href="https://aws.amazon.com/vpc/pricing/">NAT pricing</a>, <a href="https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints.html">VPC endpoints</a>, <a href="https://aws.amazon.com/s3/pricing/">S3 pricing</a>, <a href="https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html">ECR endpoints</a>
- GCP: <a href="https://cloud.google.com/compute/all-pricing">Compute pricing</a>, <a href="https://cloud.google.com/compute/docs/instances/spot">Spot/Preemptible</a>, <a href="https://cloud.google.com/vpc/docs/private-google-access">Private Google Access</a>, <a href="https://cloud.google.com/nat/pricing">Cloud NAT pricing</a>, <a href="https://cloud.google.com/artifact-registry/pricing">Artifact Registry</a>
- Azure: <a href="https://azure.microsoft.com/pricing/details/virtual-machines/">VM pricing</a>, <a href="https://learn.microsoft.com/azure/virtual-machines/spot-vms">Spot</a>, <a href="https://azure.microsoft.com/pricing/details/nat-gateway/">NAT pricing</a>, <a href="https://learn.microsoft.com/azure/private-link/private-endpoint-overview">Private Endpoints</a>, <a href="https://learn.microsoft.com/azure/container-registry/">ACR</a>
- Compliance: <a href="https://www.aicpa-cima.com/resources/article/soc-2-faqs">SOC 2</a>, <a href="https://www.pcisecuritystandards.org/document_library">PCI-DSS</a>, <a href="https://www.hhs.gov/hipaa/for-professionals/security/laws-regulations/index.html">HIPAA Security Rule</a>

---

<Callout title="WarpBuild" type="success">
This guide is vendor-neutral; if you want managed building blocks that implement many of the above, see WarpBuild docs: [`/docs/ci/`](/docs/ci/).

  WarpBuild offers a comprehensive solution for self-hosted runners, including support for Linux, Windows, across all major cloud providers built for Enterprises. Get started today with WarpBuild: [`https://app.warpbuild.com/`](https://app.warpbuild.com/).

  WarpBuild also offers a cloud-hosted solution with high performance runners, that are 10x faster and 90% cheaper than GitHub hosted infrastructure, optimized for peak performance and seamless integration.
</Callout>
