Condicionais

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.


IF

https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/evaluate-expressions-in-workflows-and-actions

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( ).