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

Index

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 :

  1. Jenkins remote ssh đến slave.
  2. Chạy bash shell download slave.jar từ jenkins
  3. 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 :

  1. 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.
  2. Chạy từ command line:
    • Download slave.jar từ jenkins web và thực thi với java 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.

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 :

  1. Tạo và cấu hình cho windows slave sử dụng Java Web Start(JNLP)
  2. Tạo và cấu hình cho linux slave sử dụng SSH slave agent.
  3. 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.
  4. 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

  1. Manage Jenkins-- > Manage Nodes --> New Node.
  2. 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 SSH
    • Credentials : 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ọn Launch 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 trong Manage Jenkins --> Configure Global Security --> TCP port for JNLP agents chọn 1 port Fixed hoặc Random.

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 :

  1. Vào cấu hình jobs:
    • Dưới mục General chọn Restrict where this project can be run
    • Nhập label của slave linux_slave cho jobs bookstore_master_verifier
    • Nhập label của slave windows_slave cho jobs windows-phone-checkbuild

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!