This is the architecture documentation for the personal profile (Website, CV, several outputs more) of Dieter Baier.
You can check the outputs for example on:
The project is not just documentation.
It is a working example of:
-
Documentation as Code
-
Multi-target publishing
-
Reproducible builds
Introduction and Goals
Motivation
Maintaining a personal profile across multiple platforms (GitHub, GitLab, personal website, CV) leads to duplication and inconsistencies.
This project provides a unified solution based on the idea:
"Write once, publish everywhere."
Goals
-
Single source of truth for all profile information
-
Generation of multiple output formats:
-
HTML (website)
-
PDF (CV)
-
Markdown (README)
-
-
Environment-specific data injection (e.g. private contact details)
-
Fully reproducible builds
Quality Goals
| Quality | Description |
|---|---|
Reproducibility |
Same output regardless of environment |
Maintainability |
Clear structure and modular build pipeline |
Automation |
Fully automated generation and deployment |
Flexibility |
Different outputs from same source |
Architecture Constraints
-
Use of AsciiDoc as primary authoring format
-
Use of Gradle as build system
-
No proprietary tools (open source only)
-
Docker support for reproducible environments
-
CI/CD via GitHub Actions
Technical constraints:
-
Pandoc required for Markdown conversion
-
Graphviz required for diagrams
System Scope and Context
Business Context
Technical Context
-
Input: AsciiDoc files
-
Processing:
-
Asciidoctor
-
Pandoc
-
-
Output:
-
HTML
-
PDF
-
Markdown
-
Solution Strategy
Build Pipeline Strategy
Context
The project uses a GitHub Actions based pipeline to build and deploy documentation artifacts (README, site, architecture).
- Goals
-
-
Minimize unnecessary builds
-
Ensure reproducibility
-
Reduce resource consumption (Green IT)
-
Keep pipeline maintainable and deterministic
-
Solution
The pipeline is structured into four logical stages:
1. Immutable Build Environment
- A Docker image is used as the build environment
-
-
Tagged using a hash of Dockerfile and .dockerignore
-
Built only when relevant files change
-
Cached using registry-based layer caching
-
2. Change Detection
File-based change detection is implemented using path filters.
- Categories
-
-
README
-
Architecture
-
Site
-
This enables selective execution of build tasks.
3. Conditional Build Execution
- Only required Gradle tasks are executed
-
-
buildReadme
-
buildArchitecture
-
buildSite
-
If no relevant changes are detected, the build step is skipped entirely.
4. Artifact-Based Deployment
- Artifacts are
-
-
generated once
-
uploaded
-
consumed by a dedicated deploy stage
-
- Deployment targets
-
-
GitHub profile README
-
GitLab profile README
-
GitHub Pages
-
personal domain
-
Consequences
- Advantages
-
-
Reduced pipeline runtime
-
Lower resource consumption
-
Deterministic builds
-
Clear separation of concerns
-
- Trade-offs
-
-
Increased pipeline complexity
-
Additional maintenance for path filters
-
Building Block View
Overview
The system consists of the following main building blocks:
| Component | Responsibility |
|---|---|
Gradle |
Orchestration of the build pipeline |
Asciidoctor |
Conversion of AsciiDoc to HTML/PDF |
Pandoc |
Conversion of DocBook to Markdown |
Docker |
Provides reproducible runtime environment |
GitHub Actions |
CI/CD execution |
Internal Structure
Runtime View
Build Process
Architecture Decisions
ADR-001: Use AsciiDoc as single source
AsciiDoc provides:
-
rich structure
-
includes
-
flexibility for multiple outputs
ADR-002: Use Gradle for orchestration
Gradle allows:
-
task orchestration
-
dependency management
-
extensibility
ADR-003: Use Docker for reproducibility
Docker ensures:
-
identical environments
-
no local setup required
ADR-004: Use Pandoc for Markdown conversion
Pandoc provides:
-
reliable format transformation
-
high-quality Markdown output