Pular para o conteúdo principal

Deploy - Plasfran API V2

Este documento descreve o processo de build e deploy automático do projeto Plasfran API V2 para o ambiente de produção, utilizando GitHub Actions.


Requisitos

  • Projeto em .NET 8.0
  • Branch de produção: master
  • Acesso SSH ao servidor
  • Secrets configuradas no repositório:
    • SSH_HOST_PROD: Endereço do servidor remoto
    • SSH_USER_PROD: Usuário com permissão de escrita
    • SSH_KEY_PROD: Chave privada SSH para acesso ao servidor

Gatilhos

O pipeline é executado automaticamente quando:

  • Um push é feito para a branch master
  • Um gatilho manual é ativado via workflow_dispatch

Etapas do Workflow

1. Checkout do Código

- name: Checkout do código
uses: actions/checkout@v3

Faz o download do código-fonte do repositório.


2. Configuração do SDK .NET

- name: Setup .NET SDK
uses: actions/setup-dotnet@v4
with:
dotnet-version: "8.0.x"

Prepara o ambiente com o SDK .NET 8.0 necessário para build e publish.


3. Restore das Dependências

- name: Restore dependências
run: dotnet restore

Restaura os pacotes NuGet.


4. Build da Aplicação

- name: Build aplicação
run: dotnet build

Compila o projeto.


5. Publicação da Aplicação

- name: Publish aplicação
run: dotnet publish -o ./publish

Gera os artefatos de publicação em ./publish.


6. Remoção do appsettings.json

- name: Remover appsettings.json
run: rm ./publish/appsettings*.json

Evita sobrescrever a configuração de produção no servidor.


7. Backup no Servidor

- name: Fazer backup
uses: appleboy/ssh-action@v1.0.0
with:
...
script: |
mkdir -p /var/www/erp_new-backup
cp -r /var/www/erp_new "/var/www/erp_new-backup/backup_$(date +'%Y%m%d_%H%M%S')"

Realiza backup da versão atual da aplicação antes do deploy.


8. Envio via SCP

- name: Deploy para o servidor via SCP
uses: appleboy/scp-action@v0.1.4
with:
...
source: "./publish/**"
target: "/var/www/erp_new"
strip_components: 1

Copia os arquivos da publicação para o servidor.


9. Restauração do appsettings.json e Restart

- name: Restaurar appsettings.json e reiniciar serviço
uses: appleboy/ssh-action@v1.0.0
with:
...
script: |
cp /var/www/appsettings_new.json /var/www/erp_new/appsettings.json
sudo systemctl restart erp_api_new.service

Repõe o appsettings.json e reinicia o serviço ERP_API_NEW via systemctl.


Resultado Esperado

Ao final do processo:

  • A aplicação é compilada e publicada
  • O ambiente de produção é atualizado
  • O serviço erp_api_new.service é reiniciado com a nova versão

Observações

  • Este workflow não sobrescreve o appsettings.json, mantendo a configuração local do servidor intacta.
  • Backups automáticos são feitos com timestamp antes de cada deploy.

Arquivo completo

name: Build and Deploy BOX3_ERP_API_NEW Produção

on:
push:
branches:
- main
workflow_dispatch:
jobs:
build-and-deploy:
runs-on: ubuntu-latest

steps:
- name: Checkout do código
uses: actions/checkout@v3

- name: Setup .NET SDK
uses: actions/setup-dotnet@v4
with:
dotnet-version: "8.0.x"

- name: Restore dependências
run: dotnet restore

- name: Build aplicação
run: dotnet build

- name: Publish aplicação
run: dotnet publish -o ./publish

- name: Remover appsettings.json para preservar do servidor
run: rm ./publish/appsettings*.json

- name: Fazer backup
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SSH_HOST_PROD }}
username: ${{ secrets.SSH_USER_PROD }}
key: ${{ secrets.SSH_KEY_PROD }}
port: 22
script: |
mkdir -p /var/www/erp_new-backup
cp -r /var/www/erp_new "/var/www/erp_new-backup/backup_$(date +'%Y%m%d_%H%M%S')"

- name: Deploy para o servidor via SCP
uses: appleboy/scp-action@v0.1.4
with:
host: ${{ secrets.SSH_HOST_PROD }}
username: ${{ secrets.SSH_USER_PROD }}
key: ${{ secrets.SSH_KEY_PROD }}
port: 22
source: "./publish/**"
target: "/var/www/erp_new"
strip_components: 1

- name: Restaurar appsettings.json e reiniciar serviço
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SSH_HOST_PROD }}
username: ${{ secrets.SSH_USER_PROD }}
key: ${{ secrets.SSH_KEY_PROD }}
port: 22
script: |
cp /var/www/appsettings_new.json /var/www/erp_new/appsettings.json
sudo systemctl restart erp_api_new.service