External Triggers for GitHub Actions
With GitHub Actions we have a really powerful tool at our hands to automate our workflows on GitHub. 
Actions are deeply integrated with GitHub and allow us to run CI / CD pipelines, automate tasks to manage issues or to connect our repo with third-party services. 
Workflows are triggered on events which are caused by certain activities on GitHub, e.g. a push to a repository or the creation of a new issue. 
However, GitHub may not be our only source of events to trigger a workflow, so let’s see how we can trigger a workflow via web hook.
repository_dispatch
A repository_dispatch event is GitHub’s way to trigger a workflow from outside of GitHub. Every repository_dispatch event comes with an event_type property which allows us to limit our workflow execution to certain events. By default, every web hook call would trigger a workflow run.
Supported events are listed in our workflow file on the repository_event trigger:
name: webhook-trigger
on:
  repository_dispatch:
    types: 
      - webhook-one
      - webhook-two
      - your-custom-event-type
Webhook Trigger
repository_dispatch events are created via GitHub API. 
We’re required to provide an event_type property, which corresponds to one of our configured repository_dispatch types above. It is also possible to pass additional payload via client_payload JSON object. This way we’re able to process additional data in our workflow.  
Issuing a repository_dispatch event requires a personal access token with repo scope to call the GitHub API:
curl -H "Authorization: token <YOUR_GITHUB_TOKEN>" \
    --request POST \
    --data '{"event_type": "<YOUR_EVENT_TYPE>"}' \
 https://api.github.com/repos/<YOUR_GITHUB_USER>/<YOUR_GITHUB_REPO>/dispatches
Processing Event Types
Let’s assume we want to carry out different workflow steps, depending on the event_type. Conditionals and context expressions enable us to do so. 
The github context gives us full access to the repository_dispatch payload, which stores our event_type value as action property. 
So we’re able to bind workflow steps to the trigger event type:
- name: Event Name
  run: |
    echo "Event triggered by $GITHUB_EVENT_NAME"
    echo "Dispatch type ${{ github.event.action }}"
- name: Goodbye
  if: ${{ github.event.action == 'webhook-one' }}
  run: npx cowsay "Bye!"
- name: Adiós
  if: ${{ github.event.action == 'webhook-two' }}
  run: npx cowsay "Adiós!
The client_payload is also accessible via context expression, e.g.
${{ github.event.client_payload.unit }}
Conclusion
It took me a bit to put all pieces together, but once all dots were connected, GitHub Actions integrated smoothly in existing CI infrastructure via web hooks. 
A small sample is available in this repo.
However, given the large amount of events we can process via GitHub Actions there is a huge potential yet to explore!
              
    
Top comments (0)