Поделиться через


Учебное пособие: Создание потока Jenkins с использованием GitHub и Docker

Это важно

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

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

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

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

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

Создание экземпляра 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>

Убедитесь, что Jenkins выполняется с помощью service команды:

$ 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 следующим образом:

  • Выберите подключаемые модули для установки
  • Найдите GitHub в текстовом поле в верхней части окна. Установите флажок для GitHub, а затем нажмите кнопку "Установить"
  • Создайте первого пользователя администратора. Введите имя пользователя, например администратор, а затем укажите собственный безопасный пароль. Наконец, введите полное имя и адрес электронной почты.
  • Нажмите кнопку "Сохранить" и "Готово"
  • Когда Jenkins будет готов, нажмите кнопку "Пуск" с помощью Jenkins
    • Если веб-браузер отображает пустую страницу при запуске Jenkins, перезапустите службу Jenkins. В сеансе SSH введите sudo service jenkins restartи обновите веб-браузер.
  • При необходимости войдите в Jenkins с помощью созданного имени пользователя и пароля.

Создайте веб-перехватчик GitHub

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

Создайте вебхук внутри созданного форка:

  • Выберите Настройки, а затем выберите Webhooks слева.
  • Нажмите "Добавить вебхук", а затем введите Jenkins в поле фильтра.
  • Для URL-адреса полезных данных, введите http://<publicIps>:8080/github-webhook/. Убедитесь, что вы добавили конечную /
  • Для типа контента выберите application/x-www-form-urlencoded.
  • Для каких событий вы хотите активировать этот веб-перехватчик? выберите только push-событие.
  • Установите флажок "Активный" на отмечено.
  • Щелкните Add webhook (Добавить веб-перехватчик).

Добавление веб-перехватчика GitHub в форк репозитория

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

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

На веб-сайте Jenkins выберите "Создать задания " на домашней странице:

  • Введите HelloWorld в качестве имени задания. Выберите проект Freestyle, а затем нажмите кнопку "ОК".
  • В разделе Общие выберите проект GitHub и введите URL-адрес вашего форкнутого репозитория, например https://github.com/cynthn/nodejs-docs-hello-world
  • В разделе "Управление исходным кодом " выберите Git, введите URL-адрес вилированного репозитория .git , например https://github.com/cynthn/nodejs-docs-hello-world.git
  • В разделе Триггеры сборки выберите триггер hook GitHub для опроса GITscm.
  • В разделе "Сборка" выберите "Добавить шаг сборки". Выберите "Выполнить оболочку", а затем введите echo "Test" в командное окно.
  • Нажмите кнопку "Сохранить " в нижней части окна заданий.

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

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

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

response.end("Hello World!");

Чтобы зафиксировать изменения, нажмите кнопку "Фиксация изменений " внизу.

В Jenkins новая сборка начинается в разделе История сборок в нижнем левом углу страницы вашего задания. Выберите ссылку номера сборки и выберите выходные данные консоли слева. Вы можете просмотреть шаги 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, выберите задание, созданное на предыдущем шаге. Выберите "Настроить" в левой части и прокрутите вниз до раздела "Сборка ":

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

  • Выберите "Добавить шаг сборки", а затем нажмите кнопку "Выполнить оболочку"

  • В командном поле введите следующие команды Docker, а затем нажмите кнопку "Сохранить".

    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 и нажмите Зафиксировать изменение. Новое задание начинается в Jenkins на основе веб-перехватчика для GitHub. Для создания образа Docker и запуска приложения в новом контейнере потребуется несколько секунд.

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

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

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

Запуск приложения Node.js

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

Запуск приложения Node.js после очередного коммита на GitHub

Дальнейшие шаги

В этом руководстве вы настроили GitHub для запуска задания сборки Jenkins при каждом коммите кода, а затем развернули контейнер Docker для тестирования вашего приложения. Вы узнали, как:

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

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