test:
runs-on: ubuntu-latest
steps:
- name: Get code
uses: actions/checkout@v4
- name: Cache dependencies
id: cache
uses: actions/cache@v4
with:
path: ~/.npm
key: deps-node-modules-${{ hashFiles('**/package-lock.json') }}
- name: Install dependencies
run: npm ci
- name: Test code
run: npm run test
- name: Upload test report
uses: actions/upload-artifact@v4
with:
name: test-report
path: test.json
Perceba que se o step “Test code” falhar, por padrão, o step “Upload test report” não será executado. O que é totalmente contrário a lógica de testes, se meu teste falha eu quero saber o que deu errado.
Para isso, usamos condicionais no workflow.
Ifs funcionam assim como em todo linguagem de programação, você pega um valor e compara com outro. No workflow é possivel fazer isso usando id e expressoes.
Exemplo ainda usando o job de teste:
test:
runs-on: ubuntu-latest
steps:
- name: Get code
uses: actions/checkout@v4
- name: Cache dependencies
id: cache
uses: actions/cache@v4
with:
path: ~/.npm
key: deps-node-modules-${{ hashFiles('**/package-lock.json') }}
- name: Install dependencies
run: npm ci
- name: Test code
id: run-tests
run: npm run test
- name: Upload test report
if: failure() && steps.run-tests.outcome == 'failure'
uses: actions/upload-artifact@v4
with:
name: test-report
path: test.json
Nesse caso o step de upload verifica se a saida do step com id:run-tests foi ‘’failure’’ e usa as condição especial failure( ).
A condição failure( ) é de muita importância, pois se deixarmos somente com o steps.run-tests.outcome == 'failure’ o github ainda vai skipar o envio do relatório. Portanto, o failure deixa claro pro github que ele deve executar o step mesmo com a falha.
O github actions tem 4 funções condicionais especiais: failure( ), success ( ), always( ), cancelled( ).