Gitlab-CI — Сборка и публикация Docker-образа при создании тега

Данный .gitlab-ci.yml конфиг нацелен на автоматическую сборку и публикацию Docker-образа в Docker Hub только при пуше тега, соответствующего версии (например, 1.2.3).

workflow:
  rules:
    - if: '$CI_COMMIT_TAG =~ /^\d+\.\d+\.\d+$/'
      when: always
    - when: never

stages:
  - build_and_push

variables:
  IMAGE_NAME: $DOCKERHUB_USERNAME/$APP_NAME
  DOCKER_HOST: tcp://docker:2375

build_and_push:
  stage: build_and_push
  image: docker:29.4.1
  services:
    - docker:29.4.1-dind
  script:
    - echo "$DOCKERHUB_PASSWORD" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin
    - docker build -t "$IMAGE_NAME:$CI_COMMIT_TAG" -t "$IMAGE_NAME:latest" .
    - docker push "$IMAGE_NAME:$CI_COMMIT_TAG"
    - docker push "$IMAGE_NAME:latest"

Что делает пайплайн:

Условие запуска (rules):
Пайплайн срабатывает только если имя тега ($CI_COMMIT_TAG) соответствует шаблону x.y.z (например, 1.0.0). Все остальные коммиты игнорируются.
Стадия build_and_push:
Используется образ docker:29.4.1 и сервис docker:29.4.1-dind для запуска Docker внутри пайплайна.
Выполняется сборка образа с тегом x.y.z и дополнительной меткой latest.
Производится логин в Docker Hub с использованием переменных DOCKERHUB_USERNAME и DOCKERHUB_PASSWORD.
Образ пушится в Docker Hub по двум тегам: с номером версии и latest.
Переменные:
IMAGE_NAME формируется как $DOCKERHUB_USERNAME/$APP_NAME
APP_NAME содержит имя приложения
DOCKER_HOST подсказывает docker-клиенту, что бы тот подключался по сети а не к локальному сокету
Примечания:
Убедись, что переменные DOCKERHUB_USERNAME и DOCKERHUB_PASSWORD заданы в настройках CI/CD проекта.

Прокрутить вверх