Development¶
Overview¶
This repository now includes an automated workflow that handles PDF generation, verification, and distribution with the following features:
How the pipeline works
- Automatic PDF Generation - Builds both light and dark mode PDFs from MkDocs source
- SHA256 Hash Generation - Creates hash files for integrity verification
- GPG Signature Signing - Signs all PDFs and hash files with repository GPG key
- VirusTotal Scanning - Automatically scans PDFs and updates release notes
- Release Automation - Packages everything into GitHub releases
Workflow Architecture¶
1. Build PDF Workflow (build-pdf.yml)¶
Trigger: Push to main, pull requests, or manual dispatch
Steps
- Checkout repository
- Set up Python 3.13 and MkDocs Material
- Install Chromium browser
- Generate both light and dark mode PDFs
- Create SHA256 hash files
- Sign all files with GPG
- Upload artifacts to GitHub Actions
- Publish release
2. VirusTotal Scan Workflow (vt-scan.yml)¶
Trigger: Push to main, tags, or manual dispatch (runs after build-pdf)
Steps
- Download PDF artifacts from build workflow
- Scan both PDFs with VirusTotal API
- Extract scan results and generate report links
- Update release notes with VT scan status and URLs
File Structure¶
After a successful build, the repository will contain:
.../
├── export/
│ ├── thgtoa.pdf # Light mode PDF
│ ├── thgtoa-dark.pdf # Dark mode PDF
│ ├── thgtoa.pdf.sig # GPG signature (light)
│ └── thgtoa-dark.pdf.sig # GPG signature (dark)
├── thgtoa.pdf.sha256 # Hash file (light)
├── thgtoa-dark.pdf.sha256 # Hash file (dark)
├── sha256sum-light.txt # Combined hash file
└── scripts/
├── build_guide_pdf.py # PDF generation script
└── verify_pdf.py # Verification utility
Security Features¶
1. SHA256 Hash Verification¶
Purpose: Ensure file integrity during download/transit
How it works:
- Each PDF gets a unique SHA256 hash calculated at build time
- Hash stored in .sha256 files alongside the PDFs
- Combined sha256sum-light.txt for batch verification
Verification command:
2. GPG Signature Verification¶
Purpose: Verify authenticity and prevent tampering
How it works
- Detached signatures created for each PDF and hash file
- Public keys available in
/pgp/directory
Verification command:
3. VirusTotal Integration¶
Purpose: Malware detection and security scanning
How it works
- Automatic scan of all generated PDFs
- Results published in release notes with direct links
- Provides third-party validation of file safety
Usage Examples¶
Local Development¶
# Build PDFs locally
python scripts/build_guide_pdf.py --both
# Verify hashes
python scripts/verify_pdf.py --hashes
# Verify signatures (requires GPG installed)
python scripts/verify_pdf.py --signatures
# Full verification with VirusTotal check
export VT_API_KEY=your_api_key
python scripts/verify_pdf.py --all
CI/CD Verification¶
The workflows automatically verify everything during the build process. To manually trigger:
- Go to Actions tab
- Select "Build guide PDF" or "VirusTotal Scan"
- Click "Run workflow"
- Download artifacts from successful run
Release Process¶
When you create a tag (e.g., v1.0.0):
- Push the tag:
git push origin v1.0.0 - Build PDF workflow triggers automatically
- VirusTotal scan workflow runs after build completes
- Both workflows update/create GitHub release with:
- Light and dark mode PDFs
- GPG signatures for all files
- Hash files for verification
- Release notes with VT scan results
Troubleshooting¶
Common Issues¶
GPG signing fails:
- Check that GPG_PRIVATE_KEY is in ASCII armor format
- Verify passphrase is correct
- Ensure key has signing capability
Hash mismatch after download: - Re-download the file (corruption during transfer) - Verify you're using the correct hash file - Check disk integrity
VirusTotal scan fails:
- Verify VT_API_KEY is set correctly
- Check API quota limits (free tier: 4 requests/minute)
- Ensure PDF files exist before scanning
Debug Mode¶
Enable verbose output by adding to workflow:
- name: Debug
run: |
echo "Current directory:" && pwd
echo "Files in export:" && ls -la export/
echo "Hash file contents:" && cat sha256sum-light.txt
Best Practices¶
- Always verify signatures before opening PDFs from untrusted sources
- Check VirusTotal results for any suspicious detections
- Keep GPG keys secure - never commit private keys to repository
- Monitor API usage for VirusTotal to avoid rate limiting
- Test locally before pushing tags to production
Future Enhancements¶
Potential improvements: - Multi-signature support (multiple maintainers) - Automated changelog generation with hashes - Cross-platform signature verification scripts - Integration with additional malware scanners - Automatic mirror updates with verified files
This workflow is designed for security-conscious users who need to verify the authenticity and integrity of downloaded documents.