GitHub Actions Branches

Published on Friday, 24 December 2021

How to get a list of branches from a current repo.

The actions/github-script is a good place to start as it has access to the Repo info. To see what you can get run the script and output the complete context:

- name: View context attributes
  uses: actions/github-script@v5
  with:
    script: console.log(context)

Be careful though, as when this is ran manually it gets different values to when ran on a schedule.

Looking at the Repository info the branches_url might be useful:

Context {
  payload: {
    repository: {
      branches_url: 'https://api.github.com/repos/alex-hedley/[REPONAME]/branches{/branch}',
    }
  }
}
  • context.payload.repository.branches_url

We don't need the {{/branch}} though. So lets remove that.

const branches_url = context.payload.repository.branches_url;
const branches_url_new = branches_url.replace("{/branch}", "");

With this url we can now get the data using the github.request() method. Map just the names of the branches to an Array. And log the data.

const result = await github.request(branches_url_new);
const names = result.data.map((branch) => branch.name);
console.log(names);
{
    ...
    data: [
        { name: 'dev', commit: [Object], protected: false },
        { name: 'main', commit: [Object], protected: false }
    ]
}
["dev", "main"]

Depending on the type of event you could

on:
  push:
    branches:
      - "*" # matches every branch that doesn't contain a '/'
      - "*/*" # matches every branch containing a single '/'
      - "**" # matches every branch
      - "!master" # excludes master

But this isn't available for workflow_dispatch: as of yet.

name: Get Branches

on:
  workflow_dispatch:

jobs:
  print-context:
    runs-on: ubuntu-latest
    outputs:
      branches: ${{ steps.branch-output.outputs.branches }}
    steps:
      - name: Branches
        id: branches-list
        uses: actions/github-script@v5
        with:
          script: |
            const branches_url = context.payload.repository.branches_url
            const branches_url_new = branches_url.replace("{/branch}", "")
            const result = await github.request(branches_url_new)
            const names = result.data.map(branch => branch.name)

            const index = names.indexOf('main');
            if (index > -1) {
              names.splice(index, 1);
            }
            console.log(names)

            return names

      - name: Branches
        id: branch-output
        run: |
          BRANCHES='${{ steps.branches-list.outputs.result }}'
          echo ::set-output name=branches::$BRANCHES

  my_matrix:
    runs-on: ubuntu-latest
    needs:
      - print-context
    strategy:
      matrix:
        branches: ${{ fromJSON(needs.print-context.outputs.branches) }}
    steps:
      - name: Branches
        run: |
          echo ${{ matrix.branches }}