-
Notifications
You must be signed in to change notification settings - Fork 87
137 lines (117 loc) · 4.91 KB
/
build-test-all-branches.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
name: trigger build-test in all supported branches
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
jobs:
trigger-branch-workflows:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Trigger workflows in other branches
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -x # Enable command echo for debugging
branches=("master" "master-next" "scarthgap" "scarthgap-next" "kirkstone" "kirkstone-next" "styhead" "styhead-next")
declare -A run_ids
declare -A run_urls
for branch in "${branches[@]}"; do
echo "Attempting to trigger workflow for branch: $branch"
# Trigger the workflow using the GitHub API directly
response=$(curl -sS -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-test-recipe.yml/dispatches" \
-d "{\"ref\":\"$branch\"}")
echo "API Response: $response"
# Check if the workflow was triggered successfully
if [ -z "$response" ]; then
echo "Workflow triggered successfully for $branch"
# Get the run ID and URL of the newly triggered workflow
sleep 5 # Wait a bit for the workflow to start
run_info=$(gh run list --workflow=build-test-recipe.yml --branch=$branch --limit 1 --json databaseId,url)
run_id=$(echo "$run_info" | jq -r '.[0].databaseId')
run_url=$(echo "$run_info" | jq -r '.[0].url')
if [ -n "$run_id" ]; then
run_ids["$branch"]="$run_id"
run_urls["$branch"]="$run_url"
echo "Triggered workflow for $branch with run ID: $run_id"
else
echo "Failed to get run info for $branch"
fi
else
echo "Error triggering workflow for $branch"
echo "API Response: $response"
fi
done
# Save run IDs and URLs to files for the next steps
echo "$(declare -p run_ids)" > run_ids.txt
echo "$(declare -p run_urls)" > run_urls.txt
echo "run_ids=${run_ids[*]}" >> $GITHUB_ENV
- name: Display triggered workflows
run: |
source run_ids.txt
source run_urls.txt
echo "# Triggered Build Test Workflows" > report.md
echo "" >> report.md
echo "| Branch | Run ID | Workflow Run |" >> report.md
echo "|--------|--------|--------------|" >> report.md
for branch in "${!run_ids[@]}"; do
id="${run_ids[$branch]}"
url="${run_urls[$branch]}"
echo "| $branch | $id | [View Run]($url) |" >> report.md
done
echo "## Triggered Workflows" >> $GITHUB_STEP_SUMMARY
cat report.md >> $GITHUB_STEP_SUMMARY
echo "Triggered workflows:"
cat report.md
- name: Wait for branch workflows to complete
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
IFS=' ' read -ra run_ids <<< "${{ env.run_ids }}"
max_attempts=180 # Maximum 180 min exec time
for attempt in $(seq 1 $max_attempts); do
all_completed=true
for run_id in "${run_ids[@]}"; do
status=$(gh run view $run_id --json status --jq '.status')
if [ "$status" != "completed" ]; then
all_completed=false
break
fi
done
if $all_completed; then
echo "All branch workflows have completed."
break
fi
if [ $attempt -eq $max_attempts ]; then
echo "Timeout waiting for workflows to complete."
exit 1
fi
echo "Waiting for workflows to complete... (Attempt $attempt/$max_attempts)"
sleep 60
done
- name: Report status and check for failures
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
echo "All branch workflows have completed."
IFS=' ' read -ra run_ids <<< "${{ env.run_ids }}"
overall_status=0
for run_id in "${run_ids[@]}"; do
run_info=$(gh run view $run_id --json headBranch,conclusion)
branch=$(echo "$run_info" | jq -r '.headBranch')
conclusion=$(echo "$run_info" | jq -r '.conclusion')
echo "Branch $branch workflow conclusion: $conclusion"
if [ "$conclusion" != "success" ]; then
overall_status=1
fi
done
if [ $overall_status -ne 0 ]; then
echo "One or more branch workflows failed."
exit 1
else
echo "All branch workflows succeeded."
fi