Исполнители
Исполнитель определяет, где раннер запускает процесс задачи. Раннер по-прежнему опрашивает сервер, получает задачу и отправляет журнал обратно; меняется только место, где работает процесс Ansible, Terraform или shell.
| Исполнитель | runner.executor.type | Где выполняется задача | Редакция |
|---|---|---|---|
| Локальный | local (по умолчанию) | Дочерний процесс на хосте раннера, с его файлами, инструментами и PATH. | Community |
| Docker | docker | Новый контейнер в демоне Docker, удаляется после задачи. | Pro |
| Kubernetes | k8s | Новый Pod в пространстве имён Kubernetes, удаляется после задачи. | Enterprise |
Исполнитель — это настройка раннера, а не сервера или шаблона. Сам сервер Semaphore всегда выполняет задачи локально; чтобы выполнять задачи в контейнерах, запустите раннер и направьте на него шаблоны с помощью тега раннера.
Выбор исполнителя
| Что нужно | Что использовать |
|---|---|
| Инструменты, установленные на одной машине, доступ к её файлам, выходные данные workflow | Локальный |
| Чистое окружение для каждой задачи, разные наборы инструментов для разных шаблонов, на одном или нескольких хостах | Docker |
| Распределение задач по кластеру, RBAC и Secrets Kubernetes, без сокета Docker | Kubernetes |
Настройка исполнителя
Добавьте блок executor в секцию runner файла конфигурации раннера:
{
"web_host": "https://semaphore.example.com",
"runner": {
"token_file": "/var/lib/semaphore/runner_token.txt",
"executor": {
"type": "docker"
}
}
}
Или задайте переменную окружения:
SEMAPHORE_RUNNER_EXECUTOR_TYPE=docker # or k8s
У каждого параметра есть переменная окружения; полные списки приведены на страницах Docker и Kubernetes. После смены исполнителя перезапустите раннер.
Контейнерные исполнители входят в Pro-сборку раннера. Используйте образ
semaphoreui/runner и ли официальный бинарный файл semaphore. Образ
semaphoreui/runner-community собран без них и при запуске пишет в журнал
docker executor is only available in the proprietary build.
Как выполняется задача в контейнере
Оба контейнерных исполнителя выполняют задачу одинаково:
- Подготовка. Раннер создаёт общую рабочую область и кладёт секреты задачи (SSH-ключи, пароли vault, дополнительные переменные, статический инвентарь) туда, где контейнеры могут их прочитать.
- Клонирование. Короткоживущий вспомогательный (helper) контейнер клонирует
репозиторий в
/workspace/repo(git clone --depth 1ветки задачи). - Сборка. Контейнер build запускается в
/workspace/repoи запускает приложение:ansible-playbook,terraform/tofu/terragrunt,bash,python3,powershellили бинарный файл пользовательского приложения. Его код выхода — результат задачи. - Журнал. Вывод обоих контейнеров передаётся в журнал задачи во время их работы.
- Очистка. Контейнеры, тома, Secrets и ConfigMaps задачи удаляются независимо от того, завершилась задача успешно, с ошибкой или была остановлена.
| Шаг | Docker | Kubernetes |
|---|---|---|
| Рабочая область | Именованный том semaphore-workspace-<task>-<random> | Том emptyDir Pod'а |
| Секреты | Именованный том semaphore-secrets-<task>-<random>, смонтирован только для чтения | Один Secret или ConfigMap на каждый вид, смонтирован только для чтения |
| Клонирование | Контейнер semaphore-job-<task>-<random>-clone | Init-контейнер git-clone |
| Сборка | Контейнер semaphore-job-<task>-<random>-build | Контейнер build Pod'а semaphore-job-<task>-<random> |
| Кнопка остановки | docker stop с cleanup_grace_seconds, затем удаление | Удаление Pod'а с cleanup_grace_seconds |
Задача, остановленная из интерфейса, получает статус Stopped, как и с локальным исполнителем.