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 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.

1. Preparing

Để 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

2. Installing

Để 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 '[email protected]_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 "\033[34mRemoving unnecessary files...\033[0m"
rm -f log/*.log &> /dev/null || true &> /dev/null
rm -rf public/uploads/* &> /dev/null || true &> /dev/null

# Build Project
echo -e "\033[34mBuilding Project...\033[0m"
docker-compose --project-name=${JOB_NAME} build

# Prepare test database
COMMAND="bundle exec rake db:drop db:create db:migrate"
echo -e "\033[34mRunning: $COMMAND\033[0m"
docker-compose --project-name=${JOB_NAME} run  \
	-e RAILS_ENV=test web $COMMAND

# Run tests
COMMAND="bundle exec rspec spec"
echo -e "\033[34mRunning: $COMMAND\033[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 "\033[34mRunning: $COMMAND\033[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:

  1. Xóa các file dư thừa trong mục log và public/upload
  2. build project bằng docker-compose build
  3. Chuẩn bị db chạy môi trường test trên docker
  4. Chạy test qua rspec
  5. 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. 😃 Nhưng đời không như là mơ ở lần thứ 2 run thì mình gặp lỗi docker. Tiếp tục phải đi tìm tòi lỗi thì nhớ ra lại bị dính vụ phân quyền user jenkins không đụng vào được con docker trên máy local của mình. Cách giải quyết là: add tạo ra group docker(nếu chưa tạo) và nhét jenkins vào
sudo groupadd docker
sudo usermod -aG docker jenkins
systemctl daemon-reload
systemctl restart docker
sudo service jenkins restart

Thử build lại một lần nữa thì docker đã chạy ngon lành và mình cũng đã hoàn thành các bước build và chạy code từ jenkins. Phần xin tiếp theo mình về connect với github PR dùng ngrok tại máy local và webhook của git mình sẽ cập nhật trong thời gian sớm nhất. Thực sự xin lỗi và cảm ơn các bạn đã theo dõi