Данный .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 проекта.