Руководство. Создание конвейера Jenkins с помощью GitHub и Docker

Важно!

Многие службы Azure используют подключаемые модули Jenkins. Поддержка некоторых таких подключаемых модулей будет прекращена 29 февраля 2024 г. В настоящее время для интеграции Jenkins со службами Azure рекомендуется использовать Azure CLI. Дополнительные сведения см. в статье Подключаемые модули Jenkins для Azure.

Чтобы автоматизировать этапы создания и тестирования приложения, вы можете использовать конвейер непрерывной интеграции и развертывания (CI/CD). В этом учебнике мы создадим конвейер CI/CD на виртуальной машине Azure, включая следующие задачи:

  • Создание виртуальной машины Jenkins
  • Установка и настройка Jenkins
  • Создание интеграции webhook между GitHub и Jenkins
  • Создание и активация заданий сборки Jenkins из фиксаций GitHub
  • Создание образа Docker для приложения
  • Проверка создания фиксацией GitHub образа Docker и изменения выполняющегося приложения

При работе с этим руководством используется интерфейс командной строки (CLI) в Azure Cloud Shell, который всегда обновлен до последней версии. Чтобы открыть Cloud Shell, выберите Попробовать в верхнем углу любого блока кода.

Если вы решили установить и использовать интерфейс командной строки локально, то для работы с этим руководством вам понадобится Azure CLI 2.0.30 или более поздней версии. Чтобы узнать версию, выполните команду az --version. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.

Создание экземпляра Jenkins

В предыдущем руководстве Как настроить виртуальную машину Linux при первой загрузке вы узнали, как автоматизировать настройку виртуальной машины с помощью cloud-init. В этом учебнике используется файл cloud-init для установки Jenkins и Docker на виртуальной машине. Jenkins — это популярный сервер автоматизации с открытым исходным кодом, который легко интегрируется с Azure для обеспечения непрерывной интеграции и непрерывной поставки (CI/CD). Другие руководства по использованию Jenkins см. в документации Jenkins® в Azure.

В текущей оболочке создайте файл cloud-init-jenkins.txt и вставьте в него приведенную ниже конфигурацию. Например, создайте файл в Cloud Shell, не на локальном компьютере. Введите sensible-editor cloud-init-jenkins.txt, чтобы создать файл и просмотреть список доступных редакторов. Убедитесь, что весь файл cloud-init скопирован правильно, особенно первая строка:

#cloud-config
package_upgrade: true
write_files:
  - path: /etc/systemd/system/docker.service.d/docker.conf
    content: |
      [Service]
        ExecStart=
        ExecStart=/usr/bin/dockerd
  - path: /etc/docker/daemon.json
    content: |
      {
        "hosts": ["fd://","tcp://127.0.0.1:2375"]
      }
runcmd:
  - apt install openjdk-8-jre-headless -y
  - wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
  - sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
  - apt-get update && apt-get install jenkins -y
  - curl -sSL https://get.docker.com/ | sh
  - usermod -aG docker azureuser
  - usermod -aG docker jenkins
  - service jenkins restart

Прежде чем создать виртуальную машину, выполните команду az group create, чтобы создать группу ресурсов. В следующем примере создается группа ресурсов с именем myResourceGroupJenkins в расположении eastus.

az group create --name myResourceGroupJenkins --location eastus

Теперь создайте виртуальную машину командой az vm create. Используйте параметр --custom-data, чтобы передать файл конфигурации cloud-init. Укажите полный путь к конфигурации cloud-init-jenkins.txt, если этот файл сохранен вне текущего рабочего каталога.

az vm create --resource-group myResourceGroupJenkins \
    --name myVM \
    --image UbuntuLTS \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init-jenkins.txt

Создание и настройка виртуальной машины может занять несколько минут.

Чтобы разрешить веб-трафик к вашей виртуальной машине, используйте команду az vm open-port для открытия порта 8080 для трафика Jenkins и порта 1337 для приложения Node.js, которое используется для запуска примера приложения:

az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 8080 --priority 1001
az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 1337 --priority 1002

Настройка Jenkins

Чтобы получить доступ к экземпляру Jenkins, получите общедоступный IP-адрес виртуальной машины:

az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv

В целях безопасности для запуска установки Jenkins необходимо ввести первоначальный пароль администратора, хранящийся в текстовом файле на виртуальной машине. Используйте общедоступный IP-адрес, полученный на предыдущем шаге, чтобы настроить подключение SSH для виртуальной машины:

