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

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

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


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

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

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

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

sudo adduser smith

Добавим доступ к sudo

sudo usermod -aG sudo 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/


Интересные статьи

Интересные статьи

IBM презентовала новую технологию защиты от киберугроз для твердотельных накопителей. FlashCore Module четвёртого поколения использует методы искусственного интеллекта, чтобы выявлять и блокировать вр...
Обретите цифрового двойника Цель этой статьи - показать, как эффективно и с минимальными затратами настроить LLM на пользовательском датасет. Мы рассмотрим использование модели Falcon-7B с адап...
Привет, Хабр!  Всем известно, что чрезмерное использование рентгеновских лучей негативно влияет на здоровье человека. Однако метод компьютерной томографии очень востребован, так как позволяет неи...
Если говорить о синтаксисе, записи (Records) кажутся лаконичным способом создания нового типа данных для хранения неизменяемых данных. Но как насчет его семантики? Другими словами,...
Не смотря на то, что Python был бы предпочтительным инструментом для исследовательского анализа, я хотел посмотреть, смогу ли я провести весь исследовательский анализ с помощью SQL-запросов. Моя цель ...