feat: lab3 complete - ENE212-0070/2022 #23
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
| name: Check Lab 3 Submission | |
| on: | |
| pull_request: | |
| branches: [main] | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| jobs: | |
| check-submission: | |
| name: Validate submission | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout PR branch | |
| uses: actions/checkout@v4 | |
| - name: Setup PHP 8.2 | |
| uses: shivammathur/setup-php@v2 | |
| with: | |
| php-version: '8.2' | |
| coverage: none | |
| - name: Check required files are present | |
| id: files | |
| run: | | |
| MISSING=() | |
| for f in lab3_task1.php lab3_task2.php lab3_task3.php lab3_task4.php; do | |
| if [ ! -f "$f" ] && [ ! -f "starter/$f" ]; then | |
| MISSING+=("$f") | |
| fi | |
| done | |
| if [ ${#MISSING[@]} -gt 0 ]; then | |
| echo "status=fail" >> $GITHUB_OUTPUT | |
| echo "::error::Missing required files: ${MISSING[*]}" | |
| else | |
| echo "status=pass" >> $GITHUB_OUTPUT | |
| echo "::notice::All required files found" | |
| fi | |
| - name: PHP syntax check | |
| id: syntax | |
| run: | | |
| ERRORS=() | |
| for f in lab3_task1.php lab3_task2.php lab3_task3.php lab3_task4.php; do | |
| TARGET="" | |
| [ -f "$f" ] && TARGET="$f" | |
| [ -f "starter/$f" ] && TARGET="starter/$f" | |
| if [ -n "$TARGET" ]; then | |
| if ! php -l "$TARGET" > /dev/null 2>&1; then | |
| ERRORS+=("$TARGET") | |
| php -l "$TARGET" || true | |
| fi | |
| fi | |
| done | |
| if [ ${#ERRORS[@]} -gt 0 ]; then | |
| echo "status=fail" >> $GITHUB_OUTPUT | |
| echo "::error::PHP syntax errors in: ${ERRORS[*]}" | |
| else | |
| echo "status=pass" >> $GITHUB_OUTPUT | |
| echo "::notice::All files pass PHP syntax check" | |
| fi | |
| - name: Check file headers for student info | |
| id: headers | |
| run: | | |
| MISSING_HEADERS=() | |
| for f in lab3_task1.php lab3_task2.php lab3_task3.php lab3_task4.php; do | |
| TARGET="" | |
| [ -f "$f" ] && TARGET="$f" | |
| [ -f "starter/$f" ] && TARGET="starter/$f" | |
| if [ -n "$TARGET" ]; then | |
| if ! grep -qi "@student" "$TARGET"; then | |
| MISSING_HEADERS+=("$TARGET") | |
| fi | |
| if grep -qi "\[Your Reg Number\]" "$TARGET"; then | |
| MISSING_HEADERS+=("$TARGET (placeholder not replaced)") | |
| fi | |
| fi | |
| done | |
| if [ ${#MISSING_HEADERS[@]} -gt 0 ]; then | |
| echo "status=warn" >> $GITHUB_OUTPUT | |
| echo "::warning::Headers missing or incomplete in: ${MISSING_HEADERS[*]}" | |
| else | |
| echo "status=pass" >> $GITHUB_OUTPUT | |
| echo "::notice::File headers look good" | |
| fi | |
| - name: Check commit message convention | |
| id: commits | |
| run: | | |
| LATEST_MSG=$(git log --oneline -1 HEAD | sed 's/^[a-f0-9]* //') | |
| echo "Latest commit: $LATEST_MSG" | |
| if echo "$LATEST_MSG" | grep -Eqi "feat:|fix:|lab3"; then | |
| echo "status=pass" >> $GITHUB_OUTPUT | |
| echo "::notice::Commit message format OK" | |
| else | |
| echo "status=warn" >> $GITHUB_OUTPUT | |
| echo "::warning::Commit message should follow: feat: lab3 complete - REGNO/YEAR" | |
| fi | |
| - name: Check TODO stubs have been worked on | |
| id: stubs | |
| run: | | |
| UNTOUCHED=0 | |
| for f in lab3_task1.php lab3_task2.php lab3_task3.php lab3_task4.php; do | |
| TARGET="" | |
| [ -f "$f" ] && TARGET="$f" | |
| [ -f "starter/$f" ] && TARGET="starter/$f" | |
| if [ -n "$TARGET" ]; then | |
| TODO_COUNT=$(grep -c "TODO:.*your code here" "$TARGET" || true) | |
| UNTOUCHED=$((UNTOUCHED + TODO_COUNT)) | |
| fi | |
| done | |
| if [ "$UNTOUCHED" -gt 0 ]; then | |
| echo "status=warn" >> $GITHUB_OUTPUT | |
| echo "::warning::$UNTOUCHED untouched TODO stub(s) found" | |
| else | |
| echo "status=pass" >> $GITHUB_OUTPUT | |
| echo "::notice::No blank TODO stubs found" | |
| fi | |
| - name: Write results to Job Summary | |
| if: always() | |
| run: | | |
| F="${{ steps.files.outputs.status }}" | |
| S="${{ steps.syntax.outputs.status }}" | |
| H="${{ steps.headers.outputs.status }}" | |
| C="${{ steps.commits.outputs.status }}" | |
| T="${{ steps.stubs.outputs.status }}" | |
| files_r=$( [ "$F" != "fail" ] && echo "✅" || echo "❌" ) | |
| syntax_r=$( [ "$S" != "fail" ] && echo "✅" || echo "❌" ) | |
| headers_r=$( [ "$H" = "pass" ] && echo "✅" || echo "⚠️" ) | |
| commits_r=$( [ "$C" = "pass" ] && echo "✅" || echo "⚠️" ) | |
| stubs_r=$( [ "$T" = "pass" ] && echo "✅" || echo "⚠️" ) | |
| if [ "$S" != "fail" ] && [ "$F" != "fail" ]; then | |
| BADGE="🟢 Ready for review" | |
| else | |
| BADGE="🔴 Issues found — student must fix before deadline" | |
| fi | |
| cat >> $GITHUB_STEP_SUMMARY << EOF | |
| ## ICS 2371 Lab 3 — Automated Check Results | |
| **$BADGE** | |
| | Check | Result | Marks at stake | | |
| |---|---|---| | |
| | Required files present | $files_r | 2 | | |
| | PHP syntax valid | $syntax_r | 3 | | |
| | File headers with reg number | $headers_r | 1 | | |
| | Commit message format | $commits_r | 1 | | |
| | TODO stubs worked on | $stubs_r | 2 | | |
| | PR template filled | _(check manually)_ | 1 | | |
| > ✅ pass · ⚠️ warning (marks may be deducted) · ❌ fail | |
| > | |
| > Review the Files changed tab and confirm final marks after the deadline. | |
| EOF | |
| - name: Fail job if critical checks failed | |
| if: always() | |
| run: | | |
| F="${{ steps.files.outputs.status }}" | |
| S="${{ steps.syntax.outputs.status }}" | |
| if [ "$F" = "fail" ] || [ "$S" = "fail" ]; then | |
| echo "Critical checks failed — files missing or PHP syntax errors present" | |
| exit 1 | |
| fi | |
| echo "All critical checks passed" |