Jenkins Agent Overview

1. Giới thiệu về Jenkins Agent Bản thân Jenkins Controller có thể vừa quản trị các biến môi trường, vừa chạy các jobs bằng tài nguyên mà nó sở hữu. Tuy nhiên, khi số lượng jobs (hay cụ thể hơn là project pipeline) quá lớn, Jenkins Controller không thể cứ “vertical scale” (nâng RAM, CPUs,

1. Giới thiệu về Jenkins Agent

Bản thân Jenkins Controller có thể vừa quản trị các biến môi trường, vừa chạy các jobs bằng tài nguyên mà nó sở hữu. Tuy nhiên, khi số lượng jobs (hay cụ thể hơn là project pipeline) quá lớn, Jenkins Controller không thể cứ “vertical scale” (nâng RAM, CPUs, …) lên mãi được. Ngoài ra, việc để tất cả các jobs cùng chạy trên Controller còn dẫn đến nhiều vấn đề về bảo mật, khi mà tất cả người dùng đều có quyền truy cập vào resource, enviroment của Jenkins Controller.

Giải pháp cho vấn đề nêu trên là Jenkins Agent.

Jenkins Agent là một machine (VM, docker container, máy chủ vật lý, AWS EC2 instance, …) kết nối và nhận jobs từ Controller. Nhiều agent kết nối với controller sẽ tạo ra kiến trúc phân tán cho Jenkins, ngoài việc giảm workloads, tăng cường bảo mật, còn nâng cao khả năng sẵn có cho hệ thống.

2. Kết nối Agent với Controller

Hiện tại có 2 cách kết nối Agent với Controller phổ biến: SSH connector và Inbound connector.

2.1 SSH connector

Với cách thức kết nối này, Jenkins Controller sẽ có thông tin remote SSH, SSH key để chủ động call tới agent.

Demo cấu hình SSH connector cho agent (Docker container trên Linux)

Yêu cầu:

  • Machine 1: đã cài đặt Jenkins (đóng vai trò là Jenkins Controller), cung cấp giao diện quản trị Jenkins.
  • Machine 2: hệ điều hành Linux, đã cài đặt Docker (để chạy container Jenkins Agent)

B1: Trên machine 2, tạo SSH key lệnh

ssh-keygen -f ~/.ssh/jenkins_agent_key

B2: Chạy agent trên machine 2:
Chạy agent container

docker run -d --rm --name=agent1 -p 22:22 
-e "JENKINS_AGENT_SSH_PUBKEY=[your-public-key]"
jenkins/ssh-agent:alpine

Trong đó, [your-public-key] là nội dung file ~/.ssh/jenkins_agent_key.pub (đã tạo ở B1)

Cập nhật container enviroment

$ VARS1="HOME=|USER=|MAIL=|LC_ALL=|LS_COLORS=|LANG="
$ VARS2="HOSTNAME=|PWD=|TERM=|SHLVL=|LANGUAGE=|_="
$ VARS="${VARS1}|${VARS2}"
$ docker exec agent1 sh -c "env | egrep -v '^(${VARS})' >> /etc/environment"

Lấy thông tin javaPath (để cấu hình cho bước sau):

docker exec agent1 which java

B3: Trên giao diện Jenkins Controller, tạo Jenkins SSH credential

Truy cập mục Manage Jenkins --> Manage Credentials --> Add Credentials (trong mục Global)
image.png

Trong mục New Credentials, điền các thông tin

  • Kind: SSH Username with private key
  • Scope: Global
  • Username: agent1-credential (cái này bạn có thể tùy chỉnh theo ý muốn)
  • Private key: tick chọn “Enter directly”, click Add, điền nội dung file ~/.ssh/jenkins_agent_key (đã tạo ở B1)

Click Create để tạo Credential.

B4: Trên giao diện Jenkins Controller, khởi tạo Agent

Truy cập mục Manage Jenkins --> Manage Nodes and Clouds --> (+) New Node

Điền tên node, tick chọn Permanent Agent, click Create.

Trong mục New Agent, điền các thông tin:

  • Remote directory: /home/directory
  • Label: ssh-agent (phần này bạn có thể tùy chỉnh, đây là trường ta sẽ dùng để khai báo Agent trong Jenkinsfile)
  • Launch method: Launch Agent via SSH
    • Host: <agent_IP>
    • Credentials: agent1-credential (Credential ta đã tạo ở bước trên)
    • Host key verification Strategy: Manual trusted key Verification Strategy
    • Click Advanced để cấu hình tham số nâng cao
      • Port: 22 (có thể open port khác tùy theo agent container port)
      • JavaPath: <java_path> (đã có ở B2)

Click Save.

B5: kiểm tra agent kết nối thành công.

2.2 Inbound connector

Đối với cách này, Jenkins Agent sẽ chủ động kết nối tới Jenkins Controller bằng cách chạy lệnh với file agent.jar

Demo cấu hình inbound connector cho agent (VM hoặc máy chủ vật lý)

Yêu cầu:

  • Machine 1: đã cài đặt Jenkins (đóng vai trò là Jenkins Controller), cung cấp giao diện quản trị Jenkins.
  • Machine 2: hệ điều hành Linux, đã cài đặt java

B1: Khởi tạo agent trên giao diện quản trị Jenkins

Truy cập mục Manage Jenkins --> Manage nodes and clouds --> (+) New node

Trong mục New Node, điền các thông tin

  • Remote directory: /home/directory
  • Label: inbound-agent (phần này bạn có thể tùy chỉnh, đây là trường ta sẽ dùng để khai báo Agent trong Jenkinsfile)
  • Usage: Only build jobs with label expressions matching this node
  • Launch method: Launch agent by connecting it to the controller

Click Save.

Trong mục Manage Jenkins --> Manage nodes and clouds, click chọn agent vừa tạo.

Jenkins sẽ sinh sẵn command để kết nối tới Jenkins Controller từ machine chạy agent.
image.png

B2: Chạy lệnh trên machine 2

Download file agent.jar (tại đường dẫn http://<jenkins-host>/jnlpJars/agent.jar), copy lệnh phía trên và chạy

Lưu ý: cần đảm bảo machine 2 đã cài java.

Kết quả thu được khi agent kết nối thành công:
image.png

Chúc mọi người cài đặt thành công và có trải nghiệm thú vị với Jenkins 😃)) !

3. Link tham khảo

https://www.jenkins.io/doc/book/using/using-agents/https://www.jenkins.io/doc/book/scaling/architecting-for-scale/

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