Skip to content

Создание воркеров для GitLab CI на базе GitLab Runner.

License

Notifications You must be signed in to change notification settings

yandex-cloud-examples/yc-gitlab-runner-docker-machine

Repository files navigation

gitlab-runner-docker-machine

Манифест 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

Установите 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

Ресурсы

Название Тип
yandex_compute_instance.gitlab_docker_machine resource
yandex_iam_service_account.gitlab_docker_machine resource
yandex_kms_symmetric_key.gitlab_token_key resource
yandex_kms_symmetric_key_iam_binding.gitlab_docker_machine_kms_roles resource
yandex_lockbox_secret.gitlab_token resource
yandex_lockbox_secret_version.gitlab_token_version resource
yandex_resourcemanager_folder_iam_member.gitlab_docker_machine_roles resource
yandex_vpc_security_group.security_group_worker resource
yandex_vpc_security_group.securtiy_group_master resource
yandex_compute_image.ubuntu_lts data source

Параметры

Название Описание Тип Значение по умолчанию Обязательное
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