Skip to content

Architektura rozwiązania

GitLab CI

GitLab CI (Continuous Integration) to wbudowany w GitLab system automatyzacji procesów budowania, testowania i wdrażania kodu.

GitLab

🔗 Repozytorium

Repozytorium procesów do ciągłej integracji i dostarczania (CI/CD) dla projektów

Reguły uruchamiania pipeline zdefiniowane są w common/workflow/main.yml. Na podstawie zdarzenia GitLab ustawiane są zmienne PIPELINE_TYPE i ARTIFACTS_TYPE, które sterują regułami wykonania jobów.

workflow

PriorytetWarunekPIPELINE_TYPEARTIFACTS_TYPE
1Tag $CI_COMMIT_TAG istniejeCD
2MR otwarty, nie jest DraftCIsnapshot
3Push na domyślną gałąź (main)CIrelease
4Push na dowolną inną gałąźCIsnapshot
fallbackŻaden warunek nie spełnionypipeline nie powstaje
flows/gitlab/
├── .gitlab-ci.yml                # Główny orkiestrator
├── common/                       # Wspólne komponenty dla wszystkich technologii
│   ├── .gitlab-ci.yml            # Orkiestrator common (includuje komponenty + instancje jobów)
│   ├── artifacts/main.yml        # Definicje artefaktów per job
│   ├── cache/main.yml            # Definicje cache per job
│   ├── helpers/                  # Współdzielone funkcje pomocnicze (logo, logger, job-prepare, job-docs, gitlab-tools)
│   ├── images/main.yml           # Obrazy Docker per job
│   ├── jobs/                     # Joby (wzorzec Job Capsule)
│   ├── needs/main.yml            # Zależności między jobami (DAG)
│   ├── resource_group/main.yml   # Grupy zasobów
│   ├── rules/main.yml            # Reguły wykonania per job
│   ├── stages/main.yml           # Definicja stagów
│   ├── variables/main.yml        # Zmienne globalne i per job
│   └── workflow/main.yml         # Reguły uruchamiania pipeline (PIPELINE_TYPE)
├── pipelines/                    # Szablony specyficzne dla technologii
│   ├── default/                  # Domyślny pipeline (gdy PROJECT_TYPE nie ustawiony)
│   ├── image-builder/            # Budowa obrazów kontenerów (Buildah)
│   ├── gitlab-pipelines/         # Pipeline CI/CD dla projektów GitLab
│   ├── gitlab-profile/           # Profile GitLab (zarządzanie pipeline meta)
│   ├── ansible-playbook/         # Zarządzanie i execucja Ansible playbook'ów
│   ├── ansible-role/             # Role Ansible — walidacja i linting
│   ├── opentofu-module/          # Moduły OpenTofu/Terraform
│   └── opentofu-iac/             # Infrastruktura OpenTofu/Terraform (IaC)
├── tests/                        # Walidacja
├── tools/                        # Skrypty generujące (create-job.sh, create-ci-technology.sh)
└── docs/                         # Dokumentacja dla developerów

Każdy job istnieje w dwóch warstwach: common definiuje domyślną implementację, a pipeline technologii może ją nadpisać przez własny main.yml z identyczną nazwą klucza YAML.

job-capsule

CI: prepare → validate → dependency → build → tests → publish
CD: prepare → validate → dependency → deployment → tests → publish
StagePrzeznaczenieCI/CD
prepare (.pre)Wyznaczenie wersji (dry-run semantic-release) + przygotowanie deploymentCI/CD
validateWalidacja konwencji i składni (conventional-commits, yamllint, shellcheck)CI
dependencyInstalacja zależnościCI
buildBudowa artefaktów (obraz, paczka)CI
deploymentWdrożenie na środowiskaCD
testsTesty jednostkoweCI
publishPublikacja artefaktów i finalny semantic-releaseCI

Każdy job to samodzielny katalog zawierający wszystkie pliki potrzebne do jego działania. Podział na osobne pliki .sh.yml jest zalecany przy dużych skryptach — pozwala utrzymać czytelność i umożliwia selektywne nadpisywanie przez technologie.

common/jobs/{nazwa-joba}/
├── main.yml                # Definicja joba (stage, image, rules, needs, artifacts)
├── script.sh.yml           # Główny skrypt joba
├── validate.sh.yml         # Walidacja parametrów wejściowych
├── before_script.sh.yml    # Setup przed uruchomieniem
├── after_script.sh.yml     # Cleanup po zakończeniu
└── README.md               # Dokumentacja dla użytkownika

Job w main.yml odwołuje się do komponentów common/ przez !reference:

.common.{job}.before_script.sh:
  - critical "Brak implementacji!"

.common.{job}.validate.sh:
  - warn "Brak implementacji!"

.common.{job}.script.sh:
  - critical "Brak implementacji!"

.common.{job}.after_script.sh:
  - critical "Brak implementacji!"

.common.{job}:
  image:     !reference [.common.images, {job}]
  stage:     !reference [.common.stages, {job}]
  variables: !reference [.common.variables, {job}]
  rules:     !reference [.common.rules, {job}]
  needs:     !reference [.common.needs, {job}]
  artifacts: !reference [.common.artifacts, {job}]
  cache:     !reference [.common.cache, {job}]
PlikKlucz YAMLCo przechowuje
artifacts/main.yml.common.artifactsCo job produkuje (ścieżki, czas retencji)
cache/main.yml.common.cacheStrategia cache per job
images/main.yml.common.imagesObraz Docker dla każdego joba
needs/main.yml.common.needsDAG zależności między jobami
resource_group/main.yml.common.resource_groupGrupy zasobów (np. deployment per environment)
rules/main.yml.common.rulesReguły wykonania per job
stages/main.yml.common.stagesPrzypisanie stagów per job
variables/main.yml.common.variablesZmienne wejściowe joba

Każda technologia jest samowystarczalna — ma własne kopie obiektów z prefiksem .pipelines.{tech}.*:

pipelines/{tech}/
├── .gitlab-ci.yml          # Orkiestrator — instancje jobów
├── artifacts/main.yml      # .pipelines.{tech}.artifacts
├── cache/main.yml          # .pipelines.{tech}.cache
├── helpers/                # Lokalne aliasy helperów common
├── images/main.yml         # .pipelines.{tech}.images
├── needs/main.yml          # .pipelines.{tech}.needs
├── resource_group/main.yml # .pipelines.{tech}.resource_group
├── rules/main.yml          # .pipelines.{tech}.rules
├── stages/main.yml         # .pipelines.{tech}.stages
├── variables/main.yml      # .pipelines.{tech}.variables
└── jobs/
    ├── conventional-commits/ # Deleguje do .common.*
    ├── yamllint/             # Deleguje do .common.*
    ├── shellcheck/           # Deleguje do .common.*
    ├── versioning/           # Deleguje do .common.*
    ├── dependency/           # Deleguje do .common.* lub logika technologii
    ├── build/                # Logika specyficzna dla technologii
    ├── unit-test/            # Logika specyficzna dla technologii
    ├── publish/              # Logika specyficzna dla technologii
    ├── environment-deployment-prepare/ # Deleguje do .common.*
    ├── trigger-deployment/   # Deleguje do .common.*
    └── deployment/           # Logika specyficzna dla technologii