Pre-render Model Pages #7
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: Pre-render Model Pages | |
| on: | |
| schedule: | |
| # Run daily at 4 AM UTC (after data and SEO updates) | |
| - cron: '0 4 * * *' | |
| workflow_dispatch: # Allow manual triggering | |
| workflow_run: | |
| workflows: ["SEO Optimization"] | |
| types: | |
| - completed | |
| permissions: | |
| contents: write | |
| pages: write | |
| id-token: write | |
| issues: write | |
| jobs: | |
| prerender: | |
| runs-on: ubuntu-latest | |
| # Only run if SEO optimization was successful or if manually triggered | |
| if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' || github.event.workflow_run.conclusion == 'success' }} | |
| # Set timeout to 45 minutes (within GitHub Actions limits) | |
| timeout-minutes: 45 | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Set up Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '18' | |
| cache: 'npm' | |
| - name: Install dependencies | |
| run: | | |
| npm ci | |
| # Install Puppeteer with Chromium (without saving to package.json) | |
| npm install puppeteer --no-save | |
| - name: Configure Git | |
| run: | | |
| git config --local user.email "action@github.com" | |
| git config --local user.name "GitHub Action" | |
| - name: Clean up any package-lock.json changes | |
| run: | | |
| # Reset any changes to package-lock.json that might have occurred during npm install | |
| git checkout -- package-lock.json 2>/dev/null || true | |
| - name: Generate minimal model pages | |
| id: prerender | |
| run: | | |
| echo "Starting minimal page generation..." | |
| node scripts/generate-minimal-pages.js | |
| echo "Minimal page generation completed" | |
| - name: Check for generated files | |
| id: check_files | |
| run: | | |
| if [ -d "models" ] && [ "$(ls -A models)" ]; then | |
| FILE_COUNT=$(ls -1 models/*.html 2>/dev/null | wc -l) | |
| echo "Generated $FILE_COUNT HTML files in models/" | |
| echo "files_generated=true" >> $GITHUB_OUTPUT | |
| echo "file_count=$FILE_COUNT" >> $GITHUB_OUTPUT | |
| else | |
| echo "No files were generated in models/" | |
| echo "files_generated=false" >> $GITHUB_OUTPUT | |
| echo "file_count=0" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Commit and push pre-rendered files | |
| if: steps.check_files.outputs.files_generated == 'true' | |
| run: | | |
| # Check if models directory exists and has files | |
| if [ -d "models" ] && [ "$(ls -A models 2>/dev/null)" ]; then | |
| git add models/ | |
| git commit -m "Automated pre-rendering: Generated ${{ steps.check_files.outputs.file_count }} model pages $(date -u '+%Y-%m-%d %H:%M:%S UTC') | |
| - Pre-rendered top 100 models by likes | |
| - Generated static HTML files for better SEO | |
| - Files saved in models/ directory | |
| - Each model now has its own addressable URL" | |
| git push | |
| else | |
| echo "No models directory or files to commit" | |
| exit 1 | |
| fi | |
| - name: Update sitemap with pre-rendered pages | |
| if: steps.check_files.outputs.files_generated == 'true' | |
| run: | | |
| echo "Updating sitemap with pre-rendered model pages..." | |
| # Create a simple script to add pre-rendered URLs to sitemap | |
| node -e " | |
| const fs = require('fs'); | |
| const path = require('path'); | |
| try { | |
| // Check if sitemap exists | |
| if (!fs.existsSync('sitemap.xml')) { | |
| console.log('sitemap.xml not found, skipping update'); | |
| process.exit(0); | |
| } | |
| // Read existing sitemap | |
| let sitemap = fs.readFileSync('sitemap.xml', 'utf8'); | |
| // Get list of pre-rendered files | |
| const prerenderDir = 'models'; | |
| if (!fs.existsSync(prerenderDir)) { | |
| console.log('No prerendered files found'); | |
| process.exit(0); | |
| } | |
| const files = fs.readdirSync(prerenderDir).filter(f => f.endsWith('.html')); | |
| if (files.length === 0) { | |
| console.log('No HTML files found in models directory'); | |
| process.exit(0); | |
| } | |
| // Create new URLs for pre-rendered pages | |
| const newUrls = files.map(file => { | |
| const modelSlug = file.replace('.html', ''); | |
| return ' <url>' + | |
| '\n <loc>https://local-ai-zone.github.io/models/' + file + '</loc>' + | |
| '\n <lastmod>' + new Date().toISOString().split('T')[0] + '</lastmod>' + | |
| '\n <changefreq>weekly</changefreq>' + | |
| '\n <priority>0.8</priority>' + | |
| '\n </url>'; | |
| }).join('\n'); | |
| // Insert new URLs before closing urlset tag | |
| sitemap = sitemap.replace('</urlset>', newUrls + '\n</urlset>'); | |
| // Write updated sitemap | |
| fs.writeFileSync('sitemap.xml', sitemap); | |
| console.log('Added ' + files.length + ' pre-rendered pages to sitemap'); | |
| } catch (error) { | |
| console.error('Error updating sitemap:', error.message); | |
| process.exit(1); | |
| } | |
| " | |
| - name: Commit sitemap updates | |
| if: steps.check_files.outputs.files_generated == 'true' | |
| run: | | |
| if git diff --quiet sitemap.xml; then | |
| echo "No sitemap changes to commit" | |
| else | |
| git add sitemap.xml | |
| git commit -m "Updated sitemap with pre-rendered model pages" | |
| git push | |
| fi | |
| - name: Trigger GitHub Pages deployment | |
| if: steps.check_files.outputs.files_generated == 'true' | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| console.log('Triggering GitHub Pages rebuild for pre-rendered pages...'); | |
| try { | |
| await github.rest.repos.requestPagesBuild({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo | |
| }); | |
| console.log('GitHub Pages rebuild triggered successfully'); | |
| } catch (error) { | |
| console.log('Error triggering Pages rebuild:', error.message); | |
| } | |
| - name: Generate pre-rendering summary | |
| if: steps.check_files.outputs.files_generated == 'true' | |
| run: | | |
| echo "## Pre-rendering Summary" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "✅ **Pre-rendering completed successfully**" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "📊 **Generated Files**: ${{ steps.check_files.outputs.file_count }} HTML pages" >> $GITHUB_STEP_SUMMARY | |
| echo "🎯 **Target**: Top 100 models by likes" >> $GITHUB_STEP_SUMMARY | |
| echo "📁 **Location**: \`models/\` directory" >> $GITHUB_STEP_SUMMARY | |
| echo "🔗 **URLs**: Each model now accessible at \`/models/{model-slug}.html\`" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "🚀 **GitHub Pages deployment triggered**" >> $GITHUB_STEP_SUMMARY | |
| echo "🗺️ **Sitemap updated** with pre-rendered page URLs" >> $GITHUB_STEP_SUMMARY | |
| - name: Create issue on failure | |
| if: failure() | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const title = `Model Pre-rendering Failed - ${new Date().toISOString().split('T')[0]}`; | |
| const body = `## Automation Failure: Model Pre-rendering | |
| **Failure Type**: Pre-rendering Process | |
| **Timestamp**: ${new Date().toISOString()} | |
| **Workflow Run**: [${context.runId}](${context.payload.repository.html_url}/actions/runs/${context.runId}) | |
| ### Error Details | |
| The model pre-rendering workflow failed. Please check the workflow logs for detailed error information. | |
| ### Affected Components | |
| - [x] Pre-rendered HTML files | |
| - [ ] Dependencies | |
| - [ ] Deployment | |
| - [ ] Sitemap updates | |
| ### Recommended Actions | |
| 1. Check the workflow logs for specific error messages | |
| 2. Verify Puppeteer is working correctly | |
| 3. Ensure the main site is accessible | |
| 4. Check if there are memory or timeout issues | |
| 5. Verify data/gguf_models.json file is accessible | |
| ### Pre-rendering Process | |
| - **Target**: Top 500 models by likes | |
| - **Concurrency**: 5 browser tabs | |
| - **Timeout**: 30 seconds per page | |
| - **Output**: models/ directory | |
| ### Next Steps | |
| - Review and fix any issues with the pre-rendering script | |
| - Re-run the workflow manually once issues are resolved | |
| - Consider adjusting concurrency or timeout settings if needed | |
| `; | |
| github.rest.issues.create({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| title: title, | |
| body: body, | |
| labels: ['automation', 'bug', 'prerendering'] | |
| }); | |
| - name: Notify on success | |
| if: success() && steps.check_files.outputs.files_generated == 'true' | |
| run: | | |
| echo "✅ Model pre-rendering completed successfully" | |
| echo "📊 Generated ${{ steps.check_files.outputs.file_count }} HTML files" | |
| echo "🚀 GitHub Pages deployment triggered" | |
| - name: Notify on no changes | |
| if: success() && steps.check_files.outputs.files_generated == 'false' | |
| run: | | |
| echo "ℹ️ Pre-rendering completed - no files generated" | |
| echo "📊 Check if models data is available" |