Skip to content

Composite action versioning #17

Composite action versioning

Composite action versioning #17

name: Validate PR Version Labels
on:
pull_request:
branches: [main]
types:
- opened
- synchronize
- edited
- labeled # important to catch version label additions
- unlabeled
- reopened
permissions:
contents: read
pull-requests: read
jobs:
validate-version-labels:
name: Validate PR Version Labels
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Get all labels on the PR
id: get_labels
run: |
SUMMARY_FILE="$GITHUB_STEP_SUMMARY"
echo "## PR Labels" >> "$SUMMARY_FILE"
all_labels=$(jq -r '.pull_request.labels[].name' < "$GITHUB_EVENT_PATH" 2>/dev/null || true)
if [ -z "$all_labels" ]; then
echo "- (none)" >> "$SUMMARY_FILE"
echo "::error title=No Labels::No Labels were found on this PR. A version label is required."
exit 1
else
echo "$all_labels" | sed 's/^`*//; /^[[:space:]]*$/d; s/^/- `&`/' >> "$SUMMARY_FILE"
fi
echo "all_labels<<EOF" >> "$GITHUB_OUTPUT"
echo "$all_labels" >> "$GITHUB_OUTPUT"
echo "EOF" >> "$GITHUB_OUTPUT"
- name: Filter Version Labels
id: filter_labels
run: |
all_labels="${{ steps.get_labels.outputs.all_labels }}"
untracked_label_found=false
if echo "$all_labels" | grep -q '^version:untracked$'; then
untracked_label_found=true
fi
echo "untracked_label_found=$untracked_label_found" >> "$GITHUB_OUTPUT"
version_labels=$(echo "$all_labels" | grep -E '^version:(.+):v[0-9]+\.[0-9]+\.[0-9]+$' || true)
if [ -z "$version_labels" ] && [ "$untracked_label_found" = false ]; then
echo "::error title=No Version Labels::No version labels found on this PR. A version label is required."
exit 1
fi
echo "version_labels<<EOF" >> "$GITHUB_OUTPUT"
echo "$version_labels" >> "$GITHUB_OUTPUT"
echo "EOF" >> "$GITHUB_OUTPUT"
- name: Untracked Version Check
id: untracked_check
run: |
version_labels="${{ steps.filter_labels.outputs.version_labels }}"
untracked_label_found="${{ steps.filter_labels.outputs.untracked_label_found }}"
if [ "$untracked_label_found" = true ] && [ -n "$version_labels" ]; then
echo "::error title=Conflicting Version Labels::\`version:untracked\` cannot be used with other version labels."
exit 1
fi
- name: Component Check
id: component_check
if : ${{ steps.filter_labels.outputs.untracked_label_found == 'false' }}
run: |
echo "TODO: Implement component version compatibility check based on version labels."
- name: CHANGELOG Check
id: changelog_check
if : ${{ steps.filter_labels.outputs.untracked_label_found == 'false' }}
run: |
echo "TODO: Implement CHANGELOG entry check based on version labels."
- name: Validation Summary
if: ${{ always() }}
env:
NO_LABELS: ${{ steps.get_labels.outcome == 'failure' }}
NO_VERSION_LABELS: ${{ steps.filter_labels.outcome == 'failure' }}
UNTRACKED: ${{ steps.filter_labels.outputs.untracked_label_found == 'true' }}
CONFLICTING_LABELS: ${{ steps.untracked_check.outcome == 'failure' }}
INVALID_COMPONENTS: ${{ steps.component_check.outcome == 'failure' }}
MISSING_CHANGELOG: ${{ steps.changelog_check.outcome == 'failure' }}
run: |
SUMMARY_FILE="$GITHUB_STEP_SUMMARY"
echo "## Validation Outcome" >> "$SUMMARY_FILE"
if [ "${{ env.NO_LABELS }}" = "true" ]; then
echo "❌ No labels found on the PR. Add at least one version label." >> "$SUMMARY_FILE"
fi
if [ "${{ env.NO_VERSION_LABELS }}" = "true" ]; then
echo "❌ No version labels found on the PR. Add at least one version label." >> "$SUMMARY_FILE"
fi
if [ "${{ env.CONFLICTING_LABELS }}" = "true" ]; then
echo "❌ Conflicting version labels found. \`version:untracked\` cannot be used with other version labels)." >> "$SUMMARY_FILE"
fi
if [ "${{ env.UNTRACKED }}" = "true" ]; then
echo "✅ \`version:untracked\` label found. No further version validation required." >> "$SUMMARY_FILE"
else
if [ "${{ env.INVALID_COMPONENTS }}" = "true" ]; then
echo "❌ One or more components specified by version labels do not exist." >> "$SUMMARY_FILE"
// TODO pass details for invalid components
else
echo "✅ All components specified by version labels exist." >> "$SUMMARY_FILE"
fi
if [ "${{ env.MISSING_CHANGELOG }}" = "true" ]; then
echo "❌ One or more components are missing CHANGELOG entries for the specified version bumps." >> "$SUMMARY_FILE"
// TODO pass details for missing CHANGELOG entries
else
echo "✅ All components have appropriate CHANGELOG entries for the specified version bumps." >> "$SUMMARY_FILE"
fi
fi
echo "> PR must include a version label." >> "$SUMMARY_FILE"
echo "> See Version Policy in [VERSIONING.md](https://github.com/OpenSesame/core-github-actions/blob/main/VERSIONING.md) for details." >> "$SUMMARY_FILE"
- name: Tags Summary
env:
UNTRACKED: ${{ steps.filter_labels.outputs.untracked_label_found }}
VERSION_LABELS: ${{ steps.filter_labels.outputs.version_labels }}
run: |
SUMMARY_FILE="$GITHUB_STEP_SUMMARY"
echo "## Tags to Create" >> "$SUMMARY_FILE"
if [ "${{ env.UNTRACKED }}" = "true" ]; then
echo "\`version:untracked\` label detected. No tags will be created." >> "$SUMMARY_FILE"
fi
echo "TODO: Add summary of detected version labels and their implications." >> "$SUMMARY_FILE"