DEV Community

loading...
Cover image for Github Action: How to dynamically run step on each PR label ?

Github Action: How to dynamically run step on each PR label ?

slashgear_ profile image Antoine Caron Originally published at slashgear.github.io on ・3 min read

For some time now I’ve been playing with github actions to see if I can easily reproduce behaviors I apply in my current CI tool. I wanted to parallelize tasks on each label of a pull request. In this article, I will show you a possible way to do it!

In my work at Bedrock, we currently use Jenkins to manage our ongoing application integration and deployment. Beyond the various concerns of using groovy with pipeline syntax 😅, we have to admit that we manage to do some pretty complex workflows.

example of complex Continous Integration workflow

Deciding to see if it would be easy for me to reproduce the steps of these pipelines with github action, I decided to try its features. Among other things by publishing a Github Action to check the title of a PR according to a regexp.

Solution

First you need to create a workflow based on pull_request events and you can even specify the types of events.

name: Example workflow
on:
  pull_request:
    types: [opened, labeled, unlabeled, synchronize]
Enter fullscreen mode Exit fullscreen mode

Now add a job that will set up a parallelization strategy based on the labels of the github event.

jobs:
  build:
    strategy:
      matrix:
        label: ${{github.event.pull_request.labels.*.name}}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Run a one-line script
        run: echo Hello, world from "${{matrix.label}}"!
Enter fullscreen mode Exit fullscreen mode

This will automatically run the steps in parallel on all the labels of each Pull Request. 🎉 However, strategy.matrix.label does not accept an empty array as a value.😢

The job should therefore be conditional so that it is only run if ${{github.event.pull_request.labels.*.name}} is not empty. There is an if parameter in the jobs that allows to do this, but unfortunately it is interpreted after checking the value of strategy.matrix.label.

The solution I found is to do this check in a previous job. This is an example of a workflow that dynamically launches actions on all the labels of each PR.

name: Example workflow

on:
  pull_request:
    types: [opened, labeled, unlabeled, synchronize]

jobs:
  checkLabels:
    runs-on: ubuntu-latest
    if: ${{github.event.pull_request.labels.*.name[0]}}
    steps:
      - run: echo Check labels is not empty
  build:
    needs: [checkLabels]
    strategy:
      matrix:
        label: ${{github.event.pull_request.labels.*.name}}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Run a one-line script
        run: echo Hello, world from "${{matrix.label}}"!
Enter fullscreen mode Exit fullscreen mode

It’s up to you to adapt it to your needs!

Discussion (0)

pic
Editor guide