DEV Community

Felipe Marques
Felipe Marques

Posted on Edited on

Github Actions: Deploy Angular App por FTP em uma estrutura On-Premise

Se você chegou até aqui, provavelmente já sabe o que é o Github Actions (GhA) e como usá-lo, mas caso não seja esse o caso, pode começar lendo essa introdução ao Github Actions.

Objetivo

O objetivo desse texto é mostrar de forma direta como criar um arquivo yml para gerar o bundle de um projeto feito em angular e fazer a entrega desse bundle via FTP em uma estrutura On-Premise não exposta para a internet.

Nesse exemplo teremos dois jobs, em que o primeiro fará o build do projeto, gerará o bundle e preparará os artefatos para a publicação no FTP e o segundo vai pegar esses artefatos e enviá-los para o FTP.

Por que separar as atividades em dois jobs?

Porque o primeiro será executado na estrutura do Github (Gh) e o segundo usará um executor auto-hospedado que será instalado na sua estrutura On-Premise.

A inclusão de um executor auto-hospedado não faz parte desse texto, veja aqui como fazer a instalação.

NOTA: Se você não está acostumado com arquivos YML, lembre-se que a identação é importante.

Job 1: Build

Vamos direto para o código:

  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-node@v1
      with:
        node-version: 10.16
    - name: Install packages with NPM
      run: npm install
    - name: Build for production
      run: npm run build -- --prod
    - name: Upload artifacts to be used in next job
      if: success()
      uses: actions/upload-artifact@v1
      with:
        name: deploy_dist
        path: dist
Enter fullscreen mode Exit fullscreen mode

Vejamos o script acima. Logo no início temos o comando runs-on: ubuntu-latest, onde é feita a escolha do executor no qual o job será executado, nesse caso será a última versão do Ubuntu. Esse executor é fornecido pelo GhA e significa que o job será executado dentro da estrutura do Github.

Em seguida inicia-se o passo a passo (steps) do job, sendo o 1º o checkout do projeto e o 2º a preparação do NodeJs, no exemplo ainda escolho a versão do node que deve ser usada (10.16 nesse exemplo).

Ao executar o npm install no 3º passo, temos a instalação de todas as depêndencias do projeto.

No 4º passo é feito o build do projeto. Aqui o comando pode sofrer variações de acordo com o projeto, você pode usar o comando que está acostumado a executar no seu ambiente de desenvolvimento quando quer fazer o build do projeto.

Já o 5º passo faz o upload dos artefatos, a linha name: deploy_dist define o nome do artefato como deploy_dist e a linha path: dist define qual caminho deve ser incluído no artefato, no exemplo usamos dist porque no meu projeto é o nome da pasta que contém os arquivos gerados no 4º passo, no arquivo angular.json você pode encontrar o nome que está sendo usado no seu projeto.

Com o primeiro job concluído, vamos para o segundo.

Job 2: Deploy FTP

Novamente vamos direto para o código:

  ftp-deploy:
    needs: build
    runs-on: self-hosted

    steps:

    - name: Download artifacts created at previous job
      if: success()
      uses: actions/download-artifact@v1
      with:
        name: deploy_dist
        path: dist
    - name: Deploy to FTP
      uses: SamKirkland/FTP-Deploy-Actions@master
      with:
        server: ${{ secrets.FTP_SERVER }}
        username: ${{ secrets.FTP_USER }}
        password: ${{ secrets.FTP_PASSWORD }}
        local-dir: dist/
        server-dir: ${{ secrets.FTP_APP_DIR }}
        dangerous-clean-slate: true # optional
Enter fullscreen mode Exit fullscreen mode

Nessa 2º parte do script, temos algumas particularidades logo no início. Logo na 2ª linha usamos o needs: build para dizer ao GhA que esse job precisa esperar o job build ser executado com sucesso para poder iniciar sua execução. Outra particularidade é o comando runs-on: self-hosted que diz ao GA que esse job deve ser executado por um executor instalado na sua estrutura On-Premise.

Já em relação ao passos desse job, são bem simples. No 1º fazemos o download do artefato de nome deploy_dist e colocamos o conteúdo desse artefato na pasta dist. Esses nomes precisam obrigatoriamente ser idênticos aos nomes escolhidos na etapa de upload do job anterior.

No 2º passo, usamos a action SamKirkland/FTP-Deploy-Actions@master para fazer o upload para o FTP. Os parâmetros server, username, password e server-dir são preenchidos por variáveis armazenadas no Secrets do repositório, você pode ver como funciona o Secrets aqui.

IMPORTANTE: tanto o parâmetro local-dir quanto o parâmetro server-dir precisam terminar com a barra / para dizer que queremos subir tudo que está na pasta dist. Assim como foi usado no exemplo: dist/.

Por último, o parâmetro dangerous-clean-slate: true, significa que todo o conteúdo que existe no server-dir será excluído antes que o upload dos arquivos inicie. Use essa opção apenas se for necessário para o seu caso.

Finalizando o script

Com os dois jobs criados, a última parte é juntar tudo em um único arquivo e incluir o nome e o evento que irá acionar a execução desse script.

No nosso caso o arquivo final fica assim:

name: Deploy to FTP On-Premise - Project ABC

on:
  push:
    branches:
      - main

  # the follow line allow this script to be started manually.
  workflow_dispatch:

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-node@v1
      with:
        node-version: 10.16
    - name: Install packages with NPM
      run: npm install
    - name: Build for production
      run: npm run build -- --prod
    - name: Upload artifacts to be used in next job
      if: success()
      uses: actions/upload-artifact@v1
      with:
        name: deploy_dist
        path: dist

  ftp-deploy:
    needs: build
    runs-on: self-hosted

    steps:

    - name: Download artifacts created at previous job
      if: success()
      uses: actions/download-artifact@v1
      with:
        name: deploy_dist
        path: dist
    - name: Deploy to FTP
      uses: SamKirkland/FTP-Deploy-Actions@master
      with:
        server: ${{ secrets.FTP_SERVER }}
        username: ${{ secrets.FTP_USER }}
        password: ${{ secrets.FTP_PASSWORD }}
        local-dir: dist/
        server-dir: ${{ secrets.FTP_APP_DIR }}
        dangerous-clean-slate: true # optional
Enter fullscreen mode Exit fullscreen mode

Conclusão

Configurar um script de deploy automático de um projeto pode ser mais simples do que parece, pelo menos em alguns casos.

O GhA pode ser usado para executar diversas outras tarefas, como a execução de testes no projeto, o envio de mensagens pelo telegram e muitas outras tarefas.

Fique à vontade para usar esse script como ponto de partida para a criação de um workflow mais adequado para a sua realidade.

Espero ter te ajudado de alguma forma com esse script.

Top comments (3)

Collapse
 
fashion86 profile image
Fashion86 •

That's useful script for auto CI. Thanks

Collapse
 
felipemsfg profile image
Felipe Marques •

I am happy to hear, I really hope it helps you. :D

Collapse
 
consule profile image
Cristiano Consule •

Muito bom o conteúdo! Estava a quase 2 dias tentando sem sucesso. Lendo esse artigo eu consegui muito rápido.

Obrigado.