DO ‐ Deploy Automático - manolito-fatec/dashflow-2025-1 GitHub Wiki

Deploy Automático no Projeto


Visão Geral

O Deploy Automático no projeto tem o objetivo de automatizar a disponibilização da aplicação em um ambiente de produção. Utilizamos o GitHub Actions para realizar esse processo no back-end e no front-end.

Somente os merges realizados da branch ‘develop’ para 'main' disparam uma pipeline de build, geração do arquivo/diretório final e então o envio para o ambiente de produção. O ambiente de produção , quando devidamente configurado, automaticamente realiza a disponibilização do back-end e front-end para o usuário final.


Configuração do CI no GitHub Actions

Estrutura do CI

O pipeline de CI é dividido em dois fluxos principais:

Backend: Compilação do projeto Java e geração de um artefato .WAR, utilizando Maven , e então o envio desse artefato para a VM especificada.

Frontend: Construção do projeto Vue.js, configurando Node.js 22 para gerar as pastas de produção ‘/dist’ e então o envio do conteúdo dessa pasta para a VM especificada.

Ambos os workflows são disparados automaticamente ao realizar um merge da develop para a main em cada um dos repositórios separadamente.

Configurações da VM

A VM (ambiente de produção) deve ser previamente configurada para receber o client e o server da aplicação.

O servidor deve estar devidamente configurado com o Apache Tomcat ,Postgresql e JDK 17. 


Build and Deploy do Backend

Configuração do Workflow

name: Java Build and Deploy

on:
  push:
    branches:
      [main]

jobs:
  build:
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres:latest
        env:
          POSTGRES_USER: ${{ secrets.DB_USERNAME }}
          POSTGRES_PASSWORD: ${{ secrets.DB_PASSWORD }}
          POSTGRES_DB: dashflow
        ports:
          - 5432:5432
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: maven

      - name: Build with Maven
        run: mvn -B clean package -f pom.xml
        env:
          SPRING_DATASOURCE_URL: jdbc:postgresql://localhost:5432/dashflow
          SPRING_DATASOURCE_USERNAME: ${{ secrets.DB_USERNAME }}
          SPRING_DATASOURCE_PASSWORD: ${{ secrets.DB_PASSWORD }}

      - name: Find WAR file
        id: find-war
        run: |
          WAR_FILE=$(ls target/*.war | head -n 1)
          echo "WAR_FILE=${WAR_FILE}" >> $GITHUB_OUTPUT
          echo "WAR_FILENAME=$(basename ${WAR_FILE})" >> $GITHUB_OUTPUT

      - name: Deploy to ManoLitoVM
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.MANOLITO_VM_IP }}
          username: ${{ secrets.MANOLITO_VM_USR }}
          password: ${{ secrets.MANOLITO_VM_PSW }}
          source: "target/*.war"
          target: "/opt/tomcat/webapps"
          strip_components: 1

Explicação dos Passos

Checkout do código: Baixa os arquivos do repositório.

Configuração do JDK 17: Instalação da versão correta do Java.

Configuração do Apache Spark: Instalação do Spark para o processamento distribuído.

Build com Maven: Compila o projeto e gera um artefato .WAR, com as libs e configurações declaradas no pom.xml.

Mover os arquivos para a VM: Envia o artefato .WAR para a VM, no caminho ‘/opt/tomcat/webapps’

Build e Deploy do Frontend

Configuração do Workflow

name: Vue.js Deploy

on:
  push:
    branches:
      '[main]'

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Set up Node.js 22
      uses: actions/setup-node@v4
      with:
        node-version: '22'
        cache: 'npm'

    - name: Install dependencies
      run: npm install

    - name: Build project
      run: npm run build

    - name: Run Test ViTest
      run: npm run test

    - name: Deploy to ManoLitoVM
      uses: appleboy/scp-action@master
      with:
        host: ${{ secrets.MANOLITO_VM_IP }}
        username: ${{ secrets.MANOLITO_VM_USR }}
        password: ${{ secrets.MANOLITO_VM_PSW }}
        source: "dist/*"
        target: "/opt/tomcat/webapps/web-client/"
        strip_components: 1

Explicação dos Passos

Checkout do código: Baixa os arquivos do repositório.

Configuração do Node.js: Instala a versão 22 do Node.js e usa cache do npm.

Instalação de dependências: Executa npm install para baixar os pacotes do projeto.

Build do projeto: Executa npm run build para gerar os arquivos estáticos no diretório ‘dist/’.

Mover arquivos para a VM: Envia o conteúdo do diretório ‘dist’ para o caminho designado na VM.

Elementos de possível melhora do CI

Implementação de Testes de Integração com Cypress; Implementação de Deploy no Tomcat 10 ou 11.

Resultados

Deploy Automatizado: Cada merge na main é deployado no ambiente.

Fácil implantação em VM's configuradas: O deploy facilitará a possível disponibilização em várias VM's previamente configuradas.