.gitlab-ci.yml (single-arch build → registry)image: docker:27.5.1
stages: [build]
variables:
GIT_STRATEGY: fetch
before_script:
# Runner может задать DOCKER_HOST к dind-сервису, но мы используем
# host docker.sock (см. runners-config). Чистим, чтобы docker CLI шёл в
# unix:///var/run/docker.sock (host docker engine).
- unset DOCKER_HOST
- echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin
build:
stage: build
services:
- name: docker:27.5.1-dind
script:
- docker build -f docker/Dockerfile -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA -t $CI_REGISTRY_IMAGE:latest .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
- docker push $CI_REGISTRY_IMAGE:latest
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
См. SMiT/SM2C/applications/controller-data-gatherer/.gitlab-ci.yml. Стадии:
build-matrix — docker buildx build --platform linux/$ARCH для amd64 и arm64 параллельно, push с тегом :branch-linux-$ARCH.release-single-arch — pull + retag + push :latest-linux-$ARCH.release-multi-arch — docker manifest create → docker manifest push :latest.deploy (опц.) — curl в semaphore-webhook.В этом паттерне обязательно tonistiigi/binfmt --install all перед buildx (qemu для cross-arch).
Запущены на firefly как контейнеры gitlab/gitlab-runner:latest (3 шт: gitlab_runner_00..02). Управляются ансибл-ролью sm2c-cloud-gitlab.
/etc/gitlab-runner/config.toml ключевые параметры (для каждого [[runners]] блока)[[runners]]
name = "GitLab Runner 00"
url = "https://gitlab.4gain.pro"
token = "<runner-registration-token>"
executor = "docker"
[runners.docker]
tls_verify = false
image = "docker:27.5.1"
privileged = true
# ⚠ Hairpin NAT firefly→public-IP сломан, dind/build-контейнеры не дойдут
# до gitlab/registry без extra_hosts.
extra_hosts = [
"gitlab.4gain.pro:10.19.1.150",
"registry.4gain.pro:10.19.1.150"
]
# docker.sock binding: build использует host docker engine на firefly.
# /cache — стандартный gitlab-cache.
volumes = [
"/var/run/docker.sock:/var/run/docker.sock",
"/cache"
]
shm_size = 0
Сам runner-контейнер (тот что обслуживает API gitlab) тоже нуждается в --add-host:
docker run -d --name gitlab_runner_00 --restart always \
--add-host gitlab.4gain.pro:10.19.1.150 \
--add-host registry.4gain.pro:10.19.1.150 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /mnt/compose/gitlab/data/gitlab/volumes/runner-00:/etc/gitlab-runner \
gitlab/gitlab-runner:latest
В роли sm2c-cloud-gitlab это включено в шаблон docker-compose.yml.j2 через extra_hosts: блок.
| Симптом | Причина | Фикс |
|---|---|---|
client version 1.25 is too old. Minimum supported API version is 1.40 |
runner image слишком старый (v14.x), а docker engine на firefly — v29+ | Обновить runner_image: "gitlab/gitlab-runner:latest" (минимум v17+). 2026-05-02 апгрейднули с 14.2.0 → 18.11.1 |
fatal: unable to access 'https://gitlab.4gain.pro/...': Failed to connect ... port 443 (на этапе Getting source from Git repository) |
Build-контейнер не имеет extra_hosts, hairpin NAT не работает |
В [runners.docker] добавить extra_hosts = ["gitlab.4gain.pro:10.19.1.150", "registry.4gain.pro:10.19.1.150"], restart runner |
Cannot connect to the Docker daemon at tcp://docker:2375 |
dind не отвечает (TLS включён в новых dind, или dind не стартанул) | (a) unset DOCKER_HOST в before_script, использовать host-socket (см. паттерн выше); (b) или установить DOCKER_TLS_CERTDIR="" если действительно нужен dind |
Cannot connect to the Docker daemon at unix:///var/run/docker.sock |
docker.sock не примонтирован в build-контейнер | В [runners.docker] добавить "/var/run/docker.sock:/var/run/docker.sock" в volumes, restart runner |
Checking for jobs... 403 Forbidden (в логах runner-контейнера) |
Stale registration token в config.toml | Удалить старые [[runners]] блоки, заново зарегистрировать через docker exec gitlab_runner_00 gitlab-runner register |
Connection refused к 5.101.14.132:443 (в логах runner-контейнера) |
Hairpin NAT, runner ходит на public IP | Для самого runner-контейнера — --add-host gitlab.4gain.pro:10.19.1.150 |
failed to create file ... No space left on device (os error 28) (uv sync, npm install и т.п.) |
/var/lib/docker на cs-root (70 GB) забит |
Сейчас: docker system prune -a -f --volumes (даёт ~20 GB). TODO #5: миграция data-root → /home/docker (1.7 TB) |
После того как обновили image и расставили extra_hosts:
ssh -p 21150 root@firefly.e1.4gain.pro
docker exec -it gitlab_runner_00 gitlab-runner register \
--non-interactive \
--url "https://gitlab.4gain.pro/" \
--registration-token "<get-from-gitlab-admin>" \
--description "GitLab Runner 00" \
--executor "docker" \
--docker-image "docker:27.5.1" \
--docker-privileged \
--docker-volumes "/var/run/docker.sock:/var/run/docker.sock" \
--docker-volumes "/cache"
# Затем вручную добавить extra_hosts в config.toml для нового [[runners]] блока:
sed -i '/\[runners.docker\]/a\ extra_hosts = ["gitlab.4gain.pro:10.19.1.150", "registry.4gain.pro:10.19.1.150"]' \
/mnt/compose/gitlab/data/gitlab/volumes/runner-00/config.toml
docker restart gitlab_runner_00
GitLab admin UI → Admin Area → Runners → Register an instance runner. Или через ансибл-PAT:
curl -s -H "PRIVATE-TOKEN: $GITLAB_ADMIN_PAT" \
-X POST \
"https://gitlab.4gain.pro/api/v4/user/runners" \
-d "runner_type=instance_type"
Changelog