Автоматизация сборки образов с помощью Jenkins и Packer

Сценарий описывает настройку автоматической сборки образов виртуальных машин с помощью Jenkins и Packer. Jenkins позволяет построить процесс непрерывной доставки изменений в конфигурациях ваших образов средству Packer для сборки образов виртуальных машин, используемых в Яндекс.Облаке.

Собранные образы можно использовать при создании облачной инфраструктуры. В этом сценарии из созданных образов будут развернуты виртуальные машины с помощью Terraform.

Чтобы установить и настроить Jenkins, Packer, GitHub и Terraform для совместной работы:

  1. Создайте сервисный аккаунт
  2. Создайте виртуальную машину с Jenkins
  3. Установите Packer на ВМ
  4. Настройте Jenkins
  5. Настройте задачу для Jenkins
  6. Настройте GitHub-репозиторий
  7. Создайте образ с помощью Jenkins
  8. Разверните образы с помощью Terraform

Если созданные ВМ и образы больше не нужны, удалите их.

Подготовьте облако к работе

Перед тем, как разворачивать приложения, нужно зарегистрироваться в Облаке и создать платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Облако или зарегистрируйтесь, если вы еще не зарегистрированы.
  2. На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша виртуальная машина, на странице облака.

Подробнее об облаках и каталогах.

  • Установите интерфейс командной строки Яндекс.Облака.
  • Установите Terraform и настройте его для работы с Яндекс.Облаком.
  • Настройте Git-клиент. Если вы работаете под Windows, используйте Git Bash.
  • Создайте ответвление репозитория с примерами в своем аккаунте на GitHub.
  • Подготовьте SSH-ключ для доступа к виртуальным машинам.
  • Создайте облачную сеть и подсеть в выбранной зоне доступности.

В стоимость поддержки инфраструктуры входят:

Создайте сервисный аккаунт

С помощью сервисного аккаунта Jenkins сможет выполнять действия в вашем облаке и каталоге. Чтобы создать сервисный аккаунт:

  1. Получите идентификаторы каталога и облака, выполнив команду yc config list.

  2. Создайте сервисный аккаунт и передайте его идентификатор в переменную окружения, выполнив команды:

    $ 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)
    
  3. Назначьте сервисному аккаунту роль admin в каталоге, где будут выполняться операции:

    $ yc resource-manager folder add-access-binding <имя_каталога> --role admin --subject serviceAccount:$SERVICE_ACCOUNT_ID
    

Создайте виртуальную машину с Jenkins

Jenkins будет получать изменения в конфигурациях образов ВМ из GitHub, а затем с помощью Packer создавать образы в облаке.

Чтобы создать виртуальную машину с Jenkins:

  1. На странице каталога в консоли управления нажмите кнопку Создать ресурс и выберите Виртуальная машина.

  2. В поле Имя введите имя виртуальной машины: jenkins-tutorial.

  3. Выберите зону доступности, в которой будет находиться виртуальная машина.

  4. В блоке Публичные образы нажмите кнопку Выбрать. В открывшемся окне выберите образ Jenkins.

  5. В блоке Диски укажите размер загрузочного диска 15 ГБ.

  6. В блоке Вычислительные ресурсы:

    • Выберите платформу: Intel Cascade Lake.
    • Укажите необходимое количество vCPU и объем RAM:
      • vCPU — 2.
      • Гарантированная доля vCPU — 5%.
      • RAM — 2 ГБ.
  7. В блоке Сетевые настройки нажмите кнопку Добавить сеть и выберите, к какой подсети подключить виртуальную машину. В блоке Публичный адрес назначьте ВМ публичный адрес автоматически или выберите один из зарезервированных адресов.

  8. В блоке Доступ укажите данные для доступа на виртуальную машину:

    • В поле Логин введите имя пользователя.
    • В поле SSH-ключ вставьте содержимое файла открытого ключа. Пару ключей для подключения по SSH необходимо создать самостоятельно.
  9. Нажмите кнопку Создать ВМ.

Установите Packer

Packer позволяет создавать образы дисков виртуальных машин с заданными в конфигурационном файле параметрами.

Примечание

