Разворачивание GitLab CI с Runner в Docker
GitLab CI/CD — мощная система автоматизации сборки, тестирования и деплоя. В этом руководстве мы поднимим GitLab CE и GitLab Runner целиком в Docker-контейнерах, зарегистрируем Runner и разберём базовый .gitlab-ci.yml.
Шаг 1: Подготовка окружения
Убедитесь, что Docker и Docker Compose установлены на сервере:
docker --version
docker compose version
Выделите под GitLab минимум 4 ГБ RAM и 20 ГБ диска. Для прода рекомендуется выносить данные на отдельный диск:
sudo mkdir -p /srv/gitlab/config /srv/gitlab/logs /srv/gitlab/data
Шаг 2: Docker Compose для GitLab CE
Создайте файл docker-compose.yml:
services:
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
hostname: gitlab.example.com
restart: unless-stopped
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.example.com'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
prometheus_monitoring['enable'] = false
ports:
- "80:80"
- "443:443"
- "2222:22"
volumes:
- /srv/gitlab/config:/etc/gitlab
- /srv/gitlab/logs:/var/log/gitlab
- /srv/gitlab/data:/var/opt/gitlab
shm_size: "256m"
docker compose up -d
Первый запуск занимает 5-10 минут. GitLab будет доступен на порту 80 после инициализации.
Шаг 3: Получение первичного пароля
Для входа в веб-интерфейс нужен пароль root-пользователя:
docker exec gitlab grep 'Password:' /etc/gitlab/initial_root_password
Этот файл автоматически удаляется через 24 часа. Создайте новый пароль через веб-интерфейс или CLI:
docker exec -it gitlab gitlab-rails console
user = User.find_by_username('root')
user.password = 'new_secure_password'
user.password_confirmation = 'new_secure_password'
user.save!
exit
Шаг 4: Запуск GitLab Runner в Docker
Runner можно запустить отдельным контейнером или зарегистрировать его на хосте. Вот запуск контейнера:
docker run -d \
--name gitlab-runner \
--restart unless-stopped \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
Шаг 5: Регистрация Runner
Перейдите в GitLab: Settings → CI/CD → Runners → New instance runner. Скопируйте токен и URL. Затем зарегистрируйте:
docker exec -it gitlab-runner gitlab-runner register \
--non-interactive \
--url "http://gitlab.example.com" \
--token "YOUR_REGISTRATION_TOKEN" \
--executor "docker" \
--docker-image "alpine:latest" \
--description "docker-runner"
После регистрации Runner будет доступен в списке:
docker exec gitlab-runner gitlab-runner list
Шаг 6: Пример .gitlab-ci.yml
Создайте файл в корне вашего репозитория:
stages:
- build
- test
- deploy
variables:
DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
build:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $DOCKER_IMAGE .
- docker push $DOCKER_IMAGE
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
- .npm/
test:
stage: test
image: $DOCKER_IMAGE
script:
- npm ci --cache .npm
- npm test
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
- .npm/
deploy:
stage: deploy
script:
- echo "Deploying to production..."
- docker pull $DOCKER_IMAGE
- docker stop app || true
- docker run -d --name app -p 3000:3000 $DOCKER_IMAGE
only:
- main
when: manual
Шаг 7: Настройка кэширования и DinD
Для Docker-in-Docker (DinD) убедитесь, что Runner использует привилегированный режим. Отредактируйте конфиг Runner:
cat /srv/gitlab-runner/config/config.toml
[[runners]]
[runners.docker]
privileged = true
volumes = ["/cache"]
shm_size = 268435456
Кэширование ускоряет повторные сборки. Папка .npm/ или node_modules/ кэшируется между пайплайнами одного бранча. Для кэша зависимостей Go используйте:
cache:
key: go-mod
paths:
- .gomod/
Шаг 8: Проверка работоспособности
Запушьте изменения и проверьте пайплайн:
git add .gitlab-ci.yml
git commit -m "Add CI/CD pipeline"
git push origin main
Перейдите в CI/CD → Pipelines и убедитесь, что задачи выполняются успешно. Логи доступны по клику на каждую задачу.
Для продакшена заменитеhttp://наhttps://и настройте TLS через Caddy или Traefik перед GitLab.