← all work

Cloud Platform Engineer

Shared CI/CD templates used by 50+ repositories

Built the team's shared GitLab CI templates and CI images — now consumed by 50+ repos — eliminating pipeline duplication, including a Terraform version-agnostic image that lets every repo pin its own version from one shared tag.

context

I’d led the migration of source control and CI/CD onto GitLab and pushed an IaC-first approach across the estate. But pipelines had grown organically — every team carried its own near-duplicate .gitlab-ci.yml, and fixes had to be applied repo by repo. There was no single place to improve how the org ships.

constraints

  • Adoption had to be earned, not mandated — teams switch when it’s obviously better, not because they’re told to.
  • Teams needed real override points without forking the whole thing.
  • Shared pipelines affect everyone, so changes needed versioning and a safe rollout path.

decision

Built a set of centralised, versioned GitLab CI templates and supporting CI images that repos include: rather than copy. The piece I’m happiest with is a Terraform version-agnostic image: it uses tfswitch to resolve the correct Terraform version at runtime, so every repo pins its own version from a single shared template tag — instead of maintaining a sprawl of images and tags.

outcome

  • 50+ repositories now consume the shared templates.
  • Widespread pipeline duplication is gone; improvements ship once, centrally.
  • The version-agnostic image collapsed an image/tag sprawl down to a single shared tag teams pin against.
  • A fix or improvement to a shared step now propagates to every consumer on their next version bump, instead of being hand-applied across dozens of repos.

what I’d do differently

The shared-template approach was the right tool when I built it. GitLab has since matured CI/CD Components and the CI/CD Catalog into a more structured successor — versioned, discoverable, and composable in a way included templates aren’t — and that’s the direction I’d take this next: breaking the templates into reusable components teams can find and adopt from a catalogue, rather than knowing which tag to include.