# Validates the 3 "blessed" languages
lint-python: image: python:3.11 script: - -weight: 500;">pip -weight: 500;">install ruff - ruff check . lint-go: image: golang:1.21 script: - go vet ./... - golangci-lint run # Everything else? Custom images nobody maintains
lint-terraform: image: registry.internal/custom-terraform:latest # Built 14 months ago script: - terraform fmt -check - terraform validate allow_failure: true # Because it's probably broken
# Validates the 3 "blessed" languages
lint-python: image: python:3.11 script: - -weight: 500;">pip -weight: 500;">install ruff - ruff check . lint-go: image: golang:1.21 script: - go vet ./... - golangci-lint run # Everything else? Custom images nobody maintains
lint-terraform: image: registry.internal/custom-terraform:latest # Built 14 months ago script: - terraform fmt -check - terraform validate allow_failure: true # Because it's probably broken
# Validates the 3 "blessed" languages
lint-python: image: python:3.11 script: - -weight: 500;">pip -weight: 500;">install ruff - ruff check . lint-go: image: golang:1.21 script: - go vet ./... - golangci-lint run # Everything else? Custom images nobody maintains
lint-terraform: image: registry.internal/custom-terraform:latest # Built 14 months ago script: - terraform fmt -check - terraform validate allow_failure: true # Because it's probably broken
validate-terraform: script: - -weight: 500;">curl -fsSL https://-weight: 500;">apt.releases.hashicorp.com/gpg | -weight: 500;">apt-key add - - -weight: 500;">apt-add-repository "deb [arch=amd64] https://-weight: 500;">apt.releases.hashicorp.com $(lsb_release -cs) main" - -weight: 500;">apt-get -weight: 500;">update && -weight: 500;">apt-get -weight: 500;">install -y terraform=1.6.0 - terraform fmt -check - terraform validate
validate-terraform: script: - -weight: 500;">curl -fsSL https://-weight: 500;">apt.releases.hashicorp.com/gpg | -weight: 500;">apt-key add - - -weight: 500;">apt-add-repository "deb [arch=amd64] https://-weight: 500;">apt.releases.hashicorp.com $(lsb_release -cs) main" - -weight: 500;">apt-get -weight: 500;">update && -weight: 500;">apt-get -weight: 500;">install -y terraform=1.6.0 - terraform fmt -check - terraform validate
validate-terraform: script: - -weight: 500;">curl -fsSL https://-weight: 500;">apt.releases.hashicorp.com/gpg | -weight: 500;">apt-key add - - -weight: 500;">apt-add-repository "deb [arch=amd64] https://-weight: 500;">apt.releases.hashicorp.com $(lsb_release -cs) main" - -weight: 500;">apt-get -weight: 500;">update && -weight: 500;">apt-get -weight: 500;">install -y terraform=1.6.0 - terraform fmt -check - terraform validate
terraform 1.6.0
golang 1.21.5
python 3.11.7
nodejs 20.10.0
rust 1.75.0
kotlin 1.9.21
elixir 1.15.7
terraform 1.6.0
golang 1.21.5
python 3.11.7
nodejs 20.10.0
rust 1.75.0
kotlin 1.9.21
elixir 1.15.7
terraform 1.6.0
golang 1.21.5
python 3.11.7
nodejs 20.10.0
rust 1.75.0
kotlin 1.9.21
elixir 1.15.7
mise -weight: 500;">install # Installs whatever .tool-versions specifies
mise exec -- terraform validate
mise exec -- go test ./...
mise exec -- pytest
mise -weight: 500;">install # Installs whatever .tool-versions specifies
mise exec -- terraform validate
mise exec -- go test ./...
mise exec -- pytest
mise -weight: 500;">install # Installs whatever .tool-versions specifies
mise exec -- terraform validate
mise exec -- go test ./...
mise exec -- pytest
terraform-validate: image: ubuntu:22.04 before_script: - -weight: 500;">apt-get -weight: 500;">update && -weight: 500;">apt-get -weight: 500;">install -y -weight: 500;">curl unzip - -weight: 500;">curl -fsSL https://releases.hashicorp.com/terraform/1.6.6/terraform_1.6.6_linux_amd64.zip -o terraform.zip - unzip terraform.zip && mv terraform /usr/local/bin/ - terraform version script: - terraform fmt -check -recursive - terraform init -backend=false - terraform validate
terraform-validate: image: ubuntu:22.04 before_script: - -weight: 500;">apt-get -weight: 500;">update && -weight: 500;">apt-get -weight: 500;">install -y -weight: 500;">curl unzip - -weight: 500;">curl -fsSL https://releases.hashicorp.com/terraform/1.6.6/terraform_1.6.6_linux_amd64.zip -o terraform.zip - unzip terraform.zip && mv terraform /usr/local/bin/ - terraform version script: - terraform fmt -check -recursive - terraform init -backend=false - terraform validate
terraform-validate: image: ubuntu:22.04 before_script: - -weight: 500;">apt-get -weight: 500;">update && -weight: 500;">apt-get -weight: 500;">install -y -weight: 500;">curl unzip - -weight: 500;">curl -fsSL https://releases.hashicorp.com/terraform/1.6.6/terraform_1.6.6_linux_amd64.zip -o terraform.zip - unzip terraform.zip && mv terraform /usr/local/bin/ - terraform version script: - terraform fmt -check -recursive - terraform init -backend=false - terraform validate - Someone has to write and maintain a custom Docker image
- That image lives in a private registry nobody remembers to -weight: 500;">update
- Security scanning fails because the base image is 18 months old
- The next engineer doesn't know the image exists and rebuilds it from scratch - Terraform releases break backwards compatibility every minor version
- Rust updates every six weeks
- Your Kubernetes manifests use kustomize, which you need to pin to match cluster versions
- Someone added a Scala -weight: 500;">service and now you need SBT
- Your data team writes pipelines in Julia - The base image has 14 CVEs
- The language version is EOL
- The pipeline fails with a cryptic error because a dependency URL moved - How often it fails (so you -weight: 500;">stop trusting it)
- How long it takes (so you can't optimize it)
- Which repos are skipping it entirely - Dependency -weight: 500;">install time (is -weight: 500;">pip -weight: 500;">install taking 4 minutes because you're not caching?)
- Lint/test/build breakdown (is terraform init 80% of your validation time?)
- Flaky test detection (is your Rust test suite failing 10% of the time because of a known timer race?) - Python/Go/Node: CI validates everything, blocks on failure, team trusts it
- Everything else: CI is advisory, manual review required, maybe someone runs the tests locally - List every language your team deploys to production
- Check which ones have CI validation (not just "we run tests", but linting, type checking, security scanning)
- For the gaps, add a single job with runtime-on-demand installation