Chắc hẳn các bạn đã nghe tới 2 khái niệm CI và CD và muốn tự động hóa một phần hoặc hoàn toàn qui trình phát triển sản phẩm của mình. Vậy trong bài viết này, mình sẽ hướng dẫn các bạn cách tích hợp Gitlab với Jenkins để thực hiện một luồng CI CD đơn giản.
Luồng sau khi tích hợp Gitlab với Jenkin sẽ hoạt động như sau:
- Khi commit source code tới Gitlab, Gitlab sẽ gửi webhook tới Jenkins
- Jenkins nhận Webhook, và xử lý.
1. Cài đặt Gitlab Plugin cho Jenkins.
Vào Manage Jenkins – > Manager Plugin
Chọn tab Availble -> tìm plugin gitlab -> Download now and install after restart
Bấm chọn Restart Jenkins ….. và chờ quá trình cài đặt hoàn tất, Jenkins sẽ khởi động lại.
Chúng ta có thể verify lại xem plugin gitlab đã cài đặt thành công hay chưa như ở dưới
2. Tạo project mới trên Gitlab
Chọn Create a proejct
Sau đó chọn Create blank proejct
Đặt tên cho project, chọn chế độ công khai hoặc riêng tư ở mục 2, ở đây mình chọn riêng tư. Ở mục a mình bỏ tích để Gitlab không tự động thêm file README, bấm Create project để tạo project mới.
Sau khi tạo xong, ta có 1 project mới như dưới.
3. Thêm sshkey cho Gitlab
Sau khi tạo xong project mình tiến hành thêm sshkey cho Gitlab, thao tác này giúp Gitlab và Jenkins không hỏi username và mật khẩu khi push hoặc pull dữ liệu. Các bạn thao tác theo thứ tự như hình dưới nhé. Để ý ở mục 3 chúng ta paste sshkey vào đây, mục 4 để đặt tên cho sshkey này và quan trọng nhớ đặt thời gian hết hạn của key ở mục 5 nhé.
Sau khi thêm xong sshkey ta có kết quả như dưới
4. Tạo thông tin Token trên Gitlab
Để tạo Token trên Gitlab, các bạn vào Setting -> Access Token
Đặt tên Token ở mục 1, thời gian hết hạn Token ở mục 2, bạn hãy lựa chọn 1 phạm vi hay nói cách khác là giới hạn cho Token này sử dụng để làm gì ở mục 3 (ở đây mình chọn api) và cuối cùng nhớ đặt thời gian hết hạn cho Token nhé.
Sau khi tạo xong Token ta kéo xuống dưới cùng sẽ thấy kết quả như dưới
Bạn hãy kéo lên đầu trang của Gitlab bạn sẽ thấy Token như mình khoanh đỏ ở dưới. Nhớ copy nó lại và lưu vào chỗ nào đó để lát chúng ta sử dụng lại nhé.
5. Tạo Job trên Jenkins
Để tạo kết nối giữa Gitlab và Jenkins mình sẽ tạo ra 1 job để demo đơn giản như sau.
Bấm vào New Item hoặc Create a job
Chọn kiểu job là Pipeline và đặt tên cho job
Chọn build triggers là Gitlab như mình bôi đỏ ở dưới.
Kéo xuống dưới tại mục Pipeline ở mục 1 chọn Pipeline script from CM, chọn kiểu kết nối là Git.
Ở mục 3 bạn dán link project của Gitlab vào, lúc này bạn sẽ thấy báo lỗi màu đỏ như ô số 5, đừng quan tâm nó, chúng ta hãy tiếp tục thực hiện các bước tiếp theo. Bạn hãy bấm vào Add -> Jenkins
Chọn loại xác thực là username with password. Điền thông tin tài khoản Gitlab vào. Ở mục ID bạn hãy đặt cho phương thức xác thực này 1 cái tên sau đó bấm lưu lại.
Lúc này lỗi màu đỏ ở mục thứ 5 hình trước sẽ biến mất. Ở hình dưới, mục thứ 2 bạn chọn nhánh làm việc của project trên Gitlab. Mục 3 hay trỏ path tới Jenkinsfile của bạn sau đó bấm Save
Bạn hãy soạn Jenkinsfile của bạn với nội dung đơn giản như dưới để test nhé, đặt file này vào thư mục gốc project của bạn.
pipeline {
agent any
stages {
stage("Build test") {
steps {
script {
if( params.APP_NAME != '' ){
sh "echo 'Build test'"
}
}
}
}
}
}
Bây giờ hãy bấm vào job của bạn như hình dưới
Bạn hãy bấm Build now để bắt đầu chạy job. Như chúng ta thấy đã có 1 job được chạy, nhưng job này được chạy bằng tay chứ không phải tự động.
Để ý ở mục số 2 bạn thấy kết quả echo của file Jenkinsfile. Như vậy đến đây mình đã build thành công 1 job đơn giản.
5. Kết nối Jenkins với Gitlab
Để kết nối Jenkins với Gitlab ta thực hiện thứ tự như hình dưới
Đặt tên cho kết nối này là Gitlab local, dán url của Gitlab vào mục 2.
Sau đó vào mục 3 và 4 để thêm Token của Gitlab vào Jenkins
Chọn kiểu kết nối là Gitlab API Token, ở mục 2 điền Token mà lúc nãy chúng ta đã lấy được ở phần trên. Ở mục 3 bạn hãy đặt tên cho nó.
Sau khi thêm xong bạn hãy bấm test, nếu thành công kết quả sẽ trả về ở số 3
6. Cấu hình Webhook Gitlab
Đầu tiên chúng ta hãy tạo 1 API Token của Jenkins bằng cách vào Manage Users
Bấm chọn Setting như dưới
Vào configure chọn Add new Token -> Generate để tạo ra 1 Token mới, bạn có thể đặt tên cho Token này hoặc bỏ trống ở ô Default name để nó tự tạo ra 1 tên ngẫu nhiên
Sau khi có Token bạn bấm ở số 2 để copy lại Token này, hãy lưu nó ở 1 nơi nào đó để chúng ta sử dụng nó ở phần sau.
Trên Gitlab cho phép Gitlab có thể gửi Hook ra ngoài mạng bằng cách vào Admin
Chọn Network
Tích vào số 1 để cho phép Gitlab có thể gửi Hook ra ngoài mạng, sau đó bấm lưu lại
GIờ bạn vào webhooks
Ở ô số 1 chúng ta dán vào 1 url với cú pháp như sau:
http://<jenkins_username>:<jenkins_token>@<jenkins_url>/project/<jenkins_project.>
Đã quá rõ ràng, theo cú pháp trên thì url của mình sẽ là như sau:
http://hoanghd:110e3143126aab2cf6947f0274043af441@192.168.13.205:8080/project/build-prometheus-monitor
Dán nó vào URL, tích chọn Push events để Gitlab gửi thông tin cho Jenkins khi có commit mới
Tích vào số 3 để Gitlab gửi thông tin cho Jenkins khi có merge request
Kéo xuống dưới bấm vào Add webhook ta được thông tin như ô số 2. GIờ thực hiện bước 3, 4 để chúng ta kiểm tra kết nối.
Nếu có kết quả trả về HTTP 200 như dưới tức là bạn đã kết nối thành công.
Bây giờ bạn hãy thử thêm 1 commit mới lên project của mình và kiểm tra kết quả ở Jenkins nhé.
Ở hình trên ta thấy job chạy lần 2 và lần 3 tự chạy hoàn toàn tự động, bạn không cần phải bấm Build now như lúc đầu nữa. Bạn hãy để ý 2 job này nó có thông báo “Started by Gitlab push by Administrator” cho ta thấy job này được khởi động bởi Gitlab.
Chúc các bạn thành công.