Рубрики
Uncategorized

Сделайте свой собственный Heroku! Авто-развертывание приложения Docker на вашем собственном сервере с действиями GitHub

Если вы переключили с использованием услуг PAAS, как Heroku, чтобы запустить VPS (или собственную машину!) … Помечено с Docker, Github, Devops.

Если вы переключились с использованием услуг PAAS, как Heroku, чтобы запустить VPS (или вашу собственную машину!) Тогда вы можете пропустить функции, такие как автоматическое развертывание.

К счастью, с силой Active Github Actions и Docker, простым репликации автоматического развертывания самостоятельно.

Вы можете найти окончательный пример репозитория ниже:

Toficofi/Auto-Deploy-Docker

🎯 Цель

Мы сможем Git Push Origin Live Некоторые изменения, и обнаруживают, что ваш сервер автоматически вытащил изменения, создал новое изображение и перезапустил контейнеры, не поднимая палец.

🧠 Что мне нужно?

Данное руководство предполагает базовое понимание докера, Git и Bash, и что у вас есть VPS или другой машину Linux, уже предоставленной. Стек для вашего приложения не имеет значения здесь!

🚀 Давайте начнем!

Наше приложение

В этом примере мы будем использовать шаблон asp.net core webapp asp.net. Неважно, какой стек вы используете, до тех пор, пока он притесняется.

$ mkdir auto-deploy-docker
$ cd auto-deploy-docker
$ dotnet new webapp
$ dotnet run dev

(Местная оболочка)

Это приведет нас с простого WebApp, найденного в localhost: 5000. .

🐳 Время докера

Бросить Dockerfile в корне проекта. Мы собираемся украсть конфигурацию из Dockerize ASP.NET Core Application Как это соответствует нашим потребностям. Я аннотировал файл с комментариями.

# syntax=docker/dockerfile:1
# First stage: build the app
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env

# Make and switch to the /app directory
WORKDIR /app

# Copy the C# project file into /app
COPY *.csproj ./

# Restore dependencies
RUN dotnet restore

# Now we can copy the rest of the source into /app
COPY ./ ./

# Build the project in Release mode to the "out" directory
RUN dotnet publish -c Release -o out

# Second stage: run the app
FROM mcr.microsoft.com/dotnet/aspnet:5.0

# Switch back to /app
WORKDIR /app 

# Copy the binaries from the build stage into our new stage
COPY --from=build-env /app/out .

# Set the entrypoint for when the image is started
ENTRYPOINT ["dotnet", "auto-deploy-docker.dll"]

Чтобы уменьшить размер изображения, опустить .Dockerignore Поэтому мы не копируем в бинарии из контекста. Нам не нужно это, потому что мы строим проект внутри контейнера.

bin/
obj/

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

Давайте построим изображение и убедитесь, что работает локально. Убедитесь, что вы выходите из dotnet запускает dev. Вы начали ранее, так что он не работает порта 5000!

# build the image
$ docker build . -t auto-deploy-docker

# run the image, binding the container's 80 to our 5000
$ docker -p 5000:80 run auto-deploy-docker 

(Местная оболочка)

Перемещаться снова до localhost: 5000 И вы должны увидеть то же приложение.

Большой! Последнее, что мы захочем сделать здесь, используют мощные Docker Compose . Если вы еще не использовали составить, в основном это способ определить все контейнеры, которые нам нужно использовать для нашего приложения с Docker-Compose.yml Файл конфигурации, что означает, что мы можем поставить их все вверх и разорвать их все в одном ходу, не поехали с другими командами.

В этом примере мы выполняем только один WebApp в контейнере только, но если вам нужно добавить другие услуги — как фоновый работник или контейнер для базы данных, Compose помогает вам организовать их. Кроме того, он позволяет настроить контейнеры для автоматического перезагрузки, когда перезапускаются, или хост-машина перезапускается.

Сделать Docker-Compose.yml и заполните его так:

version: "3.8"
services:
  auto_deploy_docker: # name of the service
    image: auto-deploy-docker # the image to use
    container_name: auto-deploy-docker # what to label the container for docker ps
    ports:
      - 80:80 # note, we're mapping to port 80 instead of 5000 because we'll use 80 on the VPS
    restart: unless-stopped # restart if failed, until we stop it ourselves

Дайте ему выстрел (Опять же, убедитесь, что вы остановите предыдущий Docker Run )

# bring everything up (will run in background)
$ docker-compose up -d

# tear everything down
$ docker-compose down

(Местная оболочка)

Ницца. У нас все и работает локально. Зафиксируйте свое приложение к Github и сделай жить Ветвь, которая отражает то, что будет жить на нашем VPS. Это то, где мы будем толкать изменения, чтобы они развернуты на сервере.

💻 Бросить наше приложение на VPS

Пришло время сделать вещи отдаленными. SSH в вашу VPS (я использую Putty ) и убедитесь, что у вас установлен Git и Docker. Я использую Debian с изображением докера из OVH. На данный момент они делают хорошее 3,50 долларов в месяц VPS.

Начните с включения кэширования учетных данных. Это сохранит наше имя пользователя GitHub и токен личного доступа. Это, однако, сохранит его в открытом тексте, поэтому убедитесь, что у вас есть жесткий контроль над вашим VPS.

$ git config --global credential.helper store

Далее клонируют ваше репо.

$ git clone https://github.com/toficofi/auto-deploy-docker.git
$ cd auto-deploy-docker

