Skip to content

Commit 8b7daec

Browse files
committed
new GHA to validate component version PR labels
1 parent 5fe341c commit 8b7daec

1 file changed

Lines changed: 102 additions & 0 deletions

File tree

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
name: Validate PR Version Labels
2+
3+
on:
4+
pull_request:
5+
branches: [main]
6+
types:
7+
- opened
8+
- synchronize
9+
- edited
10+
- labeled # important to catch version label additions
11+
- unlabeled
12+
- reopened
13+
14+
permissions:
15+
contents: read
16+
pull-requests: read
17+
18+
jobs:
19+
validate-version-labels:
20+
name: Validate PR Version Labels
21+
runs-on: ubuntu-latest
22+
23+
steps:
24+
- name: Checkout repo
25+
uses: actions/checkout@v4
26+
27+
- name: Get all labels on the PR
28+
id: get_labels
29+
run: |
30+
SUMMARY_FILE="$GITHUB_STEP_SUMMARY"
31+
32+
echo "## PR Labels" >> "$SUMMARY_FILE"
33+
34+
all_labels=$(jq -r '.pull_request.labels[].name' < "$GITHUB_EVENT_PATH" 2>/dev/null || true)
35+
36+
if [ -z "$all_labels" ]; then
37+
echo "- (none)" >> "$SUMMARY_FILE"
38+
echo "::error title=No Labels::No Labels were found on this PR. A version label is required."
39+
exit 1
40+
else
41+
while IFS= read -r lbl; do
42+
[ -z "$lbl" ] && continue
43+
echo "- \`$lbl\`" >> "$SUMMARY_FILE"
44+
done <<< "$all_labels"
45+
fi
46+
47+
# Save labels for later steps
48+
{
49+
echo "all_labels<<EOF"
50+
echo "$all_labels"
51+
echo "EOF"
52+
} >> "$GITHUB_OUTPUT"
53+
54+
- name: Filter Version Labels
55+
id: filter_labels
56+
run: |
57+
all_labels="${{ steps.get_labels.outputs.all_labels }}"
58+
version_labels=$(echo "$all_labels" | grep -E '^version:(.+):v[0-9]+\.[0-9]+\.[0-9]+$|^version:untracked$' || true)
59+
60+
if [ -z "$version_labels" ]; then
61+
echo "::error title=No Version Labels::No version labels found on this PR. A version label is required."
62+
exit 1
63+
fi
64+
65+
echo "$version_labels" >> "$GITHUB_OUTPUT"
66+
67+
- name: Untrack Label Check
68+
id: untracked_check
69+
run: |
70+
version_labels="${{ steps.filter_labels.outputs.version_labels }}"
71+
//TODO check for version:untracked label
72+
// error if other version labels are present along with it
73+
if echo "$version_labels" | grep -q '^version:untracked$' &&; then
74+
if [ "$(echo "$version_labels" | wc -l)" -gt 1 ]; then
75+
echo "::error title=Conflicting Version Labels::The label 'version:untracked' cannot be used with other version labels."
76+
exit 1
77+
fi
78+
fi
79+
80+
- name: Outcome
81+
if: ${{ always() }}
82+
env:
83+
NO_LABELS: ${{ steps.get_labels.outcome == 'failure' }}
84+
NO_VERSION_LABELS: ${{ steps.filter_labels.outcome == 'failure' }}
85+
CONFLICTING_LABELS: ${{ steps.untracked_check.outcome == 'failure' }}
86+
run: |
87+
SUMMARY_FILE="$GITHUB_STEP_SUMMARY"
88+
echo "## Validation Outcome" >> "$SUMMARY_FILE"
89+
90+
if [ "${{ env.NO_LABELS }}" = "true" ]; then
91+
echo "❌ No labels found on the PR. Add at least one version label." >> "$SUMMARY_FILE"
92+
fi
93+
if [ "${{ env.NO_VERSION_LABELS }}" = "true" ]; then
94+
echo "❌ No version labels found on the PR. Add at least one version label." >> "$SUMMARY_FILE"
95+
fi
96+
if [ "${{ env.CONFLICTING_LABELS }}" = "true" ]; then
97+
echo "❌ Conflicting version labels found. \`version:untracked\` cannot be used with other version labels)." >> "$SUMMARY_FILE"
98+
fi
99+
100+
echo "> PR must include a version label." >> "$SUMMARY_FILE"
101+
echo "> See Version Labeling Policy in VERSIONING.md for details." >> "$SUMMARY_FILE"
102+

0 commit comments

Comments
 (0)