Аннотация

Внедрение контейнеров Docker и методов DevOps произвело революцию в развертывании программного обеспечения, предоставив командам разработчиков гибкость и масштабируемость. В этой статье мы исследуем интеграцию рабочих процессов непрерывной интеграции/непрерывного развертывания Docker (CI/CD) в средах виртуального частного облака Linux (VPC) или виртуального частного сервера (VPS), используя GitHub Actions для оптимизации автоматизации. Мы углубляемся в тонкости автоматизации сборки образов Docker и отправки образов в DockerHub с помощью GitHub Actions. Мы также продемонстрируем, как организовать перезапуск приложений Docker и настроек Docker Compose посредством взаимодействия на основе SSH, а также рассмотрим расширение возможностей автоматизации путем введения веб-перехватчиков в качестве альтернативного механизма запуска.

К концу этой статьи вы поймете, как использовать GitHub Actions для автоматизации CI/CD для приложений Docker в средах VPC/VPS. Это поможет вам повысить качество и надежность выпусков программного обеспечения, а также сократить время, необходимое для предоставления пользователям новых функций.

Содержание:

  1. Абстрактный
  2. Введение
  3. Сборка образов Docker BuildPush с помощью действий GitHub через SSH.
  4. Настройка веб-хука на сервере
  5. Сборка образов Docker BuildPush с помощью действий GitHub через веб-хук
  6. Заключение
  7. Рекомендации

Введение

Во-первых, в моей последней статье из этой серии GitHub Actions под названием Начало работы с GitHub Actions: Руководство для начинающих мы рассмотрели основы GitHub Actions. В этой статье мы будем опираться на эти знания и покажем вам, как использовать GitHub Actions для создания и отправки образов Docker в Docker Hub. Я также рассмотрел основы Docker в своей статье. Мы также расскажем, как перезапустить приложения Docker на VPC или VPS через SSH и через веб-хук.

Образы BuildPush Docker с использованием действий GitHub через SSH

Чтобы создать и отправить образы Docker с помощью действий GitHub, мы будем использовать следующие действия:

  1. docker/login-action@v1: это действие позволит войти в Docker Hub, используя ваши учетные данные.
  2. docker/build-push-action@v2: это действие создаст и отправит образ Docker в Docker Hub.

Ниже подробно представлен наш файл действий GitHub. Это базовое приложение expressjs только с одной конечной точкой, возвращающей «Hello World».

name: Continuous Integration-Continuous Deployment

on:
  push:
    branches:
      - main
jobs:
  build:
    runs-on: ubuntu-latest
    name: Continuous Integration
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
        with:
          node-version: 18
      - run: npm ci
      - run: npm run test
  docker_build:
    runs-on: ubuntu-latest
    name: Docker Image Build
    needs: [build]
    steps:
      - uses: actions/checkout@v2
      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Build Docker image
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./docker/Dockerfile
          push: true
          tags: gvgodfrey/expressjs:latest
  deploy:
    runs-on: ubuntu-latest
    name: Continuous Deployment
    needs: [docker_build]
    steps:
      - name: Deploy using ssh
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USERNAME }}
          password: ${{ secrets.SSH_PASSWORD }}
          port: 22
          script: |
            cd /srv/expressjs/;docker stop expressjs;docker rm expressjs;docker pull gvgodfrey/expressjs:latest;docker-compose up -d

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

1. Задание сборки (наш конвейер непрерывной интеграции), которое включает шаги по настройке среды и запуску тестов для приложения Node.js в следующем порядке:

  • Проверьте наш репозиторий проекта, используя пакет action/checkout@v2. Действие action/checkout@v2 загрузит код из репозитория в каталог $GITHUB_WORKSPACE. Этот каталог создается GitHub Actions и используется для хранения кода, извлеченного из репозитория, который будет использоваться для автоматизированного рабочего процесса, такого как в данном случае GitHub Actions, или других действий.
  • Настройте среду Node.js, используя пакет action/setup-node@v1.
  • Установите зависимости проекта с помощью npm ci.
  • Запустите тесты (если они используются, чтобы убедиться, что сборка нашего проекта не нарушает логику).

2. Создание задания образа Docker, которое включает шаги по созданию и отправке образа Docker в Docker Hub в следующем порядке:

  • Проверьте репозиторий.
  • Войдите в Docker Hub, используя пакет docker/login-action@v1 и учетные данные Docker Hub, которые хранятся в секретах DOCKER_USERNAME и DOCKER_PASSWORD GitHub Actions.
  • Создайте образ Docker, используя docker/build-push-action@v2.
  • Отправьте созданный образ в Docker Hub с тегом gvgodfrey/expressjs:latest.

