Part 4 - Jenkins CI : Cấu hình slave node machine và tích hợp hệ thống phân tán - phần cuối
Bài đăng này đã không được cập nhật trong 3 năm
Index
- Part 1 - Introduction
- Part 2 - Cài đặt , cấu hình Gerrit với apache basic authen
- Part 3 - Tích hợp CI / CD
- Part 4 - Jenkins CI : Cấu hình slave node machine và tích hợp hệ thống phân tán - phần cuối
Tiếp theo chuỗi bài viết về Gerrit vs Jenkins, trong phần này mình sẽ đề cập đến kiến trúc master/slave khi sử dụng Jenkins CI.
Đây cũng là phần cuối của chuỗi bài viết và tổng hợp lại những kỹ thuật cơ bản cần thiết khi xây dựng một hệ thống CI hoàn chỉnh. Để hiểu rõ hơn kiến trúc, mục đích và ứng dụng của master slave trong jenkins , chúng ta cùng tìm hiểu những phần sau.
Kiến trúc Master/Slave
Khi nói đến jenkins master , chúng ta sẽ hiểu rằng đó là một machine mà jenkins đã được cài đặt trên đó, chẳng hạn như đó là một Linux PC, nhằm thực hiện một vài task vụ nào đó như build source code , chạy unit test trong các jobs ...
Vậy câu hỏi đặt ra, nếu source code đó là một .Net project thì jenkins master sẽ thực thi như thế nào, vì có sự khác biệt về platform ?
Và từ đó chúng ta có khái niệm jenkins slave để giải quyết sự "khác biệt" đó.
Slave là một hoặc nhiều máy tính với môi trường khác nhau , OS khác nhau. Chúng được kết nối với jenkins để nhận các tác vụ được giao trong jobs
của jenkins.
Ví dụ chúng ta có một vài slave như bên dưới :
- 1 slave chạy Ubuntu để build các project Java và Android.
- 1 slave chạy MacOS để build các project iOS.
- 1 salve chạy Windows để build các project .Net
- 1 slave chạy CenOS để phục vụ một vài tác vụ đặc thù ..vvv
Thực chất, mọi request sẽ được gửi đến jenkins , từ đây nó sẽ phân bổ tới các slave tương ứng ( nếu có) để thực thi nhiệm vụ. Một khi nhiệm vụ hoàn thành, slave sẽ report lại jenkins với kết quả tương ứng.
Việc kết nối giữa slave <--> jenkins sẽ thông qua một chương trình chạy ta gọi nó là slave agent
, nhằm nhận sự ủy quyền,chạy cáct task vụ/command được gừi từ jenkins trên console background của slave ..vv .
Chạy slave agent như thế nào
Tùy thuộc vào từng môi trường OS của jenkins master/slave mà chúng ta có cách chạy khác nhau. Nhưng việc đầu tiên chúng ta cần có :
- 1 PC đóng vai trò là slave với OS bất kỳ.
- 1 computer node đã tạo trên jenkins
Manage Nodes
(http://yourdomain.com:8080/computer/), để cấu hình environment của slave, cũng như connect/disconnect slave đó.
Sau đó, ta có thể cấu hình chạy slave theo cách chúng ta muốn, về cơ bản sẽ có một vài cách cấu hình để chạy slave như sau
Chạy slave agent qua SSH
Cách này thường được sử dụng và ưu tiên hơn cho Unix slave, vì ssh được build-in trong OS. Jenkins sẽ thực hiện một ssh connection đến slave để start slave agent với các steps như sau :
- Jenkins remote ssh đến slave.
- Chạy bash shell download slave.jar từ jenkins
- Start slave.jar từ slave để kết nối slave ---> jenkins ( vẫn trong ssh remote khi start slave.jar)
Để hiểu rõ hơn, chúng ta cùng xem một đoạn log quá trình connect 1 slave (IP 192.168.5.173) trên jenkins master như bên dưới :
[05/30/17 20:44:38] [SSH] Opening SSH connection to 192.168.5.173:22.
[05/30/17 20:44:38] [SSH] WARNING: SSH Host Keys are not being verified. Man-in-the-middle attacks may be possible against this connection.
[05/30/17 20:44:38] [SSH] Authentication successful.
...
.
[05/30/17 20:44:39] [SSH] Checking java version of java
[05/30/17 20:44:39] [SSH] java -version returned 1.8.0_131.
[05/30/17 20:44:39] [SSH] Starting sftp client.
[05/30/17 20:44:39] [SSH] Copying latest slave.jar...
[05/30/17 20:44:39] [SSH] Copied 717,563 bytes.
Expanded the channel window size to 4MB
[05/30/17 20:44:39] [SSH] Starting slave process: cd "/home/manhnv/jenkins" && java -jar slave.jar
<===[JENKINS REMOTING CAPACITY]===>channel started
Slave.jar version: 3.4.1
This is a Unix agent
Evacuated stdout
Agent successfully connected and online
Để jenkins có thể ssh remote vào slave , chúng ta cũng cần phải config authenticate, chi tiết phần này mình sẽ hướng dẫn khi thực hiện demo.
Chạy slave agent bằng JNLP
Với Java Web Start(JNLP), cách này thường được sử dụng với windows slave , hoặc áp dụng khi jenkins không thể tạo connection đến slave, do bị hạn chế bởi một vài yếu tố security, authenticate, firewall ..vv.
Không giống như phương thức chạy agent bằng ssh, JNLP sẽ khởi chạy agent trên máy slave để connect đến master.
Có 2 cách để start slave agent bằng Java Web Start từ 1 slave machine :
- Chạy qua GUI Interface :
- Download file
slave-agent.jnlp
trên jenkins web và khởi chạy với java web , file cũng đã bao gồm các config đến jenkins server và node của slave đó trên jenkins. - Trên windows, chúng ta cũng có thể cài đặt nó như một system service mà không cần phải trực tiếp start nó mỗi khi cần sử dụng.
- Download file
- Chạy từ command line:
- Download
slave.jar
từ jenkins web và thực thi vớijava
command, syntax bạn có thể nhìn xuống ví dụ bên dưới
java -jar slave.jar -jnlpUrl http://192.168.5.28:8080/computer/windows-slave/slave-agent.jnlp -secret 1a3353cf33271d5b937f0a3890c3fcb78ae0f7e03c8ae0a19746b5178fb01b08
- Bạn cũng không cần thiết phải nhớ syntax trên, vì nó sẽ được cung đầy đủ thông tin
jnlpUrl
trên màn hình computer node của jenkins web.
- Download
Chạy slave agent trên Windows
Cũng gần tương tự như cách chạy agent bằng SSH, nhưng cách này sẽ chỉ hoạt động từ Windows 2000 trở lên. Và có ít nhất các điều kiện sau :
- Phải có 1 account có administrative access permisison.
- Port 139 và 445 phải được enable access trên slave machine
- Service Remote Registry Access phải được enable.
- Ngoài ra còn có một số local security setting để có thể hoạt động đúng.
Về cơ bản có thể hiểu nôm na là , jenkins sẽ connect đến slave bằng account đã được cung cấp, tạo 1 system service và remote start/stop agent, mọi thao tác hoàn toàn được xử lý dưới background - không UI.
Tuy nhiên thì cách này unrecommended trên windows, chúng ta nên xem xét sử dụng Java Web Start (JNLP) để thay thế. Tránh sẩy ra những lỗi không mong muốn liên quan đến service cũng như windows platform.
Recommend khi chạy slave agent
Tùy vào việc áp dụng cho công việc mà chúng ta có những lựa chọn khác nhau. Nhưng về cơ bản thì mình recommend như sau :
- Với Unix slave thì recommend hơn với SSH và Java Web Start trên Terminal.
- Windows có thì có thể sử dụng Java Web Start để thay thế cho Remote Registry Access.
Cũng vì vậy trong phần dưới, mình sẽ hướng dẫn cách tạo, sử dụng áp dụng slave trong ứng dụng thực tế. Trên cả slave windows và linux áp dụng chạy slave agent bằng SSH và JNLP
Demo
Nôi dung chi tiết mục demo này như sau :
- Tạo và cấu hình cho windows slave sử dụng Java Web Start(JNLP)
- Tạo và cấu hình cho linux slave sử dụng SSH slave agent.
- Add slave tới jobs build , mình có 2 jobs tương ứng cho 2 slave như sau :
- 1 job cho java project sử dụng linux slave để verify source.
- 1 jobs cho windows phone app project sử dụng windows slave để build source.
- Start slave agent trên linux và windows machine
Lưu ý : 1 slave cũng có thể sử dụng cho nhiều jobs , và 1 job cũng có thể delegate cho nhiều slaves. Để đi nhanh, ở ví dụ này mình sẽ thực hiện 1 slave <=> 1 job
Tạo computer node cho linux slave
Như mình đã nói ở đầu, mỗi một computer node sẽ đại diện cho 1 slave. Đó là nơi sẽ cấu hình liên quan đến môi trường, remote directory( thư mục trên máy slave sẽ làm việc), thông tin account kết nối đến salve (nếu có) ...etc.
Tạo node mới cho salve
Manage Jenkins
-- >Manage Nodes
-->New Node
.- Nhập tên node, ở ví dụ này của mình là
linux_slave
Cấu hình linux slave với ssh agent
of executors
: maximum concurrent builds ở cùng 1 thời điểm trên slave này.Remote root directory
: root thư mục trên máy slave để làm việc.Labels
: một label name cái sẽ cần sử dụng để định danh slave này cho các jobs build. Label có thể là một group slave nếu đặt cùng label name.Usage
: Only build jobs with label expressions matching this node.Launch method
: Launch slave agents via SSH.Host
: IP hoặc domain name của slave để có thể connect qua SSHCredentials
: chọn account để kết nối đến slave này. Nếu chưa có click Add để thêm xác thực mới.Host Key Verification Strategy
: chọn Non verifying Verification Strategy.
Với Credentials
: là thông tin account của slave mà jenkins sẽ sử dụng để connect tới slave thông qua SSH. Bạn có thể chỉ định user name với password
hoặc user name với private key
tùy thuộc vào việc config authenticate trên ssh của slave.
Như hình ảnh trên, mình sử dụng user name với password
trên slave để xác thực. Nếu bạn muốn sử dụng private key , trước tiên bạn cần config ssh trên slave để disable password authen, sau đó add private key của jenkins sang file authorized_keys
của slave. Bạn có thể tìm hiểu thêm trên internet về cách config này trên ssh.
Tạo computer node cho windows slave
Giống như việc tạo linux slave ở phía trên, thiết lập Remote root directory
tương ứng.
Launch method
: mình sẽ chọnLaunch agent via Java Web Start
cho môi trường windows.Labels
: windows_slave
Lưu ý : Để sử dụng
Launch agent via Java Web Start
bạn cần enable JNLP agents trongManage Jenkins
-->Configure Global Security
--> TCP port for JNLP agents chọn 1 portFixed
hoặcRandom
.
Add slave thực thi cho jobs build.
Mình đã có bài hướng dẫn cách tạo jobs build trên jenkins, bạn có thể tham khảo phần 3 link sau https://viblo.asia/manhnv118/posts/eW65GYWOZDO
Kịch bản hiện tại :
- 1 job build
bookstore_master_verifier
cho java project . - 1 job build
windows-phone-checkbuild
cho windows phone project. - 1 linux slave với 1 label
linux_slave
đã tạo ở trên. - 1 windows slave với 1 label
windows_slave
đã tạo ở trên.
Để jenkins có thể delegate cho các slave machine này, mình sẽ cấu hình như sau :
- Vào cấu hình jobs:
- Dưới mục
General
chọnRestrict where this project can be run
- Nhập label của slave
linux_slave
cho jobsbookstore_master_verifier
- Nhập label của slave
windows_slave
cho jobswindows-phone-checkbuild
- Dưới mục
Như vậy , việc cấu hình slave và delegate slave đã hoàn tất. Điều đó cũng có nghĩa là mọi script schell và những tác vụ trong những jobs này sẽ được chạy trên slave machine thay vì jenkins master.
Start slave agent
Việc cuối cùng là chúng ta sẽ start slave trên các slave, để jenkins có thể delegate mỗi khi job build được chạy.
Yêu cầu bắt buộc :
- Trên các slave machine, java đã được cài đặt.
linux slave
- Trên jenkins --> Manage Jenkins > Manage Nodes
- Click node linux slave
- Click button
Launch agent
Jenkins sẽ tự động connect đến slave qua SSH với thông tin đã được cấu hình.
windows slave
Trên windows do sử dụng Java Web Start,do vậy chúng ta cần phải download slave-agent.jnlp
hoặc slave.jar
tùy theo cách bạn muốn sử dụng UI hay command line.
- Trên jenkins --> Manage Jenkins > Manage Nodes
- Click node windows slave
- Download file tương ứng cho UI hoặc command line
- Với GUI click vào button Launch để download.
- Hoặc
slave.jar
để chạy với command line đã cung cấp.
Tổng kết
Trải qua 4 phần của chuỗi bài viết Gerrit vơí Jenkins CI, từ việc cài đặt Gerrit, cấu hình authenticate với apache basic authen, đến cài đặt và tương tác Gerrit vs Jenkins. Thì đây là phần cuối của chuỗi bài viết , với mong muốn tổng hợp những kỹ thuật cần có khi xây dựng 1 hệ thống CI/CD.
Trái tim của jenkins là shell script vậy nên bạn có thể tùy ý làm gì mình muốn. Hoặc nếu bạn muốn tiết kiệm thời gian, thì có thể tìm kiếm những plugins trên https://plugins.jenkins.io/ để có thể thao tác config bằng giao diện.
Thank you for reading!
All rights reserved