Git подскажет вам войти в Github, если вы еще этого не сделали. Вы не можете использовать свой пароль GitHub здесь, вам нужно генерировать личный токен доступа и используйте это вместо пароля. Ограничьте спецификации для патентов. Нам нужно только репо Доступ на VPS.

Большой! Давайте дадим это тестовый прогон.

# build the image on the server
$ docker build . -t auto-deploy-docker
$ docker-compose up
$ git checkout live # switch to our live branch

(удаленная оболочка) Перейдите к IP-адресу вашего сервера, и вы должны увидеть страницу вверх и запустить. Фантастический!

Далее мы напишем сценарий Bash для автоматического вытягивания изменений и развертывания их.

📝 Сценарий развертывания

Давайте повторимся, где мы находимся.

  • У нас есть приложение ASP.NET Core, и мы подключили его.
  • У нас есть это на Github, а VPS у подтянутой репо.
  • Мы можем запустить Docker-Compose up начать наш контейнер.

Чтобы ответить на изменения в коде, это шаги, которые нам нужно предпринять:

  1. Снимите обновленный жить ветка
  2. Создайте изображение (которое также построит проект)
  3. Разорвать существующие контейнеры
  4. Запустите существующий контейнер

Мы будем обернуть эти шаги немного Deploy.sh Сценарий, который будет справиться со всем одним исполнением.

Сделать Deploy.sh Сценарий:

echo "Deploying changes..."
# Pull changes from the live branch
git pull

# Build the image with the new changes
docker build . -t auto-deploy-docker

# Shut down the existing containers
docker-compose down

# Start the new containers
docker-compose up -d
echo "Deployed!"

ПРИМЕЧАНИЕ. Если вы разрабатываете на платформе Windows, убедитесь, что вы измените ваши окончания строки для использования \r (Unix-стиль) вместо \ r \ n или Bash на сервере не поймет скрипт.

Сделайте исполняемый скрипт и дайте ему выстрел!

$ chmod +x deploy.sh
$ deploy.sh

(удаленная оболочка)

Это может занять пару минут, но вы сможете посмотреть, что он потяните изменения, создайте свое изображение и начните контейнеры.

Подключите к вашему VPS, и вы должны увидеть приложение!

⚡ Настройка действия GitHub

У нас есть наш Deploy.sh Сценарий готов к работе. Последний кусок головоломки состоит в том, чтобы настроить действие GitHub, которое автоматически вызывает этот скрипт всякий раз, когда жить Филиал был обновлен, завершил цикл.

Перепрыгивайте на ваше репо на Github, перейдите к Действия Страница и ударить Пропустите это и настроить рабочий процесс самостоятельно Отказ

Вы будете представлены сценарием рабочего процесса с шаблоном. Это выглядит немного подавляющим, но это действительно просто список «действий». Каждое действие вызвано чем-то, как толкание в ветку. Затем он выполнит последовательность шагов в контейнере, предоставленном GitHub. Вы можете узнать больше о действиях здесь.

Мы просто собираемся использовать действие в SSH и вызывать наш Deploy.sh Скрипт всякий раз, когда жить ветвь толкает.

Снимите этот сценарий рабочего процесса в:

name: Deploy

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the live branch
  push:
    branches: [ live ]
  pull_request:
    branches: [ live ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  deploy:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      - name: log into VPS and trigger deploy script
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }} # uses secrets stored in the Secrets tab
          username: ${{ secrets.USERNAME }}
          password: ${{ secrets.PASSWORD }}
          port: ${{ secrets.PORT }}
          script: sh deploy.sh

Это должно быть довольно самочувствительным. Совершить сценарий рабочего процесса к жить ветка.

Нам нужно будет разрешить доступ к доступу доступа нашего SSH-хоста, имени пользователя, пароля и порта. Перейти к настройкам> Секреты.

Добавить секреты для Хозяин (IP/домен для вашего сервера), Имя пользователя (SSH Имя пользователя), Пароль (SSH Password) Порт (вероятно, 22).

ПРИМЕЧАНИЕ: Эти секреты доступны для всех с доступом вкладчика к хранилищу, что означает, что они смогут войти в ваш VPS. Будь осторожен.

С помощью секретов добавлено, что нам готовы к работе. Давайте дадим это вихре!

На вашей местной машине сделайте изменение в ваше приложение. Например, мы изменим Index.cshtml Чтобы показать «Привет, автоматическое развертывание!»

Welcome

Hello, Auto Deploy!.

Нажмите ваши изменения в жить ветвь и прыгать на Github, чтобы посмотреть действие. Вы сможете увидеть GitHub, выполняющий каждый шаг для вас. Как только это будет сделано, перейдите к своему серверу IP/домен, а некоторые ✨magic✨ произошло!

🎁 Упаковка

Теперь, когда вы завершили это руководство, вы сможете развернуть ваши изменения в VPS простым Git push Отказ Это сэкономит вам тонну времени и делает основу для конференций CI/CD.

Вот несколько следующих шагов, которые вы можете занять:

  • Запустите некоторые тесты как часть вашего трубопровода развертывания
  • Создайте приложение, используя действия GitHub и отправьте двоичные файлы через SCP вместо того, чтобы поддерживать репо на VPS
  • Отправьте уведомление, когда развертывание завершено с Pushbullet Cli.

🎉 Спасибо за чтение! Вы можете найти меня в Twitter здесь. и на LinkedIn здесь.

Оригинал: «https://dev.to/toficofi/make-your-own-heroku-auto-deploy-a-docker-app-on-your-own-server-with-github-actions-5d32»