Automatizando fluxos de trabalho com GitHub Actions

themattos

Jonathan Gonçalves

Posted on December 21, 2023

Automatizando fluxos de trabalho com GitHub Actions

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.

Product API

Easily start application with docker.

docker compose up
Enter fullscreen mode Exit fullscreen mode

Laravel Logo

Build Status Total Downloads Latest Stable Version License

About Laravel

Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:

Laravel is accessible, powerful, and provides tools required for large, robust applications.

Learning Laravel

Laravel has the most extensive and thorough documentation and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.

You may also try the Laravel Bootcamp, where you will be guided through building a modern Laravel…




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

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

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
Enter fullscreen mode Exit fullscreen mode

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.

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
Enter fullscreen mode Exit fullscreen mode

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.

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
Enter fullscreen mode Exit fullscreen mode

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

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

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;

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

failed tests

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.

💖 💪 🙅 🚩
themattos
Jonathan Gonçalves

Posted on December 21, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related