В Gitea наконец-то завезли собственный Runner и можно выбросить на свалку истории так мною любимые Jenkins и Concourse. Принцип работы аналогичный Runner для Gitlab и так-же используется Docker для операций сборки и деплоя.
Action Runner — это агент, который запускает задачи в системе CI/CD на платформе Gitea. Он работает как отдельное приложение и выполняет скрипты или действия, описанные в файлах YAML, которые хранятся вместе с исходным кодом проекта.
Как устроен Action Runner?
- Регистрация: После установки Action Runner регистрируется на сервере Gitea через API, предоставляя токен регистрации, полученный при создании агента на веб-интерфейсе Gitea.
- Пул задач: Регистрируясь, Action Runner начинает слушать пул заданий от сервера Gitea. Когда появляется новая задача (например, после отправки кода в репозиторий), она отправляется на зарегистрированный Action Runner.
- Запуск задания: Получив задачу, Action Runner проверяет ее условия выполнения (триггеры). Если все соответствует условиям, начинается выполнение шагов, указанных в конфигурационном файле (gitea.yml).
- Контейнеризация: В зависимости от конфигурации, задание может выполняться внутри Docker-контейнера или напрямую на хост-машине.
- Отчетность: По завершении каждого шага информация о его выполнении (успешно или нет) передается обратно на сервер Gitea, где отображается статус выполнения.
- Хранение результатов: Результат выполнения задания (логи, артефакты) сохраняется либо локально, либо загружается на сервер Gitea по запросу.
Основные компоненты
- Action Worker: Основной процесс, выполняющий логику обработки задач.
- Docker Executor: Позволяет выполнять шаги в изолированных контейнерах Docker.
- Shell Executor: Выполняет команды непосредственно на операционной системе хоста.
- Artifacts Handler: Обрабатывает файлы, создаваемые во время выполнения заданий (артфакты), позволяя их сохранять и использовать позже.
Получение токена для регистрации Runner-а
Переходим в панель управления в WEB-интерфейсе Gitea.

Раздел «Действия» -> «Раннеры» и нажимаем кнопку «Создать новый раннер».

Запуск Gitea Runner в Ubuntu Linux
Существует два варианта запуска Gitea Runner. Вы можете запустить Runner в виде Docker образа или в виде SystemD сервиса.
Запуск в виде Docker Compose
Для установки Docker и Docker Compose воспользуемся нашей статьей:
Создадим Docker Compose файл docker-compose.yml.
services:
runner-1:
image: gitea/act_runner:nightly
restart: always
environment:
- CONFIG_FILE=/config.yaml
- GITEA_INSTANCE_URL=https://git.interlan.xyz
- GITEA_RUNNER_REGISTRATION_TOKEN=xxxTOKENxxx
volumes:
- ./runner-1/config.yaml:/config.yaml
- ./runner-1/data:/data
- ./runner-1/cache:/root/.cache
- /var/run/docker.sock:/var/run/docker.sock
ports:
- "8088:8088"
Ранеров как вы понимаете может быть сколько угодно и в моем случае я создал его с именем runner-1, а токен естественно одинаковый для всех.

Запущеный ранер будет отображаться в web-интерфейсе. Файл конфигурации config.yaml в моем случае имеет следующее содержание.
log:
level: info
runner:
file: .runner
capacity: 1
timeout: 3h
insecure: false
fetch_timeout: 5s
fetch_interval: 2s
labels: ["ubuntu-latest:docker://node:16-bullseye", "ubuntu-22.04:docker://node:16-bullseye", "ubuntu-20.04:docker://node:16-bullseye", "ubuntu-18.04:docker://node:16-buster"]
cache:
enabled: true
dir: ""
host: "1.2.3.4"
port: 8088
external_server: ""
container:
network: ""
privileged: false
options:
workdir_parent:
valid_volumes: []
docker_host: ""
force_pull: false
host:
workdir_parent:
Конфигурационные параметры Action Runner’a
Ниже приведены основные разделы и поля конфигурационного файла Action Runner’а для Gitea Actions.
1. Базовые параметры
Эти параметры определяют общую информацию о рабочем окружении и подключении к серверу Gitea.
| Параметр | Описание |
|---|---|
| name | Имя action runner’а, которое будет видно в списке агентов на панели управления Gitea. |
| url | URL-адрес вашего экземпляра Gitea, куда отправляет запросы Action Runner. Например, «https://example.com» |
| token | Токен доступа, необходимый для авторизации у сервера Gitea. Выдается при добавлении нового агента. |
| runner_group_id | Идентификатор группы агентов, если используется группировка (опционально). |
| labels | Метки, используемые для выбора подходящего агента под конкретную задачу. Например, можно указать метку «docker», «linux». |
| work_dir | Рабочая директория, где будут храниться временные данные работы. По умолчанию /tmp/actions_runner_workdir. |
| ephemeral | Логическое значение, указывающее, должен ли runner удаляться автоматически после завершения всех назначенных ему работ. Значения: true/false. |
| log_level | Уровень детализации ведения журнала событий. Возможные значения: «debug», «info», «warn», «error». |
| check_interval | Интервал проверки новых заданий в секундах. Стандартное значение — 3 секунды. Может быть увеличено для снижения нагрузки на сервер. |
| max_concurrent_jobs | Максимальное количество одновременно выполняемых заданий на одном runner-е. Используется для ограничения параллельных задач. |
2. Дополнительные опции Docker Engine
Если ты используешь контейнеризацию с Docker, то могут понадобиться дополнительные параметры:
| Параметр | Описание |
|---|---|
| docker.enabled | Включать поддержку Docker? Значения: true/false. Полезно, когда необходимо использовать контейнеры для изоляции окружения. |
| docker.host | Адрес сокета Docker Daemon, например, «unix:///var/run/docker.sock». |
| docker.network_mode | Режим сети Docker. Можно задать сеть по умолчанию, например, «bridge», чтобы ограничить доступ к интернету или сетевым ресурсам. |
| docker.privileged | Предоставлять привилегии контейнеру? Это важно для некоторых специальных сценариев. |
| docker.volumes | Массив томов Docker, которые монтируются внутрь контейнера. Например, [ «/home/user:/workspace»]. |
| docker.dockerfile_path | Путь до Dockerfile, используемого для создания образа контейнера. Используется только тогда, когда необходим кастомный образ. |
3. Параметры производительности и безопасности
Некоторые параметры отвечают за производительность и безопасность системы:
| Параметр | Описание |
|---|---|
| timeout_minutes | Таймаут ожидания перед завершением задания, если оно зависло. Например, задается в минутах. |
| retry_count | Количество попыток повторного выполнения задания в случае ошибки. |
| idle_timeout_minutes | Время простоя (в минутах), после которого idle runner отключится, если указан флаг ephemeral=true. |
| tls_verify | Проверять сертификат TLS при соединении с сервером Gitea? Зависит от того, настроен ли ваш экземпляр с самоподписанным сертификатом. |
| use_proxy | Использовать прокси-сервер для соединений с внешним миром. Обычно полезно в корпоративных сетях с ограниченным доступом в интернет. |
4. Параметры логирования
Параметры для контроля уровня логирования и хранения журналов:
| Параметр | Описание |
|---|---|
| log_to_file | Флаг, указывающий, записывать ли журналы в файл. |
| log_max_size | Максимальная размер файлов журнала (в мегабайтах). |
| log_rotation | Частота ротации файлов журнала (ежедневная, еженедельная и т.д.). |
| log_compression | Метод сжатия старых журналов, например gzip. |
Пример минимального конфигурационного файла:
{
"name": "MyRunner",
"url": "http://my-gitea.example.com",
"token": "<your_token>",
"work_dir": "/opt/my_actions_runner",
"labels": ["linux", "x86_64"],
"log_level": "info"
}
Запуск в виде SystemD сервиса
Action Runner представляет собой Go-приложение и поставляется в виде бинарного файла который можно загрузить по адресу https://about.gitea.com/products/runner/.

