GitHub actions is a popular option to automate all common software workflows such as test, build and deploy. Jenkins was the most popular option for doing the same tasks; with that said, a challenge to connect two platforms will be: How to invoke GitHub action workflows from a Jenkins pipeline. In this technical post, we will go over this approach and we will describe what we need to do. The first step is to create a fine-grained token to get access with some privileges to the target GitHub repository. You can do this in Settings > Developer settings > Personal access tokens > Fine-grained tokens > Generate new token with these permissions:
Repository Permission
Read access to:
- Actions variables
- Deployments
- Environments
- Metadata
- Secrets
Read and Write access to:
- Action
- Code (Contents)
- Workflows
Then, you will need to add a repository_dispatch
event as you can see in this example:
name: Playwright Tests
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
repository_dispatch:
schedule:
- cron: '0 21 * * *'
env:
APPLITOOLS_API_KEY: ${{ secrets.APPLITOOLS_API_KEY }}
USERNAME: ${{ secrets.USERNAME }}
PASSWORD: ${{ secrets.PASSWORD }}
jobs:
test:
timeout-minutes: 60
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 18
- name: Install dependencies
run: npm ci
- name: Install Playwright Browsers
run: npx playwright install --with-deps
- name: Run Playwright visual tests
run: npx playwright test visual --project chromium
- name: Run Playwright e2e tests
run: npx playwright test e2e
- uses: actions/upload-artifact@v3
if: always()
with:
name: playwright-report
path: playwright-report/
retention-days: 30
The last step is to create a HTTP request
curl --request POST \
--url 'https://api.github.com/repos/${USERNAME}/${YOUR_REPOSITORY}/dispatches' \
--header 'Accept: application/vnd.github+json' \
--header 'Authorization: Bearer ${TOKEN}' \
--data '{"event_type": "Called from API request"}'
where:
${USERNAME}
GitHub username${YOUR_REPOSITORY}
Repository with workflow you want to run${TOKEN}
Your fine-grained generated token
Invoke from Jenkins Pipeline
If you want to execute this cURL
command from a declarative Jenkins pipeline, you can do it in this way:
stage ('Testing') {
steps {
echo 'Invoke GitHub Actions Workflow'
script {
try {
sh """curl -X POST https://api.github.com/repos/josdem/playwright-vetlog/dispatches \
--header "Accept: application/vnd.github.v3+json" \
--header "Authorization: Bearer ${token}" \
--data '{"event_type": "Called from Jenkins"}'"""
} catch (Exception e) {
echo "Failed to invoke GitHub Actions Workflow: ${e.getMessage()}"
}
}
echo 'Done!'
}
}
To browse a project with this implementation go here and here to download the project:
git clone git@github.com:josdem/playwright-vetlog.git
git clone git@github.com:josdem/vetlog-pipeline.git