Check CI stability for PRs with "ci/verify-stability" or "ci/verify-stability-merge-master" label #458
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Check CI stability for PRs with "ci/verify-stability" or "ci/verify-stability-merge-master" label | |
on: | |
schedule: | |
# Monday to Friday: Every 2 hours from 7 PM to 7 AM CEST | |
- cron: "0 17 * * 1-5" | |
- cron: "0 19 * * 1-5" | |
- cron: "0 21 * * 1-5" | |
- cron: "0 23 * * 1-5" | |
- cron: "0 1 * * 2-6" | |
- cron: "0 3 * * 2-6" | |
- cron: "0 5 * * 2-6" | |
# Saturday and Sunday: Every 2 hours all day | |
- cron: "0 */2 * * 6,0" | |
workflow_dispatch: # Allows manual trigger from GitHub Actions UI | |
env: | |
GH_USER: "github-actions[bot]" | |
GH_EMAIL: "<41898282+github-actions[bot]@users.noreply.github.com>" | |
jobs: | |
trigger-ci: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Generate GitHub app token | |
id: github-app-token | |
uses: actions/create-github-app-token@5d869da34e18e7287c1daad50e0b8ea0f506ce69 # v1.11.0 | |
with: | |
app-id: ${{ secrets.APP_ID }} | |
private-key: ${{ secrets.APP_PRIVATE_KEY }} | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 0 | |
token: ${{ steps.github-app-token.outputs.token }} | |
- name: Get open pull requests and save to file | |
run: | | |
gh pr list --json number,labels > open_prs.json | |
env: | |
GITHUB_TOKEN: ${{ steps.github-app-token.outputs.token }} | |
- name: Process PRs | |
id: process_prs | |
run: | | |
cat open_prs.json | |
pr_numbers_with_verify_stability=$(jq -r -c '.[] | select(.labels[]?.name == "ci/verify-stability") | .number' open_prs.json | tr '\n' ' ') | |
pr_numbers_with_verify_stability_merge_master=$(jq -r '.[] | select(.labels[]?.name == "ci/verify-stability-merge-master") | .number' open_prs.json | tr '\n' ' ') | |
echo "PRs with 'ci/verify-stability' label: $pr_numbers_with_verify_stability" | |
echo "PRs with 'ci/verify-stability-merge-master' label: $pr_numbers_with_verify_stability_merge_master" | |
echo "pr_numbers_with_verify_stability=$pr_numbers_with_verify_stability" >> $GITHUB_OUTPUT | |
echo "pr_numbers_with_verify_stability_merge_master=$pr_numbers_with_verify_stability_merge_master" >> $GITHUB_OUTPUT | |
env: | |
GITHUB_TOKEN: ${{ steps.github-app-token.outputs.token }} | |
- name: Merge master branch (if applicable) and push a single commit | |
if: steps.process_prs.outputs.pr_numbers_with_verify_stability != '' | |
run: | | |
eval "pr_numbers=(${{ steps.process_prs.outputs.pr_numbers_with_verify_stability }})" | |
for pr_number in $pr_numbers; do | |
current_datetime=$(date +"%Y-%m-%d %H:%M:%S") | |
echo "Processing PR #$pr_number" | |
# Fetch PR details to get the base branch (original branch name) | |
pr_branch=$(gh pr view $pr_number --json headRefName --jq '.headRefName') | |
echo "The original branch for PR #$pr_number is $pr_branch" | |
git fetch origin pull/$pr_number/head:$pr_branch | |
git checkout $pr_branch | |
git config user.name "${GH_USER}" | |
git config user.email "${GH_EMAIL}" | |
# Check if the PR needs to merge with master | |
if echo "${{ steps.process_prs.outputs.pr_numbers_with_verify_stability_merge_master }}" | grep -wq "$pr_number"; then | |
echo "Merging master into PR #$pr_number" | |
git fetch origin master | |
git merge origin/master --no-ff --no-commit | |
git commit --allow-empty -m "Merge master into PR #$pr_number" | |
fi | |
# Commit an empty commit to trigger the CI | |
echo "Pushing empty commit to trigger CI for PR #$pr_number on $current_datetime" | |
git commit --allow-empty -m "Trigger CI for PR #$pr_number on $current_datetime" | |
git push origin $pr_branch | |
done | |
env: | |
GITHUB_TOKEN: ${{ steps.github-app-token.outputs.token }} |