[16 December, 2025] Feature branch for self-hosted runner billing part 1 (#58631)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: cmuto09 <cmuto09@github.com> Co-authored-by: Sophie <29382425+sophietheking@users.noreply.github.com> Co-authored-by: Jules <19994093+jules-p@users.noreply.github.com> Co-authored-by: Laura Coursen <lecoursen@github.com> Co-authored-by: Collin McNeese <collinmcneese@github.com>
This commit is contained in:
76
assets/example-scripts/billing/README.md
Normal file
76
assets/example-scripts/billing/README.md
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
# Actions Cost Summary Script
|
||||||
|
|
||||||
|
The script can be found here: https://gist.github.com/docs-bot/98cb03ec43b716b1f8e03bcc091d069c.
|
||||||
|
|
||||||
|
This script processes GitHub Actions billing data to generate cost summaries by SKU (Stock Keeping Unit).
|
||||||
|
|
||||||
|
This script is referenced in the Billing tutorial: content/billing/tutorials/estimate-actions-costs.md
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
|
||||||
|
The script analyzes [summarized usage reports](https://docs.github.com/en/billing/reference/billing-reports#summarized-usage-report) from GitHub billing and creates CSV summaries that help you understand:
|
||||||
|
|
||||||
|
- Which Actions SKUs are being used
|
||||||
|
- Total costs per SKU
|
||||||
|
- Free minutes usage per SKU
|
||||||
|
|
||||||
|
Optionally, the script can generate per-organization breakdowns to analyze usage across different organizations.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Python 3.x (uses only standard library modules)
|
||||||
|
|
||||||
|
## Use the script
|
||||||
|
|
||||||
|
### Basic usage
|
||||||
|
|
||||||
|
Generate a single SKU summary file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 summarize_actions_costs.py input_file.csv
|
||||||
|
```
|
||||||
|
|
||||||
|
This creates `input_file_sku.csv` containing:
|
||||||
|
- Each distinct SKU that starts with `actions_`
|
||||||
|
- Sum of all costs (`net_amount`) for each SKU
|
||||||
|
- Sum of free minutes used (where `net_amount` is 0) for each SKU
|
||||||
|
|
||||||
|
### Per-organization summaries
|
||||||
|
|
||||||
|
Generate both the SKU summary and individual files for each organization:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 summarize_actions_costs.py input_file.csv --by-org
|
||||||
|
```
|
||||||
|
|
||||||
|
This creates:
|
||||||
|
- `input_file_sku.csv` - Overall SKU summary across all organizations
|
||||||
|
- `input_file.organization_name.csv` - Individual summary for each organization
|
||||||
|
|
||||||
|
Each organization file contains the same SKU-level breakdown (costs and free minutes) but filtered to that specific organization's usage.
|
||||||
|
|
||||||
|
## Output format
|
||||||
|
|
||||||
|
All output CSV files have the following format:
|
||||||
|
|
||||||
|
```csv
|
||||||
|
sku,total_net_amount,free_minutes_quantity
|
||||||
|
actions_linux,10800.30,248594.00
|
||||||
|
actions_macos,24424.38,10294.00
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
- **sku**: The SKU identifier (only those starting with `actions_`)
|
||||||
|
- **total_net_amount**: Sum of all costs for this SKU
|
||||||
|
- **free_minutes_quantity**: Sum of quantity used when no cost was incurred (free tier usage)
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- The script only processes rows where the `product` is `actions`
|
||||||
|
- Only SKUs starting with `actions_` are included in the output
|
||||||
|
- Organization names are sanitized for safe filenames (removes special characters, path separators, and limits length)
|
||||||
|
- Empty organization names are saved as `unknown`
|
||||||
|
- The script validates required CSV columns before processing
|
||||||
|
- Malformed rows are skipped with a warning message
|
||||||
|
- CSV injection protection is applied to output fields
|
||||||
|
- Maximum of 1000 organizations when using `--by-org` to prevent resource exhaustion
|
||||||
@@ -18,16 +18,21 @@ topics:
|
|||||||
- CD
|
- CD
|
||||||
---
|
---
|
||||||
|
|
||||||
|
{% data reusables.actions.self-hosted-price-note %}
|
||||||
|
|
||||||
A self-hosted runner is a system that you deploy and manage to execute jobs from {% data variables.product.prodname_actions %} on {% data variables.product.github %}.
|
A self-hosted runner is a system that you deploy and manage to execute jobs from {% data variables.product.prodname_actions %} on {% data variables.product.github %}.
|
||||||
|
|
||||||
Self-hosted runners:
|
Self-hosted runners:
|
||||||
|
|
||||||
{% ifversion fpt or ghec %}
|
{% ifversion fpt or ghec %}
|
||||||
* Give you more control of hardware, operating system, and software tools than {% data variables.product.prodname_dotcom %}-hosted runners provide. Be aware that you are responsible for updating the operating system and all other software.{% endif %}
|
* Give you more control of hardware, operating system, and software tools than {% data variables.product.github %}-hosted runners provide. Be aware that you are responsible for updating the operating system and all other software.
|
||||||
|
* Allow you to use machines and services that your company already maintains and pays to use.{% endif %} {% ifversion actions-cloud-platform-march %}
|
||||||
|
* Add little to your bill for actions usage because you pay only for using the actions cloud platform. See [AUTOTITLE](/billing/concepts/product-billing/github-actions).{% elsif fpt or ghec %}
|
||||||
|
* Are currently free to use with {% data variables.product.prodname_actions %}. From {% data variables.actions.self_hosted_runner_charge_date %}, you will see a small per-minute charge for using the actions cloud platform in your bill for actions usage. See [AUTOTITLE](/billing/concepts/product-billing/github-actions).{% endif %} {% ifversion ghes %}
|
||||||
* Are free to use with {% data variables.product.prodname_actions %}, but you are responsible for the cost of maintaining your runner machines.
|
* Are free to use with {% data variables.product.prodname_actions %}, but you are responsible for the cost of maintaining your runner machines.
|
||||||
|
* Can use cloud services or local machines that you already pay for.{% endif %}
|
||||||
* Let you create custom hardware configurations that meet your needs with processing power or memory to run larger jobs, install software available on your local network.
|
* Let you create custom hardware configurations that meet your needs with processing power or memory to run larger jobs, install software available on your local network.
|
||||||
* Receive automatic updates for the self-hosted runner application only, though you may disable automatic updates of the runner.
|
* Receive automatic updates for the self-hosted runner application only, though you may disable automatic updates of the runner.
|
||||||
* Can use cloud services or local machines that you already pay for.
|
|
||||||
* Don't need to have a clean instance for every job execution.{% ifversion ghec or ghes %}
|
* Don't need to have a clean instance for every job execution.{% ifversion ghec or ghes %}
|
||||||
* Can be organized into groups to restrict access to specific workflows, organizations, and repositories. See [AUTOTITLE](/actions/hosting-your-own-runners/managing-self-hosted-runners/managing-access-to-self-hosted-runners-using-groups).{% endif %}
|
* Can be organized into groups to restrict access to specific workflows, organizations, and repositories. See [AUTOTITLE](/actions/hosting-your-own-runners/managing-self-hosted-runners/managing-access-to-self-hosted-runners-using-groups).{% endif %}
|
||||||
* Can be physical, virtual, in a container, on-premises, or in a cloud.
|
* Can be physical, virtual, in a container, on-premises, or in a cloud.
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ Before you add a self-hosted runner, you should understand what they are and how
|
|||||||
Additionally, you must meet the following requirements:
|
Additionally, you must meet the following requirements:
|
||||||
{% data reusables.actions.self-hosted-runners-prerequisites %}
|
{% data reusables.actions.self-hosted-runners-prerequisites %}
|
||||||
|
|
||||||
|
{% data reusables.actions.self-hosted-price-note %}
|
||||||
|
|
||||||
## Adding a self-hosted runner to a repository
|
## Adding a self-hosted runner to a repository
|
||||||
|
|
||||||
You can add self-hosted runners to a single repository. To add a self-hosted runner to a user repository, you must be the repository owner. For an organization repository, {% ifversion custom-org-roles %}you must be an organization owner, have admin access to the repository, or have the “Manage organization runners and runner groups” permission.{% else %}you must be an organization owner or have admin access to the repository.{% endif %}
|
You can add self-hosted runners to a single repository. To add a self-hosted runner to a user repository, you must be the repository owner. For an organization repository, {% ifversion custom-org-roles %}you must be an organization owner, have admin access to the repository, or have the “Manage organization runners and runner groups” permission.{% else %}you must be an organization owner or have admin access to the repository.{% endif %}
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ versions:
|
|||||||
ghec: '*'
|
ghec: '*'
|
||||||
---
|
---
|
||||||
|
|
||||||
|
{% data reusables.actions.self-hosted-price-note %}
|
||||||
|
|
||||||
{% data reusables.actions.enterprise-github-hosted-runners %}
|
{% data reusables.actions.enterprise-github-hosted-runners %}
|
||||||
|
|
||||||
{% ifversion repository-actions-runners %}
|
{% ifversion repository-actions-runners %}
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ versions:
|
|||||||
type: overview
|
type: overview
|
||||||
---
|
---
|
||||||
|
|
||||||
|
{% data reusables.actions.self-hosted-price-note %}
|
||||||
|
|
||||||
## Requirements for self-hosted runner machines
|
## Requirements for self-hosted runner machines
|
||||||
|
|
||||||
You can use a machine as a self-hosted runner as long as it meets these requirements:
|
You can use a machine as a self-hosted runner as long as it meets these requirements:
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ children:
|
|||||||
- /create-an-example-workflow
|
- /create-an-example-workflow
|
||||||
- /build-and-test-code
|
- /build-and-test-code
|
||||||
- /authenticate-with-github_token
|
- /authenticate-with-github_token
|
||||||
|
- /migrate-to-github-runners
|
||||||
- /create-actions
|
- /create-actions
|
||||||
- /publish-packages
|
- /publish-packages
|
||||||
- /manage-your-work
|
- /manage-your-work
|
||||||
|
|||||||
150
content/actions/tutorials/migrate-to-github-runners.md
Normal file
150
content/actions/tutorials/migrate-to-github-runners.md
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
---
|
||||||
|
title: 'Migrating from self-hosted runners to GitHub-hosted runners'
|
||||||
|
intro: 'Learn how to assess your current CI infrastructure and migrate workflows from self-hosted runners to {% data variables.product.github %}-hosted runners.'
|
||||||
|
shortTitle: 'Migrate to GitHub runners'
|
||||||
|
versions:
|
||||||
|
fpt: '*'
|
||||||
|
ghec: '*'
|
||||||
|
contentType: tutorials
|
||||||
|
audience:
|
||||||
|
- driver
|
||||||
|
---
|
||||||
|
|
||||||
|
You can run workflows on {% data variables.product.github %}-hosted or self-hosted runners, or use a mixture of runner types.
|
||||||
|
|
||||||
|
This tutorial shows you how to assess your current use of runners, then migrate workflows from self-hosted runners to {% data variables.product.github %}-hosted runners efficiently.
|
||||||
|
|
||||||
|
## 1. Assess your current CI infrastructure
|
||||||
|
|
||||||
|
Migrating from self-hosted runners to {% data variables.product.github %}-hosted larger runners begins with a thorough assessment of your current CI infrastructure. If you take the time to match specifications and environments carefully, you will minimize the time spent fixing problems when you start running workflows on different runners.
|
||||||
|
|
||||||
|
1. Create an inventory of each machine specification used to run workflows, including CPU cores, RAM, storage, chip architecture, and operating system.
|
||||||
|
1. Note if any of the runners are part of a runner group or have a label. You can use this information to simplify migration of workflows to new runners.
|
||||||
|
1. Document any custom images and pre-installed dependencies that workflows rely on, as these will influence your migration strategy.
|
||||||
|
1. Identify which workflows currently target self-hosted runners, and why. For example, in {% data variables.product.prodname_actions %} usage metrics, use the **Jobs** tab and filter by runner label (such as `self-hosted` or a custom label) to see which repositories and jobs are using that label. If you need to validate specific workflow files, you can also use code search to find workflow files that reference `runs-on: self-hosted` or other self-hosted labels.
|
||||||
|
1. Identify workflows that access private network resources (for example, internal package registries, private APIs, databases, or on-premises services), since these may require additional networking configuration.
|
||||||
|
|
||||||
|
## 2. Map your processing requirements to {% data variables.product.github %}-hosted runner types
|
||||||
|
|
||||||
|
{% data variables.product.github %} offers managed runners in multiple operating systems—Linux, Windows, and macOS—with options for GPU-enabled machines. See [AUTOTITLE](/actions/reference/runners/larger-runners).
|
||||||
|
|
||||||
|
1. Map each distinct machine specification in your inventory to a suitable {% data variables.product.github %}-hosted runner specification.
|
||||||
|
1. Make a note of any self-hosted runners where there is no suitable {% data variables.product.github %}-hosted runner.
|
||||||
|
1. Exclude any workflows that must continue to run on self-hosted runners from your migration plans.
|
||||||
|
|
||||||
|
## 3. Estimate capacity requirements
|
||||||
|
|
||||||
|
Before you provision {% data variables.product.github %}-hosted runners, estimate how much compute capacity your workflows will need. Reviewing your current self-hosted runner usage helps you choose appropriate runner sizes, set concurrency limits, and forecast potential cost changes.
|
||||||
|
|
||||||
|
{% data reusables.profile.access_org %}
|
||||||
|
{% data reusables.user-settings.access_org %}
|
||||||
|
{% data reusables.organizations.insights %}
|
||||||
|
1. In the "Insights" navigation menu, click **Actions Usage Metrics**.
|
||||||
|
1. Click on the tab that contains the metrics you would like to view. See [AUTOTITLE](/actions/concepts/metrics).
|
||||||
|
1. Review the following data points to estimate hosted runner capacity:
|
||||||
|
|
||||||
|
* **Total minutes consumed**: Helps you estimate baseline compute demand.
|
||||||
|
* **Number of workflow runs**: Identifies peak activity times that may require more concurrency.
|
||||||
|
* **Job distribution across OS types**: Ensures you provision the right mix of Linux, Windows, and macOS runners.
|
||||||
|
* **Runner labels (Jobs tab)**: Filter by a runner label to understand where a label is used.
|
||||||
|
|
||||||
|
1. Convert your findings into a capacity plan:
|
||||||
|
|
||||||
|
* Match high-usage workflows to larger runner sizes where appropriate.
|
||||||
|
* Identify workflows that may benefit from pre-built or custom images to reduce runtime.
|
||||||
|
* Estimate concurrency by determining how many jobs typically run simultaneously.
|
||||||
|
|
||||||
|
1. Make a note of any gaps:
|
||||||
|
|
||||||
|
* Workflows with hard dependencies your current hosted runner images do not support.
|
||||||
|
* Jobs with unusually long runtimes or bespoke environment needs. (You may need custom images for these.)
|
||||||
|
|
||||||
|
Your capacity plan will guide how many runners to provision, which machine types to use, and how to configure runner groups and policies in the next steps.
|
||||||
|
|
||||||
|
## 4. Configure runner groups and policies
|
||||||
|
|
||||||
|
After estimating your capacity needs, configure runner groups and access policies so your {% data variables.product.github %}-hosted runners are available to the right organizations and workflows.
|
||||||
|
|
||||||
|
Configuring runner groups before provisioning runners helps ensure that migration doesn’t accidentally open access too broadly or create unexpected cost increases.
|
||||||
|
|
||||||
|
1. Create runner groups at the enterprise level to define who can use your hosted runners. See [AUTOTITLE](/enterprise-cloud@latest/actions/how-tos/manage-runners/larger-runners/control-access#creating-a-runner-group-for-an-enterprise).
|
||||||
|
|
||||||
|
Use runner groups to scope access by organization, repository, or workflow. If you are migrating from self-hosted runners, consider reusing existing runner group names or labels where possible. This allows workflows to continue working without changes when you switch to {% data variables.product.github %}-hosted runners.
|
||||||
|
|
||||||
|
1. Add new {% data variables.product.github %}-hosted runners to the appropriate group and set concurrency limits based on the usage patterns you identified in step 3. For details on automatic scaling, see [AUTOTITLE](/actions/how-tos/manage-runners/larger-runners/manage-larger-runners#configuring-autoscaling-for-larger-runners).
|
||||||
|
1. Review policy settings to ensure runners are only used by the intended workflows. For example, restricting use to specific repositories or preventing untrusted workflows from accessing more powerful machine types.
|
||||||
|
|
||||||
|
>[!NOTE] macOS larger runners cannot be added to runner groups and must be referenced directly in your workflow files.
|
||||||
|
|
||||||
|
## 5. Set up {% data variables.product.github %}-hosted runners
|
||||||
|
|
||||||
|
Next, provision your {% data variables.product.github %}-hosted runners based on the machine types and capacity you identified earlier.
|
||||||
|
|
||||||
|
1. Choose the machine size and operating system that match your workflow requirements. For available images and specifications, see [AUTOTITLE](/actions/reference/runners/larger-runners#runner-images).
|
||||||
|
1. Assign each runner to a runner group and configure concurrency limits to control how many jobs can run at the same time.
|
||||||
|
1. Select an image type:
|
||||||
|
|
||||||
|
* Use {% data variables.product.github %}-managed images for a maintained, frequently updated environment.
|
||||||
|
* Use custom images when you need pre-installed dependencies to reduce setup time. See [AUTOTITLE](/actions/how-tos/manage-runners/larger-runners/use-custom-images).
|
||||||
|
|
||||||
|
1. Apply any required customizations, such as environment variables, software installation, or startup scripts. For more examples, see [AUTOTITLE](/actions/how-tos/manage-runners/github-hosted-runners/customize-runners).
|
||||||
|
1. Optionally, configure private networking if runners must access internal resources. See [AUTOTITLE](/enterprise-cloud@latest/actions/concepts/runners/private-networking).
|
||||||
|
|
||||||
|
### Configure private connectivity options
|
||||||
|
|
||||||
|
If your workflows need access to private resources (for example, internal package registries, private APIs, databases, or on-premises services), choose an approach that fits your network and security requirements.
|
||||||
|
|
||||||
|
#### Configure Azure Private Networking
|
||||||
|
|
||||||
|
Run {% data variables.product.github %}-hosted runners inside an Azure Virtual Network (VNET) for secure access to internal resources.
|
||||||
|
|
||||||
|
1. Create an Azure Virtual Network (VNET) and configure subnets and network security groups for your runners.
|
||||||
|
1. Enable Azure private networking for your runner group. See [AUTOTITLE](/admin/configuring-settings/configuring-private-networking-for-hosted-compute-products/configuring-private-networking-for-github-hosted-runners-in-your-enterprise#1-add-a-new-network-configuration-for-your-enterprise)
|
||||||
|
1. Apply network configuration, such as NSGs and firewall rules, to control ingress and egress traffic.
|
||||||
|
1. Update workflow targeting to use the runner group that is configured for private networking.
|
||||||
|
|
||||||
|
For detailed instructions, see:
|
||||||
|
|
||||||
|
* [AUTOTITLE](/organizations/managing-organization-settings/configuring-private-networking-for-github-hosted-runners-in-your-organization)
|
||||||
|
* [AUTOTITLE](/admin/configuring-settings/configuring-private-networking-for-hosted-compute-products/configuring-private-networking-for-github-hosted-runners-in-your-enterprise)
|
||||||
|
|
||||||
|
#### Connect using a WireGuard overlay network
|
||||||
|
|
||||||
|
If Azure private networking is not applicable (for example, because your target network is on-premises or in another cloud), you can use a VPN overlay such as WireGuard to provide network-level access to private resources.
|
||||||
|
|
||||||
|
For detailed instructions and examples, see [AUTOTITLE](/actions/how-tos/manage-runners/github-hosted-runners/connect-to-a-private-network/connect-with-wireguard).
|
||||||
|
|
||||||
|
#### Use OIDC with an API gateway for trusted access to private resources
|
||||||
|
|
||||||
|
If you don’t need the runner to join your private network, you can use OIDC to establish trusted, short-lived access to a service you expose via an API gateway. This approach can reduce the need for long-lived secrets and limits network access to the specific endpoints your workflow needs.
|
||||||
|
|
||||||
|
For detailed instructions and examples, see [AUTOTITLE](/actions/how-tos/manage-runners/github-hosted-runners/connect-to-a-private-network/connect-with-oidc).
|
||||||
|
|
||||||
|
## 6. Update workflows to use the new runners
|
||||||
|
|
||||||
|
After your {% data variables.product.github %}-hosted runners are configured, update your workflow files to target them.
|
||||||
|
|
||||||
|
1. Reuse existing labels if you assigned your new runners to the same runner group names your self-hosted runners used. In this case, workflows will automatically use the new runners without changes.
|
||||||
|
1. If you created new runner groups or labels, update the runs-on field in your workflow YAML files. For example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: [github-larger-runner, linux-x64]
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: {% data reusables.actions.action-checkout %}
|
||||||
|
- name: Build project
|
||||||
|
run: make build
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Check for hard-coded references to self-hosted labels (such as `self-hosted`, `linux-x64`, or custom labels) and replace them with the appropriate {% data variables.product.github %}-hosted runner labels.
|
||||||
|
1. Test each updated workflow to ensure it runs correctly on the new runners. Monitor for any issues related to environment differences or missing dependencies.
|
||||||
|
|
||||||
|
## 7. Remove unused self-hosted runners
|
||||||
|
|
||||||
|
After your workflows have been updated and tested on {% data variables.product.github %}-hosted runners, remove any self-hosted runners that are no longer needed. This prevents jobs from accidentally targeting outdated infrastructure. See [AUTOTITLE](/actions/how-tos/manage-runners/self-hosted-runners/remove-runners).
|
||||||
|
|
||||||
|
Before you remove self-hosted runners, verify that you have fully migrated:
|
||||||
|
|
||||||
|
* In {% data variables.product.prodname_actions %} usage metrics, use the **Jobs** tab and filter by runner label (for example, `self-hosted` or your custom labels) to confirm no repositories or jobs are still using self-hosted runners.
|
||||||
@@ -27,9 +27,15 @@ You can use policies to control how enterprise members use {% data variables.pro
|
|||||||
|
|
||||||
## Adding runners
|
## Adding runners
|
||||||
|
|
||||||
To run {% data variables.product.prodname_actions %} workflows, you need to use runners. {% data reusables.actions.about-runners %} If you use {% data variables.product.company_short %}-hosted runners, you will be billed based on consumption after exhausting the minutes included in your plan, whereas self-hosted runners are free. For more information, see [AUTOTITLE](/billing/managing-billing-for-github-actions/about-billing-for-github-actions).
|
To run {% data variables.product.prodname_actions %} workflows, you need to use runners. {% data reusables.actions.about-runners %} You can use {% data variables.product.github %}-hosted runners or add self-hosted runners.
|
||||||
|
|
||||||
For more information, see [AUTOTITLE](/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners).
|
* **{% data variables.product.github %}-hosted runners:** Available immediately. Your plan includes some free usage of standard runners, after this you pay for processing time and storage.
|
||||||
|
* **Self-hosted runners:** You need to add and maintain them. {% ifversion actions-cloud-platform-march %}These runners add little to your bill for actions usage because you are charged only for using the {% data variables.product.prodname_actions %} cloud platform. After you have used the free minutes included in your plan, you pay $0.002 USD per minute of processing time.{% elsif fpt or ghec %}Use is currently free. From {% data variables.actions.self_hosted_runner_charge_date %}, you will pay a per-minute fee for using the cloud platform.{% endif %}
|
||||||
|
|
||||||
|
For more information:
|
||||||
|
|
||||||
|
* [AUTOTITLE](/billing/concepts/product-billing/github-actions)
|
||||||
|
* [AUTOTITLE](/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners)
|
||||||
|
|
||||||
If you choose self-hosted runners, you can add runners at the enterprise, organization, or repository levels. For more information, see [AUTOTITLE](/actions/hosting-your-own-runners/managing-self-hosted-runners/adding-self-hosted-runners).
|
If you choose self-hosted runners, you can add runners at the enterprise, organization, or repository levels. For more information, see [AUTOTITLE](/actions/hosting-your-own-runners/managing-self-hosted-runners/adding-self-hosted-runners).
|
||||||
|
|
||||||
|
|||||||
@@ -23,17 +23,22 @@ shortTitle: GitHub Actions
|
|||||||
contentType: concepts
|
contentType: concepts
|
||||||
---
|
---
|
||||||
|
|
||||||
|
{% data reusables.billing.actions-price-changes %}
|
||||||
|
|
||||||
## How use of {% data variables.product.prodname_actions %} is measured
|
## How use of {% data variables.product.prodname_actions %} is measured
|
||||||
|
|
||||||
{% data variables.product.prodname_actions %} usage is **free** for **self-hosted runners** and for **public repositories** that use standard {% data variables.product.github %}-hosted runners. See [AUTOTITLE](/actions/writing-workflows/choosing-where-your-workflow-runs/choosing-the-runner-for-a-job#standard-github-hosted-runners-for-public-repositories).
|
{% data variables.product.prodname_actions %} usage is measured and charged according to runner type and repository visibility.
|
||||||
|
|
||||||
For **private repositories**, each {% data variables.product.github %} account receives a quota of free minutes, artifact storage, and cache storage for use with {% data variables.product.github %}-hosted runners, depending on the account's plan. Any usage beyond the included amounts is billed to your account.
|
* **Standard, {% data variables.product.github %}-hosted runners**
|
||||||
|
* Public repositories: Free to use, see [AUTOTITLE](/actions/writing-workflows/choosing-where-your-workflow-runs/choosing-the-runner-for-a-job#standard-github-hosted-runners-for-public-repositories).
|
||||||
|
* Private and internal repositories: Free until your plan quota is empty, then billed for minutes and storage use
|
||||||
|
* **Larger, {% data variables.product.github %}-hosted runners**: Billed for minutes and storage
|
||||||
|
* **Self-hosted runners on the {% data variables.product.prodname_actions %} cloud platform**: Free until your plan quota is empty, then billed for cloud platform use{% ifversion actions-cloud-platform-march %}<!--Nothing to display-->{% elsif fpt or ghec %} from {% data variables.actions.self_hosted_runner_charge_date %}{% endif %}
|
||||||
|
|
||||||
* **Minutes:** Your free minutes reset to the full amount at the start of each billing cycle. Minutes usage is charged to the repository owner, not the person who triggered the workflow runs.
|
Each {% data variables.product.github %} account receives a quota of free minutes, artifact storage, and cache storage for use with {% data variables.product.github %}-hosted runners, depending on the account's plan. Any usage beyond the included amounts is billed to your account. Minutes reset every month, while artifact and cache storage usage do not.
|
||||||
* **Storage:** Storage charges accumulate throughout the month based on hourly usage. Your accrued storage charges reset to zero at the start of each billing cycle.
|
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Anyone with write access to a repository can run actions without using minutes for their personal account.
|
> Anyone with write access to a repository can run actions. Any costs of running the actions are billed to the repository owner.
|
||||||
|
|
||||||
## How storage billing works
|
## How storage billing works
|
||||||
|
|
||||||
@@ -79,22 +84,28 @@ Your monthly bill converts GB-Hours to GB-Months by dividing by the hours in the
|
|||||||
|
|
||||||
### Examples of how usage is measured
|
### Examples of how usage is measured
|
||||||
|
|
||||||
* If you run a workflow on a standard Linux runner and it takes 10 minutes to complete, you'll use 10 minutes of the repository owner's allowance. If the workflow generates a 10 MB artifact, then you'll also use 10 MB of the repository owner's artifact storage allowance.
|
{% data variables.product.github %}-hosted runners:
|
||||||
|
|
||||||
|
* If you run a workflow on a Linux runner and it takes 10 minutes to complete, you'll use 10 minutes of the repository owner's allowance. If the workflow generates a 10 MB artifact, then you'll also use 10 MB of the repository owner's artifact storage allowance.
|
||||||
* If you run a workflow that normally takes 10 minutes and it fails after 5 minutes because a dependency isn't available, you'll use 5 minutes of the repository owner's allowance. If you fix the problem and re-run the workflow successfully, in total you'll use 15 minutes of the repository owner's allowance.
|
* If you run a workflow that normally takes 10 minutes and it fails after 5 minutes because a dependency isn't available, you'll use 5 minutes of the repository owner's allowance. If you fix the problem and re-run the workflow successfully, in total you'll use 15 minutes of the repository owner's allowance.
|
||||||
* If you run a workflow that generates many log files and a long job summary, these files do not count towards the repository owner's artifact storage allowance.
|
* If you run a workflow that generates many log files and a long job summary, these files do not count towards the repository owner's artifact storage allowance.
|
||||||
* Cache storage usage is measured by the peak usage for each hour. Included usage is 10 GB per repository. For a given hour, if a repository has a peak cache usage of 15 GB, then the repository owner will be charged for the 5 GB of usage above the 10 GB included for that hour. The repository owner will only be charged if the repository cache storage limit has been configured higher than the included usage.
|
* Cache storage usage is measured by the peak usage for each hour. Included usage is 10 GB per repository. For a given hour, if a repository has a peak cache usage of 15 GB, then the repository owner will be charged for the 5 GB of usage above the 10 GB included for that hour. The repository owner will only be charged if the repository cache storage limit has been configured higher than the included usage.
|
||||||
* Additional cache storage is $0.07 per GiB, per month.
|
* Additional cache storage is $0.07 per GiB, per month.
|
||||||
|
|
||||||
|
Self-hosted runners:
|
||||||
|
|
||||||
|
{% ifversion actions-cloud-platform-march %}
|
||||||
|
* If you run a workflow on a self-hosted runner and it takes 10 minutes to complete, the repository owner will be billed for 10 minutes use of the {% data variables.product.prodname_actions %} cloud platform.{% elsif fpt or ghec %}
|
||||||
|
* Currently, all use of self-hosted runners is free.
|
||||||
|
* From {% data variables.actions.self_hosted_runner_charge_date %}, if you run a workflow on a self-hosted runner and it takes 10 minutes to complete, the repository owner will be billed for 10 minutes use of the {% data variables.product.prodname_actions %} cloud platform.
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
## Free use of {% data variables.product.prodname_actions %}
|
## Free use of {% data variables.product.prodname_actions %}
|
||||||
|
|
||||||
The following amounts of time for standard runners, artifact storage, and cache storage are included in your {% data variables.product.github %} plan. At the start of each month, the minutes used by the account are reset to zero.
|
The following amounts of time for standard {% data variables.product.github %}-hosted runners, artifact storage, and cache storage are included in your {% data variables.product.github %} plan. At the start of each month, the minutes used by the account are reset to zero.
|
||||||
|
|
||||||
{% data reusables.billing.actions-included-quotas %}
|
{% data reusables.billing.actions-included-quotas %}
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> * Included minutes cannot be used for larger runners. These runners will always be charged for, even when used by public repositories.
|
|
||||||
> * The storage amounts shown are **shared** with {% data variables.product.prodname_registry %}. This means your total storage across Actions artifacts, Actions caches, and Packages cannot exceed the included amount for your plan.
|
|
||||||
|
|
||||||
The use of standard {% data variables.product.github %}-hosted runners is free:
|
The use of standard {% data variables.product.github %}-hosted runners is free:
|
||||||
|
|
||||||
* In public repositories
|
* In public repositories
|
||||||
@@ -102,43 +113,65 @@ The use of standard {% data variables.product.github %}-hosted runners is free:
|
|||||||
* For {% data variables.product.prodname_dependabot %}
|
* For {% data variables.product.prodname_dependabot %}
|
||||||
* For the agentic features ({% data variables.release-phases.public_preview %}) in {% data variables.copilot.copilot_code-review %}
|
* For the agentic features ({% data variables.release-phases.public_preview %}) in {% data variables.copilot.copilot_code-review %}
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
>
|
||||||
|
> * **Self-hosted runners:** {% ifversion actions-cloud-platform-march %}Use minutes from your plan until your quota is exhausted. You are then charged for additional processing time used.{% elsif fpt or ghec %}Are free to use until {% data variables.actions.self_hosted_runner_charge_date %}.{% endif %}
|
||||||
|
> * **Larger runners:** Are always charged for, even when used by public repositories or when you have quota available from your plan.
|
||||||
|
> * * The storage amounts shown are **shared** with {% data variables.product.prodname_registry %}. This means your total storage across Actions artifacts, Actions caches, and Packages cannot exceed the included amount for your plan.
|
||||||
|
|
||||||
## Using more than your included quota
|
## Using more than your included quota
|
||||||
|
|
||||||
If your account does not have a valid payment method on file, usage is blocked once you use up your quota.
|
If your account does not have a valid payment method on file, usage is blocked once you use up your quota. Usage of larger runners is always blocked until you set up a payment method.
|
||||||
|
|
||||||
## Paying for additional {% data variables.product.prodname_actions %} use
|
## Paying for additional {% data variables.product.prodname_actions %} use
|
||||||
|
|
||||||
You pay for any additional use above your quota using the payment method set up for your {% data variables.product.github %} account. See [AUTOTITLE](/billing/how-tos/set-up-payment/manage-payment-info).
|
You pay for any additional use above your quota using the payment method set up for your {% data variables.product.github %} account. See [AUTOTITLE](/billing/how-tos/set-up-payment/manage-payment-info).
|
||||||
|
|
||||||
Storage is billed based on hourly usage of artifacts and caches throughout the month. Minutes are calculated based on the total processing time used on each runner type during the month.
|
For {% data variables.product.github %}-hosted runners, storage is billed based on hourly usage of artifacts and caches throughout the month. Minutes are calculated based on the total processing time used by each runner type during the month.
|
||||||
|
|
||||||
* To estimate costs for paid {% data variables.product.prodname_actions %} usage, use the {% data variables.product.github %} [pricing calculator](https://github.com/pricing/calculator?feature=actions).
|
{% ifversion actions-cloud-platform-march %}
|
||||||
* To view your current minutes, artifact, and cache storage, see [AUTOTITLE](/billing/managing-billing-for-your-products/viewing-your-product-usage).
|
For self-hosted runners, use of the {% data variables.product.prodname_actions %} cloud platform is based on the total processing time used across all workflows during the month.
|
||||||
|
{% elsif fpt or ghec %}
|
||||||
|
From {% data variables.actions.self_hosted_runner_charge_date %}, use of the {% data variables.product.prodname_actions %} cloud platform by self-hosted runners will be based on the total processing time used across all workflows during the month.
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
* To estimate costs for paid usage, use the {% data variables.product.github %} [pricing calculator](https://github.com/pricing/calculator?feature=actions).
|
||||||
|
* To view your current costs, see [AUTOTITLE](/billing/managing-billing-for-your-products/viewing-your-product-usage).
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> The billing dashboard may show your Actions usage as a dollar amount ("spend") rather than raw minutes. This amount already reflects any applicable minute multipliers.
|
> The billing dashboard may show your Actions usage as a dollar amount ("spend") rather than raw minutes. This amount already reflects any applicable minute costs.
|
||||||
|
|
||||||
### Minute multipliers
|
### Baseline minute costs
|
||||||
|
|
||||||
Each type of runner has a minute multiplier that is determined by the operating system and processing power. For example, jobs that run on Windows and macOS runners hosted by {% data variables.product.github %} consume minutes at 2 and 10 times the rate that jobs on Linux runners consume.
|
Each type of runner hosted by {% data variables.product.github %} has a cost per-minute that is determined by the operating system and processing power.{% ifversion actions-cloud-platform-march %} Self-hosted runners have a flat cost per-minute of $0.002 USD for use of the cloud platform.{% endif %}
|
||||||
|
|
||||||
| Operating system | Minute multiplier |
|
For example, jobs that run on Windows and macOS runners hosted by {% data variables.product.github %} cost more to run than jobs on Linux runners.
|
||||||
| ---------------- | :---------------: |
|
|
||||||
| Linux | 1 |
|
|
||||||
| Windows | 2 |
|
|
||||||
| macOS | 10 |
|
|
||||||
|
|
||||||
For full details of minute multipliers for {% data variables.product.github %}-hosted runners, see [AUTOTITLE](/billing/reference/actions-minute-multipliers).
|
{% data reusables.billing.actions-standard-runner-prices %}
|
||||||
|
|
||||||
### Example minutes cost calculation
|
For full details of minute costs for different types of runners, see [AUTOTITLE](/billing/reference/actions-runner-pricing).
|
||||||
|
|
||||||
For example, if your organization uses {% data variables.product.prodname_team %}, using 5,000 minutes beyond the included quota would have a total actions minutes cost of $56 USD, with the use of both Linux and Windows runners.
|
### Example minutes cost calculation for {% data variables.product.github %}-hosted runners
|
||||||
|
|
||||||
|
For example, if your organization uses {% data variables.product.prodname_team %}, using 5,000 minutes beyond the included quota on {% data variables.product.github %}-hosted runners would have a total actions minutes cost of $56 USD currently, if you used baseline Linux and Windows runners.
|
||||||
|
|
||||||
* 5,000 (3,000 Linux and 2,000 Windows) minutes = $56 USD ($24 USD + $32 USD).
|
* 5,000 (3,000 Linux and 2,000 Windows) minutes = $56 USD ($24 USD + $32 USD).
|
||||||
* 3,000 Linux minutes at $0.008 USD per minute = $24 USD.
|
* 3,000 Linux minutes at $0.008 USD per minute = $24 USD.
|
||||||
* 2,000 Windows minutes at $0.016 USD per minute = $32 USD.
|
* 2,000 Windows minutes at $0.016 USD per minute = $32 USD.
|
||||||
|
|
||||||
This example assumes that the baseline runner was used for each operating system.
|
>[!TIP]
|
||||||
|
> The cost for these runners will reduce from {% data variables.actions.self_hosted_runner_charge_date %}.
|
||||||
|
|
||||||
|
### Example minutes cost calculation for self-hosted runners
|
||||||
|
|
||||||
|
{% ifversion actions-cloud-platform-march %}
|
||||||
|
For example, if you use 5,000 minutes of processing time on self-hosted runners this will cost $10 USD for using the {% data variables.product.prodname_actions %} cloud platform.
|
||||||
|
|
||||||
|
{% elsif fpt or ghec %}
|
||||||
|
From **{% data variables.actions.self_hosted_runner_charge_date %}**, regardless of your plan, using 5,000 minutes on self-hosted runners would have a total actions minutes cost of $10 USD for using the {% data variables.product.prodname_actions %} cloud platform.
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
Calculation: 5,000 * $0.002 USD per minute = $10 USD
|
||||||
|
|
||||||
### Example artifact storage cost calculation
|
### Example artifact storage cost calculation
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
title: Actions runner pricing
|
title: Actions runner pricing
|
||||||
shortTitle: Actions runner pricing
|
shortTitle: Actions runner pricing
|
||||||
intro: Reference information for calculating the cost of using different {% data variables.product.github %}-hosted runners.
|
intro: Reference information for calculating the cost of using different types of runners.
|
||||||
versions:
|
versions:
|
||||||
fpt: "*"
|
fpt: "*"
|
||||||
ghec: "*"
|
ghec: "*"
|
||||||
@@ -14,60 +14,69 @@ redirect_from:
|
|||||||
- /billing/reference/actions-minute-multipliers
|
- /billing/reference/actions-minute-multipliers
|
||||||
---
|
---
|
||||||
|
|
||||||
|
{% data reusables.billing.actions-price-changes %}
|
||||||
|
|
||||||
{% data variables.product.github %} rounds the minutes and partial minutes each job uses up to the nearest whole minute.
|
{% data variables.product.github %} rounds the minutes and partial minutes each job uses up to the nearest whole minute.
|
||||||
|
|
||||||
## Standard runners
|
## Self-hosted runners
|
||||||
|
|
||||||
| Operating system | Per-minute rate (USD) |
|
{% ifversion actions-cloud-platform-march %}
|
||||||
| ------------------------------------ | --------------------- |
|
The cost of using a self-hosted runner on the {% data variables.product.prodname_actions %} cloud platform is $0.002 USD per minute.
|
||||||
| Linux 1-core | $0.002 |
|
{% elsif fpt or ghec %}
|
||||||
| Linux 2-core | $0.008 |
|
From {% data variables.actions.self_hosted_runner_charge_date %}, the cost of using a self-hosted runner on the {% data variables.product.prodname_actions %} cloud platform will be $0.002 USD per minute.
|
||||||
| Windows 2-core | $0.016 |
|
{% endif %}
|
||||||
| macOS 3-core or 4-core (M1 or Intel) | $0.08 |
|
|
||||||
|
The cost of using the {% data variables.product.prodname_actions %} cloud platform is included in the per-minute cost of all {% data variables.product.github %}-hosted runners.
|
||||||
|
|
||||||
|
## Standard {% data variables.product.github %}-hosted runners
|
||||||
|
|
||||||
|
These runners will use minutes included in your quota to run workflows in private and internal repositories until the quota is used up.
|
||||||
|
|
||||||
|
{% data reusables.billing.actions-standard-runner-prices %}
|
||||||
|
|
||||||
## x64-powered {% data variables.actions.hosted_runners %}
|
## x64-powered {% data variables.actions.hosted_runners %}
|
||||||
|
|
||||||
| Operating system | Per-minute rate (USD) |
|
| Operating system | Billing SKU | Per-minute rate until January 1, 2026 (USD) | January 1, 2026 onward | Percentage change |
|
||||||
| --------------------- | --------------------- |
|
| --------------------- | -------------------------- | ----------------- |---------------|------|
|
||||||
| Linux Advanced 2-core | $0.008 |
|
| Linux Advanced 2-core | `linux_2_core_advanced` | $0.008 | $0.006 | -25% |
|
||||||
| Linux 4-core | $0.016 |
|
| Linux 4-core | `linux_4_core` | $0.016 | $0.012 | -25% |
|
||||||
| Linux 8-core | $0.032 |
|
| Linux 8-core | `linux_8_core` | $0.032 | $0.022 | -31% |
|
||||||
| Linux 16-core | $0.064 |
|
| Linux 16-core | `linux_16_core` | $0.064 | $0.042 | -34% |
|
||||||
| Linux 32-core | $0.128 |
|
| Linux 32-core | `linux_32_core` | $0.128 | $0.082 | -36% |
|
||||||
| Linux 64-core | $0.256 |
|
| Linux 64-core | `linux_64_core` | $0.256 | $0.162 | -37% |
|
||||||
| Linux 96-core | $0.384 |
|
| Linux 96-core | `linux_96_core` | $0.384 | $0.252 | -34% |
|
||||||
| Windows 4-core | $0.032 |
|
| Windows 4-core | `windows_4_core` | $0.032 | $0.022 | -31% |
|
||||||
| Windows 8-core | $0.064 |
|
| Windows 8-core | `windows_8_core` | $0.064 | $0.042 | -34% |
|
||||||
| Windows 16-core | $0.128 |
|
| Windows 16-core | `windows_16_core` | $0.128 | $0.082 | -36% |
|
||||||
| Windows 32-core | $0.256 |
|
| Windows 32-core | `windows_32_core` | $0.256 | $0.162 | -37% |
|
||||||
| Windows 64-core | $0.512 |
|
| Windows 64-core | `windows_64_core` | $0.512 | $0.322 | -37% |
|
||||||
| Windows 96-core | $0.768 |
|
| Windows 96-core | `windows_96_core` | $0.768 | $0.552 | -28% |
|
||||||
| macOS 12-core | $0.12 |
|
| macOS 12-core | `macos_l` | $0.120 | $0.077 | -36% |
|
||||||
|
|
||||||
## arm64-powered {% data variables.actions.hosted_runners %}
|
## arm64-powered {% data variables.actions.hosted_runners %}
|
||||||
|
|
||||||
| Operating system | Per-minute rate (USD) |
|
| Operating system | Billing SKU | Per-minute rate until January 1, 2026 (USD) | January 1, 2026 onward | Percentage change |
|
||||||
| ----------------- | --------------------- |
|
| --------------------- | --------------------- | ----------------- |---------------|------|
|
||||||
| Linux 2-core | $0.005 |
|
| Linux 2-core | `linux_2_core_arm` | $0.005 | $0.005 | 0% |
|
||||||
| Linux 4-core | $0.01 |
|
| Linux 4-core | `linux_4_core_arm` | $0.010 | $0.008 | -20% |
|
||||||
| Linux 8-core | $0.02 |
|
| Linux 8-core | `linux_8_core_arm` | $0.020 | $0.014 | -30% |
|
||||||
| Linux 16-core | $0.04 |
|
| Linux 16-core | `linux_16_core_arm` | $0.040 | $0.026 | -35% |
|
||||||
| Linux 32-core | $0.08 |
|
| Linux 32-core | `linux_32_core_arm` | $0.080 | $0.050 | -38% |
|
||||||
| Linux 64-core | $0.16 |
|
| Linux 64-core | `linux_64_core_arm` | $0.160 | $0.098 | -39% |
|
||||||
| Windows 2-core | $0.01 |
|
| Windows 2-core | `windows_2_core_arm` | $0.010 | $0.008 | -20% |
|
||||||
| Windows 4-core | $0.02 |
|
| Windows 4-core | `windows_4_core_arm` | $0.020 | $0.014 | -30% |
|
||||||
| Windows 8-core | $0.04 |
|
| Windows 8-core | `windows_8_core_arm` | $0.040 | $0.026 | -35% |
|
||||||
| Windows 16-core | $0.08 |
|
| Windows 16-core | `windows_16_core_arm` | $0.080 | $0.050 | -38% |
|
||||||
| Windows 32-core | $0.16 |
|
| Windows 32-core | `windows_32_core_arm` | $0.160 | $0.098 | -39% |
|
||||||
| Windows 64-core | $0.32 |
|
| Windows 64-core | `windows_64_core_arm` | $0.320 | $0.194 | -39% |
|
||||||
| macOS 6-core (M1) | $0.16 |
|
| macOS 6-core (M1) | `macos_xl` | $0.160 | $0.102 | -36% |
|
||||||
|
|
||||||
## GPU-powered {% data variables.actions.hosted_runners %}
|
## GPU-powered {% data variables.actions.hosted_runners %}
|
||||||
|
|
||||||
| Operating system | Per-minute rate (USD) |
|
| Operating system | Billing SKU | Per-minute rate until January 1, 2026 (USD) | January 1, 2026 onward | Percentage change |
|
||||||
| ---------------- | --------------------- |
|
| ------------------ | ------------------------ | ------------- |------------|------|
|
||||||
| Linux 4-core | $0.07 |
|
| Linux 4-core | `linux_4_core_gpu` | $0.070 | $0.052 | -26% |
|
||||||
| Windows 4-core | $0.14 |
|
| Windows 4-core | `windows_4_core_gpu` | $0.14 | $0.102 | -27% |
|
||||||
|
|
||||||
## Points to note about rates for runners
|
## Points to note about rates for runners
|
||||||
|
|
||||||
|
|||||||
134
content/billing/tutorials/estimate-actions-costs.md
Normal file
134
content/billing/tutorials/estimate-actions-costs.md
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
---
|
||||||
|
title: 'Estimating the cost of using GitHub Actions on different types of runners'
|
||||||
|
intro: 'Analyze the costs and benefits of different CI/CD setups by understanding the relative costs of using {% data variables.product.github %}-hosted and self-hosted runners.'
|
||||||
|
shortTitle: 'Estimate Actions costs'
|
||||||
|
versions:
|
||||||
|
fpt: '*'
|
||||||
|
ghec: '*'
|
||||||
|
permissions: 'Users who can see the "Billing & Licensing" and "Insights" pages for an organization or enterprise on {% data variables.product.prodname_dotcom_the_website %} or {% data variables.enterprise.data_residency_site %}'
|
||||||
|
topics:
|
||||||
|
- Enterprise
|
||||||
|
- Billing
|
||||||
|
- REST
|
||||||
|
contentType: tutorials
|
||||||
|
audience:
|
||||||
|
- driver
|
||||||
|
---
|
||||||
|
|
||||||
|
As your usage of CI/CD grows, optimizing costs becomes increasingly important. With this tutorial, you can assess your current {% data variables.product.prodname_actions %} costs, estimate the impact of upcoming pricing changes, and identify configuration changes that could reduce expenses or improve efficiency. See [2026 pricing changes for {% data variables.product.prodname_actions %}](https://resources.github.com/actions/2026-pricing-changes-for-github-actions) in {% data variables.product.github %} Executive Insights.
|
||||||
|
|
||||||
|
## 1. Download past usage of {% data variables.product.prodname_actions %}
|
||||||
|
|
||||||
|
You can download a full breakdown of the costs of using {% data variables.product.github %}-hosted runners from the "Usage" view of the "Billing & licensing" tab. {% ifversion actions-cloud-platform-march %}Data for self-hosted runners is included in this report from {% data variables.actions.self_hosted_runner_charge_date %}.
|
||||||
|
|
||||||
|
<!-- expires 2026-09-01 -->
|
||||||
|
For data on self-hosted runners before {% data variables.actions.self_hosted_runner_charge_date %}, see the "Actions Usage Metrics" view of the "Insights" tab.
|
||||||
|
<!-- end expires 2026-09-01 -->
|
||||||
|
|
||||||
|
{% elsif fpt or ghec %}
|
||||||
|
|
||||||
|
Usage of self-hosted runners is available on the **Insights** tab of your organization or enterprise. From {% data variables.actions.self_hosted_runner_charge_date %}, this data will also be included in billing usage reports.
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
### Generate report for runner usage and costs
|
||||||
|
|
||||||
|
{% data reusables.billing.nav-to-org-or-ent %}
|
||||||
|
{% data reusables.billing.access-org-or-ent-page %}
|
||||||
|
{% data reusables.billing.display-usage-view %}
|
||||||
|
|
||||||
|
1. At the top of the page, click **{% octicon "download" aria-hidden="true" %} Get usage report**.
|
||||||
|
1. Select a report type of **Summarized** and a time frame of at least three months.
|
||||||
|
1. Click **Email me the report**.
|
||||||
|
|
||||||
|
When the report is ready for you to download, you'll receive a message to your primary email account with a link to download the report. The link will expire after 24 hours.
|
||||||
|
|
||||||
|
### Get usage of self-hosted runners
|
||||||
|
|
||||||
|
<!-- expires 2026-09-01 -->
|
||||||
|
{% ifversion actions-cloud-platform-march %}
|
||||||
|
This step is needed only if you want to download data from before {% data variables.actions.self_hosted_runner_charge_date %}.
|
||||||
|
{% endif %}
|
||||||
|
<!-- end expires 2026-09-01 -->
|
||||||
|
|
||||||
|
1. Click **{% octicon "graph" aria-hidden="true" %} Insights** tab for your organization or enterprise to display additional insights.
|
||||||
|
1. In the "Insights" navigation menu, click **{% octicon "play" aria-hidden="true" %} Actions Usage Metrics** to display usage data.
|
||||||
|
1. At the top of the page, click **Period:Current month** and define a time period of at least three months.
|
||||||
|
1. In the tabbed table, click **{% octicon "stopwatch" aria-hidden="true" %} Jobs** to show all usage split by job.
|
||||||
|
1. To show only jobs that run on self-hosted runners, add a filter on runner type:
|
||||||
|
|
||||||
|
```text copy
|
||||||
|
runner_type:self-hosted
|
||||||
|
```
|
||||||
|
|
||||||
|
1. To the right of the filter box, click {% octicon "download" aria-label="Download report" %} to download the data from the table.
|
||||||
|
|
||||||
|
## 2. Summarize past usage and costs
|
||||||
|
|
||||||
|
You have downloaded one billing report, `summarizedUsageReport`, and possibly one actions usage metrics report for self-hosted runners. You need to further summarize the data from the `summarizedUsageReport` before moving to the next step, for example:
|
||||||
|
|
||||||
|
* **Get cost per runner type:** Sum costs for each `sku` for the `actions` product
|
||||||
|
* **Get usage of minutes included in your plan:** Sum minutes for each `sku` that were included in your plan, that is: `net_amount` of `0`
|
||||||
|
* Consider splitting the costs and included minutes by organization
|
||||||
|
|
||||||
|
For an example Python script that generates this summary information from a `summarizedUsageReport`, see [`summarize_actions_costs.py`](https://gist.github.com/docs-bot/98cb03ec43b716b1f8e03bcc091d069c).
|
||||||
|
|
||||||
|
>[!TIP]
|
||||||
|
> There is no change to the costs of storing artifacts and caches, so you can ignore the `actions_storage` SKU.
|
||||||
|
|
||||||
|
## 3. Estimate impact of the cost changes
|
||||||
|
|
||||||
|
Using the summaries of the recent costs of {% data variables.product.github %}-hosted runners and the minutes used by self-hosted runners, you can estimate future costs of using {% data variables.product.prodname_actions %}.
|
||||||
|
|
||||||
|
### General trend in costs
|
||||||
|
|
||||||
|
Assuming that the number of workflows you run and the time they take to complete stays similar, the impact on your future costs will vary according to the types of runners that you currently use:
|
||||||
|
|
||||||
|
* **Mostly {% data variables.product.github %}-hosted runners:** You will see lower bills for {% data variables.product.prodname_actions %}.
|
||||||
|
* **Mostly self-hosted runners:** You will probably see higher bills for actions. It makes sense to re-evaluate your split between self-hosted and {% data variables.product.github %}-hosted runners. You may find that the costs of maintaining your own runners versus using {% data variables.product.github %}-hosted runners are more evenly balanced.
|
||||||
|
* **A mix of runner types:** You will need to assess how your costs will change with the new charging model and decide whether or not to make any changes to your runner usage.
|
||||||
|
|
||||||
|
### Detailed calculations of changes to costs
|
||||||
|
|
||||||
|
For each type of runner that you use, you can calculate how much the same usage will cost from January and from March 2026 using data from [AUTOTITLE](/billing/reference/actions-runner-pricing).
|
||||||
|
|
||||||
|
To estimate your expected spend more precisely, you can also use the [{% data variables.product.github %} pricing calculator](https://github.com/pricing/calculator?feature=actions).
|
||||||
|
|
||||||
|
In this example, the change in costs for standard {% data variables.product.github %}-hosted runners and self-hosted runners is calculated.
|
||||||
|
|
||||||
|
| Runner type | Past {% data variables.product.github %} bill | January 1, 2026 onward | March 1, 2026 onward |
|
||||||
|
|--|--|--|--|
|
||||||
|
| Linux 2-core (`actions_linux`) | _past cost_ | _past cost_ **\* 0.75** | _past cost_ **\* 0.75** |
|
||||||
|
| Windows 2-core (`actions_windows`) | _past cost_ | _past cost_ **\* 0.62** | _past cost_ **\* 0.62** |
|
||||||
|
| macOS 3-core or 4-core (`actions_macos`) | _past cost_ | _past cost_ **\* 0.77** | _past cost_ **\* 0.77** |
|
||||||
|
| Self-hosted | $0 USD | $0 USD | _Minutes used_ **\* $0.002 USD** |
|
||||||
|
|
||||||
|
The multipliers in this table reflect the change in per-minute pricing for standard {% data variables.product.github %}-hosted runners starting January 1, 2026. For self-hosted runners, billing begins on March 1, 2026, based on total minutes used.
|
||||||
|
|
||||||
|
## 4. Identify runner changes to explore
|
||||||
|
|
||||||
|
When you have estimated the impact of the charging changes on your costs, you may want to update your runner usage.
|
||||||
|
|
||||||
|
### Investing the budget freed in more powerful runners
|
||||||
|
|
||||||
|
If the billing changes free some of your budget, then you could identify the workflows that take the longest to run and update them to use larger runners hosted by {% data variables.product.github %}.
|
||||||
|
|
||||||
|
To identify the longest-running workflows, display the **Insights** tab for your enterprise or organization and display the **Actions performance metrics**. Click **Avg run time** to sort the workflows by run time.
|
||||||
|
|
||||||
|
For more information, see [AUTOTITLE](/actions/concepts/runners/larger-runners).
|
||||||
|
|
||||||
|
### Migrating workflows from self-hosted to {% data variables.product.github %}-hosted runners
|
||||||
|
|
||||||
|
If the total cost of running workflows on self-hosted runners is now similar to the cost of using {% data variables.product.github %}-hosted runners, you may want to simplify your CI/CD platform by migrating from self-hosted runners.
|
||||||
|
|
||||||
|
Some considerations:
|
||||||
|
|
||||||
|
* Do all the costs of maintaining self-hosted runners come under the same internal budget as billing for actions usage?
|
||||||
|
* Are we using all the processing time included in our {% data variables.product.github %} plan currently?
|
||||||
|
* Do any of the self-hosted runners provide specialized environments that would be difficult to replicate on a {% data variables.product.github %}-hosted runner?
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> You can request that additional tools are added to {% data variables.product.github %}-hosted runners, by raising an issue with the [tool request](https://github.com/actions/runner-images/issues/new?template=tool-request.yml) template.
|
||||||
|
|
||||||
|
## Next steps
|
||||||
|
|
||||||
|
* [AUTOTITLE](/actions/tutorials/migrate-to-github-runners)
|
||||||
@@ -13,7 +13,7 @@ children:
|
|||||||
- /set-up-budgets
|
- /set-up-budgets
|
||||||
- /control-costs-at-scale
|
- /control-costs-at-scale
|
||||||
- /estimate-spending
|
- /estimate-spending
|
||||||
|
- /estimate-actions-costs
|
||||||
- /gather-insights
|
- /gather-insights
|
||||||
contentType: tutorials
|
contentType: tutorials
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ topics:
|
|||||||
Using {% data variables.product.prodname_actions %} runners allows you to more easily identify {% data variables.product.prodname_dependabot %} job errors and manually detect and troubleshoot failed runs. You can also integrate {% data variables.product.prodname_dependabot %} into your CI/CD pipelines by using {% data variables.product.prodname_actions %} APIs and webhooks to detect {% data variables.product.prodname_dependabot %} job status such as failed runs, and perform downstream processing. For more information, see [AUTOTITLE](/rest/actions) and [AUTOTITLE](/webhooks/webhook-events-and-payloads).
|
Using {% data variables.product.prodname_actions %} runners allows you to more easily identify {% data variables.product.prodname_dependabot %} job errors and manually detect and troubleshoot failed runs. You can also integrate {% data variables.product.prodname_dependabot %} into your CI/CD pipelines by using {% data variables.product.prodname_actions %} APIs and webhooks to detect {% data variables.product.prodname_dependabot %} job status such as failed runs, and perform downstream processing. For more information, see [AUTOTITLE](/rest/actions) and [AUTOTITLE](/webhooks/webhook-events-and-payloads).
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> Running {% data variables.product.prodname_dependabot %} on {% data variables.product.prodname_dotcom %}-hosted and self-hosted runners **does not** count towards your included {% data variables.product.prodname_actions %} minutes. For more information, see [AUTOTITLE](/billing/managing-billing-for-github-actions/about-billing-for-github-actions).
|
> Running {% data variables.product.prodname_dependabot %} on {% data variables.product.prodname_dotcom %}-hosted or self-hosted runners **does not** count towards your included {% data variables.product.prodname_actions %} minutes. For more information, see [AUTOTITLE](/billing/managing-billing-for-github-actions/about-billing-for-github-actions).
|
||||||
|
|
||||||
You can run {% data variables.product.prodname_dependabot %} on {% data variables.product.prodname_actions %} using:
|
You can run {% data variables.product.prodname_dependabot %} on {% data variables.product.prodname_actions %} using:
|
||||||
* {% data variables.product.prodname_dotcom %}-hosted runners
|
* {% data variables.product.prodname_dotcom %}-hosted runners
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ You can understand your spending trends by viewing graphs of {% data variables.p
|
|||||||
For more detailed insights, you can group usage by the type of {% data variables.product.prodname_copilot_short %} plan, and enterprises can filter the results by cost center.
|
For more detailed insights, you can group usage by the type of {% data variables.product.prodname_copilot_short %} plan, and enterprises can filter the results by cost center.
|
||||||
|
|
||||||
1. Go to your enterprise or organization account settings and click **{% octicon "credit-card" aria-hidden="true" aria-label="credit-card" %} Billing & Licensing**.
|
1. Go to your enterprise or organization account settings and click **{% octicon "credit-card" aria-hidden="true" aria-label="credit-card" %} Billing & Licensing**.
|
||||||
1. In the left sidebar, click **Usage** (organizations) or **Usage** and then **Metered usage** (enterprises).
|
{% data reusables.billing.display-usage-view %}
|
||||||
1. In the "Metered usage" section, in the search field, enter `product:copilot`. To filter by cost center, add a query like `cost_center:ce-pilot-group`.
|
1. In the "Metered usage" section, in the search field, enter `product:copilot`. To filter by cost center, add a query like `cost_center:ce-pilot-group`.
|
||||||
1. To understand spending differences between {% data variables.copilot.copilot_business_short %} and {% data variables.copilot.copilot_enterprise_short %} plans, select the **Group: None** dropdown menu and click **Group by: SKU**.
|
1. To understand spending differences between {% data variables.copilot.copilot_business_short %} and {% data variables.copilot.copilot_enterprise_short %} plans, select the **Group: None** dropdown menu and click **Group by: SKU**.
|
||||||
|
|
||||||
|
|||||||
10
data/features/actions-cloud-platform-march.yml
Normal file
10
data/features/actions-cloud-platform-march.yml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Reference: #20361
|
||||||
|
# Documentation for the self-hosted runner billing changes for GitHub Cloud.
|
||||||
|
# Shipping on {% data variables.actions.self_hosted_runner_charge_date %}
|
||||||
|
versions:
|
||||||
|
# fpt: '*'
|
||||||
|
# ghec: '*'
|
||||||
|
# This change will never ship to GHES.
|
||||||
|
# The value below allows tests to pass while hiding the content for fpt and ghec until
|
||||||
|
# it's ready to ship to GitHub Cloud on {% data variables.actions.self_hosted_runner_charge_date %}.
|
||||||
|
ghes: '3.21'
|
||||||
@@ -1 +1 @@
|
|||||||
{% data variables.product.prodname_actions %} usage is free for standard {% data variables.product.prodname_dotcom %}-hosted runners in public repositories, and for self-hosted runners. See [AUTOTITLE](/actions/writing-workflows/choosing-where-your-workflow-runs/choosing-the-runner-for-a-job#standard-github-hosted-runners-for-public-repositories). For private repositories, each {% data variables.product.prodname_dotcom %} account receives a quota of free minutes and storage for use with {% data variables.product.prodname_dotcom %}-hosted runners, depending on the account's plan. Any usage beyond the included amounts is billed to your account.
|
{% data variables.product.prodname_actions %} usage is free for public repositories that use standard {% data variables.product.github %}-hosted runners. See [AUTOTITLE](/actions/writing-workflows/choosing-where-your-workflow-runs/choosing-the-runner-for-a-job#standard-github-hosted-runners-for-public-repositories). For private and internal repositories, each {% data variables.product.github %} account receives a quota of free minutes and storage for use with {% data variables.product.github %}-hosted or self-hosted runners. The quota size depends on the account's plan. Any usage beyond the included amounts is billed to your account.
|
||||||
|
|||||||
8
data/reusables/actions/self-hosted-price-note.md
Normal file
8
data/reusables/actions/self-hosted-price-note.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{% ifversion actions-cloud-platform-march %}
|
||||||
|
<!--Nothing to show-->
|
||||||
|
{% elsif fpt or ghec %}
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> Use of self-hosted runners is currently free. From {% data variables.actions.self_hosted_runner_charge_date %}, repository owners will pay a per-minute fee for using the cloud platform to run workflows on self-hosted runners. See [2026 pricing changes for {% data variables.product.prodname_actions %}](https://resources.github.com/actions/2026-pricing-changes-for-github-actions) in {% data variables.product.github %} Executive Insights.
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
13
data/reusables/billing/actions-price-changes.md
Normal file
13
data/reusables/billing/actions-price-changes.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{% ifversion actions-cloud-platform-march %}
|
||||||
|
<!--Nothing to show-->
|
||||||
|
{% elsif fpt or ghec %}
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> Upcoming changes to {% data variables.product.prodname_actions %} pricing:
|
||||||
|
>
|
||||||
|
> * **Self-hosted runners**: You will be charged for using the {% data variables.product.prodname_actions %} cloud platform from **{% data variables.actions.self_hosted_runner_charge_date %}**.
|
||||||
|
> * **{% data variables.product.github %}-hosted runners**: The charge for using actions minutes in private and internal repositories will include the cost of using the cloud platform from **January 1, 2026**.
|
||||||
|
>
|
||||||
|
> See [2026 pricing changes for {% data variables.product.prodname_actions %}](https://resources.github.com/actions/2026-pricing-changes-for-github-actions) in {% data variables.product.github %} Executive Insights.
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
6
data/reusables/billing/actions-standard-runner-prices.md
Normal file
6
data/reusables/billing/actions-standard-runner-prices.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
| Operating system | Billing SKU | Per-minute rate until January 1, 2026 (USD) | January 1, 2026 onward | Percentage change |
|
||||||
|
| ------------------------------------ | -------------|----------------- |---------------|--------|
|
||||||
|
| Linux 1-core | `linux_slim` | $0.002 | $0.002 | 0% |
|
||||||
|
| Linux 2-core | `linux` | $0.008 | $0.006 | -25% |
|
||||||
|
| Windows 2-core | `windows` | $0.016 | $0.010 | -38% |
|
||||||
|
| macOS 3-core or 4-core (M1 or Intel) | `macos` | $0.080 | $0.062 | -23% |
|
||||||
1
data/reusables/billing/display-usage-view.md
Normal file
1
data/reusables/billing/display-usage-view.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
1. In the left sidebar, click **Usage** . For enterprises, then click **Metered usage**.
|
||||||
@@ -7,3 +7,5 @@ github_hosted_runner: 'GitHub-hosted runner'
|
|||||||
github_hosted_runners: 'GitHub-hosted runners'
|
github_hosted_runners: 'GitHub-hosted runners'
|
||||||
github_hosted_larger_runner: 'GitHub-hosted larger runner'
|
github_hosted_larger_runner: 'GitHub-hosted larger runner'
|
||||||
github_hosted_larger_runners: 'GitHub-hosted larger runners'
|
github_hosted_larger_runners: 'GitHub-hosted larger runners'
|
||||||
|
# Date when the new billing changes for self-hosted runners on GitHub Cloud will ship
|
||||||
|
self_hosted_runner_charge_date: 'March 1, 2026'
|
||||||
|
|||||||
Reference in New Issue
Block a user