3. Задание развертывания (непрерывная доставка), которое включает шаги для запуска развертывания на сервере в следующем порядке.

  • Изменяет каталог на каталог /srv/expressjs/, в котором на сервере находится наш yaml-файл docker-compose.
  • Останавливает существующий контейнер «expressjs”.
  • Удаляет существующий контейнер «expressjs”.
  • Извлекает последний образ gvgodfrey/expressjs Docker из Docker Hub.
  • Запускает контейнер expressjs с помощью Docker Compose.

Настройка веб-хука на сервере

Чтобы настроить веб-перехватчик на сервере, нам нужно сделать пару вещей

1) Установите пакет веб-перехватчика с помощью команды «sudo apt-get install webhook»
2) После завершения установки переходим к следующему шагу, который включает в себя создание службы, которая будет гарантировать, что веб-перехватчик остается активным. через перезапуски и сбои. Это можно сделать с помощью следующего набора команд:

# set up the web hook service
# define our web hook home directory
webhook_home_dir=/home/webhook/
# create web hook service
cat > webhook.service << EOF
[Unit]
Description=Web hook server for triggering CICD Deployment
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/webhook -verbose -hooks $webhook_home_dir/hooks.json -port 9105
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF

3) В приведенном выше скрипте мы обозначили домашний каталог вебхука (webhook_home_dir) как «/home/webhook/». Однако вы можете выбрать другой каталог, который вам больше подходит. Следующим шагом будет создание файла webhook.service, который будет содержать инструкции по запуску сервера вебхуков на порту 9105, а также определение конечных точек вебхуков (хуков), указанных в файле «${webhook_home_dir}/hooks.json».

Вы можете спросить, что это за файлooks.json? Этот файл содержит все сопоставления каждого крючка с файлом сценария (.sh). Затем файл сценария содержит инструкции по обновлению образа и приложения, а это означает, что здесь можно разместить команды, которые мы запускали ранее для метода ssh.
Ниже приведен пример файлаooks.json.

[
  {
    "id": "redeploy-expressjs",
    "execute-command": "/home/webhook/expressjs/deploy.sh",
    "command-working-directory": "/home/webhook/expressjs/",
    "response-message": "Continuous Deployment for Expressjs app."
  }
]

Ниже приведен наш файл sh, расположенный в каталоге, который мы указали выше в файлеooks.json «/home/webhook/expressjs/deploy.sh».

#!bin/bash
cd /srv/expressjs/;docker stop expressjs;docker rm expressjs;docker pull gvgodfrey/expressjs:latest;docker-compose up -d

Затем мы запускаем эти команды, чтобы переместить файл webhook.service, который мы создали выше, в папку «/etc/systemd/system/» и запустить службу.

sudo mv webhook.service /etc/systemd/system/webhook.service
sudo systemctl daemon-reload
sudo systemctl start webhook.service

В Linux каталог /etc/systemd/system/ обычно используется для хранения файлов конфигурации, связанных с системными службами.
Моя окончательная структура папок выглядит примерно так: папка «expressjs» содержит файл сценария (deploy .sh), который будет запускаться при каждом вызове перехватчика

Образы BuildPush Docker с использованием действий GitHub через веб-хук

Чтобы инициировать развертывание через веб-перехватчик, единственное серьезное изменение, которое необходимо внести в наш файл действий GitHub, — это задание развертывания, как показано ниже:

deploy:
    runs-on: ubuntu-latest
    name: Continuous Deployment
    needs: [docker_build]
    steps:
      - name: Deploy docker container webhook
        uses: joelwmale/webhook-action@master
        env:
          WEBHOOK_URL: http://${{ secrets.SSH_HOST }}:${{ secrets.SSH_PORT }}/hooks/redeploy-expressjs
          data: ""

Теперь давайте быстро разберем команды веб-хука, приведенные выше.

  1. Задание развертывания (непрерывная доставка), которое включает шаги по запуску развертывания на сервере в следующем порядке:
  • Отправьте запрос к существующему на сервере веб-хуку (redeploy-expressjs, определенному в файлеooks.json выше), используя пакет joelwmale/webhook-action@master.
  • Веб-перехватчик запускает сценарий ssh ​​сверху, который перетаскивает только что отправленный образ Docker локально на сервер, и перезапускает приложение Docker на сервере.

Заключение

Интеграция Docker с GitHub Actions позволяет оптимизировать процессы разработки и развертывания. Мы научились легко создавать и отправлять образы Docker с помощью GitHub Actions. Кроме того, мы изучили способы перезапуска приложений Docker и служб Docker Compose на VPC/VPS с помощью пакета appleboy/ssh-action@master. Наконец, мы увидели, как запускать действия с помощью веб-перехватчиков с помощью пакета `joelwmale/webhook-action@master`, который позволяет разработчикам беспрепятственно автоматизировать задачи.

Вы можете получить доступ к коду из этого репозитория Github.

Ссылки

1) Действие BuildPush
2) Действие входа в Docker
3) Действие Joelwmale Web-hook
4) Документация действий Github
5) Действия Github Маркетплейс
6) Докер-документация