Skip to content

OpenTofu Iac

Dokumentacja techniczna

Kompletny pipeline CI/CD dla projektów OpenTofu Infrastructure as Code. Obsługuje formatowanie, linting, walidację konfiguracji, generowanie planu i deployment przez tofu apply na środowiska GitLab.

W projekcie dodaj do .gitlab-ci.yml:

include:
  - project: pl.rachuna-net/flows/gitlab
    file: pipelines/opentofu-iac/.gitlab-ci.yml
    ref: main

variables:
  PROJECT_TYPE: opentofu-iac
.pre        → 🕵 Set Version
validate    → 🔍 Analyze Conventional Commits
            → 🕵 yamllint           (tylko gdy zmienił się *.yml/*.yaml)
            → 🐚 shellcheck         (tylko gdy zmienił się *.sh/*.sh.yml)
            → 🕵 opentofu fmt       (autofix: amend + push)
            → 🔍 tflint
            → ✅ opentofu validate
tests       → 🧪 opentofu-plan      (needs: Set Version + opentofu fmt + tflint + validate)
publish     → 📍 Publish Version    (needs: opentofu-plan)
.pre        → 🕵 Set Version
            → 🔧 Prepare Dynamic Deployment
deployment  → 🚀 Trigger Deployment  → child pipeline:
                                          💥 Deployment:<ENV_NAME>  (per środowisko)
JobNazwa emojiStageCICD
versioning (Set Version)🕵 Set Version.pre
environment-deployment-prepare🔧 Prepare Dynamic Deployment.pre
conventional-commits🔍 Analyze Conventional Commitsvalidate
yamllint🕵 yamllintvalidate✅*
shellcheck🐚 shellcheckvalidate✅*
opentofu-fmt🕵 opentofu fmtvalidate
tflint🔍 tflintvalidate
opentofu-validate✅ opentofu validatevalidate
dependency📦 dependencydependency
build🚀 buildbuild
trigger-deployment🚀 Trigger Deploymentdeployment
opentofu-plan🧪 opentofu-plantests
unit-test🧪 unit-testtests
deployment💥 deploymentdeployment✅**
publish🌐 publishpublish
versioning (Publish Version)📍 Publish Versionpublish

* tylko gdy zmienił się odpowiedni typ pliku względem main ** uruchamia się w child pipeline (CI_PIPELINE_SOURCE == "parent_pipeline")

Joby opentofu-validate, opentofu-plan i deployment uruchamiają tofu_init w before_script, który inicjalizuje backend GitLab Terraform State:

tofu init \
  -backend-config="address=${CI_SERVER_URL}/api/v4/projects/${CI_PROJECT_ID}/terraform/state/${TF_STATE_NAME}" \
  -backend-config="username=gitlab-ci-token" \
  -backend-config="password=${CI_JOB_TOKEN}" \
  ...
tofu validate

Weryfikuje poprawność konfiguracji bez łączenia z zewnętrznym backendem.

tofu plan -out=tfplan

Generuje plan zmian. Zależy od: Set Version + opentofu fmt + tflint + opentofu validate.

💥 deployment (deployment — child pipeline)

Section titled “💥 deployment (deployment — child pipeline)”
TF_STATE_NAME=$CI_ENVIRONMENT_NAME
tofu apply -auto-approve

Uruchamia pełny deployment dla każdego środowiska GitLab. Wprowadza rzeczywiste zmiany infrastruktury.

ZmiennaDomyślnaOpis
TOFU_VALIDATE_AUTOFIX"true"Autofix formatowania HCL: amend + push
TF_STATE_NAMEproductionNazwa stanu Terraform (validate, plan, deployment)
GITLAB_TOKEN— (CI secret)Wymagany przez opentofu-fmt i joby OpenTofu
JobWymagany
🧪 opentofu-plan✅ (required)

Joby OpenTofu (opentofu-fmt, tflint, opentofu-validate, opentofu-plan, deployment): registry.gitlab.com/pl.rachuna-net/artifacts/containers/opentofu:v1.1.2

Pozostałe joby: dziedziczą z common (python:v1.1.1 lub semantic-release).

Wszystkie joby uruchamiane na runnerze z tagiem gitlab-rnp.

.pipelines.opentofu-iac.*

Różnice względem pipelines/opentofu-module

Section titled “Różnice względem pipelines/opentofu-module”
Aspektopentofu-iacopentofu-module
Deployment (CD)tofu apply -auto-approve❌ brak
opentofu-validate✅ CI❌ brak
opentofu-plan✅ CI (tests stage)❌ brak
terraform-docs❌ brak✅ CI
Backend Terraform State✅ GitLab HTTP❌ nie dotyczy
PrzeznaczenieInfrastruktura (IaC)Moduł wielokrotnego użytku