Cấu hình Framgia CI v2 cho dự án Rails API

Sau 3 ngày hì hục, tìm tài liệu, thử, gọi trợ giúp các kiểu thì mình cũng đã tích hợp thành công con CI cho dự án Rails API. Hiện tại, Framgia CI đang có 2 version v2 và v3. Bài này mình sẽ hướng dẫn cấu hình với bản v2.

1. Tạo docker image, upload lên hub docker

Bước 1: Tạo thư file Dockerfile vào thư mục gốc của dự án như sau:

FROM ruby:2.4.1

RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - && apt-get install -y nodejs && npm install -g gulp-cli bower eslint babel-eslint eslint-plugin-angular

COPY Gemfile /cache/Gemfile
COPY Gemfile.lock /cache/Gemfile.lock

RUN cd /cache && bundle install

RUN curl -o /usr/bin/framgia-ci https://raw.githubusercontent.com/framgia/ci-report-tool/master/dist/framgia-ci && chmod +x /usr/bin/framgia-ci

Nội dung file này là tạo một image bao gồm: một image có tên ruby:2.4.1 (image của docker giống như file ghost bên win, là bản nén gồm những thứ đã cài đặt sẵn rồi, chỉ việc bung ra và dùng) đã có đủ ruby version 2.4.1, bundle, gem... các kiểu và cài thêm vào đó những thứ ta cần như nodejs, gulp-cli... Copy file Gemfile, Gemfile.lock ở thư mục dự án của hiện tại vào folder cache, chạy bundle để install gem, cài Framgia CI.

Bước 2: Build image từ Dockerfile vừa tạo:

Cài Docker trên máy của bạn(Tự tìm hiểu) và chạy lệnh build image sau:

docker build -t [image-name] .

Bước 3: Upload lên hub docker

Vào trang https://hub.docker.com/ và tạo tk, rồi tạo một Automatic build(trong tab Create gần avatar) trỏ đến dự án hiện tại trên git/bitbucket... Tiếp theo là chọn dự án, rồi điền thêm description, nhớ để chế độ public cho repo(Vì phần này liên quan đến bảo mật nên mình k share màn hình được) Sau khi thành công ta được kq:

Tiếp theo, đẩy image vừa tạo ở bước 2 lên hub docker theo tài liệu ở đây

2. Cấu hình cho CI

Bước 1: Tạo file .drone.yml trong thư mục gốc của dự án

# .drone.yml
build:
  image: quyetlqp/blog
  environment:
    REPO_URL: [email protected]:framgia/rails5_skeleton.git
    EMAIL_USERNAME: [email protected]
    EMAIL_PASSWORD: sample1
    HOST: localhost:3000
    AWS_REGION: ap-northeast-1
    AWS_ACCESS_KEY_ID: AWS_ACCESS_KEY_ID
    AWS_SECRET_ACCESS_KEY: AWS_SECRET_ACCESS_KEY
    S3_BUCKET_NAME: S3_BUCKET_NAME
    DATABASE_HOSTNAME: 127.0.0.1 #không sửa
    DATABASE_NAME: rails_app_development
    DATABASE_USERNAME: test #không sửa
    DATABASE_PASSWORD: test #không sửa
    REDIS_HOSTNAME: localhost
    RAILS_ENV: test #không sửa
    SECRET_KEY_BASE: ci_test
    DEVISE_SECRET_KEY: ci_test
    WEB_SERVER: unicorn
    NUM_UNICORN_WORKERS: 3
  commands:
    - framgia-ci test-connect 127.0.0.1 3306
    - bundle install
    - RAILS_ENV=test rake db:create db:migrate
    - framgia-ci run

compose:
  database:
    image: mysql
    environment:
      MYSQL_DATABASE: rails_app_development
      MYSQL_USER: test #không sửa
      MYSQL_PASSWORD: test #không sửa
      MYSQL_ROOT_PASSWORD: root #không sửa
  redis:
    image: redis:3.0.7
cache:
  mount:
    - .git`

Trong file trên là những cấu hình riêng của môi trường test, tên biến môi trường thì đặt theo dự án hiện tại. Riêng nhưng dòng mình có comment Không sửa thì cần giữ lại đúng giá trị cho biến môi trường đó, còn lại nhưng biến môi thì nếu dùng thì thêm, không thì xóa. Trong phần compose nếu dự án k sử dụng redis thì có thể xóa đi. File này đóng vai trò chim mồi cho git hiểu được cần chạy CI cho PR này.

Bước 2: Tạo file .framgia-ci.yml trong thư mục gốc của dự án

Trong file này chính là những lệnh bạn muốn chạy test cho dự án

# .framgia-ci.yml
project_type: ruby
test:
  bundle-audit:
    command: bundle-audit check --update > .framgia-ci-reports/bundle-audit.txt
    ignore: true
  rspec:
    command: rspec --format html --out .framgia-ci-reports/rspec.html spec/
  brakeman:
    command: brakeman -o .framgia-ci-reports/brakeman.html -o .framgia-ci-reports/brakeman.json
    ignore: true
  reek:
    command: reek --format html > .framgia-ci-reports/reek.html app/
    ignore: true
  rubocop:
    command: bundle exec rubocop --require rubocop/formatter/checkstyle_formatter --format RuboCop::Formatter::CheckstyleFormatter --no-color --rails --out .framgia-ci-reports/rubocop.xml app/ lib/
    ignore: true

Tiếp đó, tạo thêm 1 thư mục .framgia-ci-reports trong thư mục gốc của dự án, tạo file .keep vào thư mục vừa tạo và gitignore toàn bộ file trong thư mục .framgia-ci-reports ngoại trừ file .keep

Bước 3: Active repo dự án chạy CI

Xin quyền admin cho repo dự án và tài khoản CI sau đó vào trang http://ci.framgia.vn/, sang tab AVAILABLE REPOSITORIES chọn repo và active nó.

Bước 4: Đẩy toàn bộ nhưng code đã thay đổi ở trên lên git và chờ xem nó chạy CI

3. Config cho CI push notification trên Chatwork group

Cái này thì ez lắm, vào trang http://ci-reports.framgia.vn/ chọn dự án, chọn mục SETTINGS, enable Chatwork notification. Trong phần Chatwork Bot thêm vào một api key của 1 tài khoản chatwork(tự tìm hiểu tạo api key ntn nhé). Trong phần Room list thì thêm vào room id của group muốn bắn notification. Chú ý: tài khoản chatwork cần phải join vào group đó thì mới bắn đc notification nhé. Xong rồi đó, push -f lại thử thôi

4. Kết luận

Nhìn thì ez vậy thôi chứ lỗi sẽ gặp nhiều ở phần sau khi đẩy lên CI test toàn fail đấy nhé. Cái này thì hơi khó hướng dẫn nên các bạn tự tìm hiểu phần này nhé 😄