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 }}