Аннотация
Внедрение контейнеров 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. Это поможет вам повысить качество и надежность выпусков программного обеспечения, а также сократить время, необходимое для предоставления пользователям новых функций.
Содержание:
- Абстрактный
- Введение
- Сборка образов Docker BuildPush с помощью действий GitHub через SSH.
- Настройка веб-хука на сервере
- Сборка образов Docker BuildPush с помощью действий GitHub через веб-хук
- Заключение
- Рекомендации
Введение
Во-первых, в моей последней статье из этой серии GitHub Actions под названием Начало работы с GitHub Actions: Руководство для начинающих мы рассмотрели основы GitHub Actions. В этой статье мы будем опираться на эти знания и покажем вам, как использовать GitHub Actions для создания и отправки образов Docker в Docker Hub. Я также рассмотрел основы Docker в своей статье. Мы также расскажем, как перезапустить приложения Docker на VPC или VPS через SSH и через веб-хук.
Образы BuildPush Docker с использованием действий GitHub через SSH
Чтобы создать и отправить образы Docker с помощью действий GitHub, мы будем использовать следующие действия:
- docker/login-action@v1: это действие позволит войти в Docker Hub, используя ваши учетные данные.
- 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: ""
Теперь давайте быстро разберем команды веб-хука, приведенные выше.
- Задание развертывания (непрерывная доставка), которое включает шаги по запуску развертывания на сервере в следующем порядке:
- Отправьте запрос к существующему на сервере веб-хуку (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) Докер-документация