Cuidado com os custos escondidos
Se você verificar nesta página os custos do github actions é cobrado por MINUTO
Ok, mas o que acontece se a action demorar 5 segundos para executar? Vai ser cobrado um minuto inteiro
Lendo o seu workflow vemos que tem diversos passos que se repetem entre os jobs:
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Use Node.js 20.x
uses: actions/setup-node@v3
with:
node-version: 20.x
cache: 'yarn'
- name: Install Dependencies
run: yarn install
essas ações vão consumir tempo desnecessário!
Otimizando essa action
Porquê não fazer em um único job o teste e o deploy?
name: Build and Deploy
on:
push:
branches: 'main'
pull_request:
branches: 'main'
jobs:
tests:
name: Run Tests
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Use Node.js 20.x
uses: actions/setup-node@v3
with:
node-version: 20.x
cache: 'yarn'
- name: Install Dependencies
run: yarn install
- name: Run Tests
run: yarn test
- name: Run Build
run: yarn build
Isso irá diminuir MUITO o tempo para rodar o flow, se ocorrer em uma organização grande pode ter certeza que fará diferença no orçamento mensal
Erro 1: O que está sendo feito com o build?
No último passo é executado o build:
- name: Run Build
run: yarn build
mas cadê o commit?
Esse build simplesmente será descartado assim que a action terminar de executar.
Erro 2: O mesmo fluxo ocorrendo em 2 momentos diferentes
Ok, não chega a ser um erro, mais uma sugestão pessoal
on:
push:
branches: 'main'
pull_request:
branches: 'main'
Porque o mesmo fluxo ocorre nesses 2 momentos? se o teste passou no Pull request não precisa testar novamente na main! Assim como buildar no pull request pode remover uma build de uma main mais atualizada.
Vou tentar exclarecer melhor:
Main Branch A Branch B
|
|-------------+----------------+
| | |
| | Commit 1 |
| | |
| <-----------+ PR 1 |
| | Commit 2
| |
| <----------------------------+ PR 2
|
No momento que é solicitado o PR 2
vai gerar uma nova build. Se esse PR for aceito vai acontecer uma das situações:
- A build do
PR 2
vai apagar totalmente oPR 1
por um momento - Vai dar conflito de merge
- Vai ficar inconsistente com arquivos de cada build misturados
Solução que utilizo
Deploy apenas quando foi aprovado o PR
# DEPLOY
on:
push:
branches: 'main'
Testes apenas no pull request
# TESTES
on:
pull_request:
branches: 'main'
Cara muito obrigado pelas sugestões, nesse exemplo eu usei para um projeto pessoal, queria realmente testar as actions, então é por isso que não tem custo.
Sim concordo com você totalmente, rodar a pipe quando tem commit na main é ruim, mas no meu caso como estou trabalhando sozinho no projeto eu faço commits direto na main, mas vou alterar aqui no meu projeto para deixar optimizado.
Vou adicionar aqui na minha pipe.