Bitbucket Pipelines to GitHub Actions Converter

Convert bitbucket-pipelines.yml to GitHub Actions workflow YAML. Translates default/branches/tags/pull-requests/custom pipelines, parallel groups, pipes, caches, and artifacts.

Migrating from Bitbucket Pipelines to GitHub Actions

Bitbucket's pipeline-per-trigger model converts cleanly to GitHub Actions if you accept that each trigger becomes its own `on:` entry on a single workflow. The converter generates one workflow per source repo (one `.github/workflows/ci.yml` file) with each Bitbucket pipeline becoming an `on:` filter plus a job (or multiple jobs if you used parallel:).

Bitbucket pipes (`atlassian/aws-s3-deploy`, `atlassian/slack-notify`, etc.) are translated to either GitHub Actions equivalents or shell commands.

Syntax cheat sheet

ConceptBitbucket PipelinesGitHub Actions
Pipeline sectionpipelines: default:on: push: {}
Branch pipelinepipelines: branches: main:on: push: branches: [main]
Step- step: script: [npm test]jobs: test: steps: - run: npm test
Parallel- parallel: - step: ... - step: ...(separate jobs without `needs:` between them)
Cache (built-in)caches: [node]- uses: actions/cache@v4 with: path: node_modules key: ...
Pipe- pipe: atlassian/aws-s3-deploy:1.4.0- uses: aws-actions/configure-aws-credentials@v4 - run: aws s3 sync ...

Gotchas to watch for

  • warning

    Bitbucket clones automatically

    GitHub Actions does not. The converter inserts `actions/checkout@v4` as the first step.

  • warning

    Custom pipelines become workflow_dispatch

    Bitbucket's `pipelines.custom` section is for manually-triggered pipelines. The converter maps each named custom pipeline to a `workflow_dispatch` trigger with an input.

  • warning

    Pipe variables are flat strings

    When converting `pipe:` blocks, every variable is rendered as a shell `--flag value` argument. Review the audit log for any pipe whose variables had structured types.

  • warning

    Schedules need to be re-created

    Bitbucket schedules live in the UI. The converter has no way to read them — re-create them as `on: schedule:` entries on the GitHub workflow.

Worked examples

Bitbucket build → GitHub Actions

A default pipeline with built-in node cache becomes a single GitHub job with actions/cache.

Bitbucket Pipelines
image: node:20
pipelines:
  default:
    - step:
        name: Test
        caches: [node]
        script:
          - npm ci
          - npm test
GitHub Actions
name: CI
on:
  push: {}
jobs:
  test:
    runs-on: ubuntu-latest
    container: node:20
    steps:
      - uses: actions/checkout@v4
      - uses: actions/cache@v4
        with:
          key: node-cache
          path: node_modules
      - run: npm ci
      - run: npm test

Frequently asked questions

How are pipes translated?expand_more

Common Atlassian pipes map to GitHub Actions equivalents (`atlassian/aws-s3-deploy` → `aws s3 sync`, `atlassian/slack-notify` → `slackapi/slack-github-action`). Less common pipes get a shell command and an audit note.

What about Bitbucket-only features like deployments?expand_more

Bitbucket `deployment:` annotations have a partial equivalent in GitHub Actions environments. The converter emits a TODO; configure environments in repository settings before running the converted workflow.

Can it handle YAML anchors?expand_more

YAML anchors (`&` / `*`) are resolved by the parser, then re-emitted as duplicated YAML in the GitHub workflow. You can re-introduce anchors by hand if needed.

Related Tools