Автоматизация сборки образов с помощью Jenkins и Packer
На основе заданной конфигурации Packer создает образы дисков ВМ в сервисе Compute Cloud. Jenkins позволяет построить процесс непрерывной доставки изменений.
Образы можно использовать при создании облачной инфраструктуры, например, с помощью Terraform.
Чтобы установить и настроить Jenkins, Packer, GitHub и Terraform для совместной работы:
- Подготовьте облако к работе.
- Настройте окружение.
- Создайте сервисный аккаунт.
- Создайте виртуальную машину с Jenkins.
- Установите Packer на ВМ.
- Настройте Jenkins.
- Настройте задачу для Jenkins.
- Настройте GitHub-репозиторий.
- Создайте образ с помощью Jenkins.
- Разверните образы с помощью Terraform.
Если созданные ВМ и образы больше не нужны, удалите их.
Подготовьте облако к работе
Перед работой нужно зарегистрироваться в Yandex Cloud и создать платежный аккаунт:
- Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь, если вы еще не зарегистрированы.
- На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за постоянно запущенные виртуальные машины (см. тарифы Yandex Compute Cloud);
- плата за хранение созданных образов (см. тарифы Yandex Compute Cloud);
- плата за использование динамических публичных IP-адресов (см. тарифы Yandex Virtual Private Cloud).
Настройте окружение
Подготовьте программы для работы:
- Установите интерфейс командной строки Yandex Cloud.
- Установите Terraform. См. также раздел Начало работы с Terraform.
- Загрузите утилиту jq.
- Настройте Git. Если вы работаете под Windows, используйте Git Bash.
- Создайте ответвление репозитория с примерами в своем аккаунте на GitHub.
- Подготовьте SSH-ключ для доступа к виртуальным машинам.
Создайте сервисный аккаунт
С помощью сервисного аккаунта Jenkins сможет выполнять действия в вашем облаке и каталоге. Чтобы создать сервисный аккаунт:
-
Получите идентификаторы каталога и облака, выполнив команду
yc config list
. -
Создайте сервисный аккаунт и передайте его идентификатор в переменную окружения, выполнив команды:
yc iam service-account create --name <имя пользователя> yc iam key create --service-account-name <имя пользователя> -o <имя пользователя.json> SERVICE_ACCOUNT_ID=$(yc iam service-account get --name <имя пользователя> --format json | jq -r .id)
В текущем каталоге будет создан JSON-файл, содержащий авторизационные данные.
-
Назначьте сервисному аккаунту роль
admin
на каталог, где будут выполняться операции:yc resource-manager folder add-access-binding <имя_каталога> --role admin --subject serviceAccount:$SERVICE_ACCOUNT_ID
Создайте виртуальную машину с Jenkins
Jenkins будет получать изменения в конфигурациях образов ВМ из GitHub, а затем с помощью Packer создавать образы в облаке.
Чтобы создать виртуальную машину с Jenkins:
-
На странице каталога в консоли управления нажмите кнопку Создать ресурс и выберите Виртуальная машина.
-
В поле Имя введите имя виртуальной машины:
jenkins-tutorial
. -
Выберите зону доступности, в которой будет находиться виртуальная машина.
-
В блоке Выбор образа/загрузочного диска перейдите на вкладку Cloud Marketplace и нажмите кнопку Посмотреть больше. В открывшемся окне выберите образ Jenkins.
Примечание
В случае самостоятельной настройки ВМ с Jenkins воспользуйтесь инструкцией.
-
В блоке Диски укажите размер загрузочного диска 15 ГБ.
-
В блоке Вычислительные ресурсы:
- Выберите платформу: Intel Ice Lake.
- Укажите необходимое количество vCPU и объем RAM:
- vCPU — 2.
- Гарантированная доля vCPU — 20%.
- RAM — 2 ГБ.
-
В блоке Сетевые настройки нажмите кнопку Добавить сеть и выберите, к какой подсети подключить виртуальную машину. В блоке Публичный адрес назначьте ВМ публичный адрес автоматически или выберите один из зарезервированных адресов.
-
В блоке Доступ укажите данные для доступа на виртуальную машину:
- В поле Логин введите имя пользователя.
- В поле SSH-ключ вставьте содержимое файла открытого ключа.
Пару ключей для подключения по SSH необходимо создать самостоятельно.
-
Нажмите кнопку Создать ВМ.
Установите Packer
Packer позволяет создавать образы дисков виртуальных машин с заданными в конфигурационном файле параметрами.
Примечание
Для работы с Yandex Cloud требуется Packer версии не ниже 1.5.
-
Скачайте дистрибутив Packer для Linux.
-
Загрузите Packer на созданную ВМ:
scp packer_<версия Packer>_linux_amd64.zip <Логин>@<Публичный IP-адрес ВМ>:~/
-
Подключитесь к виртуальной машине по протоколу SSH. Для этого можно использовать утилиту
ssh
в Linux и macOS и программуPuTTY
для Windows. -
Создайте новую директорию, переместите в нее исполняемые файлы Packer и распакуйте архив:
sudo mkdir /opt/yandex-packer/ sudo mv packer_<версия Packer>_linux_amd64.zip /opt/yandex-packer/ unzip packer_<версия Packer>_linux_amd64.zip
-
Все действия системы Jenkins будут выполняться от имени пользователя
jenkins
. Дайте этому пользователю права на запуск Packer:sudo chmod u+x /opt/yandex-packer/packer* sudo chown jenkins:jenkins /opt/yandex-packer/packer*
Настройте Jenkins
Чтобы собирать образы по конфигурациям из GitHub, нужно настроить Jenkins:
-
Подключитесь к виртуальной машине по протоколу SSH. Для этого можно использовать утилиту
ssh
в Linux и macOS и программуPuTTY
для Windows. -
Откройте файл пароля для запуска настройки и скопируйте пароль:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
-
Перейдите в браузере по адресу
http://<публичный IP-адрес ВМ с Jenkins>
. Откроется консоль управления Jenkins. -
Введите в поле Administrator password скопированный пароль и нажмите кнопку Continue.
-
Выберите Select plugins to install.
Вам потребуются следующие плагины:
Pipeline
— плагин для получения исходного кода из системы контроля версий, его сборки, тестирования и развертывания.Git
— плагин для работы с Git-репозиториями.Credentials Binding
— плагин для создания переменных окружения, содержащих авторизационные данные.
-
Нажмите кнопку Install. Начнется установка выбранных компонентов.
-
После завершения установки вам будет предложено создать учетную запись администратора. Заполните поля формы и нажмите кнопку Save and Continue.
-
Вам будет предложено создать URL для Jenkins. Оставьте URL вида
http://<публичный IP-адрес ВМ>/
. Нажмите кнопку Save and finish. -
Нажмите кнопку Start using Jenkins, чтобы завершить установку и перейти на административную панель Jenkins.
Настройте задачу для Jenkins
Чтобы Jenkins мог выполнять сборки образов, следует указать авторизационные данные для Yandex Cloud и создать задачу на получение изменений из репозитория GitHub. Авторизационные данные будут использоваться в переменных, находящихся в конфигурационных файлах Packer.
-
Откройте административную панель Jenkins.
-
В правом верхнем углу нажмите на имя пользователя.
-
Выберите пункт Credentials.
-
В блоке Stores scoped to Jenkins нажмите на ссылку
Global
. -
Получите идентификатор подсети, в которой будут собираться образы, выполнив команду
yc vpc subnet list
. -
Нажмите кнопку Add credentials. Укажите следующие параметры:
- В списке Kind выберите пункт
Secret text
. - В списке Scope оставьте
Global
. - В поле Secret укажите идентификатор вашего каталога.
- В поле Id укажите
YC_FOLDER_ID
. Нажмите кнопку OK.
- В списке Kind выберите пункт
-
Создайте еще один секрет со следующими параметрами:
- Kind:
Secret text
. - Scope:
Global
. - Secret: идентификатор подсети, в которой находится ВМ с Jenkins.
- ID:
YC_SUBNET_ID
.
- Kind:
-
Создайте еще один секрет со следующими параметрами:
- Kind:
Secret file
. - Scope:
Global
. - File: файл
<имя пользователя>.json
из шага 1. - ID:
YC_ACCOUNT_KEY_FILE
.
- Kind:
-
Вернитесь на главную страницу административной панели и выберите пункт New item.
-
Введите название для задачи:
jenkins-tutorial
и выберите тип задачи Pipeline. Нажмите кнопку OK. -
В открывшемся окне поставьте флаг GitHub hook trigger for GITScm polling. Эта опция позволяет запускать сборку по каждому выполнению команды
push
в веткуmaster
Git-репозитория. -
В блоке Pipeline в списке Definition выберите
Pipeline script from SCM
. -
В списке SCM выберите
Git
. -
В поле Repository URL укажите URL вашего ответвления из GitHub.
-
В поле Script path укажите
jenkins-packer/Jenkinsfile
. -
Оставьте остальные поля без изменений и нажмите Сохранить.
Настройте GitHub-репозиторий
В настройках репозитория GitHub включите webhook для запуска сборки в Jenkins и добавьте публичный SSH-ключ для авторизации.
Включите Webhook
- Откройте ответвление репозитория на GitHub в браузере.
- Выберите вкладку Settings.
- Выберите пункт Webhooks и нажмите кнопку Add webhook.
- В поле Payload URL введите
http://<публичный IP-адрес ВМ>/github-webhook/
. - Нажмите кнопку Add webhook.
Добавьте на GitHub SSH-ключ
- Нажмите на ваш аватар на GitHub. В открывшемся меню выберите пункт Settings.
- Выберите пункт SSH and GPG keys.
- Нажмите кнопку New SSH key.
- В поле Title введите любое имя ключа.
- Скопируйте в поле Key ваш SSH-ключ.
- Нажмите кнопку Add SSH key.
Создайте образ с помощью Jenkins
Сборка образа в Jenkins запускается автоматически после выполнения команды push
в ветке master
GitHub-репозитория.
-
Склонируйте на ваш компьютер ответвление репозитория examples, которое вы создали во время подготовки к работе:
git clone git@github.com:<логин на GitHub>/examples.git
-
Внесите изменения в шаблоны Packer, находящиеся в директории
jenkins-packer/packer/
. Документацию шаблонов Packer можно найти на сайте разработчика. В параметрахimage_family
иsource_image_family
указываются семейства образов, которые будет собирать Jenkins. Подробнее о семействах см. Семейства образов. -
Внесите изменения в файл описания Pipeline для Jenkins
Jenkinsfile
, расположенный в корневой директории репозитория. Документацию Pipeline см. на сайте разработчика. -
Загрузите изменения на GitHub:
git add -A git commit -m "Build update" git push
-
Откройте административную панель Jenkins и проверьте состояние задачи.
-
Если все настройки выполнены верно, то запустится сборка образов. Результат выполнения можно увидеть в логах сборки.
Примечание
При настройке задачи Jenkins в разделе GitHub Hook log возможно появление ошибки Polling has not run yet
. В этом случае следует первый раз запустить сборку вручную.
После этого в разделе Образы сервиса Compute Cloud появятся три новых образа:
Debian
— базовый образ с последними обновлениями.Nginx
— образ с веб-сервером nginx, базирующийся на образеDebian
.Django
— образ с фреймворком Django, базирующийся на образеDebian
.
Разверните образы
После того, как образы будут созданы, их можно использовать для создания виртуальных машин. Создайте тестовую инфраструктуру с помощью Terraform:
-
В директории с ответвлением перейдите в директорию с файлами Terraform:
cd examples/jenkins-packer/terraform
-
Переименуйте файл
terraform.tfvars_example
:mv terraform.tfvars_example terraform.tfvars
-
Заполните поля файла требуемыми значениями. См. также документацию Terraform и провайдера Yandex Cloud.
-
Инициализируйте провайдера Terraform командой
terraform init
. -
Выполните команду
terraform plan -var-file="terraform.tfvars"
. Проверьте созданную конфигурацию. -
Выполните команду
terraform apply
и подтвердите создание инфраструктуры, введяyes
в терминале.
После этого будут созданы:
- Облачная сеть.
- Подсети во всех зонах доступности.
- Виртуальные машины из образов, созданных с помощью Packer. Виртуальные машины с nginx получат публичные IP-адреса. Все виртуальные машины будут подключены к подсетям.
Как удалить созданные ресурсы
Чтобы освободить ресурсы в каталоге:
- Удалите созданные ВМ.
- Удалите созданные образы.
- Удалите сервисный аккаунт и файл
<имя пользователя.json>
. - Удалите сеть и подсеть.
Для удаления созданных с помощью Terraform используйте команду terraform destroy
.