Skip to content

Commit c2441e8

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

1 file changed

Lines changed: 146 additions & 0 deletions

File tree

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
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+
echo "$all_labels" | sed 's/^`*//; /^[[:space:]]*$/d; s/^/- `&`/' >> "$SUMMARY_FILE"
42+
fi
43+
44+
echo "all_labels<<EOF" >> "$GITHUB_OUTPUT"
45+
echo "$all_labels" >> "$GITHUB_OUTPUT"
46+
echo "EOF" >> "$GITHUB_OUTPUT"
47+
48+
- name: Filter Version Labels
49+
id: filter_labels
50+
run: |
51+
all_labels="${{ steps.get_labels.outputs.all_labels }}"
52+
53+
untracked_label_found=false
54+
if echo "$all_labels" | grep -q '^version:untracked$'; then
55+
untracked_label_found=true
56+
fi
57+
echo "untracked_label_found=$untracked_label_found" >> "$GITHUB_OUTPUT"
58+
59+
version_labels=$(echo "$all_labels" | grep -E '^version:(.+):v[0-9]+\.[0-9]+\.[0-9]+$' || true)
60+
61+
if [ -z "$version_labels" ] && [ "$untracked_label_found" = false ]; then
62+
echo "::error title=No Version Labels::No version labels found on this PR. A version label is required."
63+
exit 1
64+
fi
65+
66+
echo "version_labels<<EOF" >> "$GITHUB_OUTPUT"
67+
echo "$version_labels" >> "$GITHUB_OUTPUT"
68+
echo "EOF" >> "$GITHUB_OUTPUT"
69+
70+
- name: Untracked Version Check
71+
id: untracked_check
72+
run: |
73+
version_labels="${{ steps.filter_labels.outputs.version_labels }}"
74+
untracked_label_found="${{ steps.filter_labels.outputs.untracked_label_found }}"
75+
76+
if [ "$untracked_label_found" = true ] && [ -n "$version_labels" ]; then
77+
echo "::error title=Conflicting Version Labels::\`version:untracked\` cannot be used with other version labels."
78+
exit 1
79+
fi
80+
81+
- name: Component Check
82+
id: component_check
83+
if : ${{ steps.filter_labels.outputs.untracked_label_found == 'false' }}
84+
run: |
85+
echo "TODO: Implement component version compatibility check based on version labels."
86+
87+
- name: CHANGELOG Check
88+
id: changelog_check
89+
if : ${{ steps.filter_labels.outputs.untracked_label_found == 'false' }}
90+
run: |
91+
echo "TODO: Implement CHANGELOG entry check based on version labels."
92+
93+
- name: Validation Summary
94+
if: ${{ always() }}
95+
env:
96+
NO_LABELS: ${{ steps.get_labels.outcome == 'failure' }}
97+
NO_VERSION_LABELS: ${{ steps.filter_labels.outcome == 'failure' }}
98+
UNTRACKED: ${{ steps.filter_labels.outputs.untracked_label_found == 'true' }}
99+
CONFLICTING_LABELS: ${{ steps.untracked_check.outcome == 'failure' }}
100+
INVALID_COMPONENTS: ${{ steps.component_check.outcome == 'failure' }}
101+
MISSING_CHANGELOG: ${{ steps.changelog_check.outcome == 'failure' }}
102+
run: |
103+
SUMMARY_FILE="$GITHUB_STEP_SUMMARY"
104+
echo "## Validation Outcome" >> "$SUMMARY_FILE"
105+
106+
if [ "${{ env.NO_LABELS }}" = "true" ]; then
107+
echo "❌ No labels found on the PR. Add at least one version label." >> "$SUMMARY_FILE"
108+
fi
109+
if [ "${{ env.NO_VERSION_LABELS }}" = "true" ]; then
110+
echo "❌ No version labels found on the PR. Add at least one version label." >> "$SUMMARY_FILE"
111+
fi
112+
if [ "${{ env.CONFLICTING_LABELS }}" = "true" ]; then
113+
echo "❌ Conflicting version labels found. \`version:untracked\` cannot be used with other version labels)." >> "$SUMMARY_FILE"
114+
elif [ "${{ env.UNTRACKED }}" = "true" ]; then
115+
echo "✅ \`version:untracked\` label found. No further version validation required." >> "$SUMMARY_FILE"
116+
else
117+
if [ "${{ env.INVALID_COMPONENTS }}" = "true" ]; then
118+
echo "❌ One or more components specified by version labels do not exist." >> "$SUMMARY_FILE"
119+
// TODO pass details for invalid components
120+
else
121+
echo "✅ All components specified by version labels exist." >> "$SUMMARY_FILE"
122+
fi
123+
if [ "${{ env.MISSING_CHANGELOG }}" = "true" ]; then
124+
echo "❌ One or more components are missing CHANGELOG entries for the specified version bumps." >> "$SUMMARY_FILE"
125+
// TODO pass details for missing CHANGELOG entries
126+
else
127+
echo "✅ All components have appropriate CHANGELOG entries for the specified version bumps." >> "$SUMMARY_FILE"
128+
fi
129+
fi
130+
131+
echo "> PR must include a version label." >> "$SUMMARY_FILE"
132+
echo "> See Version Policy in [VERSIONING.md](https://github.com/OpenSesame/core-github-actions/blob/main/VERSIONING.md) for details." >> "$SUMMARY_FILE"
133+
134+
- name: Tags Summary
135+
env:
136+
UNTRACKED: ${{ steps.filter_labels.outputs.untracked_label_found }}
137+
VERSION_LABELS: ${{ steps.filter_labels.outputs.version_labels }}
138+
run: |
139+
SUMMARY_FILE="$GITHUB_STEP_SUMMARY"
140+
echo "## Tags to Create" >> "$SUMMARY_FILE"
141+
142+
if [ "${{ env.UNTRACKED }}" = "true" ]; then
143+
echo "\`version:untracked\` label detected. No tags will be created." >> "$SUMMARY_FILE"
144+
fi
145+
146+
echo "TODO: Add summary of detected version labels and their implications." >> "$SUMMARY_FILE"

0 commit comments

Comments
 (0)