chore(ci): make skill validation blocking #114
Workflow file for this run
This file contains hidden or 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
| # Issue Reference Check Workflow | |
| # | |
| # Validates that all PR commits reference a GitHub issue. | |
| # Based on template: skills/issue-driven-delivery/templates/check-issue-reference.yml | |
| # | |
| # See: docs/playbooks/standards-compliance.md | |
| name: Check Issue References | |
| on: | |
| pull_request: | |
| types: [opened, synchronize, reopened] | |
| jobs: | |
| validate-commits: | |
| name: Validate commit references | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version-file: ".nvmrc" | |
| cache: "npm" | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: Get PR commits | |
| id: commits | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: | | |
| BASE_SHA="${{ github.event.pull_request.base.sha }}" | |
| HEAD_SHA="${{ github.event.pull_request.head.sha }}" | |
| echo "Checking commits from $BASE_SHA to $HEAD_SHA" | |
| COMMITS=$(git log --format="%H|%s|%an" "$BASE_SHA..$HEAD_SHA") | |
| COMMIT_COUNT=$(echo "$COMMITS" | grep -c . || echo 0) | |
| echo "Found $COMMIT_COUNT commit(s) to validate" | |
| echo "commit_count=$COMMIT_COUNT" >> $GITHUB_OUTPUT | |
| echo "commits<<EOF" >> $GITHUB_OUTPUT | |
| echo "$COMMITS" >> $GITHUB_OUTPUT | |
| echo "EOF" >> $GITHUB_OUTPUT | |
| - name: Validate each commit | |
| id: validate | |
| run: | | |
| COMMITS='${{ steps.commits.outputs.commits }}' | |
| FAILED=0 | |
| PASSED=0 | |
| SKIPPED=0 | |
| FAILURES="" | |
| echo "## Commit Validation Results" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "| Status | Commit | Message |" >> $GITHUB_STEP_SUMMARY | |
| echo "|--------|--------|---------|" >> $GITHUB_STEP_SUMMARY | |
| while IFS='|' read -r sha subject author; do | |
| [ -z "$sha" ] && continue | |
| SHORT_SHA="${sha:0:7}" | |
| # Skip automated commits | |
| if echo "$author" | grep -qiE 'dependabot|renovate|github-actions'; then | |
| echo "| ⏭️ Skipped | \`$SHORT_SHA\` | $subject (automated) |" >> $GITHUB_STEP_SUMMARY | |
| SKIPPED=$((SKIPPED + 1)) | |
| continue | |
| fi | |
| FULL_MSG=$(git log -1 --format="%B" "$sha") | |
| if echo "$FULL_MSG" | npx commitlint 2>/dev/null; then | |
| echo "| ✅ Pass | \`$SHORT_SHA\` | $subject |" >> $GITHUB_STEP_SUMMARY | |
| PASSED=$((PASSED + 1)) | |
| else | |
| echo "| ❌ Fail | \`$SHORT_SHA\` | $subject |" >> $GITHUB_STEP_SUMMARY | |
| FAILURES="${FAILURES}${SHORT_SHA}: $subject\n" | |
| FAILED=$((FAILED + 1)) | |
| fi | |
| done <<< "$COMMITS" | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "**Summary:** $PASSED passed, $FAILED failed, $SKIPPED skipped" >> $GITHUB_STEP_SUMMARY | |
| if [ "$FAILED" -gt 0 ]; then | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### Failed Commits" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "The following commits are missing issue references:" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo -e "$FAILURES" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "**Expected format:** Include \`Refs: #123\`, \`Fixes: #456\`, or \`(#123)\` in the commit message." >> $GITHUB_STEP_SUMMARY | |
| echo "failed=$FAILED" >> $GITHUB_OUTPUT | |
| exit 1 | |
| fi | |
| echo "failed=0" >> $GITHUB_OUTPUT |