OpenTofu Module
Ten pipeline jest przeznaczony dla repozytoriów z modułami OpenTofu/Terraform, czyli takich, które nie wykonują wdrożeń infrastruktury (apply), a jedynie dostarczają wielokrotnego użytku kod IaC. Celem jest utrzymanie:
- spójnego formatowania (
tofu fmt) - jakości kodu (
tflint) - aktualnej dokumentacji modułu (
terraform-docs) oraz wymuszenie, aby README nie „dryfowało” względem kodu
Pipeline działa wyłącznie w trybie walidacyjnym (stage: validate).
Wymagania
Section titled “Wymagania”-
Repozytorium zawiera moduł OpenTofu/Terraform (
*.tf). -
W repo istnieje
README.md(wymagane przez krok diff). -
Obraz kontenera zawiera narzędzia:
tofutflintterraform-docs
-
Dostępny jest wspólny helper:
.helper_gitlab-ci.sh(referencja wbefore_script).
Struktura pipeline
Section titled “Struktura pipeline”Zmienne
Section titled “Zmienne”| Zmienna | Domyślna wartość | Opis |
|---|---|---|
OPENTOFU_IMAGE | registry.rachuna-net.pl/pl.rachuna-net/containers/opentofu:1.0.0 | Obraz narzędziowy z OpenTofu i narzędziami walidacyjnymi. |
Joby: opis i zachowanie
Section titled “Joby: opis i zachowanie”1) 🕵 opentofu fmt (stage: validate)
Section titled “1) 🕵 opentofu fmt (stage: validate)”Cel: Sprawdzenie formatowania plików modułu bez modyfikacji repo.
Komenda:
Kiedy się uruchamia: zawsze (na sukces), na każdym pipeline.
Efekt: pipeline failuje, jeżeli pliki nie są sformatowane zgodnie z tofu fmt.
2) ✅ tflint (stage: validate)
Section titled “2) ✅ tflint (stage: validate)”Cel: Linting modułu – wykrywanie problemów jakościowych oraz antywzorców.
Komenda:
Uwagi praktyczne:
- Jeżeli w repozytorium jest
.tflint.hcl, totflintużyje tej konfiguracji. - W pipeline nie ma
tofu init, więc jeśli używasz reguł wymagających pełnego kontekstu providerów/modułów, rozważ dopisanie init (opcjonalnie). W większości repo modułowychtflintjest używany w trybie statycznym i to jest akceptowalne.
3) ✅ terraform-docs (stage: validate)
Section titled “3) ✅ terraform-docs (stage: validate)”Cel: Wymuszenie, aby dokumentacja modułu była aktualna, a README nie odbiegało od tego, co wygenerowałby terraform-docs.
Job działa jako „check”, a nie jako „formatter” – nie commitujemy zmian automatycznie, tylko pipeline failuje, jeśli README wymaga aktualizacji.
Logika joba
Section titled “Logika joba”-
Tworzy kopię README:
-
Generuje dokumentację jedną z dwóch metod:
-
jeśli istnieje
.terraform-docs.yml:(zwykle generuje/aktualizuje README wg konfiguracji)
-
jeśli nie ma
.terraform-docs.yml:(nadpisuje README wygenerowanym markdownem)
-
-
Porównuje pliki:
Jak interpretować wynik
Section titled “Jak interpretować wynik”- Brak różnic → README jest aktualne → job przechodzi.
- Są różnice → README wymaga aktualizacji →
diffzwróci kod != 0 → job failuje.
Co ma zrobić developer, gdy job failuje
Section titled “Co ma zrobić developer, gdy job failuje”Lokalnie uruchomić ten sam mechanizm generowania dokumentacji:
-
jeśli repo ma
.terraform-docs.yml: -
jeśli repo nie ma
.terraform-docs.yml:
Następnie commit/push zmian w README.
Zakres pipeline i intencja projektowa
Section titled “Zakres pipeline i intencja projektowa”Ten pipeline celowo:
- nie wykonuje
tofu init - nie wykonuje
tofu validate - nie wykonuje
plan/apply - nie używa backendu state
To jest właściwe dla modułów, bo:
- moduł nie jest „wdrażalny” sam w sobie,
- jego wartość to jakość, konwencje i dokumentacja,
- wdrożenia odbywają się w repozytoriach „root module / live infra”, a nie w repo modułu.
Typowe problemy i diagnoza
Section titled “Typowe problemy i diagnoza”terraform-docs failuje przez brak README.md
Section titled “terraform-docs failuje przez brak README.md”Ten pipeline zakłada, że README.md istnieje. Jeśli moduł go nie ma, dodaj minimalny README (nawet pusty nagłówek) albo zmodyfikuj job tak, aby tworzył plik, gdy nie istnieje.
terraform-docs nadpisuje README, a diff zawsze wykrywa zmiany
Section titled “terraform-docs nadpisuje README, a diff zawsze wykrywa zmiany”Najczęstsze powody:
- generacja zależy od wersji
terraform-docs(różne wersje = inny output), - README zawiera ręczne sekcje, które są kasowane przez domyślny tryb.
Rekomendacja: używać .terraform-docs.yml i/lub trybu z markerami (<!-- BEGIN_TF_DOCS --> / <!-- END_TF_DOCS -->) – wtedy terraform-docs aktualizuje tylko sekcję, a reszta README zostaje.
tflint zgłasza błędy bez sensu dla modułu
Section titled “tflint zgłasza błędy bez sensu dla modułu”Dodaj .tflint.hcl i skonfiguruj reguły modułowe (np. wyłączając te, które wymagają init/provider context).
Referencja: definicje z pipeline
Section titled “Referencja: definicje z pipeline”🕵 opentofu fmt: format check✅ tflint: lint check✅ terraform-docs: README drift check (fail, jeśli README wymaga regeneracji)
Pipeline: opentofu-module
Section titled “Pipeline: opentofu-module”Pipeline CI dla projektów OpenTofu/Terraform Module. Obsługuje formatowanie kodu, statyczną analizę, generowanie dokumentacji oraz wersjonowanie modułu.
Użycie
Section titled “Użycie”W projekcie dodaj do .gitlab-ci.yml:
Joby i stagi
Section titled “Joby i stagi”Przepływ CI (branch != main)
Section titled “Przepływ CI (branch != main)”Tabela jobów
Section titled “Tabela jobów”| Job | Nazwa emoji | Stage | CI | CD |
|---|---|---|---|---|
| versioning (Set Version) | 🕵 Set Version | .pre | ✅ | ❌ |
| environment-deployment-prepare | 🔧 Prepare Dynamic Deployment | .pre | ❌ | ❌ |
| conventional-commits | 🔍 Analyze Conventional Commits | validate | ✅ | ❌ |
| yamllint | 🕵 yamllint | validate | ✅* | ❌ |
| shellcheck | 🐚 shellcheck | validate | ✅* | ❌ |
| opentofu-fmt | 🕵 opentofu fmt | validate | ✅ | ❌ |
| tflint | 🔍 tflint | validate | ✅ | ❌ |
| terraform-docs | 📄 terraform-docs | validate | ✅ | ❌ |
| dependency | 📦 dependency | dependency | ❌ | ❌ |
| build | 🚀 build | build | ❌ | ❌ |
| trigger-deployment | 🚀 Trigger Deployment | deployment | ❌ | ❌ |
| deployment | 💥 deployment | deployment | ❌ | ❌ |
| unit-test | 🧪 unit-test | tests | ❌ | ❌ |
| publish | 🌐 publish | publish | ❌ | ❌ |
| versioning (Publish Version) | 📍 Publish Version | publish | ✅ | ❌ |
* tylko gdy zmienił się odpowiedni typ pliku względem main
Pipeline nie obsługuje CD — wszystkie joby poza walidacją i wersjonowaniem mają
when: never.
OpenTofu-specyficzne joby
Section titled “OpenTofu-specyficzne joby”🕵 opentofu fmt (validate)
Section titled “🕵 opentofu fmt (validate)”Sprawdza i opcjonalnie naprawia formatowanie kodu HCL.
Tryb autofix (TOFU_VALIDATE_AUTOFIX: "true", domyślny):
tofu fmt -recursive— formatuje wszystkie pliki.tfgitlab_commit_amend— amend ostatniego commita i force-push na branch- Jeśli push się powiódł (
GITLAB_AMEND_RESULT == "pushed") — triggeruje nowy pipeline
Tryb check (TOFU_VALIDATE_AUTOFIX: "false"):
Kończy się błędem jeśli formatowanie jest niezgodne — wymaga ręcznej korekty lokalnej.
🔍 tflint (validate)
Section titled “🔍 tflint (validate)”Statyczna analiza kodu OpenTofu/Terraform.
--init pobiera pluginy zdefiniowane w .tflint.hcl. --recursive sprawdza wszystkie podmoduły.
📄 terraform-docs (validate)
Section titled “📄 terraform-docs (validate)”Generuje lub weryfikuje dokumentację modułu w README.md.
Tryb autofix (TERRAFORM_DOCS_AUTOFIX: "true", domyślny):
- Generuje dokumentację (używa
.terraform-docs.ymljeśli istnieje, inaczejterraform-docs md . > README.md) - Porównuje z istniejącym
README.md(diff) - Jeśli różnice —
gitlab_commit_amend+ force-push + nowy pipeline
Tryb check (TERRAFORM_DOCS_AUTOFIX: "false"):
Kończy się błędem jeśli README.md jest nieaktualny.
Zmienne konfiguracyjne
Section titled “Zmienne konfiguracyjne”| Zmienna | Domyślna | Opis |
|---|---|---|
TOFU_VALIDATE_AUTOFIX | "true" | Autofix formatowania: amend + push |
TERRAFORM_DOCS_AUTOFIX | "true" | Autofix dokumentacji: amend + push |
GITLAB_TOKEN | — (CI secret) | Wymagany przez opentofu-fmt do gitlab_commit_amend |
Zależności 📍 Publish Version
Section titled “Zależności 📍 Publish Version”| Job | Wymagany |
|---|---|
🕵 Set Version | ✅ (artifacts) |
🕵 opentofu fmt | ✅ (required) |
🔍 tflint | ✅ (required) |
📄 terraform-docs | ✅ (required) |
🔍 Analyze Conventional Commits | optional |