Skip to content
Explore the latest in AI, DevEx, security: Get 20% off your tickets to GitHub Universe, only until September 3.

GitHub ActionsGitHub Actions

Automate your workflow
from idea to production

GitHub Actions makes it easy to automate all your software workflows, now with world-class CI/CD. Build, test, and deploy your code right from GitHub. Make code reviews, branch management, and issue triaging work the way you want.

Get started with Actions

Questions? Contact Sales

on: milestone
on: issue_comment
on: check_run
on: deployment
on: label
on: project_card
on: pull_request_comment
on: release
on: repository_vulnerability_alert
on: milestone
on: public
on: repository_dispatch
on: issue_comment
on: fork
on: deployment_status
on: page_build
on: watch
on: pull_request
on: delete
on: issue_comment
on: issues
on: check_suite
on: scheduled
on: pull_request_review
on: project_column
on: status
on: project
on: pull_request
on: delete
on: issue_comment
on: push
on: page_build
on: watch

Run a workflow
on any GitHub event

Kick off workflows with GitHub events like push, issue creation, or a new release. Combine and configure actions for the services you use, built and maintained by the community.

Whether you want to build a container, deploy a web service, or automate welcoming new users to your open source projects—there's an action for that. Pair GitHub Packages with Actions to simplify package management, including version updates, fast distribution with our global CDN, and dependency resolution, using your existing GITHUB_TOKEN.

on: milestone
on: issue_comment
on: check_run
on: deployment
on: label
on: project_card
on: pull_request_comment
on: release
on: repository_vulnerability_alert
on: milestone
on: public
on: repository_dispatch
on: issue_comment
on: fork
on: deployment_status
on: page_build
on: watch
on: pull_request
on: delete
on: issue_comment
on: issues
on: check_suite
on: scheduled
on: pull_request_review
on: project_column
on: status
on: project
on: pull_request
on: delete
on: issue_comment
on: push
on: page_build
on: watch
Illustration depicting the execution of 'npm test' as a push action on three different platforms: Linux, MacOS, and Windows.

Linux, macOS, Windows, ARM, and containers

Matrix builds

Any language

  error-pages
  GET /
     should respond with page list
  Accept: text/html
    GET /403
       should respond with 403
    GET /404
       should respond with 404
    GET /500
       should respond with 500
  Accept: application/json
    GET /403
       should respond with 403
    GET /404
       should respond with 404
    GET /500
       should respond with 500
  Accept: text/plain
    GET /403
       should respond with 403
    GET /404
       should respond with 404
    GET /500
       should respond with 500
error
  GET /
     should respond with 500
  GET /next
     should respond with 500
  GET /missing
     should respond with 404

markdown
  GET /
     should respond with html
  GET /fail
     should respond with an error

multi-router
  GET /
     should respond with root handler
  GET /api/v1/
     should respond with APIv1 root handler
  GET /api/v1/users
     should respond with users from APIv1
  GET /api/v2/
     should respond with APIv2 root handler
  GET /api/v2/users
     should respond with users from APIv2

mvc
  GET /
     should redirect to /users
  GET /pet/0
     should get pet
  GET /pet/0/edit
     should get pet edit page
  PUT /pet/2
     should update the pet
  GET /users
     should display a list of users (70ms)
  GET /user/:id
    when present
       should display the user
       should display the users pets
    when not present
       should 404
  GET /user/:id/edit
     should display the edit form
  PUT /user/:id
     should 500 on error
     should update the user
  POST /user/:id/pet
     should create a pet for user (19ms)

params
  GET /
     should respond with instructions
  GET /user/0
     should respond with a user
  GET /user/9
     should fail to find user
  GET /users/0-2
     should respond with three users
  GET /users/foo-bar
     should fail integer parsing

resource
  GET /
     should respond with instructions
  GET /users
     should respond with all users
  GET /users/1
     should respond with user 1
  GET /users/9
     should respond with error
  GET /users/1..3
     should respond with users 1 through 3
  DELETE /users/1
     should delete user 1
  DELETE /users/9
     should fail
  GET /users/1..3.json
     should respond with users 2 and 3 as json

route-map
  GET /users
     should respond with users
  DELETE /users
     should delete users
  GET /users/:id
     should get a user
  GET /users/:id/pets
     should get a users pets
  GET /users/:id/pets/:pid
     should get a users pet

route-separation
  GET /
     should respond with index
  GET /users
     should list users
  GET /user/:id
     should get a user
     should 404 on missing user
  GET /user/:id/view
     should get a user
     should 404 on missing user (13ms)
  GET /user/:id/edit
     should get a user to edit
  PUT /user/:id/edit
     should edit a user
  POST /user/:id/edit?_method=PUT
     should edit a user
  GET /posts
     should get a list of posts

vhost
  example.com
    GET /
       should say hello
    GET /foo
       should say foo
  foo.example.com
    GET /
       should redirect to /foo
  bar.example.com
    GET /
       should redirect to /bar

web-service
  GET /api/users
    without an api key
       should respond with 400 bad request
    with an invalid api key
       should respond with 401 unauthorized
    with a valid api key
       should respond users json
  GET /api/repos
    without an api key
       should respond with 400 bad request
    with an invalid api key
       should respond with 401 unauthorized
    with a valid api key
       should respond repos json

