Weekly Template Inspection #18
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: Weekly Template Inspection | |
| on: | |
| schedule: | |
| - cron: "0 0 * * 3" | |
| workflow_dispatch: | |
| inputs: | |
| templates: | |
| description: "Specific templates to inspect (comma-separated, leave empty for all)" | |
| required: false | |
| default: "" | |
| permissions: | |
| contents: read | |
| issues: write | |
| jobs: | |
| inspect-templates: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Set up Python | |
| uses: actions/setup-python@v4 | |
| with: | |
| python-version: "3.12" | |
| - name: Setup PDM | |
| uses: pdm-project/setup-pdm@v4 | |
| - name: Install dependencies | |
| run: pdm install -G dev | |
| - name: Install UV package manager | |
| run: | | |
| curl -LsSf https://astral.sh/uv/install.sh | sh | |
| echo "$HOME/.cargo/bin" >> $GITHUB_PATH | |
| - name: Verify UV installation | |
| run: | | |
| export PATH="$HOME/.cargo/bin:$PATH" | |
| uv --version | |
| which uv | |
| - name: Set up Docker Compose | |
| run: | | |
| if ! command -v docker-compose &> /dev/null; then | |
| echo "Installing Docker Compose..." | |
| sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose | |
| sudo chmod +x /usr/local/bin/docker-compose | |
| fi | |
| docker --version | |
| docker-compose --version | |
| - name: Run template inspection | |
| run: | | |
| export PATH="$HOME/.cargo/bin:$PATH" | |
| uv --version # Verify UV is available | |
| pdm run python scripts/inspect-templates.py --templates "${{ github.event.inputs.templates }}" --output template_inspection_results.json --verbose | |
| - name: Upload inspection results | |
| uses: actions/upload-artifact@v4 | |
| if: always() # Upload even if inspection fails | |
| with: | |
| name: template-inspection-results | |
| path: template_inspection_results.json | |
| retention-days: 30 | |
| - name: Create Issue on Failure | |
| if: failure() | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const fs = require('fs'); | |
| let resultsContent = "Inspection results not available."; | |
| try { | |
| const results = JSON.parse(fs.readFileSync('template_inspection_results.json', 'utf8')); | |
| resultsContent = `## 📊 Template Inspection Results | |
| **Inspection Date:** ${results.inspection_date} | |
| **Total Templates:** ${results.total_templates} | |
| **✅ Passed:** ${results.passed_templates} | |
| **❌ Failed:** ${results.failed_templates} | |
| ### Failed Templates: | |
| `; | |
| results.results.forEach(result => { | |
| if (!result.is_valid) { | |
| resultsContent += `\n#### ❌ ${result.template_name}\n`; | |
| if (result.errors && result.errors.length > 0) { | |
| resultsContent += "**Errors:**\n"; | |
| result.errors.forEach(error => { | |
| resultsContent += `- ${error}\n`; | |
| }); | |
| } | |
| if (result.warnings && result.warnings.length > 0) { | |
| resultsContent += "**Warnings:**\n"; | |
| result.warnings.forEach(warning => { | |
| resultsContent += `- ${warning}\n`; | |
| }); | |
| } | |
| } | |
| }); | |
| resultsContent += `\n---\n**Workflow:** [${context.workflow}](${context.payload.repository.html_url}/actions/runs/${context.runId})`; | |
| } catch (error) { | |
| resultsContent += `\nError reading results: ${error.message}`; | |
| } | |
| await github.rest.issues.create({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| title: `🚨 Weekly Template Inspection Failed - ${new Date().toISOString().split('T')[0]}`, | |
| body: resultsContent, | |
| labels: ['bug', 'template-inspection', 'automated'] | |
| }); | |
| - name: Report Results | |
| if: always() | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const fs = require('fs'); | |
| try { | |
| const results = JSON.parse(fs.readFileSync('template_inspection_results.json', 'utf8')); | |
| let summary = `## 📊 Template Inspection Summary\n\n`; | |
| summary += `**Inspection Date:** ${results.inspection_date}\n`; | |
| summary += `**Total Templates:** ${results.total_templates}\n`; | |
| summary += `**✅ Passed:** ${results.passed_templates}\n`; | |
| summary += `**❌ Failed:** ${results.failed_templates}\n\n`; | |
| if (results.passed_templates > 0) { | |
| summary += `### ✅ Passed Templates:\n`; | |
| results.results.forEach(result => { | |
| if (result.is_valid) { | |
| summary += `- ${result.template_name}\n`; | |
| } | |
| }); | |
| summary += `\n`; | |
| } | |
| if (results.failed_templates > 0) { | |
| summary += `### ❌ Failed Templates:\n`; | |
| results.results.forEach(result => { | |
| if (!result.is_valid) { | |
| summary += `- ${result.template_name}`; | |
| if (result.errors && result.errors.length > 0) { | |
| summary += `: ${result.errors[0]}`; | |
| } | |
| summary += `\n`; | |
| } | |
| }); | |
| } | |
| console.log(summary); | |
| if (results.failed_templates === 0) { | |
| console.log(`🎉 All templates passed inspection!`); | |
| } else { | |
| console.log(`⚠️ ${results.failed_templates} template(s) failed inspection`); | |
| } | |
| } catch (error) { | |
| console.log(`📊 Template inspection completed`); | |
| console.log(`📄 Results available in workflow artifacts`); | |
| console.log(`❌ Error reading results: ${error.message}`); | |
| } |