Если вы переключились с использованием услуг 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
начать наш контейнер.
Чтобы ответить на изменения в коде, это шаги, которые нам нужно предпринять:
- Снимите обновленный
жить
ветка - Создайте изображение (которое также построит проект)
- Разорвать существующие контейнеры
- Запустите существующий контейнер
Мы будем обернуть эти шаги немного 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»