Манифест Terraform для динамического создания воркеров GitLab CI базе GitLab Runner, docker-machine и драйвера для Yandex Clouid
Позволяет по запросу от CI создавать временныe воркеры GitLab Runner для выполнения конвейеров CI. Предназначена для сборки и тестирования контейнеров docker
, а также для других задач, где требуется среда исполнения docker
(docker gitlab executor).
- Штатная функциональность GitLab Runner
- Не требуется кластер Kubernetes
- Необходима одна постоянная виртуальная машина c минимальными характеристиками: 2 cpu 50%, 2Gb памяти, 20Gb диск, временные воркеры создаются по требованию
- Динамически создаваемые воркеры позволяют эффективно использовать вычислительные ресурсы
- Короткое время жизни воркера позволяте использовать преимущества NRD дисков практически без риска потери данных
- За счет изоляции снижаются риски информационной безопасности при использовании привилегированного режима для контейнеров
docker:dind
- Гибкое управление временем жизни воркеров с помощь расписания
GitLab Runner работает на постоянной виртуальной машине с минимальными характеристиками. При получении задания от GitLab CI, Runner создает виртуальную машину с заданными параметрами (4 cpu, 8 Gb, 93 Gb network-ssd-nonreplicated), устанавливает на нее сервис docker
и запускает в нем выполнение задания. Одновременно может быть создано несколько виртуальных машин для параллельного выполнения нескольких заданий. После завершения задания GitLab Runner ожидает новые задания в течении 30 минут в рабочее время или 10 минут в остальное время. Если новых заданий в указанный период не поступает, временная виртуальная машина удаляется.
Установите terraform подготовьте облако к работе.
Для применения манифеста необходимо уаказать 4 обязательных параметра: cloud_id, folder_id, gitlab_url, gitlab_registration_token. Например, через файл terraform.tfvars
Значения "по умолчанию" остальных параметров приведены в справке ниже
# terraform.tfvars
cloud_id = "b1gxxxxx"
folder_id = "b1gxxxxx"
gitlab_registration_token = "GRxxxxxxx-UAxxxxxxx"
gitlab_url = "https://xxxxxx.gitlab.yandexcloud.net/"
Выполните инициализацию terraform
terraform init
Примените манифест
terraform apply
После успешного применения манифеста, через 40-60 секунд, в списе раннеров появится появиться новый раннер
Замечания:
- Манифест создает файл конфигурации для GitLab Runner и постоянную ВМ. По умолчанию, ВМ создается с публичным адресом
- Финальная настройка ВМ производится скриптом /root/postinstall.sh. Скрипт и файл конфигурации доставляются на ВМ через user-data. Скрипт выполняет установку gitlab-runner, docker-machiche и docker-machine-yandex-driver
- Данные для регистрации GitLab Runner (URL и токен) передаются через Yandex Lockbox. Регистрация в GitLab CI выполняется при старте сервиса gitlab-runner.
- Операции по созданию временных ВМ выполняются от сервисного аккаунта, привязанного к постоянной ВМ
- Группы безопасности открывают доступ к временным ВМ только с постоянной ВМ.
Название | Версия |
---|---|
terraform | >= 0.13 |
Название | Версия |
---|---|
yandex | 0.85.0 |
Название | Исх. код | Версия |
---|---|---|
network | ./modules/network | n/a |
Название | Описание | Тип | Значение по умолчанию | Обязательное |
---|---|---|---|---|
cloud_id | cloud-id | string |
n/a | yes |
default_region | Default Yandex Cloud region | string |
"ru-central1" |
no |
default_zone | Default availability zone | string |
"ru-central1-a" |
no |
folder_id | folder-id | string |
n/a | yes |
gitlab_registration_token | gitlab registration token | string |
n/a | yes |
gitlab_url | gitlab url | string |
n/a | yes |
gitlab_runner_tags | gitlab runner tags | string |
"" |
no |
network_cidr | network cidr | string |
"10.11.12.0/24" |
no |
network_create | create the network? | bool |
true |
no |
network_description | Network description | string |
"autocreated docker-machine network" |
no |
network_id | Existing network_id(vpc-id) where resources will be created | string |
null |
no |
network_name | Network name | string |
"docker-machine" |
no |
purpose | Virtual machine purpose (prod, dev, stage, etc) | string |
"docker-machine" |
no |
security_group_create | create security group(s)? | bool |
true |
no |
subnet_id | Existing subnet id | string |
null |
no |
user_pubkey_filename | ssh public key filename | string |
"~/.ssh/id_rsa.pub" |
no |
username | Initialzation username | string |
"ubuntu" |
no |
worker_runners_limit | Maximum number of parallel workers | string |
"10" |
no |
worker_cores | yandex-cores | string |
"4" |
no |
worker_disk_size | yandex-disk-size | string |
"93" |
no |
worker_disk_type | yandex-disk-type | string |
"network-ssd-nonreplicated" |
no |
worker_image_family | yandex-image-family | string |
"ubuntu-2204-lts" |
no |
worker_memory | yandex-memory | string |
"8" |
no |
worker_platform_id | yandex-platform-id | string |
"standard-v3" |
no |
worker_preemptible | yandex-preemptible | bool |
true |
no |
worker_use_internal_ip | yandex-use-internal-ip | bool |
true |
no |
Название | Описание |
---|---|
docker-machine | ssh command for connection |