Automatisierung mit GitHub Actions¶
dnsjinja lässt sich vollständig über GitHub Actions betreiben: Ein Workflow im
Daten-Repository spielt bei jedem Push auf main die DNS-Zonen aus.
Ablauf¶
dnsjinjawird (versions-gepinnt) aus dem Tool-Repository installiert.- Das Daten-Repository wird ausgecheckt.
dnsjinja -b -w -uwird ausgeführt (Backup, Write, Upload).- Zone-Files und Backups werden als Build-Artefakte gesichert.
exit_on_errorsetzt den Job auf „failure", falls eine Domain nicht aktualisiert werden konnte.
Secrets und Variables¶
Im Daten-Repository unter Settings → Secrets and variables → Actions:
| Name | Typ | Inhalt |
|---|---|---|
HETZNER_API_AUTH_TOKEN |
Secret | Bearer-Token (Cloud API, Read & Write) |
GH_PAT_DNSJINJA |
Secret | GitHub-PAT mit Lesezugriff auf das (private) dnsjinja-Repo |
DNSJINJA |
Variable | Repo-Pfad des Tools, z. B. kaijen/dnsjinja |
DNSDATA |
Variable | Repo-Pfad der DNS-Daten |
DNSJINJA_VER |
Variable | zu installierender Tag, z. B. v1.0.1 |
Token-Typ
HETZNER_API_AUTH_TOKEN muss ein Cloud-API-Token sein (nicht der alte
DNS-Konsolen-Token), sonst scheitert der Lauf an der Authentifizierung.
Beispiel-Workflow¶
.github/workflows/publish_dns.yml im Daten-Repository:
name: Publish DNS to Hetzner
on:
push:
branches: [main]
env:
DNSJINJA_AUTH_API_TOKEN: ${{ secrets.HETZNER_API_AUTH_TOKEN }}
DNSJINJA_DATADIR: data
DNSJINJA_CONFIG: data/config/config.json
jobs:
dns-hetzner:
runs-on: ubuntu-latest
steps:
- name: Install dnsjinja
run: pip install git+https://${{ secrets.GH_PAT_DNSJINJA }}@github.com/${{ vars.DNSJINJA }}.git@${{ vars.DNSJINJA_VER }}
- name: Check out DNS data
uses: actions/checkout@v4
with:
repository: ${{ vars.DNSDATA }}
path: ${{ env.DNSJINJA_DATADIR }}
- name: Run dnsjinja
run: |
mkdir ${{ env.DNSJINJA_DATADIR }}/zone-files
mkdir ${{ env.DNSJINJA_DATADIR }}/zone-backups
dnsjinja -b -w -u
- name: Upload Zone Backups
uses: actions/upload-artifact@v4
with:
name: zone-backups
path: ${{ env.DNSJINJA_DATADIR }}/zone-backups
- name: Upload Zone Files
uses: actions/upload-artifact@v4
with:
name: zone-files
path: ${{ env.DNSJINJA_DATADIR }}/zone-files
- name: Set error status
run: exit_on_error
Version pinnen
@${{ vars.DNSJINJA_VER }} installiert einen festen Tag statt des Default-Branches.
Updates erfolgen dann kontrolliert durch Hochsetzen der Variable DNSJINJA_VER –
reproduzierbar und nachvollziehbar.
Diese Dokumentation: Versionierung mit mike¶
Die Doku selbst wird mit MkDocs erstellt und mit
mike je Release versioniert. Ein Workflow im
dnsjinja-Repo baut die Seiten bei jedem Tag-Push (v*) und veröffentlicht sie in
den Branch gh-pages:
name: Publish Docs
on:
push:
tags: ['v*']
workflow_dispatch:
inputs:
version:
description: 'Version/Alias (z. B. v1.0.1)'
required: true
permissions:
contents: write
jobs:
deploy-docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: pip install ".[docs]"
- name: Configure git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Deploy with mike
run: |
VERSION="${{ github.event.inputs.version || github.ref_name }}"
git fetch origin gh-pages --depth=1 || true
mike deploy --push --update-aliases "$VERSION" latest
mike set-default --push latest
mike legt jede Version in einen eigenen Unterpfad (/v1.0.1/) und pflegt den Alias
latest. Der Versionsumschalter oben rechts wird vom Material-Theme automatisch
eingeblendet.
Eigener Webserver statt GitHub Pages
Der Workflow schreibt ausschließlich in den Branch gh-pages. Du musst GitHub
Pages nicht aktivieren – der Branch enthält eine fertige, statische Site, die
du auf deinem eigenen Webserver ausliefern kannst (z. B. per Checkout/Export des
Branches). Passe dazu site_url in mkdocs.yml an deine tatsächliche URL an,
damit kanonische Links und sitemap.xml stimmen.