MkDocs GitHub Actions Automatic Deployment Setup Guide¶
A complete guide to implementing automatic MkDocs deployment with GitHub Actions. This guide explains in detail how to migrate from manual deployment to an automated CI/CD pipeline.
Key Points¶
Fully Automated Deployment
Automatically deploy to GitHub Pages upon push
Team Development Support
Unified quality without requiring local environments
Enhanced Security
Proper permission management and token control
Fast Builds
Quick deployment with dependency caching
Quality Assurance
Automatic halt on build errors
Deployment History Management
Complete tracking of execution logs and history
Why GitHub Actions CI/CD Is Necessary¶
Problems with Traditional Manual Deployment¶
Limitations of mkdocs gh-deploy: - ❌ No pre-deployment review - ❌ Local environment dependent, unsuitable for team development - ❌ Risk of overlooking build errors - ❌ Limited security control - ❌ Inconsistent execution environment
Benefits of GitHub Actions CI/CD¶
Professional operations: - ✅ Automation: Automatic deployment upon push - ✅ Quality assurance: Automatic halt on errors - ✅ Team collaboration: Unified execution environment - ✅ Security: Proper permission management - ✅ Efficiency: Acceleration through caching - ✅ Monitoring: Detailed logs and execution history
Implementation Steps¶
1. Prepare Directory Structure¶
mkdir -p .github/workflows
2. Create GitHub Actions Workflow File¶
.github/workflows/deploy-mkdocs.yml:
name: Deploy MkDocs to GitHub Pages
on:
push:
branches: [ "master" ] # or "main"
paths: [ "docs/**", "mkdocs.yml", "custom_theme/**" ]
workflow_dispatch: # Manual execution option
permissions:
contents: write
pages: write
id-token: write
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # Fetch Git history (for revision date plugin)
- name: Configure Git Credentials
run: |
git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Cache dependencies
run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
- name: Cache MkDocs
uses: actions/cache@v4
with:
key: mkdocs-material-${{ env.cache_id }}
path: .cache
restore-keys: |
mkdocs-material-
- name: Install dependencies
run: |
pip install --upgrade pip
pip install mkdocs-material
pip install mkdocs-git-revision-date-localized-plugin
pip install mkdocs-minify-plugin
pip install mkdocs-static-i18n
- name: Build and deploy to GitHub Pages
run: mkdocs gh-deploy --force --clean --verbose
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
3. Configure .gitignore File¶
.gitignore:
# MkDocs build output
site/
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
env/
venv/
.venv
pip-log.txt
pip-delete-this-directory.txt
.tox
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.log
.git
.mypy_cache
.pytest_cache
.hypothesis
# OS
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
Important: Correct .gitignore Syntax
site/is the correct syntax×/site/- This ignores only site/ directly under the root directory○site/- This ignores site/ directories at any level
MkDocs build output consists of a large number of files and should not be committed to the master branch. GitHub Actions will automatically deploy to the gh-pages branch.
4. Commit and Push¶
git add .
git commit -m "Implement GitHub Actions CI/CD for MkDocs deployment"
git push origin master
Workflow Details Explained¶
Trigger Configuration¶
on:
push:
branches: [ "master" ]
paths: [ "docs/**", "mkdocs.yml", "custom_theme/**" ]
Key points: - branches: Specify target branches - paths: Execute only when documentation-related files change - workflow_dispatch: Enable manual execution
Permission Configuration¶
permissions:
contents: write # Repository write access
pages: write # GitHub Pages write access
id-token: write # For OIDC authentication
Security considerations: - Follow the principle of least privilege - Do not use write-all - Grant only necessary permissions
Cache Strategy¶
- name: Cache MkDocs
uses: actions/cache@v4
with:
key: mkdocs-material-${{ env.cache_id }}
path: .cache
restore-keys: |
mkdocs-material-
Benefits: - Significantly reduce build time - Avoid re-downloading dependencies - Update cache weekly
Advanced Configuration Options¶
Multi-language Site Support¶
- name: Install dependencies
run: |
pip install --upgrade pip
pip install mkdocs-material
pip install mkdocs-static-i18n # Multi-language support
Test Integration¶
- name: Run tests
run: |
# Link checking
pip install pytest-check-links
pytest --check-links docs/
# Markdown linting
pip install markdownlint-cli
markdownlint docs/**/*.md
Notification Configuration¶
- name: Notify deployment status
if: failure()
uses: 8398a7/action-slack@v3
with:
status: failure
webhook_url: ${{ secrets.SLACK_WEBHOOK }}
Troubleshooting¶
Common Errors and Solutions¶
1. Permission Error¶
Error example:
Error: Resource not accessible by integration
Solution: 1. Repository Settings → Actions → General 2. Change "Workflow permissions" to "Read and write permissions"
2. Build Error¶
Error example:
ModuleNotFoundError: No module named 'mkdocs_material'
Solution: - Create requirements.txt to explicitly specify dependencies - Verify the dependency installation section of the workflow
3. Cache Issues¶
Symptoms: - Build time is not reduced - Old dependencies are being used
Solution:
- name: Clear cache (if needed)
run: |
rm -rf .cache
pip cache purge
Debugging Methods¶
- name: Debug information
run: |
echo "Python version: $(python --version)"
echo "MkDocs version: $(mkdocs --version)"
echo "Working directory: $(pwd)"
ls -la
Security Best Practices¶
1. Principle of Least Privilege¶
permissions:
contents: write # Minimum required
pages: write # For GitHub Pages
id-token: write # For OIDC
2. Secret Management¶
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Use auto-generated token
Avoid: - Using personal access tokens - Hardcoded credentials
3. Dependency Pinning¶
- name: Install dependencies
run: |
pip install mkdocs-material==9.6.14 # Pin version
Performance Optimization¶
1. Parallel Execution¶
strategy:
matrix:
python-version: ["3.11"]
os: [ubuntu-latest]
2. Conditional Execution¶
- name: Deploy only on main branch
if: github.ref == 'refs/heads/main'
run: mkdocs gh-deploy --force --clean
3. Differential Build¶
- name: Check for changes
run: |
if git diff --quiet HEAD~1 HEAD docs/; then
echo "No documentation changes detected"
exit 0
fi
Production Best Practices¶
1. Branch Strategy¶
on:
push:
branches: [ "main", "develop" ] # Support multiple branches
pull_request:
branches: [ "main" ] # Validation on PR
2. Environment-specific Deployment¶
- name: Deploy to staging
if: github.ref == 'refs/heads/develop'
run: mkdocs gh-deploy --config-file mkdocs-staging.yml
- name: Deploy to production
if: github.ref == 'refs/heads/main'
run: mkdocs gh-deploy --force --clean
3. Version Management¶
- name: Install versioning tool
run: pip install mike
- name: Deploy versioned docs
run: |
mike deploy --push --update-aliases ${{ github.ref_name }} latest
mike set-default --push latest
Summary¶
Automatic MkDocs deployment with GitHub Actions CI/CD provides the following value:
🎯 Implementation Benefits¶
- Efficiency: Complete automation of manual work
- Quality: Consistent build environment
- Safety: Proper permissions and security control
- Visibility: Detailed logs and execution history
- Team development: Elimination of environment differences
🚀 Future Operations¶
- Push:
git push origin master - Auto-execute: GitHub Actions starts
- Auto-deploy: Site update completed in a few minutes
With this setup, updating documentation becomes easier, safer, and more efficient. This configuration is essential for professional development teams.