Tự động kiểm tra source code, test 1 dự án Laravel với Github Actions

Trước đây, với các dự án được quản lý source code trên Github, chúng ta thường cần sử dụng thêm một số CI/CD service như Jenkins, CircleCI để tự động hoá các quá trình kiểm tra chất lượng source code, test hay deploy ứng dụng của mình. Thay vì phải làm các công việc lặp đi lặp lại, chúng ta sẽ để cho các hệ thống tự làm.

Tuy nhiên Github đã ra mắt tính năng Github Actions với cùng chung mục đích. Nhân dịp đang xây dựng Scaffold cho Laravel 7.x, mình vọc luôn Github Actions xem sao.

Trong phạm vi bài viết này mình sẽ thử tự động hoá một số quy trình mỗi khi có commit mới được push lên Github Repository:

  1. Tự động hoá việc kiểm tra chất lượng source code bằng việc sử dụng 2 thư viện phpmd và phpcs.
  2. Tự động chạy unit test

Với việc tự động hoá việc deploy, cũng sẽ tương tự như 2 việc trên tuỳ vào việc bạn deploy ứng dụng của mình theo cách nào. Vì mỗi người có cách deploy ứng dụng của mình riêng nên mình sẽ giới thiệu về cách deploy ứng dụng kết hợp với Github Ations trong những bài viết khác.

Repository mình sử dụng là Laravel 7 Scaffold mà bên mình đang opensource đã được cài đặt sẵn các thư viện và config rule trong các file phpmd.xml, phpcs.xml

Thử click vào tab Actions trong Repository và được Github gợi ý luôn template cho Laravel:

Click thử Set up this workflow, Github redirect bạn tới trang tạo file laravel.yml trong folder .github/workflows/ với nội dung:

Cùng phân tích nội dung file chút.

Tên của workflow

name: Laravel  

Setup workflow của bạn sẽ chạy trên branch master khi có push event lên branch đó, và có các pull request với target branch vào master:

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

Mỗi worklfow có thể config được nhiều job và các job có thể chạy song song hoặc tuần tự với nhau.

Tạm thời chúng ta sẽ thử phân tích phần khai báo job laravel-tests mà tempate cung cấp như dưới đây:

jobs:  
  laravel-tests:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - 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-suggest --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

Lệnh runs-on: ubuntu-latest dùng để khai báo hệ điều hành mà job sẽ sử dụng. Hiện tại Github đang cung cấp các hệ điều hành sau:

  • ubuntu-latest, ubuntu-18.04, or ubuntu-16.04
  • windows-latest or windows-2019
  • macos-latest or macos-10.15

hơi buồn là không có CentOS :(

Phía dưới là khai báo các step của job.
Lệnh - uses: actions/checkout@v2 là lệnh khai báo sử dụng lại các action đã có sẵn trên Github Marketplace. Ở đây là action checkout V2 ở link: https://github.com/marketplace/actions/checkout

Tiếp theo là các lệnh run trong các virtual machine của job với cú pháp như tên, biến môi trường, câu lệnh cần run:

    - name: Execute tests (Unit and Feature tests) via PHPUnit
      env:
        DB_CONNECTION: sqlite
        DB_DATABASE: database/database.sqlite
      run: vendor/bin/phpunit

Nhấn vào start commit và tạo thử 1 pull request để chạy thử workflow hiện tại:
Tổng thời gian 28s, có vẻ khá nhanh.
Xem thử workflow chạy ra sao ?
Thấy ngay là setup job nhanh, không rõ Github tạo instance như thế nào mà nhanh vậy?

Giờ thử customize 1 chút. Trước khi build ứng dụng, cần kiểm tra coding convention bằng php codesniffer trước. Thêm luôn 1 run command vào ngay sau command Install Dependencies

    - name: Install Dependencies
      run: composer install -q --no-ansi --no-interaction --no-scripts --no-suggest --no-progress --prefer-dist
    - name: Check coding convention by PHP_CodeSniffer
      run: ./vendor/bin/phpcs

commit và push lên branch feature/github-action và xem sự thay đổi trạng thái của lần build mới:

Lệnh phpcs đã được chạy.

Tương tự sẽ add thêm php mess detector vào sau run command của phpcs :

    - name: PHP mess detector
      run:  ./vendor/bin/phpmd app,database,routes,tests text phpmd.xml

Trong template ban đầu ở trên, nếu bạn để ý, các câu lệnh phía dưới đã tạo thêm database trên sqlite và run unit test.
Kết quả là với github action, mỗi khi bạn gửi pull request tới master branch, ứng dụng của bạn sẽ được build và test như ảnh dưới:

Với việc dùng Github Action thay thế cho các CI/CD khác như CircleCI, Codeship, mình có thể thấy ngay 1 điểm lợi là toàn bộ config của bạn sẽ được lưu trong source code và bạn sẽ không phải sử dụng thêm hệ thống thứ 3 ngoài github để kiểm tra quá trình build & test của ứng dụng.

Ngoài ra thì Github Action đang miễn phí, đó cũng là 1 điểm cộng so với các dịch vụ CI/CD khác.

Bạn hãy vọc thử và chia sẻ các tip sử dụng Github Actions Workflow nhé !

Related article