CircleCI to GitHub Actions Converter

Convert .circleci/config.yml to GitHub Actions workflow YAML in your browser. Translates Docker executors, jobs, workflows, orb commands, restore_cache/save_cache, and store_artifacts/persist_to_workspace.

Migrating from CircleCI to GitHub Actions

CircleCI configs are tightly coupled to the workflow graph at the bottom of `config.yml`. Converting to GitHub Actions means flattening that graph: each CircleCI workflow job becomes a GitHub job, with `requires:` translated into `needs:`. The cache pair (`restore_cache` + `save_cache`) collapses into a single `actions/cache@v4` step, and `store_artifacts` / `persist_to_workspace` collapses into the `actions/upload-artifact` / `actions/download-artifact` pair.

The converter recognises common orbs (`circleci/node`, `circleci/python`, `circleci/aws-cli`, `circleci/docker`) and rewrites their commands as the corresponding GitHub Actions where possible.

Syntax cheat sheet

ConceptCircleCIGitHub Actions
Triggerworkflows: main: triggers: - schedule: { cron, filters }on: schedule: - cron: ...
Executordocker: [{ image: cimg/node:20 }]runs-on: ubuntu-latest container: cimg/node:20
Checkout- checkout- uses: actions/checkout@v4
Cache- restore_cache: { keys } - save_cache: { key, paths }- uses: actions/cache@v4 with: { key, path }
Workspace- persist_to_workspace: { paths }- uses: actions/upload-artifact@v4
Matrixworkflows: main: jobs: - test: matrix: parameters: { node: [...] }strategy: matrix: node: [...]
Variable<< matrix.node >>${{ matrix.node }}
Manual gatejobs: - hold: type: approval(environments with required reviewers)

Gotchas to watch for

  • warning

    Workflow definition disappears

    CircleCI puts the DAG in a workflows section at the bottom; GitHub puts it in `needs:` on each job. The converter inverts the structure.

  • warning

    Cache keys with checksums

    CircleCI cache keys often use `{{ checksum "..." }}` — these translate to `${{ hashFiles('...') }}` in GitHub Actions. The converter rewrites the syntax.

  • warning

    Pipeline parameters

    CircleCI pipeline parameters (`<< pipeline.parameters.foo >>`) become GitHub Actions inputs. They only fire on `workflow_dispatch` triggers.

  • warning

    Approval jobs

    A `type: approval` job becomes a GitHub Actions job that waits for a deployment-environment approval. The converter emits a stub and a TODO.

  • warning

    Resource classes

    CircleCI resource classes (`resource_class: large`) have no direct equivalent — choose `runs-on:` from the GitHub-hosted matrix (e.g. `ubuntu-latest-4-cores`) or use self-hosted runners.

Worked examples

CircleCI Node test → GitHub Actions

A workflow with one Docker-executor job. Caches collapse to actions/cache.

CircleCI
version: 2.1
jobs:
  test:
    docker:
      - image: cimg/node:20.10
    steps:
      - checkout
      - run: npm ci
      - run: npm test
workflows:
  build:
    jobs: [test]
GitHub Actions
name: CI
on:
  push: {}
jobs:
  test:
    runs-on: ubuntu-latest
    container: cimg/node:20.10
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm test

Frequently asked questions

How do you handle CircleCI orbs?expand_more

Common orbs (`circleci/node`, `circleci/aws-cli`, `circleci/python`, `circleci/docker`) map to GitHub Actions equivalents (`actions/setup-node`, `aws-actions/configure-aws-credentials`, etc.). Less common orbs are rewritten as shell commands and flagged for manual review.

What about machine and macos executors?expand_more

A `machine: true` job is mapped to `runs-on: ubuntu-latest`. A `macos: { xcode: ... }` job is mapped to `runs-on: macos-latest`. Adjust the runner choice if you need a specific Xcode version (use `runs-on: macos-13` etc.).

Can it convert dynamic config (path-filtering, continuation orb)?expand_more

No. CircleCI continuation orb / path-filtering use cases require dynamic pipeline generation that GitHub Actions handles via reusable workflows or matrix combinations. The converter emits a TODO; rebuild this manually.

Related Tools