GET /api/user/:name/repos
  without an api key
     should respond with 400 bad request
  with an invalid api key
     should respond with 401 unauthorized
  with a valid api key
     should respond user repos json
     should 404 with unknown user

when requesting an invalid route
   should respond with 404 json

1123 passing (4s)

=============================================================================
Writing coverage object [/home/runner/build/expressjs/express/coverage/coverage.json]
Writing coverage reports at [/home/runner/build/expressjs/express/coverage]
=============================================================================

=============================== Coverage summary ===============================
Statements   : 98.81% ( 1916/1939 ), 38 ignored
Branches     : 94.58% ( 751/794 ), 22 ignored
Functions    : 100% ( 267/267 )
Lines        : 100% ( 1872/1872 )
================================================================================
The command "npm run test-ci" exited with 0.

$ npm run lint

> express@4.17.1 lint /home/runner/build/expressjs/express
> eslint .

The command "npm run lint" exited with 0.

store build cache

$ # Upload coverage to coveralls

Done. Your build exited with 0.

          
All checks have passed
4 successful checks
Hide all checks
build Successfully in 59s — build
test Successfully in 59s — build
publish Successfully in 59s — build
This branch has no conflicts with the base branch
Merging can be performed automatically.
Merge when ready
Select merge queue method
You can also open this in GitHub Desktop or view command line instructions.

Live logs

Built in secret store

Multi-container testing

ci.yml
1
2
3
4
5
6
7
8
9
10
11
12
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
on: push
jobs:
  test:
    strategy:
      matrix:
        platform: [ubuntu-latest, macos-latest, windows-latest]
    runs-on: ${{ matrix.platform }}
    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: 20
    - run: npm install-ci-test
    - uses:











  publish:
    needs: [test]
    steps:
    - uses: actions/checkout@v4
              

Community-powered workflows

GitHub Actions connects all of your tools to automate every step of your development workflow. Easily deploy to any cloud, create tickets in Jira, or publish a package to npm.

Want to venture off the beaten path? Use the millions of open source libraries available on GitHub to create your own actions. Write them in JavaScript or create a container action—both can interact with the full GitHub API and any other public API.

What our community is saying

Yarn

For open source projects, the lower the infrastructure friction we have, the easier it becomes to work with external contributors. Using GitHub Actions for CI and common tasks like triaging issues allows us to lower the barriers even more, so we can focus on writing a good product.”

Maël Nison Yarn maintainer
mabl

Custom scripts and bespoke systems prevented many of our users from fully realizing the benefits of CI/CD. GitHub Actions gave us a platform to deliver intelligent pipelines with minimal up-front investment and no ongoing maintenance.”

Dan Belcher mabl Co-Founder
SciPy

Actions is an exciting development and unlocks so much potential beyond CI/CD. It promises to streamline our workflows for a variety of tasks, from deploying our websites to querying the GitHub API for custom status reports to standard CI builds.”

Ralf Gommers SciPy maintainer
Dow Jones

We love the repo-native GitHub Actions CI/CD to fully self-contain end-to-end systems, applications, and now their deployment from a single repository! Our tokendito tool for generating credentials fits perfectly into Actions to securely authenticate to our cloud. It enables us to automate and standardize our software development lifecycle and security governance across all of our organizations.”

Sydney Sweeney Lead Cybersecurity Engineer at Dow Jones

Simple, pay-as-you-go pricing

GitHub Actions is free
for public repositories

We take pride in our Open Source legacy, and are happy to provide free CI/CD for public repositories. Check out the doc to see which runners are included.

View docs

Every GitHub plan
includes free usage

Check out plan details to see how many minutes are included and the pricing table below to see which runners you can use your free minutes on.

View pricing

Linux

  • 2-vCPU
    Free plan minutes apply
    $0.008 USD

    per minute

  • 4-vCPU
    Free for public repos
    $0.016 USD

    per minute

  • 8-vCPU
    $0.032 USD

    per minute

  • 16-vCPU
    $0.064 USD

    per minute

  • 32-vCPU
    $0.128 USD

    per minute

  • 64-vCPU
    $0.256 USD

    per minute

Windows

  • 2-vCPU
    Free plan minutes apply
    $0.016 USD

    per minute

  • 4-vCPU
    Free for public repos
    N/A
  • 8-vCPU
    $0.064 USD

    per minute

  • 16-vCPU
    $0.128 USD

    per minute

  • 32-vCPU
    $0.256 USD

    per minute

  • 64-vCPU
    $0.512 USD

    per minute

macOS

  • 3-vCPU
    Free plan minutes apply
    Free for public repos
    $0.08 USD

    per minute

  • 12-vCPU
    $0.12 USD

    per minute

  • 6-vCPU (M1)
    $0.16 USD

    per minute

For a complete list of runner pricing and features please view docs about billing for GitHub Actions.

The future of workflow automation is now

Get started with GitHub Actions today and explore community created actions in the GitHub Marketplace.

Explore GitHub Actions
Documentation

Documentation

Read the workflow language reference and how to’s for many popular languages.

Learn how to create an action and share it with everyone on GitHub.

View docs