Деплой с помощью github actions и пакетов

—

от автора

Гайд по настройке деплоя через ssh и docker контейнеры в github. Развертывать будем на сервер под управлением Ubuntu 23.04.


Предустановка сервера

Нам понадобится docker-compose.

Настроим доступы к нашему серверу

Для этого создадим нового пользователя, под которым будем ходить из github actions:

sudo adduser smith

Разрешим для нашего юзера выполнять docker команды без пароля

sudo usermod -aG docker smith

Для доступа из github, создадим ssh ключ и его же добавим в авторизованные ключи:

ssh-keygen cp .ssh/id_rsa.pub .ssh/authorized_keys

Настройка github

Создадим PAT (персональный токен доступа) на странице — Personal Access Tokens (Classic) (github.com) . Важно его сохранить на время куда-нибудь. Если делаете для организации, то у неё другая страница.

Добавляем секреты в репу (settings -> Secrets -> Actions):

  • PAT — персональный токен

  • SSH_HOST — хост машины, на которой будем разворачивать контейнер

  • SSH_PRIVATE_KEY — приватный ключ юзера smith

  • SSH_USER — имя юзера, smith

Создаем в репе файл docker-compose.yml с нашим сервисом:

services:   example_app:     container_name: example_app     image: ghcr.io/your_nick/example_app:latest     volumes:       - ~/data:/app/data

Настраиваем github workflow, файл .github/workflow/deploy.yml:

name: deploy  on:   pull_request:     types:       - closed     branches: [ "main" ]  jobs:      build:         name: Build         runs-on: ubuntu-latest          steps:         - uses: actions/checkout@v3         - name: Login           run: |             echo ${{ secrets.PAT }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin         - name: Build and Publish           run: |             docker build . --tag ${{ env.DOCKER_TAG }}             docker push ${{ env.DOCKER_TAG }}      deploy:         name: Deploy         runs-on: ubuntu-latest          steps:         - uses: actions/checkout@v4         - name: install ssh keys           # check this thread to understand why its needed:           # <https://stackoverflow.com/a/70447517>           run: |             install -m 600 -D /dev/null ~/.ssh/id_rsa             echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa             ssh-keyscan -H ${{ secrets.SSH_HOST }} > ~/.ssh/known_hosts         - name: create docker compose config           run: |             cat docker-compose.yml | envsubst > docker-compose-secret.yml         - name: copy docker compose config           run: scp docker-compose-secret.yml ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:docker-compose.yml         - name: connect and pull           run: ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "docker-compose pull && docker-compose up -d && exit"         - name: cleanup config           if: always()           run: ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "rm docker-compose.yml"         - name: cleanup keys           if: always()           run: rm -rf ~/.ssh docker-compose-secret.yml 

В данном случае сборка и деплой будет при мёрже пул-реквеста.

Docker-compose будет скачивать образ из ghcr.io без кредов, поэтому нужно сделать наш пакет публичным. На странице профиля github смотрим вкладку packages. Выбираем пакет и в разделе Package settings открываем доступ.

Есть опция сделать работу с приватным пакетом, тогда нужно PAT везде использовать, будет чуть сложнее конфиг workflow.

P.S.:

На этом всё. Напишите, как вы разворачиваете с помощью github свои проекты. Вероятно мой вариант не самый удобный.


ссылка на оригинал статьи https://habr.com/ru/articles/810041/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *