How to Trigger Workflows Between Repos
How to Trigger Workflows
Workflows in GitHub Actions can be triggered in multiple ways, such as on pushes, pull requests, or manually. Beyond these basic triggers, workflows can also trigger other workflows, either within the same repository or across different repositories. Understanding the differences helps you design automation that is both efficient and maintainable.
Trigger Workflows From the Same Repo
GitHub Actions allows one workflow to trigger another in the same repository using the workflow_run
event. This is useful when separating concerns, such as building and deploying, in different workflows.
name: Workflow Aon: push: branches: [main] workflow_dispatch:
jobs: build: runs-on: ubuntu-latest steps: - run: echo "Workflow A ran!"
name: Workflow Bon: workflow_run: workflows: ["Workflow A"] types: - completed
jobs: deploy: runs-on: ubuntu-latest steps: - run: echo "Workflow B triggered by Workflow A!"
With this setup, every time Workflow A completes on the main
branch, Workflow B is automatically triggered.
Triggering Workflows Across Different Repositories
Sometimes you want to trigger a workflow in another repository. For this, GitHub provides the repository_dispatch
event. This requires a Personal Access Token (PAT) stored as a secret to authenticate between repos.
name: Trigger Repo Bon: workflow_dispatch:
jobs: trigger: runs-on: ubuntu-latest steps: - name: Trigger Repo B run: | curl -X POST \\ -H "Authorization: token ${{ secrets.REPO_B_PAT }}" \\ -H "Accept: application/vnd.github.v3+json" \\ -d '{"event_type": "run-workflow"}' \\ https://api.github.com/repos/username/repo-B/dispatches
name: Repo B Workflowon: repository_dispatch: types: [run-workflow]
jobs: build: runs-on: ubuntu-latest steps: - run: echo "Repo B workflow triggered by Repo A!"
This minimal example shows the mechanics without extra complexity.
Blog Draft Sync Between Repositories
In my personal workflow, I maintain a draft blog repo and a public blog repo. A workflow in the draft repo:
- Sends a
repository_dispatch
to the public blog repo - Fetches the content from an API
- Creates a PR with the new blog post
This setup automates the content sync while keeping drafts private until ready for publication.
From Private Repo
name: Trigger Blog Sync
on: issues: types: [labeled] workflow_dispatch:
jobs: trigger: runs-on: ubuntu-latest if: github.event.label.name == 'trigger' steps: - name: Notify blog repo run: | curl -X POST \\ -H "Authorization: token ${{ secrets.TRIGGER_TOKEN }}" \\ -H "Accept: application/vnd.github.v3+json" \\ -d '{ "event_type": "sync-blog-post", "client_payload": { "issue_id": ${{ github.event.issue.number }}, "issue_title": "${{ github.event.issue.title }}" } }' \\ https://api.github.com/repos/username/repo/dispatches
Public Repo
name: Sync Blog Poston: repository_dispatch: types: [sync-blog-post] workflow_dispatch:
jobs: post: runs-on: ubuntu-latest steps: - uses: actions/checkout@vx.x.x with: fetch-depth: 0 # do your thing
Important Note: The
event_type
in the private repo workflow must match thetypes
in the public repo workflow. This ensures that therepository_dispatch
event correctly triggers the workflow in the public repo.
For the full workflow implementation, view it here.
How it Works (Diagram)
Thank you
Big thanks for reading! You’re awesome, and I hope this post helped. Until next time!