config CI tự động chạy rspec của project ruby 2.4.1

0. Mở đầu

Như các bạn đã biết, ở framgia đã áp dụng CI. Mỗi khi có pull request, CI sẽ fetch pull request về, chạy rake spec, gửi report. Để mọi người biết được có bị fail RSPEC hay ko, % coverage là bao nhiêu. Sau 1 thời gian cặm cụi, mình xin chia sẻ cách config CI cho project. Các bước cần thực hiện 1-Config RailsApp để, chạy rake spec 0 fails, coverage > 80% 2-Chuẩn bị repository, cần user có quyền admin 3-Active Repositories của project trên trang http://ci.framgia.vn/ 4-Build docker image cho project của bạn (Dockerfile), hoặc sử dụng image của người khác =)) 5-Tạo các file config(.drone.yml, .framgia-ci.yml) 6-Đẩy pull, xem kết quả CI chạy

1. Config RailsApp để, chạy rake spec 0 fails, coverage > 80%

a. Cài đặt gem Project mẫu git clone https://github.com/framgia/rails5_skeleton

group :development, :test do
  gem "byebug", platform: :mri
  gem "pry-rails"
  gem "rspec"
  gem "rspec-rails"
  gem "rspec-collection_matchers"
  gem "factory_girl_rails"
  gem "faker"
end

group :test do
  gem "shoulda-matchers"
  gem "simplecov", require: false
  gem "simplecov-rcov", require: false
end

b. config spec/spec_helper.rb

SimpleCov.start do
  coverage_dir ".framgia-ci-reports/coverage"
  add_filter "/config/"
  add_filter "/app/controllers/"
  add_filter "/app/mailers/"
  add_filter "/app/helpers/"
  add_filter "/spec/"

  add_group "Models", "app/models"
  add_group "Decorators", "app/decorators"
  add_group "Validators", ["app/validators", "app/policies"]
  add_group "Services", "app/services"
  add_group "Jobs", ["app/workers", "app/jobs"]
end

Đến đây, nếu chạy rake spec pass và coverage > 80% thì chuyển qua bước tiếp theo.

2. Chuẩn bị repository, cần user có quyền admin

Cần xin quyền admin cho account của bạn ở reposity. Nếu không, tạo 1 account mới và xin quyền admin

3. Chuẩn bị repository, cần user có quyền admin

http://ci.framgia.vn/ Đăng nhập vào, bằng github của admin repository Active Repositories của project. Khi đó, CI đã tự động tạo deploy key, webhook trên repository giúp bạn, bạn không cần sửa gì trên github nữa

Đẩy thử 1 pull request để test thử.

Vào http://ci.framgia.vn/framgia/your_app thấy có bản build mới là đã thành công và chuyển tới bước tiếp theo, nếu ko xóa repository trên http://ci.framgia.vn/ và active lại

4. Builde docker image cho project của bạn (Dockerfile), hoặc sử dụng image của người khác =))

Nếu sửa dụng image của người khác tạo sẵn thì bỏ qua bước này, nhưng thông thường mỗi project đều có các thư viện, ruby version, apt ... sử dụng riêng vì thế nên tạo image riêng.

a. Đăng ký tài khoản https://hub.docker.com/

b. Cài đặt docker c. Tạo docker file chứa những gì cần thiết của project (package...)

FROM ubuntu:14.04.5


# Update package list
RUN apt-get -y update


# Install dependences package for ruby environment
RUN apt-get install -y patch curl imagemagick graphicsmagick-libmagick-dev-compat build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion libmysqlclient18 libmysqlclient-dev mysql-server  memcached mongodb monit graphviz nodejs redis-server acct sysv-rc-conf tomcat6 tomcat6-admin postfix mailutils libsasl2-2 ca-certificates libsasl2-modules vim htop libcurl4-openssl-dev npm libicu-dev libgdbm-dev libncurses5-dev libreadline-dev libffi-dev checkinstall logrotate

