Blog #3

Improve code quality with Gem Rubocop and Github Actions

# Giới thiệu

RuboCop là một trình phân tích mã tĩnh Ruby (a.k.a linter) và trình định dạng mã. Ra khỏi hộp, nó sẽ thực thi nhiều nguyên tắc được nêu trong Hướng dẫn phong cách Ruby của cộng đồng. Ngoài việc báo cáo các sự cố được phát hiện trong mã của bạn, RuboCop cũng có thể tự động khắc phục nhiều sự cố cho bạn.

RuboCop cực kỳ linh hoạt và hầu hết các khía cạnh hoạt động của nó có thể được điều chỉnh thông qua các tùy chọn cấu hình khác nhau.

Đọc thêm về Rubocop ở đây.

 

# Ví dụ

Ví dụ mình có 1 func như sau

def enough_18_years_old?(number)
    if number <= 0
      return 'Please enter a positive number!'
    end

    number > 18 ? 'Yes' : 'No'
end

Nó sẽ chửi mình như sau

 

Sao m code ng.u thế hả cu???

Đại ý là nó muốn cụm if thành 1 dòng thôi, sửa như sau:  

def enough_18_years_old?(number)
    return 'Please enter a positive number!' if number <= 0

    number > 18 ? 'Yes' : 'No'
end

# Cài đặt

Chạy lệnh

$ gem install rubocop

hoặc thêm vào Gemfile

gem 'rubocop', require: false

Sau đó chạy lệnh

$ bundle install

Nó sẽ tự tạo file rubocop.yml cho bạn. 
Ở trong file này nó sẽ cấu hình những rule ví dụ như chiều dài tối đa của mỗi dòng, 1 function tối đa bao nhiều lines hoặc là những vấn đề khác. Các bạn có thể thêm hoặc bớt rule nếu muốn. Có thể tham khảo thêm tại đây.

# Sử dụng ở local

Kiểm tra toàn bộ project của bạn

$ rubocop

Kiểm tra riêng 1 thư mục (Ở ví dụ này mình muốn kiểm tra cho toàn bộ files controller)

$ rubocop app/controllers

Kiểm tra file cụ thể

$ rubocop app/controllers/home_controller.rb

 

# Kiểm tra với Github Actions

Mục đích chính của blog này là ở đoạn này. Vì đoạn trước có nhiều bài viết và hướng dẫn rubocop cụ thể rồi, mình chỉ lướt qua sơ lược thôi.

Đây là kết quả sau khi nhờ Github review code cho mình :)). Nó sẽ tự động comment vào từng line những comment cực kì chi tiết. 
Như bạn thấy nó đang báo với mình là cần phải có khoảng cách sau {

Bad code

{locale: I18n.locale}

Good code

{ locale: I18n.locale }

Tuy không phải là lỗi gì nghiêm trọng, nhưng nó sẽ giúp bạn cải thiện rất nhiều về code quality và style code.

# Cài đặt Github workflows

Cần phải cài đặt Gem Pronto

Thêm vào Gemfile trong group development

group :development do
  gem 'pronto', '~> 0.11.0'
  gem 'pronto-flay', '~> 0.11.0', require: false
  gem 'pronto-rubocop', '~> 0.11.1', require: false
end

Sau đó chạy lệnh

$ bundle install

Thêm vào project file pronto.yml theo đường dẫn .github/workflows/pronto.yml

name: Rubocop Check
on: [pull_request]

jobs:
  pronto:
    permissions: write-all
    name: 'Rubocop Check'
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - run: |
          git fetch
      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
      - name: Setup pronto
        run: gem install pronto pronto-rubocop
      - name: Run Pronto
        run: pronto run -f github_status github_pr -c origin/${{ github.base_ref }}
        env:
          PRONTO_PULL_REQUEST_ID: ${{ github.event.pull_request.number }}
          PRONTO_GITHUB_ACCESS_TOKEN: "${{ github.token }}"

Vậy là xong. Bây giờ việc các bạn làm là tạo 1 pull request bất kì và để Github Actions check lỗi giúp các bạn thôi!