CI Validation Scope¶
This repository ships runnable artifacts (a Python sample app under apps/, Bicep infrastructure under infra/, Kubernetes manifests, and reproducible labs under labs/) alongside the documentation. Continuous integration validates these artifacts on every pull request so guidance stays reproducible, while deliberately avoiding any check that would require live Azure credentials or incur cloud cost.
Workflows¶
| Workflow | File | Trigger paths |
|---|---|---|
| Deploy Documentation | .github/workflows/docs.yml | docs/**, mkdocs.yml |
| Validate Content Source Metadata | .github/workflows/validate-content-sources.yml | docs/**, scripts/**, root markdown, mkdocs.yml, .github/workflows/** |
| Validate Artifacts | .github/workflows/validate-artifacts.yml | apps/**, infra/**, labs/** |
What CI Validates¶
Documentation¶
mkdocs build --strictbuilds the full site and fails on broken internal links, missing nav entries, or unrecognized anchors.validate_content_sources.pyenforces the canonicalcontent_sources.diagrams[…]provenance shape on every Mermaid page.- Microsoft Learn URL locale normalization (
/en-us/prefix). - Frontmatter YAML style drift.
Infrastructure (Bicep)¶
The bicep-build job runs az bicep build against infra/main.bicep, infra/main-private.bicep, and every module under infra/modules/. This compiles the templates to ARM JSON and surfaces syntax and type errors without deploying anything.
Kubernetes manifests¶
The k8s-manifests job validates every manifest under apps/**/manifests/ and labs/**/workload/:
- YAML syntax parsing with PyYAML (multi-document aware).
- Schema validation with
kubeconform --ignore-missing-schemas, which checks each resource against the upstream Kubernetes OpenAPI schemas.
Python sample app¶
The python-app job installs apps/python/requirements.txt, byte-compiles the sources with py_compile, and runs ruff check (non-blocking) for lint feedback.
Container image¶
The container-build job builds apps/python/Dockerfile with Docker Buildx (push: false) using a GitHub Actions build cache. This proves the image builds from a clean checkout without publishing it to any registry.
Dockerfile lint¶
The dockerfile-lint job runs hadolint against apps/python/Dockerfile (non-blocking) for best-practice feedback.
What CI Does Not Validate¶
CI is intentionally scoped to static and build-time checks. It does not:
- Deploy any resource to Azure or authenticate to a subscription.
- Provision an AKS cluster or apply manifests to a live cluster.
- Run
az deployment group create,terraform apply, orkubectl applyagainst real infrastructure. - Push container images to Azure Container Registry or any registry.
- Execute the fault-injection labs end-to-end (they require a live cluster and are validated manually; see the lab guides).
These exclusions keep pull-request CI fast, credential-free, and zero-cost. Live validation is performed manually and recorded in the tutorial validation dashboard.
Adding a New Artifact¶
When you add a new runnable artifact, extend validate-artifacts.yml so it is covered:
- New manifests → place them under
apps/**/manifests/orlabs/**/workload/so the existing glob picks them up. - New Bicep modules → they are auto-discovered under
infra/modules/; a new top-level template needs an explicitaz bicep build --fileline. - A new sample app → add a build/compile job mirroring
python-appandcontainer-build.