Для работы с Яндекс.Облаком требуется Packer версии не ниже 1.4.1.

  1. Скачайте дистрибутив Packer для Linux.

  2. Загрузите Packer на созданную ВМ:

    $ scp packer_<версия Packer>_linux_amd64.zip <Логин>@<Публичный IP-адрес ВМ>:~/
    
  3. Подключитесь к виртуальной машине по протоколу SSH. Для этого можно использовать утилиту ssh в Linux и macOS и программу PuTTY для Windows.

  4. Создайте новую директорию, переместите в нее исполняемые файлы Packer и распакуйте архив:

    $ sudo mkdir /opt/yandex-packer/
    $ sudo mv packer_<версия Packer>_linux_amd64.zip /opt/yandex-packer/
    $ unzip packer_<версия Packer>_linux_amd64.zip
    
  5. Все действия системы Jenkins будут выполняться от имени пользователя jenkins. Дайте этому пользователю права на запуск Packer:

    $ sudo chmod u+x /opt/yandex-packer/packer*
    $ sudo chown jenkins:jenkins /opt/yandex-packer/packer*
    

Настройте Jenkins

Чтобы собирать образы по конфигурациям из GitHub, нужно настроить Jenkins:

  1. Подключитесь к виртуальной машине по протоколу SSH. Для этого можно использовать утилиту ssh в Linux и macOS и программу PuTTY для Windows.

  2. Откройте файл пароля для запуска настройки и скопируйте пароль:

    $ sudo cat /var/lib/jenkins/secrets/initialAdminPassword
    
  3. Откройте в браузере адрес http://<публичный IP-адрес ВМ с Jenkins>. Откроется консоль управления Jenkins.

  4. Введите в поле Administrator password скопированный пароль и нажмите кнопку Continue.

  5. Выберите Select plugins to install.

  6. Для выполнения этого сценария потребуются следующие плагины:

    • Pipeline — плагин для получения исходного кода из системы контроля версий, его сборки, тестирования и развертывания.
    • Git — плагин для работы с git-репозиториями.
    • Credentials Binding — плагин для создания переменных окружения, содержащих авторизационные данные.
  7. Нажмите кнопку Install. Начнется установка выбранных компонентов.

  8. После завершения установки вам будет предложено создать учетную запись администратора. Заполните поля формы и нажмите кнопку Save and Continue.

  9. Вам будет предложено создать URL для Jenkins. Оставьте URL вида http://<публичный IP-адрес ВМ>/. Нажмите кнопку Save and finish.

  10. Нажмите кнопку Start using Jenkins, чтобы завершить установку и перейти на административную панель Jenkins.

Настройте задачу для Jenkins

Чтобы Jenkins мог выполнять сборки образов, следует указать авторизационные данные для Яндекс.Облака и создать задачу на получение изменений из репозитория GitHub. Авторизационные данные будут использоваться в переменных, находящихся в конфигурационных файлах Packer.

  1. Откройте административную панель Jenkins.
  2. Выберите пункт Credentials.
  3. В блоке Stores scoped to Jenkins нажмите на ссылку Global.
  4. Получите идентификатор подсети, в которой будут собираться образы, выполнив команду yc vpc subnet list.
  5. Нажмите кнопку Add credentials. Укажите следующие параметры:
    1. В списке Kind выберите пункт Secret text.
    2. В списке Scope оставьте Global.
    3. В поле Secret укажите идентификатор вашего каталога.
    4. В поле Id укажите YC_FOLDER_ID. Нажмите кнопку OK.
  6. Создайте еще один секрет со следующими параметрами:
    1. Kind: Secret text.
    2. Scope: Global.
    3. Secret: идентификатор подсети, в которой находится ВМ с Jenkins.
    4. ID: YC_SUBNET_ID.
  7. Создайте еще один секрет со следующими параметрами:
    1. Kind: Secret file.
    2. Scope: Global.
    3. File: файл <имя пользователя>.json из шага 1.
    4. ID: YC_ACCOUNT_KEY_FILE.
  8. Вернитесь на главную страницу административной панели и выберите пункт New item.
  9. Введите название для задачи: jenkins-tutorial и выберите тип задачи Pipeline. Нажмите кнопку OK.
  10. В открывшемся окне поставьте флаг GitHub hook trigger for GITScm polling. Эта опция позволяет запускать сборку по каждому выполнению команды push в ветку master git-репозитория.
  11. В блоке Pipeline в списке Definition выберите Pipeline script from SCM.
  12. В списке SCM выберите Git.
  13. В поле Repository URL укажите URL вашего ответвления из GitHub.
  14. В поле Script path укажите jenkins-packer/Jenkinsfile.
  15. Оставьте остальные поля без изменений и нажмите Сохранить.

