Automatizando fluxos de trabalho com GitHub Actions
Tags: github, devops, cicd, softwareengineering
Published: 2023-12-21 14:02:14

Com o GitHub Actions, podemos executar fluxos de trabalho personalizados diretamente em nosso repositório. Podemos descobrir, criar e compartilhar ações para automação eficiente, CI/CD e muito mais.

Vamos automatizar o fluxo de trabalho de um projeto já bem conhecido em nossos artigos, product-api.

{% embed https://github.com/jmgoncalves97/product-api %}

Vou criar duas ações que serão executadas após pull requests. A primeira realiza testes para evitar quebras de recursos, enquanto a segunda executa lint para garantir qualidade no código.

Vamos para a tab Actions em nosso repositório.

![Actions](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p8862wd084vtrfnwd9ac.png)

Observe que ele me sugere alguns workflows. Vamos configurar o Laravel.

```yml
name: Laravel

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  laravel-tests:

    runs-on: ubuntu-latest

    steps:
    - uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
      with:
        php-version: '8.0'
    - uses: actions/checkout@v3
    - name: Copy .env
      run: php -r "file_exists('.env') || copy('.env.example', '.env');"
    - name: Install Dependencies
      run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
    - name: Generate key
      run: php artisan key:generate
    - name: Directory Permissions
      run: chmod -R 777 storage bootstrap/cache
    - name: Create Database
      run: |
        mkdir -p database
        touch database/database.sqlite
    - name: Execute tests (Unit and Feature tests) via PHPUnit
      env:
        DB_CONNECTION: sqlite
        DB_DATABASE: database/database.sqlite
      run: vendor/bin/phpunit
```

Vamos ajustar o fluxo de trabalho para acionar em qualquer pull request, atualizar a versão do PHP para 8.1 e remover a criação do banco de dados e variáveis de ambiente, pois nosso projeto está configurado para usar banco de dados em memória durante os testes.

```yml
name: Laravel

on:
  push:
    branches: [ "master" ]
  pull_request:

jobs:
  laravel-tests:

    runs-on: ubuntu-latest

    steps:
    - uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
      with:
        php-version: '8.1'
    - uses: actions/checkout@v3
    - name: Copy .env
      run: php -r "file_exists('.env') || copy('.env.example', '.env');"
    - name: Install Dependencies
      run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
    - name: Generate key
      run: php artisan key:generate
    - name: Directory Permissions
      run: chmod -R 777 storage bootstrap/cache
    - name: Execute tests (Unit and Feature tests) via PHPUnit
      run: vendor/bin/phpunit
```

Agora, criaremos nosso segundo workflow responsavel por executar lint no código. Em 'Actions', clique em 'Skip this and set up a workflow yourself'. Ao pesquisar 'lint' no marketplace, encontraremos o action que precisamos. Entretanto, o .yml sugerido está incompleto, então escreveremos o nosso.

Vamos aplicar a mesma configuração para pushes e pull requests utilizado no laravel.yml. Em seguida, modificaremos os steps para utilizar  a ação aglipanci/laravel-pint-action.

```yml
name: PHP Linting
on:
  push:
    branches: ["master"]
  pull_request:
jobs:
  phplint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: "laravel-pint"
        uses: aglipanci/laravel-pint-action@2.0.0
        with:
          preset: laravel
          verboseMode: true
          testMode: true
          pintVersion: 1.8.0
          onlyDirty: true
```

Com os workflows criados, vamos aproveitar pra passar um lint no projeto. Em seguida, faremos um pull request e aguardaremos os workflows executarem. Se tudo estiver correto, poderemos seguir com o merge do pull request.

![passed tests](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8asf5p3djx1xss9gmsfa.png)

Agora faremos o pull request de uma branch que possui um teste que falhará e chave aberta na mesma linha que o nome da classe.

```php
<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;

class FalseAssertTest extends TestCase {
    /**
     * A basic unit test example.
     */
    public function test_example(): void
    {
        $this->assertTrue(false);
    }
}
```

![failed tests](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7hwdqs8w67q94yf36akp.png)

A implementação de fluxos de trabalho eficientes,  agiliza a validação de código, aumenta a confiança nas alterações e aprimora o processo de CI/CD, promovendo um desenvolvimento ágil e de alta qualidade.