ssh azureuser@<publicIps>

С помощью команды service проверьте, запущен ли сервер Jenkins:

$ service jenkins status
● jenkins.service - LSB: Start Jenkins at boot time
   Loaded: loaded (/etc/init.d/jenkins; generated)
   Active: active (exited) since Tue 2019-02-12 16:16:11 UTC; 55s ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 0 (limit: 4103)
   CGroup: /system.slice/jenkins.service

Feb 12 16:16:10 myVM systemd[1]: Starting LSB: Start Jenkins at boot time...
...

Просмотрите initialAdminPassword для установки Jenkins и скопируйте его:

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

Если файл еще не доступен, подождите несколько минут, пока файл cloud-init не завершит установку Jenkins и Docker.

Теперь откройте браузер и перейдите к http://<publicIps>:8080. Выполните начальную настройку Jenkins следующим образом:

  • Щелкните Select plugins to install (Выбрать подключаемые модули для установки).
  • Выполните поиск по слову GitHub в текстовом поле вверху. Установите флажок для GitHub, а затем выберите Установить.
  • Создайте первого администратора. Введите имя пользователя, например admin, а затем укажите безопасный пароль. Наконец введите полное имя и адрес электронной почты.
  • Выберите Сохранить и завершить.
  • Когда настройка Jenkins будет завершена, щелкните Start using Jenkins (Начать работу с Jenkins).
    • Если веб-браузере отображает пустую страницу при запуске Jenkins, перезапустите службу Jenkins. В сеансе SSH введите sudo service jenkins restart, а затем обновите веб-браузера.
  • При необходимости войдите в Jenkins, введя созданные имя пользователя и пароль.

Создание объекта webhook GitHub

Чтобы настроить интеграцию с GitHub, откройте пример приложения Node.js Hello World из репозитория примеров Azure. Чтобы создать разветвление репозитория для своей учетной записи GitHub, нажмите кнопку Fork (Разветвление) в правом верхнем углу.

Создание объекта webhook в созданном разветвлении

  • Щелкните Settings (Параметры), а затем выберите Webhooks (Веб-перехватчики).
  • Нажмите кнопку Add webhook (Добавить веб-перехватчик) и в поле фильтра введите Jenkins.
  • В поле URL-адреса полезных данных введите http://<publicIps>:8080/github-webhook/. Убедитесь, что адрес содержит завершающую косую черту (/).
  • В поле типа содержимого выберите application/x-www-form-urlencoded.
  • Для параметра Which events would you like to trigger this webhook? (Какие события должен активировать этот веб-перехватчик?) выберите Just the push event (Только событие отправки).
  • Установите флажок Active (Активно).
  • Щелкните Add webhook (Добавить веб-перехватчик).

Add GitHub webhook to your forked repo

Создание задания Jenkins

Чтобы система Jenkins реагировала на событие в GitHub, такое как фиксация кода, создайте задание Jenkins. Используйте URL-адреса для собственной вилки GitHub.

На веб-сайте Jenkins щелкните Create new jobs (Создание заданий) на домашней странице.

  • Введите HelloWorld в качестве имени задания. Выберите Freestyle project (Универсальный проект) и нажмите кнопку ОК.
  • В разделе Общие выберите проект GitHub и введите URL-адрес вилки репозитория, например https://github.com/cynthn/nodejs-docs-hello-world.
  • В разделе Управление исходным кодом выберите Git и введите URL-адрес GIT-файла вилки репозитория, например https://github.com/cynthn/nodejs-docs-hello-world.git.
  • В разделе Build Triggers (Создание триггеров) выберите GitHub hook trigger for GITScm polling (Обработчик триггера Github для опроса GITScm).
  • В разделе Build (Сборка) щелкните Add build step (Добавить шаг сборки). Выберите Execute shell (Выполнение оболочки), затем введите echo "Test" в командном окне.
  • В нижней части окна заданий нажмите кнопку Save (Сохранить).

Тестирование интеграции GitHub

Для проверки интеграции GitHub с Jenkins зафиксируйте изменение в разветвлении.

Вернитесь к веб-интерфейсу пользователя GitHub, выберите разветвление репозитория и щелкните файл index.js. Щелкните значок карандаша и измените этот файл так, чтобы строка 6 выглядела следующим образом.

response.end("Hello World!");

Чтобы зафиксировать изменения, нажмите кнопку Commit changes (Зафиксировать изменения) внизу.

