Автоматизация сборки образов с помощью Jenkins и Packer
На основе заданной конфигурации Packer
Образы можно использовать при создании облачной инфраструктуры, например, с помощью Terraform
Чтобы установить и настроить Jenkins, Packer, GitHub и Terraform для совместной работы:
- Подготовьте облако к работе.
- Настройте окружение.
- Создайте сервисный аккаунт.
- Создайте ВМ с Jenkins.
- Установите Packer на ВМ.
- Настройте Jenkins.
- Настройте задачу для Jenkins.
- Настройте GitHub-репозиторий.
- Создайте образ с помощью Jenkins.
- Разверните образы с помощью Terraform.
Если созданные ВМ и образы больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- Плата за постоянно запущенные ВМ (см. тарифы Compute Cloud).
- Плата за хранение созданных образов (см. тарифы 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:
-
В консоли управления
выберите каталог, в котором будет создана ВМ. -
В списке сервисов выберите Compute Cloud.
-
На панели слева выберите
Виртуальные машины. -
Нажмите кнопку Создать виртуальную машину.
-
В блоке Образ загрузочного диска перейдите на вкладку Marketplace, нажмите кнопку Показать все продукты Marketplace и выберите образ Jenkins.
Примечание
В случае самостоятельной настройки ВМ с Jenkins воспользуйтесь инструкцией
. -
В блоке Расположение выберите зону доступности, в которой будет находиться ВМ.
-
В блоке Диски и файловые хранилища задайте размер загрузочного диска
15 ГБ
. -
В блоке Вычислительные ресурсы перейдите на вкладку Своя конфигурация и укажите параметры:
- Платформа —
Intel Ice Lake
. - vCPU —
2
. - Гарантированная доля vCPU —
20%
. - RAM —
2 ГБ
.
- Платформа —
-
В блоке Сетевые настройки:
-
В поле Подсеть укажите идентификатор подсети в зоне доступности создаваемой ВМ или выберите облачную сеть из списка.
-
У каждой сети должна быть как минимум одна подсеть. Если подсети нет, создайте ее, выбрав Создать подсеть.
-
Если сети нет, нажмите Создать сеть и создайте ее:
- В открывшемся окне укажите имя сети и выберите каталог, в котором она будет создана.
- (Опционально) Выберите опцию Создать подсети, чтобы автоматически создать подсети во всех зонах доступности.
- Нажмите Создать сеть.
-
-
В поле Публичный адрес выберите
Автоматически
, чтобы назначить виртуальной машине случайный внешний IP-адрес из пула Yandex Cloud, или выберите статический адрес из списка, если вы зарезервировали его заранее.
-
-
В блоке Доступ выберите SSH-ключ и укажите данные для доступа к ВМ:
-
В поле Логин введите имя пользователя, который будет создан на виртуальной машине, например
yc-user
.Внимание
Не используйте логин
root
или другие имена, зарезервированные операционной системой. Для выполнения операций, требующих прав суперпользователя, используйте командуsudo
. -
В поле SSH-ключ выберите SSH-ключ, сохраненный в вашем профиле пользователя организации.
Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
- Нажмите кнопку Добавить ключ.
- Задайте имя SSH-ключа.
- Загрузите или вставьте содержимое открытого SSH-ключа. Пару SSH-ключей для подключения к ВМ по SSH необходимо создать самостоятельно.
- Нажмите кнопку Добавить.
SSH-ключ будет добавлен в ваш профиль пользователя организации.
Если в организации отключена возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя создаваемой виртуальной машины.
-
-
В блоке Общая информация задайте имя ВМ:
jenkins-tutorial
. -
Нажмите кнопку Создать ВМ.
Установите Packer
Packer позволяет создавать образы дисков ВМ с заданными в конфигурационном файле параметрами.
Примечание
Для работы с Yandex Cloud требуется Packer версии 1.5 и выше.
-
Скачайте дистрибутив Packer
для Linux. Также вы можете скачать дистрибутив Packer для вашей платформы из зеркала . -
Загрузите 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
-
Настройте плагин Yandex Compute Builder
:-
Создайте файл
config.pkr.hcl
в директории/opt/yandex-packer/
со следующим содержанием:packer { required_plugins { yandex = { version = ">= 1.1.2" source = "github.com/hashicorp/yandex" } } }
-
Установите плагин:
packer init <путь_к_файлу_config.pkr.hcl>
Результат:
Installed plugin github.com/hashicorp/yandex v1.1.2 in ...
-
-
Все действия системы 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 https://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
.