# Install Rvm, Ruby and Bundler
RUN curl -sSL https://rvm.io/mpapis.asc | gpg --import -
RUN  \curl -L https://get.rvm.io | bash -s stable
RUN /bin/bash -l -c "rvm requirements"
RUN /bin/bash /etc/profile.d/rvm.sh
RUN /bin/bash -l -c "rvm install 2.4.1"
RUN /bin/bash -l -c "rvm install 2.4.1"
RUN /bin/bash -l -c "gem install bundler --no-ri --no-rdoc"
RUN apt-get update && apt-get install --yes nodejs

# Copy Gemfile from local to container
COPY Gemfile /cache/Gemfile
COPY Gemfile.lock /cache/Gemfile.lock

# Install dependences Gem on Gemfile
RUN /bin/bash -l -c "cd /cache && bundle install"

# Run framgia CI
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

d. Tạo image, và upload lên docker hub https://hub.docker.com/r/nguyenthanhluanframgia/rails/

5. Tạo các file config(.drone.yml, .framgia-ci.yml)

a. Trong thư mục RAILS_APP, tạo file .drone.yml

Config biến môi trường của APP, để chạy được rake spec

build:
  image: nguyenthanhluanframgia/rails
  commands:
    - sudo start redis
    - export HOST_URL=omething
    - export HOST=something
    - cp config/database-ci.yml config/database.yml
    - cat config/database.yml
    - /bin/bash -c "source /etc/profile.d/rvm.sh && gem update eslint-rails && bundle install && RAILS_ENV=test rake db:create db:migrate && framgia-ci run"

compose:
  database:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --init-connect='SET NAMES UTF8;'
    environment:
      MYSQL_DATABASE: ci_test
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      MYSQL_ROOT_PASSWORD: root
  redis:
    image: redis:3.0.7
  elasticsearch:
    image: elasticsearch:2.4.2
cache:
  mount:
    - .git

b. RAILS_APP/config/database-ci.yml

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: 5
  host: 127.0.0.1
  username: test
  password: test
  redis:
    host: localhost
    port: 6379
    db: 0
    options:
      namespace: ci-test

development:
  <<: *default
  database: ci_development

test:
  <<: *default
  adapter: mysql2
  encoding: utf8mb4
  database: ci_test

c. Trong thư mục RAILS_APP, tạo file .framgia-ci.yml

project_type: ruby
test:
  #bundle-audit:
   # enable: true
    #ignore: true
    #command: bundle-audit check --update > .framgia-ci-reports/bundle-audit.txt
  rspec:
    enable: true
    ignore: false
    command: rspec --format html --out .framgia-ci-reports/rspec.html spec/
    #command: rspec spec --format html --out .framgia-ci-reports/rspec.html spec/
  #brakeman:
   # enable: true
    #ignore: true
    #command: brakeman -o .framgia-ci-reports/brakeman.html -o .framgia-ci-reports/brakeman.json
  #reek:
   # enable: true
    #ignore: true
    #command: reek --format html > .framgia-ci-reports/reek.html
  #rubocop:
   # enable: true
    #ignore: true
    #command: bundle exec rubocop --require rubocop/formatter/checkstyle_formatter --format RuboCop::Formatter::CheckstyleFormatter --no-color --rails --out .framgia-ci-reports/rubocop.xml app/ lib/
  #scss-lint:
   # enable: true
    #ignore: true
    #command: scss-lint --require=scss_lint_reporter_checkstyle --format=Checkstyle --out=.framgia-ci-reports/scss-lint.xml app/assets/stylesheets/
  #eslint:
   # enable: true
    #ignore: true
    # command: rake eslint:run_all --format=checkstyle --output-file=.framgia-ci-reports/eslint.xml app/
    #command: rake eslint:run_all format=checkstyle output_file=.framgia-ci-reports/eslint.xml app/
  #rails_best_practices:
   # enable: true
    #ignore: true
    #command: rails_best_practices --format html --output-file .framgia-ci-reports/rails_best_practices.html app/

6. Đẩy pull, xem kết quả CI chạy

Vào http://ci.framgia.vn/framgia/your_project Để xem kết quả chạy, đọc log, sửa lại config nếu cần và push code lên github. Nếu làm đầy đủ các bước ở trên thì đến bước này chúng ta có thể kết quả chạy rspec, coverage rồi.

Tài liệu tham khảo https://github.com/framgia/ci-service-document

Hi vọng bài viết này hữu ích. ❤️