This document describes how the repositories are hosted, mirrored, and connected through CI/CD pipelines.
graph TB
GH["GitHub: attic-iac (public)"]
GL_O1["GitLab: Overlay 1 (CI/CD)"]
GL_O2["GitLab: Overlay 2 (CI/CD)"]
GH_M["GitHub: org overlay (mirror)"]
DC["Dev K8s"]
PC["Prod K8s"]
GH_M -->|push| GL_O1
GL_O1 -->|"CI clones upstream"| GH
GL_O2 -->|"CI clones upstream"| GH
GL_O1 -->|deploys| DC
GL_O2 -->|deploys| PC
Jesssullivan/attic-iac)build/overlay.bzl), and
Nix flake for container builds.organization.yaml, CI pipeline definitions, and any files that
override upstream defaults.origin points to the GitHub mirror (for code review and backup)gitlab points to the GitLab project (for CI/CD execution)Pushes to the GitHub mirror are forwarded to GitLab, which triggers the CI pipeline.
Additional overlay repositories follow the same pattern. Each targets a different Kubernetes cluster with its own organization-specific configuration, while sharing the same upstream modules.
All overlay repositories follow the same CI pattern:
@attic_merged layout that Bazel
produces locally.plan and apply against the merged file tree.main branch, deploys are automatic (not gated by manual
approval).This means the CI pipeline does not depend on Bazel itself. It reproduces the overlay merge with shell-level symlinks, keeping the CI environment lightweight.
Each overlay repository is typically managed by a separate GitLab account (or group):
All clusters receive the same upstream infrastructure components (Attic cache, runners, dashboard) but with organization-specific configuration provided by their respective overlays.