urity features  ](/en/actions/security-guides/using-githubs-security-features-to-secure-your-use-of-github-actions)
    * [ Automatic token authentication  ](/en/actions/security-guides/automatic-token-authentication)

  * Creating actions 

    * [ About custom actions  ](/en/actions/creating-actions/about-custom-actions)
    * [ Create a Docker container action  ](/en/actions/creating-actions/creating-a-docker-container-action)
    * [ Create a JavaScript action  ](/en/actions/creating-actions/creating-a-javascript-action)
    * [ Create a composite action  ](/en/actions/creating-actions/creating-a-composite-action)
    * [ Metadata syntax  ](/en/actions/creating-actions/metadata-syntax-for-github-actions)
    * [ Dockerfile support  ](/en/actions/creating-actions/dockerfile-support-for-github-actions)
    * [ Set exit codes  ](/en/actions/creating-actions/setting-exit-codes-for-actions)
    * [ Publish in GitHub Marketplace  ](/en/actions/creating-actions/publishing-actions-in-github-marketplace)
    * [ Share from your private repository  ](/en/actions/creating-actions/sharing-actions-and-workflows-from-your-private-repository)
    * [ Share with your organization  ](/en/actions/creating-actions/sharing-actions-and-workflows-with-your-organization)
    * [ Release and maintain actions  ](/en/actions/creating-actions/releasing-and-maintaining-actions)
    * [ CLI setup action  ](/en/actions/creating-actions/developing-a-third-party-cli-action)

  * [ Guides for GitHub Actions  ](/en/actions/guides)

  * [ GitHub Actions ](/en/actions "GitHub Actions") / 
  * [ Using jobs ](/en/actions/using-jobs "Using jobs") / 
  * [ Choose the runner for a job ](/en/actions/using-jobs/choosing-the-runner-for-a-job "Choose the runner for a job")

#  Choosing the runner for a job

Define the type of machine that will process a job in your workflow.

##  Overview

Use ` jobs.<job_id>.runs-on ` to define the type of machine to run the job on.

  * The destination machine can be either a  GitHub-hosted runner  ,  larger runner  , or a  self-hosted runner  . 

  * You can target runners based on the labels assigned to them, or their group membership, or a combination of these. 

  * You can provide ` runs-on ` as: 

    * a single string 
    * a single variable containing a string 
    * an array of strings, variables containing strings, or a combination of both 
    * a ` key: value ` pair using the ` group ` or ` labels ` keys 
  * If you specify an array of strings or variables, your workflow will execute on any runner that matches all of the specified ` runs-on ` values. For example, here the job will only run on a self-hosted runner that has the labels ` linux ` , ` x64 ` , and ` gpu ` : 
    
        runs-on: [self-hosted, linux, x64, gpu]
    

For more information, see "  Choosing self-hosted runners  ."

  * You can mix strings and variables in an array. For example: 
    
        on:
      workflow_dispatch:
        inputs:
          chosen-os:
            required: true
            type: choice
            options:
            - Ubuntu
            - macOS
    
    jobs:
      test:
        runs-on: [self-hosted, "${{ inputs.chosen-os }}"]
        steps:
        - run: echo Hello world!
    

  * If you would like to run your workflow on multiple machines, use [ ` jobs.<job_id>.strategy ` ](/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstrategy) . 

**Note:** Quotation marks are not required around simple strings like ` self-
hosted ` , but they are required for expressions like ` "${{ inputs.chosen-os
}}" ` .

###  Choosing GitHub-hosted runners

If you use a GitHub-hosted runner, each job runs in a fresh instance of a
runner image specified by ` runs-on ` .

Available GitHub-hosted runner labels are:

**OS (YAML workflow label)** |  **Notes**  
---|---  
` ubuntu-latest ` , ` ubuntu-22.04 ` , ` ubuntu-20.04 ` |  The ` ubuntu-latest ` label currently uses the Ubuntu 22.04 runner image.   
` windows-latest