🛠 Job template: 🚀 Image bulder

🚀 Image bulder

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.


Wymagania wstępne

  • Buildah – wbudowany w używany obraz Dockera (ustawiany przez inputs.docker_image).
  • Dostęp do rejestru Docker/GitLab (CI_REGISTRY, CI_REGISTRY_USER, CI_REGISTRY_PASSWORD).
  • Plik konfiguracyjny obrazu kontenera (buildah_config_path).

⚙️ Parametry wejściowe (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)

🧬 Zmienne środowiskowe ustawiane w jobie

  • 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 kontenerze
  • Dodatkowe zmienne konfiguracyjne Buildah: STORAGE_DRIVER, BUILDAH_FORMAT, BUILDAH_ISOLATION, BUILDAH_STORAGE_ROOT, BUILDAH_STORAGE_RUNROOT

📤 Output

Szablon wykonuje następujące kroki:

  1. Budowanie obrazu kontenera na podstawie buildah_config_path:

    • Pobranie obrazu bazowego (base_image)
    • Instalacja pakietów i certyfikatów
    • Dodanie repozytoriów (custom_repos)
    • Kopiowanie plików i ustawienie zmiennych środowiskowych
    • Tworzenie użytkownika nie-root (opcjonalnie)
    • Ustawienie ENTRYPOINT oraz CMD
  2. Zapis obrazu do tarballa (container-image.tar).

  3. Publikacja obrazu w rejestrze Docker/GitLab (job 🌐 publish container image).

  4. Testowanie obrazu z wykorzystaniem skryptu testowego (job 🧪 test docker image).


🧪 Dostępne joby

🚀 build container 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"

🌐 publish container image

Publikuje zbudowany obraz do gitlab registry:

🧪 test docker image

Testuje opublikowany obraz kontenera uruchamiając w nim skrypt bashowy domyślnie container_test.sh:


🧪 Przykład użycia w pipeline

---
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
Last modified August 14, 2025: feat!: DEVOPS-123 Zmiana mkdocs na hugo (660375f)