Build Jenkins, dockers, rails project
Tiếp tục sau phần 1 viết về giới thiệu về CI và một số tool CI cơ bản đặc biệt là jenkins. Hôm nay mình viết phần tiếp theo tìm hiểu thêm vào các plugin của jenkins và thực hiện demo một project rails build bằng docker và CI-tool là jenkins. Bài viết này sẽ thực hiện những công việc cài đặt plugin ...
Tiếp tục sau phần 1 viết về giới thiệu về CI và một số tool CI cơ bản đặc biệt là jenkins. Hôm nay mình viết phần tiếp theo tìm hiểu thêm vào các plugin của jenkins và thực hiện demo một project rails build bằng docker và CI-tool là jenkins. Bài viết này sẽ thực hiện những công việc cài đặt plugin cần thiết và thực hiện việc build tự động một project trên git cũng như xây dựng cái gem phục vụ CI như brakemen, robocop, rspec với Rails để check CI với mỗi pull request trên github.
Để làm được điều đó chúng ta cần một số plugin có sẵn cho jenkins and thực hiện nó giống như một luồng của Travis CI. Vậy Travis CI flow là gì? Nói đơn giản đó là công cụ để kiểm soát testing các pull request. Đây là các plugin cần thiết:
- GitHub Plugin
- GitHub Pull Request Builder
- Post Build Script Plugin
- Parameterized Trigger
Để cài đặt plugin các bạn có thể ở màn hình Dashboard chọn mục Manage Jenkins > Manage Plugins. Các bạn có thể tìm thấy các plugin trên ở mục available chọn install and restart jenkins. Để có luồng giống với Travis Ci chúng ta thêm vào 2 jobs: PR-create: 1 job sẽ build tất cả Pull Request đã tạo PR-create-Base: 1 job trigger bỏ 1 pu To have a similar flow to Travis CI we added two different jobs: JobName: A job that builds any Pull Request created. JobName-Base: A job triggered by a Pull Request job. It builds the base branch of the project every time the associated Pull Request job has a successful status. Sẵn sàng để setup các job này ngay bây giờ JobName Name: Tên project của bạn GitHub project: Link project của bạn ví dụ (https://github.com/bathien/deploy-test) Phần Source Code Management: Git
You need to set Refspec with: +refs/heads/:refs/remotes/origin/ +refs/pull/:refs/remotes/origin/pr/ Save lại và build thử Bạn sẽ gặp lỗi như sau. ! Vậy làm sao nó lại xuất hiện nhỉ, máy mình cài github và ssh-key đầy đủ rồi mà, googling một hồi thì phát hiện đây là user jenkins và không hề đăng nhập git, vậy để fix lỗi này cũng easy thôi. Mình chỉ rút gọn các bước cơ bản nhất thôi Đây là bí kíp full
sudo su - jenkins // switch user qua user jenkins 'ssh-keygen -t rsa -C 'JENKINS_USERNAME@WHATEVER_HOSTNAME' cat id_rsa.pub // lấy chuỗi này add vào ssh trên git của bạn
thử phát lại xem sao
Tiếp theo thì khi build lần 2 thì git đã qua, thấy code chạy về mừng hớn hở. Đương nhiên là jenkins sinh ra không phải chỉ để lấy code git, tiếp tục mình cấu hình thêm cho nó làm sao để build lại dc code đó với docker. Bài viết này mình không focus vào docker nên mình sẽ không giải thích cụ thể từng script docker nhưng sẽ đây là script mà mình chạy và đó là script lấy trên mạng, không phải do mình viết, các bạn nào biết về docker có thể đọc hiểu hoặc chỉnh sửa dễ dàng. Nếu gặp khó khăn các bạn có thể comment mình sẽ cố gắng giải thích trong tầm hiểu biết của mình. Để chạy script khi build các bạn vào configure job kéo xuống phần build chọn Build Execute Shell.
!/bin/bash +x set -e # Remove unnecessary files echo -e " 33[34mRemoving unnecessary files... 33[0m" rm -f log/*.log &> /dev/null || true &> /dev/null rm -rf public/uploads/* &> /dev/null || true &> /dev/null # Build Project echo -e " 33[34mBuilding Project... 33[0m" docker-compose --project-name=${JOB_NAME} build # Prepare test database COMMAND="bundle exec rake db:drop db:create db:migrate" echo -e " 33[34mRunning: $COMMAND 33[0m" docker-compose --project-name=${JOB_NAME} run -e RAILS_ENV=test web $COMMAND # Run tests COMMAND="bundle exec rspec spec" echo -e " 33[34mRunning: $COMMAND 33[0m" unbuffer docker-compose --project-name=${JOB_NAME} run web $COMMAND # Run rubocop lint COMMAND="bundle exec rubocop app spec -R --format simple" echo -e " 33[34mRunning: $COMMAND 33[0m" unbuffer docker-compose --project-name=${JOB_NAME} run -e RUBYOPT="-Ku" web $COMMAND
Giải thích sơ qua đây là script thực hiện tuần tự các bước cơ bản khi build gồm:
- Xóa các file dư thừa trong mục log và public/upload
- build project bằng docker-compose build
- Chuẩn bị db chạy môi trường test trên docker
- Chạy test qua rspec
- Chạy robocop kiểm tra coding convention Tiếp theo các bạn save và chạy thử xem kết quả thế nào.