Настройте GitHub-репозиторий

В настройках репозитория GitHub нужно настроить вебхук для запуска сборки в Jenkins и добавить публичный SSH-ключ для авторизации.

Настройте Webhook

  1. Откройте ответвление репозитория на GitHub в браузере.
  2. Выберите вкладку Settings.
  3. Выберите пункт Webhooks и нажмите кнопку Add webhook.
  4. В поле Payload URL введите http://<публичный IP-адрес ВМ>/github-webhook/.
  5. Нажмите кнопку Add webhook.

Добавьте на GitHub SSH-ключ

  1. Нажмите на ваш аватар на GitHub. В открывшемся меню выберите пункт Settings.
  2. Выберите пункт SSH and GPG keys.
  3. Нажмите кнопку New SSH key.
  4. В поле Title введите любое имя ключа.
  5. Скопируйте в поле Key ваш SSH-ключ.
  6. Нажмите кнопку Add SSH key.

Создайте образ с помощью Jenkins

Сборка образа в Jenkins запускается автоматически после выполнения команды push в ветке master GitHub-репозитория.

  1. Склонируйте на ваш компьютер ответвление репозитория examples, которое вы создали во время подготовки к работе:

    $ git clone git@github.com:<логин на GitHub>/examples.git
    
  2. Внесите изменения в шаблоны Packer, находящиеся в директории jenkins-packer/packer/. Документацию шаблонов Packer можно найти на сайте разработчика. В параметрах image_family и source_image_family указываются семейства образов, которые будет собирать Jenkins. Подробнее о семействах см. Семейства образов.

  3. Внесите изменения в файл описания Pipeline для Jenkins Jenkinsfile, расположенный в корневой директории репозитория. Документацию Pipeline см. на сайте разработчика.

  4. Загрузите изменения на Github:

    $ git add -A
    $ git commit -m "Build update"
    $ git push
    
  5. Откройте административную панель Jenkins и проверьте состояние задачи.

  6. Если все настройки выполнены верно, то запустится сборка образов. Результат выполнения можно увидеть в логах сборки.

После этого в разделе Образы сервиса Compute Cloud появятся три новых образа:

  • Debian — базовый образ с последними обновлениями.
  • nginx — образ с веб-серверм nginx, базирующийся на образе Debian.
  • Django — образ с фреймворком Django, базирующийся на образе Debian.

Разверните образы

После того, как образы будут созданы, их можно использовать для создания виртуальных машин. Создайте тестовую инфраструктуру с помощью Terraform:

  1. В директории с ответвлением перейдите в директорию с файлами Terraform:

    $ cd examples/jenkins-packer/terraform
    
  2. Переименуйте файл terraform.tfvars_example:

    mv terraform.tfvars_example terraform.tfvars
    
  3. Заполните поля файла требуемыми значениями. Документацию Terraform см. на сайте разработчика.

  4. Инициализируйте провайдера Terraform командой terraform init.

  5. Выполните команду terraform plan -var-file="terraform.tfvars". Проверьте созданную конфигурацию.

  6. Выполните команду terraform apply и подтвердите создание инфраструктуры, введя yes в терминале.

После этого будут созданы:

  1. Облачная сеть.
  2. Подсети во всех зонах доступности.
  3. Виртуальные машины из образов, созданных с помощью Packer. Виртуальные машины с nginx получат публичные IP-адреса. Все виртуальные машины будут подключены к подсетям.

Удалите созданные ресурсы

Если вам больше не нужны ВМ и образы:

Для удаления созданных с помощью Terraform используйте команду terraform destroy.