Poniżej znajduje się lista stworzonych komponentów
component | version |
---|---|
ast | |
build | |
deploy | |
prepare | |
release | |
sast | |
unit-test | |
validate |
This is the multi-page printable view of this section. Click here to print.
Komponent do przygotowania procesu CI/CD.
Job print-input-parameters
umożliwia czytelne i uporządkowane wyświetlenie zmiennych procesu gitlab-ci, w tym wersji komponentów CI/CD oraz obrazów kontenerowych. Jest szczególnie przydatny podczas wczesnych etapów pipeline’a (etap prepare
) do weryfikacji, czy zmienne zostały poprawnie przekazane i rozwinięte.
Job, który wyświetla informacje o zmiennych procesowych CI
inputs
)Nazwa | Typ | Domyślna wartość | Opis |
---|---|---|---|
docker_image |
string | registry.gitlab.com/pl.rachuna-net/containers/python:2.0.0 |
Obraz Dockera z interpreterem Pythona lub shellem |
Komponent wypisuje wartości m.in. następujących zmiennych:
GITLAB_CI_VERSION
COMPONENT_VERSION_*
COMPONENT_VERSION_DEPLOY
CONTAINER_IMAGE_*
CONTAINER_IMAGE_PYTHON
VAULT_ADDR
SONAR_HOST_URL
Skrypt wypisuje dane w formie tabeli ASCII w logach pipeline’u, np.:
===> 💾 Print set inputs Variables
┌────────────────────────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Variable │ Value │
├────────────────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ CONTAINER_IMAGE_TERRAFORM │ registry.gitlab.com/pl.rachuna-net/containers/terraform:1.0.0 │
│ COMPONENT_VERSION_DEPLOY │ v1.2.3 │
...
└────────────────────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────┘
include:
- component: $CI_SERVER_FQDN/pl.rachuna-net/cicd/components/prepare/input_parameters@$COMPONENT_VERSION_PREPARE
inputs:
docker_image: $CONTAINER_IMAGE_PYTHON
🔍 input parameters:
stage: prepare
rules:
- when: on_success
Job Analyze Conventional Commits
, który automatycznie weryfikuje komunikaty commitów pod kątem zgodności z konwencją Conventional Commits, pomijając commity typu Merge i Revert oraz przerywając pipeline w przypadku wykrycia niezgodności.
include:
- component: $CI_SERVER_FQDN/pl.rachuna-net/cicd/components/prepare/conventional_commits@$COMPONENT_VERSION_PREPARE
inputs:
docker_image: $CONTAINER_IMAGE_PYTHON
🔍 Analyze Conventional Commits:
stage: prepare
rules:
- when: on_success
Komponent do automatycznej walidacji jakości i poprawności kodu w procesach CI/CD.
Job Validate files (conftest)
pozwala na automatyczną walidację plików YAML/JSON w oparciu o polityki OPA/Conftest.
Pipeline pobiera repozytorium z politykami, przygotowuje środowisko i uruchamia testy w zadanym namespace
.
Idealnie sprawdza się na etapie validate
w pipeline’ach CI/CD.
inputs
)Nazwa | Typ | Domyślna wartość | Opis |
---|---|---|---|
docker_image |
string | registry.gitlab.com/pl.rachuna-net/containers/conftest:1.0.0 |
Obraz Dockera z narzędziem Conftest |
logo_url |
string | https://gitlab.com/pl.rachuna-net/cicd/gitlab-ci/-/raw/main/_configs/_logo?ref_type=heads |
Adres URL logo wyświetlanego w logach |
repository_policies |
string | git@gitlab.com:pl.rachuna-net/discipline.git |
Repozytorium GitLab z politykami OPA/Conftest |
repository_policies_branch |
string | main |
Branch repozytorium z politykami |
repository_policies_path |
string | policies/conftest |
Ścieżka katalogu polityk w repozytorium |
source_files |
string | *.yml |
Pliki w repozytorium, które mają być testowane |
namespace_policy |
string | (puste) | Przestrzeń nazw dla polityk Conftest (namespace) |
CONTAINER_IMAGE_CONFTEST
– obraz Dockera Conftest (na podstawie inputs.docker_image
)LOGO_URL
– ścieżka do logo (na podstawie inputs.logo_url
)REPOSITORY_POLICIES
– repozytorium z politykamiREPOSITORY_POLICIES_BRANCH
– branch repozytorium z politykamiREPOSITORY_POLICIES_PATH
– katalog polityk w repozytoriumSOURCE_FILES
– pliki do testowaniaNAMESPACE_POLICY
– przestrzeń nazw polityk ConftestJob wykonuje następujące kroki:
LOGO_URL
jest ustawiony)._function_print_row
).repository_policies
) w odpowiednim branchu.source_files
) i polityk (repository_policies_path
) w przestrzeni nazw namespace_policy
.Przykład logu:
===> 🔬 Conftest Validate - Parameters
┌───────────────────────────────────┬─────────────────────────────────────────────────────┐
│ Variable │ Value │
├───────────────────────────────────┼─────────────────────────────────────────────────────┤
│ REPOSITORY_POLICIES │ git@gitlab.com:pl.rachuna-net/discipline.git │
│ REPOSITORY_POLICIES_PATH │ policies/conftest │
│ SOURCE_FILES │ *.yml │
└───────────────────────────────────┴─────────────────────────────────────────────────────┘
Waliduje wskazane pliki repozytorium względem polityk Conftest:
🔬 Validate files (conftest):
stage: validate
image: $CONTAINER_IMAGE_CONFTEST
before_script:
- git config --global --add safe.directory ${CI_PROJECT_DIR}
- [ ! -z "${LOGO_URL}" ] && curl -s "${LOGO_URL}"
- !reference [.validate:_function_print_row]
- !reference [.validate:conftest_input_variables]
- !reference [.validate:conftest_prepare]
script:
- conftest test $SOURCE_FILES --policy $REPOSITORY_POLICIES_PATH --namespace $NAMESPACE_POLICY
include:
- component: $CI_SERVER_FQDN/pl.rachuna-net/cicd/components/validate/conftest@$COMPONENT_VERSION_VALIDATE
inputs:
repository_policies: git@gitlab.com:pl.rachuna-net/discipline.git
repository_policies_path: policies/k8s
source_files: "config.yml"
namespace_policy: image_builder
⚡ Dzięki temu szablonowi szybko weryfikujesz zgodność konfiguracji z politykami OPA/Conftest bez ręcznej konfiguracji za każdym razem w pipeline’ach.
Komponent Yamllint jest odpowiedzialny za walidację wszystkich plików YAML w repozytorium w ramach stage validate.
Wykorzystuje narzędzie yamllint
oraz centralny plik konfiguracyjny .yamllint.yml
, aby zapewnić spójność stylu i poprawności składniowej plików YAML.
function_print_row.yml
, logo.yml
, itp.)Job, który wykonuje walidację składni plików YAML w repozytorium przy użyciu narzędzia yamllint.
inputs
)Nazwa | Typ | Domyślna wartość | Opis |
---|---|---|---|
docker_image |
string | registry.gitlab.com/pl.rachuna-net/containers/python:2.0.0 |
Obraz Dockera z interpreterem Pythona lub shellem. |
logo_url |
string | https://gitlab.com/pl.rachuna-net/cicd/gitlab-ci/-/raw/main/_configs/_logo?ref_type=heads |
URL logotypu wyświetlanego w logach joba. |
validate_repo_namespace |
string | pl.rachuna-net/cicd/components/validate |
Namespace i ścieżka do repozytorium komponentu validate. |
validate_repo_branch |
string | main |
Gałąź komponentu validate, z której pobierane są pliki. |
yamllint_path |
string | _configs/validate/.yamllint.yml |
Ścieżka do pliku konfiguracyjnego yamllint. |
Job ustawia i wykorzystuje poniższe zmienne środowiskowe:
CONTAINER_IMAGE_PYTHON
– wybrany obraz Dockera.LOGO_URL
– adres logotypu, który jest opcjonalnie pobierany w trakcie uruchamiania joba.VALIDATE_REPO_NAMESPACE
– namespace repozytorium komponentu validate.VALIDATE_REPO_BRANCH
– gałąź repozytorium komponentu validate.YAMLLINT_PATH
– ścieżka do pliku konfiguracyjnego yamllint.Job wykonuje linting plików YAML i wypisuje wyniki w logach pipeline’u w formie standardowej dla narzędzia yamllint, np.:
===> 🔍 YAML lint results
source/ci-template.yml
10:3 warning missing document start "---" (document-start)
22:1 error too many blank lines (1 > 0) (empty-lines)
W przypadku błędów job kończy się statusem failed
.
Komponent do zarządzania wersjami i publikacji bibliotek i aplikacji.
SemVer - (Semantic Versioning) to standard wersjonowania oprogramowania, który określa sposób nadawania numerów wersji w formacie MAJOR.MINOR.PATCH.
Job, który odpowiada za wersjonowanie i publikację zmian w repozytorium za pomocą narzędzia semantic-release. Szablon składa się z dwóch kroków:
[!NOTE]
Wymagania:
- Obraz kontenera dostępny jest tutaj.
- Stosowanie standardu opisywania commitów Conventional Commits
inputs
)Nazwa | Typ | Domyślna wartość | Opis |
---|---|---|---|
docker_image |
string | registry.gitlab.com/pl.rachuna-net/containers/semantic-release:2.0.0 |
Obraz Dockera zawierający semantic-release. |
logo_url |
string | https://gitlab.com/pl.rachuna-net/cicd/gitlab-ci/-/raw/main/_configs/_logo?ref_type=heads |
URL logotypu wyświetlanego w logach joba. |
debug |
string | false |
Włącza tryb debugowania (--debug ). |
dry_run |
string | false |
Uruchamia semantic-release w trybie dry-run (--dry-run ). |
component_repo_namespace |
string | pl.rachuna-net/cicd/components/release |
Namespace i ścieżka do repozytorium komponentu. |
component_repo_branch |
string | main |
Gałąź repozytorium komponentu. |
releaserc_path |
string | _configs/release/.releaserc.js |
Ścieżka do pliku konfiguracyjnego semantic-release. |
Job ustawia i wykorzystuje poniższe zmienne środowiskowe:
CONTAINER_IMAGE_SEMANTIC_RELEASE
– obraz Dockera z semantic-release.LOGO_URL
– adres logotypu.DEBUG
– flaga debugowania (dziedziczona z inputs.debug
).VERSIONING_DEBUG
– włącza dodatkowy debug semantic-release.VERSIONING_DRY_RUN
– uruchamia semantic-release w trybie dry-run.COMPONENT_REPO_NAMESPACE
– namespace repozytorium komponentu.COMPONENT_REPO_BRANCH
– gałąź repozytorium komponentu.RELEASERC_FILE
– ścieżka do pliku .releaserc.js
.Job generuje:
Plik CHANGELOG.md
– zawierający opis zmian.
Plik versioning.env
(zapisany jako artifact dotenv
) z informacjami o wersji, np.:
VERSION=1.2.3
VERSION_MAJOR=1
VERSION_MINOR=2
VERSION_PATCH=3
Logi semantic-release z informacją o wygenerowanej wersji i ewentualnie o publikacji.
include:
- component: '$CI_SERVER_FQDN/pl.rachuna-net/cicd/components/release@$COMPONENT_VERSION_RELEASE'
inputs:
docker_image: "registry.gitlab.com/pl.rachuna-net/containers/semantic-release:2.0.0"
debug: "true"
dry_run: "false"
prepare
VERSIONING_DRY_RUN: "true"
) w celu przygotowania wersji i changeloga.release
W pierwszej kolejności sprawdzane jest - czy można zwersjonować aplikacje na odpowiednim branchu
"branches": [
{
"name": "feature/*",
"channel": "feat-${name.replace(/^feature\\//, '').substring(0, 20)}",
"prerelease": "feat-${name.replace(/^feature\\//, '').substring(0, 20)}"
},
{
"name": "epic/*",
"channel": "epic-${name.replace(/^epic\\//, '').replace(/[^A-Za-z0-9]/, '').substring(0, 20)}",
"prerelease": "epic-${name.replace(/^epic\\//, '').replace(/[^A-Za-z0-9]/, '').substring(0, 20)}"
},
{ "name": "alpha", "channel": "alpha", "prerelease": true },
{ "name": "release", "channel": "rc", "prerelease": true },
{ "name": "hotfix", "channel": "ht", "prerelease": true },
{ "name": "main" }
],
Komponent sprawdza, czy czyta wszystkie informacje o commitach zgodnie z standardem Conventional Commits
"plugins": [
[ "@semantic-release/commit-analyzer",
{
"preset": "conventionalcommits",
"releaseRules": [
{ "breaking": true, "release": "major" },
{ "type": "feat", "release": "minor" },
{ "type": "fix", "release": "patch" },
{ "type": "style", "release": "patch" },
{ "type": "perf", "release": "patch" },
{ "type": "test", "release": "patch" },
{ "type": "docs", "release": "patch" },
{ "type": "sec", "release": "patch" }
]
}
],
Następnie generuje release notes
[
"@semantic-release/release-notes-generator",
{
"preset": "conventionalcommits",
"presetConfig": {
"types": [
{ "type": "feat", "section": "✨ Features ✨" },
{ "type": "fix", "section": "🐛 Bug Fixes 🐛" },
{ "type": "revert", "section": "⏮️️ Reverts ⏮️️" },
{ "type": "perf", "section": "🔧 Performance Improvements 🔧" },
{ "type": "docs", "section": "📝 Documentation 📝" },
{ "type": "build", "section": "📀 Build 📀" },
{ "type": "test", "section": "💚 Tests 💚" },
{ "type": "ci", "section": "🏁 CI/CD 🏁" }
]
}
}
],
Generowanie localnie pliku CHANGELOG.md
[
"@semantic-release/changelog",
{
"changelogFile": "CHANGELOG.md"
}
],
Integracja z gitab
[
"@semantic-release/gitlab"
]
{
name: "versioning-variables",
generateNotes: (pluginConfig, context) => {
const releaseNote = context.nextRelease.notes;
const nextVersion = context.nextRelease.version;
// Check if the version is a final version or a snapshot
const finalVersionRegex = /(\d+\.\d+\.\d+)/;
const matchFinalVersion = nextVersion.match(finalVersionRegex);
let artifactType = "snapshot";
if (matchFinalVersion) {
artifactType = "release";
}
// Extract JIRA issues from commits
const jiraRegexp = /\b[A-Z][A-Z0-9_]+-[1-9][0-9]*/g;
const jiraSet = new Set();
for (const commit of context.commits) {
if (commit.message) {
const matchJIRA = commit.message.match(jiraRegexp);
if (matchJIRA) {
matchJIRA.forEach(jira => jiraSet.add(match));
}
}
}
// Create a file with the environment variables
const uniqJiraList = Array.from(jiraSet)
const environmentList = [
{ key: "RELEASE_CANDIDATE_VERSION", value: nextVersion },
{ key: "ARTIFACTS_TYPE", value: artifactType },
{ key: "JIRA_ISSUES_IDS", value: uniqJiraList.join(", ") }
]
const fileContent = environmentList.map(env => `${env.key}=${env.value}`).join("\n");
fs.writeFileSync("versioning.env", fileContent);
}
}
Komponent do analizy pod kątem bezpiecezństwa (Application Security Testing).
Job SonarQube Scanner (SAST)
umożliwia analizę jakości kodu źródłowego oraz wykrywanie błędów z wykorzystaniem platformy SonarQube/SonarCloud. Szablon należy uruchamiać w etapie sast
, aby mieć pewność, że jakość kodu spełnia wymagania organizacji.
inputs.docker_image
.sonar_host_url
, sonar_token
, sonar_project_key
).inputs
)Nazwa | Typ | Domyślna wartość | Opis |
---|---|---|---|
docker_image |
string | registry.gitlab.com/pl.rachuna-net/containers/sonar-scanner:2.0.0 |
Obraz Dockera zawierający SonarQube Scanner |
logo_url |
string | https://gitlab.com/pl.rachuna-net/cicd/gitlab-ci/-/raw/main/_configs/_logo?ref_type=heads |
Adres URL logo wyświetlanego w logach |
sonar_user_home |
string | ${CI_PROJECT_DIR}/.sonar |
Lokalny katalog roboczy SonarQube |
sonar_host_url |
string | https://sonarcloud.io |
Adres instancji SonarQube lub SonarCloud |
sonar_organization |
string | pl-rachuna-net |
Nazwa organizacji w SonarCloud |
sonar_project_name |
string | (puste) | Nazwa projektu analizowanego w SonarQube |
sonar_project_key |
string | (puste) | Klucz projektu w SonarQube (unikalny identyfikator) |
sonar_token |
string | (puste) | Token uwierzytelniający do SonarQube |
sonar_project_description |
string | (puste) | Opis projektu w SonarQube |
sonar_project_version |
string | 1.0.0 |
Wersja analizowanego projektu |
sonar_sources |
string | . |
Ścieżka do katalogu ze źródłami do analizy |
CONTAINER_IMAGE_SONAR_SCANNER
– obraz Dockera SonarQube Scanner (na podstawie inputs.docker_image
)SONAR_USER_HOME
– katalog roboczy SonarQubeSONAR_HOST_URL
– adres instancji SonarQube/SonarCloudSONAR_ORGANIZATION
– nazwa organizacjiSONAR_PROJECT_KEY
– klucz projektu w SonarQubeSONAR_PROJECT_NAME
– nazwa projektuSONAR_PROJECT_DESCRIPTION
– opis projektuSONAR_PROJECT_VERSION
– wersja projektuSONAR_SOURCES
– ścieżki źródeł do analizySONAR_TOKEN
– token uwierzytelniający do SonarQubeJob wykonuje następujące kroki:
Wyświetlenie zmiennych wejściowych i konfiguracji SonarQube.
Uruchomienie SonarQube Scanner z zadeklarowanymi parametrami:
SONAR_SOURCES
),SONAR_HOST_URL
).Pipeline zakończy się niepowodzeniem, jeśli analiza SonarQube wykryje błędy jakościowe powodujące blokadę (quality gate failure).
Analizuje kod źródłowy i przesyła wyniki do SonarQube/SonarCloud:
💪 sonarqube scanner:
stage: sast
image: $CONTAINER_IMAGE_SONAR_SCANNER
before_script:
- git config --global --add safe.directory ${CI_PROJECT_DIR}
- [ ! -z "${LOGO_URL}" ] && curl -s "${LOGO_URL}"
- !reference [.ast:_function_print_row]
- !reference [.ast:sonarqube_input_variables]
- !reference [.ast:sonarqube-init]
script:
- |
sonar-scanner \
-Dsonar.projectKey="${SONAR_PROJECT_KEY}" \
-Dsonar.organization="${SONAR_ORGANIZATION}" \
-Dsonar.projectName="${SONAR_PROJECT_NAME}" \
-Dsonar.projectDescription="${CI_PROJECT_DESCRIPTION}" \
-Dsonar.projectVersion="${SONAR_PROJECT_VERSION}" \
-Dsonar.sources="${SONAR_SOURCES}" \
-Dsonar.sourceEncoding=UTF-8 \
-Dsonar.token="${SONAR_TOKEN}"
rules:
- when: on_success
include:
- component: $CI_SERVER_FQDN/pl.rachuna-net/cicd/components/ast/sonarqube@$COMPONENT_VERSION_SONARQUBE
💪 sonarqube scanner:
variables:
SONAR_PROJECT_KEY: $CI_PROJECT_NAME
SONAR_PROJECT_NAME: "Project $CI_PROJECT_NAME"
SONAR_TOKEN: $SONAR_TOKEN
rules:
- when: on_success
Job Trivy image scan (DAST)
umożliwia automatyczne skanowanie obrazów kontenerów pod kątem luk bezpieczeństwa przy użyciu narzędzia Trivy.
Szablon można uruchamiać w etapie integration-test
, aby upewnić się, że obraz nie zawiera znanych podatności o poziomie HIGH lub
CRITICAL.
inputs.docker_image
).inputs.container_to_analyze
).inputs
)Nazwa | Typ | Domyślna wartość | Opis |
---|---|---|---|
docker_image |
string | registry.gitlab.com/pl.rachuna-net/containers/buildah:1.0.0 |
Obraz Dockera zawierający narzędzie Trivy |
logo_url |
string | https://gitlab.com/pl.rachuna-net/cicd/gitlab-ci/-/raw/main/_configs/_logo?ref_type=heads |
Adres URL logo wyświetlanego w logach |
container_to_analyze |
string | (puste) | Pełna nazwa obrazu, który ma być skanowany |
CONTAINER_IMAGE_TRIVY
– obraz Dockera Trivy (na podstawie inputs.docker_image
)CONTAINER_TO_ANALYZE
– nazwa obrazu kontenera do przeskanowania (na podstawie inputs.container_to_analyze
)TRIVY_NO_PROGRESS
– wyłącza pasek postępu w logach (domyślnie true
)TRIVY_CACHE_DIR
– lokalny katalog cache Trivy (domyślnie .trivycache/
)Job wykonuje następujące kroki:
Uruchomienie skanowania obrazu kontenera (CONTAINER_TO_ANALYZE
) z użyciem Trivy:
--exit-code 0
).--exit-code 1
).Wykorzystanie cache Trivy w katalogu .trivycache/
w celu przyspieszenia kolejnych skanów.
Skanuje wskazany obraz kontenera i kończy pipeline, jeśli znajdzie luki o poziomie CRITICAL:
🔬 trivy (dast):
image: $CONTAINER_IMAGE_TRIVY
stage: integration-test
services:
- name: $CONTAINER_IMAGE_TRIVY
alias: buildah-dind
allow_failure: true
before_script:
- git config --global --add safe.directory ${CI_PROJECT_DIR}
- [ ! -z "${LOGO_URL}" ] && curl -s "${LOGO_URL}"
- !reference [.ast:trivy_input_variables]
script:
- trivy image --exit-code 0 --severity HIGH $CONTAINER_TO_ANALYZE
- trivy image --exit-code 1 --severity CRITICAL $CONTAINER_TO_ANALYZE
cache:
paths:
- .trivycache/
include:
- component: $CI_SERVER_FQDN/pl.rachuna-net/cicd/components/ast/trivy@$COMPONENT_VERSION_TRIVY
🔬 trivy (dast):
allow_failure: true
variables:
CONTAINER_TO_ANALYZE: $CI_REGISTRY_IMAGE:$RELEASE_CANDIDATE_VERSION
rules:
- when: on_success
Komponentu odpowiedzialne za budowanie i publikacje kontenerów.
Job Build & publish container image
umożliwia budowanie i publikację obrazów kontenerów w rejestrze Docker/GitLab z użyciem narzędzia Buildah. Szablon wspiera wieloetapowy proces: budowanie, publikowanie i testowanie obrazu. Idealny do wykorzystania w etapach build
, publish
i integration-test
w pipeline’ach CI/CD.
inputs.docker_image
).CI_REGISTRY
, CI_REGISTRY_USER
, CI_REGISTRY_PASSWORD
).buildah_config_path
).inputs
)Nazwa | Typ | Domyślna wartość | Opis |
---|---|---|---|
docker_image |
string | registry.gitlab.com/pl.rachuna-net/containers/buildah:1.0.0 |
Obraz Dockera zawierający narzędzie Buildah |
logo_url |
string | https://gitlab.com/pl.rachuna-net/cicd/gitlab-ci/-/raw/main/_configs/_logo?ref_type=heads |
Adres URL logo wyświetlanego w logach |
buildah_config_path |
string | config.yml |
Ścieżka do definicji obrazu kontenera w formacie YAML |
container_version |
string | latest |
Wersja obrazu kontenera, który będzie budowany |
docker_test_script_path |
string | container_test.sh |
Ścieżka do skryptu testowego uruchamianego w zbudowanym obrazie (job 🧪 test docker image ) |
CONTAINER_IMAGE_BUILDAH
– obraz Dockera Buildah (na podstawie inputs.docker_image
)LOGO_URL
– ścieżka do logo (na podstawie inputs.logo_url
)CONTAINER_VERSION
– wersja obrazu (na podstawie inputs.container_version
)FULL_IMAGE_NAME
– pełna nazwa obrazu: $CI_REGISTRY_IMAGE:$CONTAINER_VERSION
BUILDAH_CONFIG_FILE_PATH
– ścieżka do pliku konfiguracji Buildah (na podstawie inputs.buildah_config_path
)DOCKER_TEST_SCRIPT_PATH
– skrypt testowy do uruchomienia w kontenerzeSTORAGE_DRIVER
, BUILDAH_FORMAT
, BUILDAH_ISOLATION
, BUILDAH_STORAGE_ROOT
, BUILDAH_STORAGE_RUNROOT
Szablon wykonuje następujące kroki:
Budowanie obrazu kontenera na podstawie buildah_config_path
:
base_image
)custom_repos
)ENTRYPOINT
oraz CMD
Zapis obrazu do tarballa (container-image.tar
).
Publikacja obrazu w rejestrze Docker/GitLab (job 🌐 publish container image
).
Testowanie obrazu z wykorzystaniem skryptu testowego (job 🧪 test docker image
).
Buduje obraz kontenera na podstawie pliku konfiguracyjnego config.yml
Przykładowy plik config yml:
---
base_image: ubuntu:noble
labels:
maintainer: "Maciej Rachuna <rachuna.maciej@gmail.com>"
version: "1.0.0"
image_source: "https://gitlab.com/pl.rachuna-net/containers/terraform"
env:
DEBIAN_FRONTEND: noninteractive
TF_IN_AUTOMATION: "true"
LANG: C.UTF-8
before_build_commands:
## terraform docs
- curl -sLo ./terraform-docs.tar.gz https://github.com/terraform-docs/terraform-docs/releases/download/v0.20.0/terraform-docs-v0.20.0-linux-amd64.tar.gz
- tar -xzf terraform-docs.tar.gz
- chmod +x terraform-docs
## terraform lint
- curl -sLo ./tflint_linux_amd64.zip https://github.com/terraform-linters/tflint/releases/download/v0.58.1/tflint_linux_amd64.zip
- unzip tflint_linux_amd64.zip
- chmod +x tflint
packages:
- bash
- curl
- git
- gnupg2
- jq
- libssl3
- lsb-release
- openssh-client
- ca-certificates
- gnupg
- terraform
custom_repos:
- name: hashicorp
key_url: https://apt.releases.hashicorp.com/gpg
key_path: /usr/share/keyrings/hashicorp-archive-keyring.gpg
repo_entry: >-
deb [arch=amd64 signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg trusted=yes] https://apt.releases.hashicorp.com noble main
extra_commands:
- chmod 777 /opt/scripts
- chmod 777 /opt/scripts/*
- terraform --version
- terraform-docs -v
- tflint --version
copy:
- source: scripts/
destination: /opt/scripts/
- source: terraform-docs
destination: /usr/local/bin/terraform-docs
- source: tflint
destination: usr/local/bin/tflint
user:
name: nonroot
shell: /bin/bash
home: /home/nonroot
chown: /opt/scripts/
entrypoint: "/opt/scripts/entrypoint.bash"
cmd: "/bin/bash"
Publikuje zbudowany obraz do gitlab registry:
Testuje opublikowany obraz kontenera uruchamiając w nim skrypt bashowy domyślnie container_test.sh
:
---
default:
tags:
- process-ci
include:
- component: $CI_SERVER_FQDN/pl.rachuna-net/cicd/components/containers/image-builder@$COMPONENT_VERSION_CONTAINERS
🚀 build container image:
needs:
- job: 🕵 YAML lint
optional: true
- job: 🔬 Validate files (conftest)
- job: 🕵 Set Version
artifacts: true
stage: build
rules:
- when: on_success
🌐 publish container image:
stage: publish
variables:
CONTAINER_VERSION: 1.2.3
needs:
- job: 🕵 Set Version
artifacts: true
- job: 🚀 build container image
artifacts: true
rules:
- when: on_success
🧪 test docker image:
variables:
CONTAINER_VERSION: 1.2.3
needs:
- job: 📍 Publish Version
artifacts: true
- job: 🌐 publish container image
artifacts: true
rules:
- when: on_success
Komponentu odpowiedzialne za zarządzanie infrastrukturą.
Joby .infrastructure:opentofu:base
oraz ich rozszerzenia pozwalają na spójną inicjalizację środowiska OpenTofu w GitLab CI, w tym przekazanie tokenów, nazw stanów, walidację oraz generowanie dokumentacji.
Wszystkie joby korzystają z jednolitego zestawu zmiennych wejściowych i mogą być używane w różnych etapach pipeline’a.
inputs
)Nazwa | Typ | Domyślna wartość | Opis |
---|---|---|---|
docker_image |
string | registry.gitlab.com/pl.rachuna-net/containers/opentofu:2.0.0 |
Obraz Dockera z OpenTofu i niezbędnymi narzędziami |
logo_url |
string | https://gitlab.com/pl.rachuna-net/cicd/gitlab-ci/-/raw/main/_configs/_logo?ref_type=heads |
Adres URL logo wyświetlanego w logach |
tf_state_name |
string | default |
Nazwa pliku stanu OpenTofu |
debug |
bool | false |
Flaga debugowania (rozszerzone logi) |
Komponent ustawia następujące zmienne w środowisku CI:
CONTAINER_IMAGE_OPENTOFU
– obraz Dockera OpenTofu (na podstawie inputs.docker_image
)LOGO_URL
– ścieżka do logo (na podstawie inputs.logo_url
)TF_STATE_NAME
– nazwa stanu OpenTofuTF_VAR_gitlab_token
– token GitLab przekazywany do OpenTofuDEBUG
– flaga debugJoby wykonują:
LOGO_URL
jest ustawiony).tofu init
) oraz odpowiednie akcje (fmt
, validate
, tflint
, plan
, apply
).Przykład logu:
===> 💾 OpenTofu Base Job - Parameters
┌──────────────────────────────┬───────────────────────────────────────────────────────┐
│ Variable │ Value │
├──────────────────────────────┼───────────────────────────────────────────────────────┤
│ TF_STATE_NAME │ default │
│ CONTAINER_IMAGE_OPENTOFU │ registry.gitlab.com/pl.rachuna-net/...:2.0.0 │
└──────────────────────────────┴───────────────────────────────────────────────────────┘
Sprawdza formatowanie plików OpenTofu:
🕵 opentofu fmt:
stage: validate
extends: ['.infrastructure:opentofu:base']
script:
- tofu fmt -recursive -check
Wykonuje walidację konfiguracji OpenTofu:
✅ opentofu validate:
stage: validate
extends: ['.infrastructure:opentofu:base']
script:
- !reference [.infrastructure:opentofu_init]
- tofu validate
Uruchamia lintera tflint
:
✅ tflint:
stage: validate
extends: ['.infrastructure:opentofu:base']
script:
- tflint
Generuje dokumentację modułu Terraform:
✅ terraform-docs:
stage: validate
extends: ['.infrastructure:terraform:base']
script:
- terraform-docs md . > README.md
Wykonuje plan wdrożenia OpenTofu:
🧪 opentofu plan:
stage: unit-test
extends: ['.infrastructure:opentofu:base']
script:
- tofu plan
Wdraża infrastrukturę OpenTofu:
💥 opentofu apply:
stage: deploy
extends: ['.infrastructure:opentofu:base']
script:
- tofu apply -auto-approve
include:
- component: $CI_SERVER_FQDN/pl.rachuna-net/cicd/components/infrastructure/opentofu@$COMPONENT_VERSION_INFRASTRUCTURE
inputs:
docker_image: $CONTAINER_IMAGE_OPENTOFU
tf_state_name: production
debug: "true"
Joby .infrastructure:terraform:base
oraz ich rozszerzenia pozwalają na spójną inicjalizację środowiska Terraform w GitLab CI, w tym przekazanie tokenów, nazw stanów, walidację oraz generowanie dokumentacji.
Wszystkie joby korzystają z jednolitego zestawu zmiennych wejściowych i mogą być używane w różnych etapach pipeline’a.
inputs
)Nazwa | Typ | Domyślna wartość | Opis |
---|---|---|---|
docker_image |
string | registry.gitlab.com/pl.rachuna-net/containers/terraform:2.0.0 |
Obraz Dockera z Terraform i niezbędnymi narzędziami |
logo_url |
string | https://gitlab.com/pl.rachuna-net/cicd/gitlab-ci/-/raw/main/_configs/_logo?ref_type=heads |
Adres URL logo wyświetlanego w logach |
tf_state_name |
string | default |
Nazwa pliku stanu Terraform |
debug |
bool | false |
Flaga debugowania (rozszerzone logi) |
Komponent ustawia następujące zmienne w środowisku CI:
CONTAINER_IMAGE_TERRAFORM
– obraz Dockera Terraform (na podstawie inputs.docker_image
)LOGO_URL
– ścieżka do logo (na podstawie inputs.logo_url
)TF_STATE_NAME
– nazwa stanu TerraformTF_VAR_gitlab_token
– token GitLab przekazywany do TerraformDEBUG
– flaga debugJoby wykonują:
LOGO_URL
jest ustawiony).terraform init
) oraz odpowiednie akcje (fmt
, validate
, tflint
, plan
, apply
).Przykład logu:
===> 💾 Terraform Base Job - Parameters
┌──────────────────────────────┬───────────────────────────────────────────────────────┐
│ Variable │ Value │
├──────────────────────────────┼───────────────────────────────────────────────────────┤
│ TF_STATE_NAME │ default │
│ CONTAINER_IMAGE_TERRAFORM │ registry.gitlab.com/pl.rachuna-net/...:2.0.0 │
└──────────────────────────────┴───────────────────────────────────────────────────────┘
Sprawdza formatowanie plików Terraform:
🕵 terraform fmt:
stage: validate
extends: ['.infrastructure:terraform:base']
script:
- terraform fmt -recursive -check
Wykonuje walidację konfiguracji Terraform:
✅ terraform validate:
stage: validate
extends: ['.infrastructure:terraform:base']
script:
- !reference [.infrastructure:terraform_init]
- terraform validate
Uruchamia lintera tflint
:
✅ tflint:
stage: validate
extends: ['.infrastructure:terraform:base']
script:
- tflint
Generuje dokumentację modułu Terraform:
✅ terraform-docs:
stage: validate
extends: ['.infrastructure:terraform:base']
script:
- terraform-docs md . > README.md
Wykonuje plan wdrożenia Terraform:
🧪 terraform plan:
stage: unit-test
extends: ['.infrastructure:terraform:base']
script:
- terraform plan
Wdraża infrastrukturę Terraform:
💥 terraform apply:
stage: deploy
extends: ['.infrastructure:terraform:base']
script:
- terraform apply -auto-approve
include:
- component: $CI_SERVER_FQDN/pl.rachuna-net/cicd/components/infrastructure/terraform@$COMPONENT_VERSION_INFRASTRUCTURE
inputs:
docker_image: $CONTAINER_IMAGE_TERRAFORM
tf_state_name: production
debug: "true"