Конфигурация сервиса /lib/systemd/system/gitea-runner.service выглядит следующим образом.
[Unit]
Description=Gitea Runner
After=syslog.target
After=network.target
[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/opt/gitea-runner
ExecStart=/opt/gitea-runner/act_runner daemon -c /opt/gitea-runner/config.yaml
Restart=always
[Install]
WantedBy=multi-user.target
Перед запуском сервиса выполняем регистрацию, для чего перелогиниваемся в пользователя git и выполняем регистрацию.
# su git
git@srv-prod-rain-02:/opt/gitea-runner$ /opt/gitea-runner/act_runner register
INFO Registering runner, arch=amd64, os=linux, version=v0.2.13.
WARN Runner in user-mode.
INFO Enter the Gitea instance URL (for example, https://gitea.com/):
https://git.interlan.xyz/
INFO Enter the runner token:
xxxTOKENxxx
INFO Enter the runner name (if set empty, use hostname: srv-prod-rain-02.rain.shiskitech.ru):
srv-prod-rain-02.rain.shiskitech.ru
INFO Enter the runner labels, leave blank to use the default labels (comma-separated, for example, ubuntu-latest:docker://docker.gitea.com/runner-images:ubuntu-latest):
docker-runner, docker-builder, docker-any
INFO Registering runner, name=srv-prod-rain-02.rain.shiskitech.ru, instance=https://git.interlan.xyz/, labels=[docker-runner docker-builder docker-any].
DEBU Successfully pinged the Gitea instance server
INFO Runner registered successfully.
Выполняем тестовый запуск.
$ /opt/gitea-runner/act_runner daemon --config /opt/gitea-runner/config.yaml
INFO[2026-04-07T10:29:16+03:00] Starting runner daemon
INFO[2026-04-07T10:29:16+03:00] labels updated to: [docker-runner:host docker-builder:host docker-any:host]
INFO[2026-04-07T10:29:16+03:00] runner: srv-prod-rain-02.rain.shiskitech.ru, with version: v0.2.13, with labels: [docker-runner docker-builder docker-any], declare successfully
Настраиваем автозапуск сервиса и запускаем.
# systemctl start gitea-runner
# systemctl enable gitea-runner
Таким образом у нас получилось уже два раннера.

Настройка сервера кэширования
Как я уже писал в статье «Оптимизация сборки Spring приложений в Gitlab/Gitlab-Runner» самый простой и эффективный способ оптимизации сборки это использование кэша и этот механизм есть в Gitea.
Аналогично сборщику из прошлого раздела запустим Action Runner в режиме кэширования.
[Unit]
Description=Gitea Runner
After=syslog.target
After=network.target
[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/opt/gitea-cache
ExecStart=/opt/gitea-cache/act_runner cache-server -s 10.101.5.1 -p 43707
Restart=always
[Install]
WantedBy=multi-user.target
И прописываем на сборщиках в конфигурационном файле адрес сервера кэширования (запуск локального кэширования на сборщиках отключаем).
Пример простейшего Workflow
Workflows в Gitea должен быть расположен в каталоге .gitea/workflows/.
name: Gitea Actions Demo
on: [push]
jobs:
build-and-test:
# Must match labels defined on your runner (e.g., ubuntu-latest)
runs-on: ubuntu-latest
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: Run a script
run: |
echo "Building the project..."
ls -la




