Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

github actions exclude pull requests from a branch

Say I have a workflow that runs on every PR to master which starts with:

on:
  pull_request:
    branches:
      - master

I'd like to skip all jobs if the PR is coming from the depbot branch. Something like:

on:
  pull_request:
    branches:
      - master
    head_ref-ignore:
      - depbot

I think you can skip all the steps (one at a time) using

 if: startsWith(github.head_ref, 'depbot') == false

But it is not what I want, as it would still initiate the job. How can I achieve that at the launch level?

like image 984
aljabadi Avatar asked Jun 30 '26 05:06

aljabadi


2 Answers

But it is not what I want, as it would still initiate the job.

That means you would need a "gatekeeper" job which would be initiated (and check github.head_ref), and, through job dependency, would call the second one only if the right condition is fulfilled.

But the point is: you need at least one job to start, in order to check a condition.

like image 129
VonC Avatar answered Jul 04 '26 04:07

VonC


According to the documentation, you can't achieve want you want at the workflow level, as it's based on base branches.

Therefore, those implementations below won't work.

on:
  pull_request:
    branches:    
      - 'master'    # matches refs/heads/master
      - '!depbot'   # excludes refs/heads/depbot

Or

on:
  pull_request:
    branches-ignore:    
      - 'depbot'   # ignore refs/heads/depbot

EDITED ANSWER

Workaround

A solution could be to use a setup job checking the github.head_ref context variable, and setting an output that would be used in an expression to run the following jobs if the condition is fulfilled.

Something like this:

jobs:
  setup:
    runs-on: ubuntu-latest
    outputs:
      condition: ${{ steps.condition.outputs.condition }}
    steps:
      - id: condition
        run: |
          if [[ ${{ github.head_ref }} == *"depbot"* ]]; then
             echo "condition=true" >> $GITHUB_OUTPUT
          else
             echo "condition=false" >> $GITHUB_OUTPUT  
          fi

  other-job:
    needs: [setup]
    runs-on: ubuntu-latest
    if: ${{ needs.setup.outputs.condition }} == 'true'
    steps:
       [ ... ]

The thing is, this workflow will always trigger, it will just not perform the desired operations if the condition isn't fulfilled.

like image 32
GuiFalourd Avatar answered Jul 04 '26 04:07

GuiFalourd