Skip to content

Pre-render Model Pages #7

Pre-render Model Pages

Pre-render Model Pages #7

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"