RU EN HE
Обо мне Проекты Блог
← Назад к блогу
DevOps и CI/CD

GitLab Runner в контейнерах: Podman Quadlets и Systemd

Введение

GitLab CI — мощная система непрерывной интеграции, но управление раннерами на серверах может быть сложным. Podman Quadlets и systemd предоставляют элегантное решение: раннер работает как systemd-юнит, автоматически перезапускается и управляется стандартными инструментами.

Podman Quadlets

Quadlets — относительно новая функция Podman, позволяющая описывать контейнеры в формате systemd-юнитов. Файл .container помещается в ~/.config/containers/systemd/ и автоматически преобразуется в systemd-сервис:

# ~/.config/containers/systemd/gitlab-runner.container
[Container]
Image=docker.io/gitlab/gitlab-runner:latest
Volume=/srv/gitlab-runner/config:/etc/gitlab-runner:Z
Volume=/run/user/1000/podman/podman.sock:/var/run/docker.sock:Z
Environment=DOCKER_HOST=unix:///var/run/docker.sock

[Service] Restart=always TimeoutStartSec=300

[Install] WantedBy=default.target

Интеграция с systemd

После создания файла квадлета, systemd автоматически генерирует сервис. Управление происходит через стандартные команды:

systemctl --user daemon-reload
systemctl --user start gitlab-runner
systemctl --user enable gitlab-runner
systemctl --user status gitlab-runner

Конфигурация раннера

Конфигурация GitLab Runner хранится в /srv/gitlab-runner/config/config.toml и монтируется в контейнер. Важно настроить executor — для Podman используется executor docker, но с сокетом Podman вместо Docker:

# config.toml
[[runners]]
name = “podman-runner”
url = https://gitlab.example.com
token = “RUNNER_TOKEN”
executor = “docker”
[runners.docker]
image = “python:3.12-slim”
privileged = false
volumes = [“/cache”]

Примеры пайплайнов

Типичный CI-пайплайн для Python-проекта включает этапы: lint (ruff), test (pytest), build (podman build), deploy (push в реестр). Каждый этап выполняется в изолированном контейнере.

Безопасность

Rootless Podman обеспечивает дополнительный уровень безопасности. Раннер работает от непривилегированного пользователя, контейнеры CI изолированы user namespace. Для доступа к реестру используются Podman secrets вместо переменных окружения.

Мониторинг и логи

Логи раннера доступны через journalctl --user -u gitlab-runner. Для мониторинга состояния используется systemctl --user is-active, что интегрируется с существующими системами мониторинга через простые check-скрипты.

Заключение

Podman Quadlets превращают контейнеры в полноценные systemd-сервисы с автозапуском, перезапуском и стандартным управлением. Для GitLab Runner это означает надёжную, безопасную и легко поддерживаемую CI-инфраструктуру.