CI/CD with Jenkins (P2)
Bài đăng này đã không được cập nhật trong 3 năm
Chào các bạn, Trong bài trước, mình đã giới thiệu các khái niệm cơ bản về CI/CD, cách set up 1 ví dụ đơn giản với Jenkins. Trong bài viết này, mình sẽ hướng dẫn các bạn xây dựng 1 chuỗi các tiện ích bằng Jekins có thể áp dụng trong dự án:
- Setting quyền truy cập vào hệ thống Jenkins sử dụng Google account
- Xây dựng các jobs tiện ích cho dự án.
- Xây dựng hệ thống thông báo.
1.Setting quyền truy cập vào hệ thống Jenkins
1.1.Thiết lập bảo mật trong Jenkins
Jenkins cung cấp 1 số cách để quản security cho phép truy cập. Bạn có thể tìm thấy và setting tại đây: http://localhost:8080/configureSecurity/
Tại đây bạn có thể chọn các option để authen một cách phù hợp.
- Phần đầu tiên: Secuirty Realm - Cho phép Jenkins xác định nơi mà Jenkins có thể tìm thấy người dùng trong suốt quá trình authentication. Tại đây ta có các option lựa chọn như sử dụng users được lưu trữ tại LDAP server, sử dụng dưới account của hệ thống Unix, hoặc sử dụng trong database được build bởi chính hệ thống Jenkins.
- Sử dụng option "Allow users to sign up" để cho phép user có thể đăng ký, và access vào hệ thống Jenkins.
- Phần thứ 2: Xác định cách Authenrization. Tại đây bạn có thể lựa chọn các option để authen từ việc đơn giản như "Anyone can do anything", "Logged-in users can do anything" với các vai trò được uỷ quyền trong dự án cụ thể.
Để tạo người dùng, cho phép login vào Jenkins:
- Tại màn hình chính của Jenkins -> Manage Jenkins -> Manage Users -> Create User
Sau khi thêm hoàn tất việc add user, ta có thể nhìn thấy user đó tại đây:
http://localhost:8080/securityRealm/
1.2.Setting quyền truy cập và thực thi thông qua Google account.
Trong Jenkins ta có thể setup quyền truy cập và thực thi hệ thống một cách thuận tiện và dễ dàng. Để authenticate và authorize việc access vào Jenkins thông qua việc sử dụng Google account chúng ta follow theo các bước dưới đây.
1.2.1.Tạo Google OAuth Client Key.
-
Để bắt đầu, chúng ta cần tạo project trong Google developer consoler tại: https://console.developers.google.com/?hl=vi
-
Tiến hành tạo 1 project:
-
Sau khi tạo mới xong project, click tạo Credentials -> OAuth Client ID
-
Configure consent screen Nhập thông tin Email Address + product name của bạn. Các phần sau là optional bạn có thể nhập hoặc bỏ qua
-
Bước tiếp theo là đến việc đăng ký Jenkins URI , nơi mà chúng ta cho phép access thông qua Goolge APIs
- Tại Authorized JavaScript origins: nhập Jenkins URI của bạn ( ở đây mình đặt là: http://localhost:8080 )
- Tại Authorized redirect URIs chính là URI mà sẽ được redirect sau khi quá trình đăng nhập tài khoản google thành công, sẽ được redirect tới. Nhập URI Jenkins của bạn + securityRealm/finishLogin . ( Trong ví dụ này mình của mình sẽ là: http://localhost:8080/securityRealm/finishLogin )
- Click create chúng ta sẽ lấy được Client ID và Clent Secret như dưới đây:
1.2.2.Install Google Login Plugin.
- Từ màn hình chính -> Manage Jenkins -> Plugin Manager Chọn và install Google Login Plugin
1.2.3. Cài đặt phân quyền truy cập và thực thi các chức năng trong hệ thống.
Cài đặt plug-in giúp cho việc phân quyền dễ dàng.
- Từ màn hình chính -> Manage Jenkins -> Manage Plugins -> Tab (Avaliable) Chọn Role-based Authorization Strategy để install
Quá trình installed hoàn tất, restart Jenkins.
- Từ màn hình chính -> Manage Jenkins -> Configure Glogal Security. Tại mục Authorization, chọn Role-Based Strategy, sau đó Save lại.
Thiết lập các roles cho việc access vào Jenkins:
- Từ màn hình chính -> Manage Jenkins -> Manage And Assign Roles -> Manage Roles:
Tại đây ta sẽ add thêm roles và các quyền thực hiện với từng roles nhất định trên Global roles hoặc trên từng Project roles . Ví dụ ở đây tôi thêm role admin full quyền tại global.
Đi đến assign roles cho từng đối tượng người dùng cụ thể:
-
Từ màn hình chính -> Manage Jenkins -> Manage And Assign Roles -> Manage Roles -> Assign Roles
-
Ở đây tôi assign cho tài khoản gmail: datvnu88@gmail.com với role là admin, khi đó khi ta login vào với tài khoảng gmail này ta có thể thực hiện được với các quyền admin đã được định nghĩa ở trên.
1.2.4. Setting Access Control lấy từ tài khoản Google account.
Vào Manage Jenkins-> Configure Global Security . Tại access control chọn Login with Google. Nhập Client Id + Client Secret ở bước trước:
- Click Save để hoàn tất quá trình authentication + authorization trong Jenkins sử dụng Google account. Từ lúc này, bất cứ aceess nào vào Jenkins sẽ thông qua tài khoản Google account.
2.Xây dựng các jobs tiện ích cho project.
2.1.Build và deploy tự động lên server.
Vào project application-jenkins-demo (ví dụ settup mở đầu trong bài Jenkins trước) -> Configure . Tại mục Build, chọn add build step là Execute shell để tạp script cho việc build và deploy code:
#!/bin/sh
cd /var/lib/jenkins/jobs/application-jenkins-demo/workspace
# clean and build project again
mvn clean package
# copy .war file to webapp folder for deploying
cp gameoflife-web/target/gameoflife.war /home/datvv/Documents/dev/apache-tomcat-8.0.35/webapps/
- Click vào Save để lưu cài đặt.
- Click vào Build Now để start build và deploy project.
- Quá trình builded and deployed thành công:
- Access vào URL http://localhost:8081/gameoflife/ được kết quả là trang web được deployed thành công:
2.2.Build và deploy nhận tham số đầu vào.
Xây dựng Jobs build nhận tham số đầu vào là 1 tính năng mạnh mẽ của Jenkins. Giúp cho việc chuyển đổi, deploy sources code theo các version Tag, Hash code, Branch sources code một cách nhanh chóng và thuận tiện.
2.2.1.Cài đặt plug-in Parameterized Build:
2.2.2.Setting Jobs nhận tham số đầu vào.
-
Sau khi cài đặt thành công, lúc này khi ta vào mục Configure của project, ta sẽ thấy có thêm mục Job Notification
-
Tại đây, ta có thể thêm các param đầu vào cho các bản build sau này.
-
Setting Execute shell cho phép check, trở về bản hash code trước đó, trường hợp khi không nhập giá trị mã HASH_CODE thì sẽ build và deploy sources mới nhất của branch develop
#!/bin/sh
cd /var/lib/jenkins/jobs/application-jenkins-demo/workspace
if [ -n "$HASH_CODE" ]
then
echo "back to hash_code version: $HASH_CODE"
git checkout $HASH_CODE
fi
# clean and build project again
mvn clean package
# copy file .war to folder tomcat for deploying
cp gameoflife-web/target/gameoflife.war /home/datvv/Documents/dev/apache-tomcat-8.0.35/webapps/
- Trở về giao diện deploy Job bây giờ sẽ cho phép ta nhập vào mã HASH_CODE khi deploy.
Bằng cách thực hiện tương tự, ta dễ dàng có thể thêm các Param đầu vào trong quá trình deploy, như trở về 1 version tag , hay deploy 1 branch sources code tại thời điểm nào đó hoặc truyền vào các tham số môi trường...để sử dụng trong quá trình build và deploy sources code.
2.3 Tạo Jobs export database cho phép users download về.
- Tạo 1 jobs mới dưới tên là: 'Dump Database From TEST server'.
- Vào configure -> Build . Chọn Execute shell cho việc thực hiện export database.
- Ví dụ ở đây tôi dùng postgresql:
#!/bin/sh
# define filename for db backup
FILE=db_on_server_test_backup.sql
NAME=${FILE%.*}
EXT=${FILE#*.}
DATE_TIME=`date +%y-%m-%d-%H%M%S`
FILE_EXPORT=${NAME}_${DATE_TIME}.${EXT}
# remove all file before export
rm /var/lib/jenkins/workspace/Dump\ Database\ From\ TEST\ server/*
# export db to folder share
pg_dump -h localhost -U postgres db_for_testing | gzip > /var/lib/jenkins/workspace/Dump\ Database\ From\ TEST\ server/$FILE_EXPORT.gz
Sau khi export file database xong, ta cần tạo archive artifacts để cho phép users có thể tải xuống dễ dàng.
- Vào Add post build action -> Archive the artifacts . Tạo pattern để archive file. Ví dụ ở đây ta chọn pattern là *.gz để archive fle database đã được export từ phần trên.
- 1 điều chú ý là: mặc định Jenkins sẽ lấy các archive affacts base trên wokspace cài đặt jenkins của project:
The base directory is the workspace. You can only archive files that are located in your workspace.
Quá trình builded và tạo archived file thành công:
2.4. Tạo Jobs backup database cuối ngày.
Trong Jenkins ta có thể dễ dàng tạo ra 1 Schedule cho phép thực thi 1 công việc bất kỳ, ví dụ như backup database cuối mỗi ngày.
- Tạo 1 jobs mới với tên "Auto backup DB at last day every day" Vào Configure jobs -> Build Triggers -> Chọn Build periodically để tạo schedule cho việc build.
- Tại đây ta đặt schedule để build jobs theo định dạng:
MINUTE HOUR DOM MONTH DOW
MINUTE Minutes within the hour (0–59)
HOUR The hour of the day (0–23)
DOM The day of the month (1–31)
MONTH The month (1–12)
DOW The day of the week (0–7) where 0 and 7 are Sunday.
- Ví dụ ở đây ta sẽ đặt 59 23 * * * khi đó job backup database của chúng ta sẽ được chạy hàng ngày vào thời 23h59'.
- Sau cùng là xuống hạng mục Build -> Excecute Shell để tạo script backup database hàng ngày.
#!/bin/sh
# define filename for db backup
FILE=db_on_server_test_backup.sql
NAME=${FILE%.*}
EXT=${FILE#*.}
DATE_TIME=`date +%y-%m-%d-%H%M%S`
FILE_EXPORT=${NAME}_${DATE_TIME}.${EXT}
# backup db
pg_dump -h localhost -U postgres db_for_testing | gzip > /home/datvv/Documents/Jenkins/DB_Backup/$FILE_EXPORT.gz
3.Xây dựng hệ thống thông báo.
3.1. Sử dụng thông báo qua email:
3.1.1. Setting mail Jenkins cho mục đích gửi mail tới users sau khi build xong.
- Chọn Manage Jenkins -> Configure System. Tại E-mail Notification ta sẽ setting các thông tin, giao thức gửi mail
3.1.2. Cài đặt plug-in Email-ext cho phép tùy biến các chiến lược gửi email thông báo.
3.1.3. Setting thông báo qua email:
- Vào Configure -> Add post-build action -> Editable Email Notification Tại đây ta có thể setup các tùy chọn người nhận, nội dung gửi với các tùy biến khác nhau:
3.2. Thông báo tới users/groups chatwork sử dụng chatwork API.
- Tham khảo tài liệu chatwork API tại: http://download.chatwork.com/ChatWork_API_Documentation.pdf
- Vào Configure -> Build -> Add build step -> Execute shell để tạo shell script cho mục đích thông báo tới users/groups trong chatwork
NOTIFICATION_COMPLETELY="The deployment process has been completed!"
curl -X POST -H "X-ChatWorkToken:efb89bedcdd62f6d4689719xxxxxxx" -d "body=$NOTIFICATION_COMPLETELY" https://api.chatwork.com/v2/rooms/49641999/messages
Chương trình chạy và gửi thông báo quá trình deployed thành công:
4. Tổng kết.
Trong bài này mình đã giới thiệu cho các bạn về cách phân quyền thực thi trong Jenkins, cũng như một số Jobs hữu ích có thể sử dụng trong quá trình setup. Rất mong các bạn có thể áp dụng một các linh động trong quá trình làm việc. Thanks for reading!
All rights reserved