config CI tự động chạy rspec của project ruby 2.4.1
. 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 ...
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.