В Jenkins запускается новая сборка в разделе Build history (Журнал сборок) в левом нижнем углу страницы задания. Щелкните ссылку с номером сборки и выберите Console output (Вывод консоли) слева. Вы можете просмотреть действия, выполняемые Jenkins по мере получения кода из GitHub и вывода действием сборки сообщения Test на консоли. Каждый раз, когда в GitHub выполняется фиксация, веб-перехватчик достигает Jenkins и активирует новый процесс сборки.

Определение образа сборки Docker

Чтобы увидеть, как приложение Node.js выполняется в зависимости от фиксаций GitHub, мы создадим образ Docker для выполнения приложения. Образ строится на основе файла Dockerfile, определяющего конфигурацию контейнера, в котором выполняется приложение.

Измените путь SSH-подключения к виртуальной машине, задав каталог рабочей области Jenkins, имя которого соответствует заданию, созданному на предыдущем шаге. В текущем примере это будет HelloWorld.

cd /var/lib/jenkins/workspace/HelloWorld

Создайте файл в этом каталоге рабочей области с sudo sensible-editor Dockerfile и вставьте следующее содержимое. Убедитесь, что весь файл Dockerfile скопирован правильно, особенно первая строка:

FROM node:alpine

EXPOSE 1337

WORKDIR /var/www
COPY package.json /var/www/
RUN npm install
COPY index.js /var/www/

Этот файл Dockerfile использует базовый образ Node.js с помощью Alpine Linux, предоставляет порт 1337, по которому выполняется приложение Hello World, а затем копирует файлы приложения и инициализирует его.

Создание правил сборки Jenkins

На предыдущем шаге мы создали базовое правило сборки Jenkins, которое выводит сообщения на консоль. Теперь создадим шаг сборки, который будет использовать наш Dockerfile и запускать приложение.

Вернитесь в экземпляр Jenkins и выберите задание, созданное на предыдущем шаге. Щелкните Configure (Настройка) в левой части и прокрутите страницу вниз до раздела Build (Сборка).

  • Удалите существующий шаг сборки echo "Test". Щелкните красный крест в верхнем правом углу поля существующего шага сборки.

  • Щелкните Add build step (Добавить шаг сборки), а затем выберите Execute shell (Выполнение оболочки).

  • В поле Command (Команда) введите следующие команды Docker. Затем нажмите кнопку Save (Сохранить):

    docker build --tag helloworld:$BUILD_NUMBER .
    docker stop helloworld && docker rm helloworld
    docker run --name helloworld -p 1337:1337 helloworld:$BUILD_NUMBER node /var/www/index.js &
    

Шаги сборок Docker создают образ и помечают его номером сборки Jenkins, чтобы вы могли вести журнал образов. Любые существующие контейнеры, выполняющие приложение, будут остановлены, а затем удалены. Затем с помощью образа запускается новый контейнер, который выполняет ваше приложение Node.js в зависимости от последней фиксации в GitHub.

Тестирование конвейера

Чтобы увидеть весь конвейер в действии, снова измените файл index.js в разветвлении репозитория GitHub и нажмите кнопку Commit changes (Зафиксировать изменения). Новое задание запускается Jenkins в зависимости от объекта webhook для GitHub. Создание образа Docker и запуск вашего приложения в новом контейнере занимает несколько секунд.

При необходимости снова получите общедоступный IP-адрес виртуальной машины:

az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv

Откройте веб-браузер и введите http://<publicIps>:1337. Приложение Node.js отображается и отражает последние фиксации в разветвлении GitHub следующим образом:

Running Node.js app

Теперь внесите другое изменение в файл index.js в GitHub и зафиксируйте изменение. Подождите несколько секунд, пока завершится задание в Jenkins, а затем обновите веб-браузер, чтобы увидеть измененную версию приложения, выполняющегося в новом контейнере, следующим образом:

Running Node.js app after another GitHub commit

Следующие шаги

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

  • Создание виртуальной машины Jenkins
  • Установка и настройка Jenkins
  • Создание интеграции webhook между GitHub и Jenkins
  • Создание и активация заданий сборки Jenkins из фиксаций GitHub
  • Создание образа Docker для приложения
  • Проверка создания фиксацией GitHub образа Docker и изменения выполняющегося приложения

Перейдите к следующему руководству, чтобы узнать, как интегрировать Jenkins в Azure DevOps Services.