config CI tự động chạy rspec của project ruby 2.4.1
This post hasn't been updated for 4 years
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.
All Rights Reserved