Skip to content

Laravel 10: Code Quality dengan GitHub Action

Published: at 15.22 (3 min read)

Setelah kita menerapkan penjaga gerbang di sisi developer (tiap-tiap anggota tim), baiknya kita juga membuat sebuah GitHub Action yang bisa menjadi penjaga layer 2 di repo kita. Biasanya, menurut saya baiknya penjagaan dilakukan berdasarkan dua tipe task. Penjagaan ketika pull request dan ketika push di branch utama kita.

Baca post sebelumnya, memaksimalkan developer experience (DX) di Laravel 10

Table of contents

Open Table of contents

GitHub Action: Pull Request

Mari kita beri nama task ini sebagai Laravel PR, task ini akan dikerjakan ketika ada sebuah pull request ke branch utama. Disini kita perlu penjagaan secara menyeluruh, mulai dari code style, code analysis serta perlu menjalankan test yang sudah dibuat agar deployment yang kita lakukan ke depan tetap terjaga stabilitasnya.

name: Laravel PR

on:
  pull_request:
    branches: ["main"]

jobs:
  laravel-tests:
    runs-on: ubuntu-latest

    steps:
      - uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
        with:
          php-version: "8.2"
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
      - run: npm install && npm run build
      - 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 PHP code style via Laravel Pint
        run: composer pint-test
      - name: Execute PHP code analysis via Larastan
        run: composer analyse
      - name: Execute tests (Unit and Feature tests) via PHPUnit
        env:
          DB_CONNECTION: sqlite
          DB_DATABASE: database/database.sqlite
        run: composer test

Code Style via Laravel Pint

Pada berkas yaml diatas, aksi ini dilakukan dengan perintah composer pint-test. Lebih detail-nya, bisa kita lihat pada berkas composer.json bagian scripts.

Code Analysis via PHPStan

Dilakukan dengan perintah composer analyse. Seperti halnya pada Code Style, rinciannya terdapat pada berkas composer.json bagian scripts.

Execute Tests via PHPUnit

Kita sebenarnya bisa langsung menulis perintah php artisan test, sebuah command bawaan dari Laravel yang bisa menjalankan testing scripts melalui PHPUnit. Namun, agar sejalan disini saya buat alias seperti pada Code Style dan Code Analysis dengan perintah dari composer.

GitHub Action: Push

Tidak beda jauh dengan aksi Pull Request, namun untuk mempercepat CI/CD menurut saya kita cukup menjalankan perintah Execute Tests via PHPUnit dan mengubah trigger ketika hanya ada push di branch utama kita.

---
name: Laravel Push

on:
  push:
    branches: ["main"]

jobs:
  laravel-tests:
    runs-on: ubuntu-latest

    steps:
      - uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
        with:
          php-version: "8.2"
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
      - run: npm install && npm run build
      - 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: composer testp

Agar lebih optimal lagi, Laravel secara out-of-the-box menyediakan sebuah opsi parallel. Kita akan menjalankan testing script secara hampir bersamaan, dengan demikian waktu tunggu pada task ini akan lebih sedikit. Dikarenakan sebelumnya kita telah menerapkan penjagaan kualitas kode dua layer. Disini, kita cukup mengganti composer test dengan composer testp.

Rincian Perintah Composer

{
    ...
    "scripts": {
        ...
        "test": [
            "XDEBUG_MODE=coverage php artisan test --coverage --profile"
        ],
        "testp": [
            "php artisan test --parallel"
        ],
        "analyse": [
            "./vendor/bin/phpstan analyse --xdebug"
        ],
        "pint-test": [
            "./vendor/bin/pint --test"
        ]
    },
    ...
}

Cheers! Semoga bermanfaat 😎