Image from https://miro.medium.com/max/1268/1*85otVgjdzFKPpKYXpK1JdA.png
อยากให้มีลุง Jenkins หลายคนช่วยกัน Build Pipeline ให้
- Server : 3 Nodes (*** จริง ๆ ใช้แค่ 2 Nodes ก็ได้ 1 Master 1 Slave)
- OS : Ubuntu 18.04 LTS
- CPU : 1 vCPUs
- RAM : อย่างน้อย 2GB
- jenkins-master (IP : 10.130.16.168)
- jenkins-slave-01 (IP : 10.130.16.175)
- jenkins-slave-02 (IP : 10.130.15.31)
ทำการติดตั้ง Jenkins ตามบทความนี้
ทั้ง 3 เครื่อง
เมื่อติดตั้งเสร็จทั้ง 3 เครื่องแล้ว (ลอง Zoom ดู)
ทำการติดตั้ง Java JRE 11 (OpenJDK JRE 11) ทั้ง 3 เครื่อง
$ apt-get install openjdk-11-jre -y
เนื่องจาก Jenkins ถูกเขียนขึ้นด้วยภาษา Java การ Remote จาก Master -> Slave จะทำผ่านภาษา Java และเนื่องจากเราทำการติดตั้ง Jenkins เป็นแบบ Docker จึงไม่ได้มีการติดตั้ง Java ไว้บนเครื่องตรง ๆ ตั้งแต่แรก เราเลยต้องติดตั้งเพิ่มเติมเอง (ไม่แน่ใจว่าสามารถใช้ Java ใน Container Jenkins เลยได้มั้ย)
ทำการสร้าง SSH Key ตามบทความนี้
Private Key ที่ได้ (jenkins-key
)
Public Key ที่ได้ (jenkins-key.pub
)
อย่าลืม Copy Public Key ไปไว้ที่ Slave Nodes ทั้ง 2 เครื่อง
Credentials นี้สร้างเป็นแบบ SSH Key (เราจะไม่ใช้แบบ Username/Password)
4.1 ไปที่เมนู Credentials > System
4.2 คลิกที่ Global credentials (unrestricted)
4.3 Add Credentials
4.4 ระบุข้อมูลต่าง ๆ ลงไป
- Kind : SSH Username with private key
- ID : กำหนดเป็นอะไรก็ได้ ห้ามซ้ำกับตัวอื่น ในที่นี้เป็น
jenkins-server
- Username : เป็น Username เครื่อง Slave ที่เราจะ Remote ไป ในที่นี้คือ
root
- Private Key : Copy Private Key จากข้อ 3 มาใส่ (เป็น Text ตรง ๆ)
- ถ้า Key มี Passphrase ก็อย่าลืมใส่ Passphrase ด้วย
จากนั้นคลิก OK
ที่ Master Node
5.1 ไปที่เมนู Manage Jenkins > Manage Nodes and Clouds
5.2 New Node
5.3 ตั้งชื่อ Node
5.4 ระบุข้อมูลต่าง ๆ ของ Node
- Name : ชื่อ Node
#
of executors : จำนวน Concurrent Build สูงสุดที่ Jenkins จะ Run บน Node นี้- Remote root directory : ในที่นี้คือ Jenkins Home ซึ่งเราลง Jenkins ไว้ที่
/var/jenkins_home
- Launch method : ในที่นี้เราสั่งงานผ่าน SSH
Launch agents via SSH
- Host : Slave IP Address
- Credentials : จากข้อ 4 ที่เรากำหนดค่าไว้
- Host Key Verification Strategy : ในที่นี้ไม่ต้องทำการ Verify Host Key แต่อย่างใด
จากนั้นคลิก Save
5.5 Check Log (เลือกที่ Node slave-01
จากนั้นไปที่เมนู Log)
การเชื่อมต่อระหว่าง master
<-> slave-01
ทำงานได้ปกติ
5.6 เพิ่ม Node slave-02
ต่อ
5.7 ข้อมูลเหมือน Node slave-01
ทั้งหมด ยกเว้น IP Address
5.8 คลิก Relaunch agent เพื่อเชื่อมต่อ master
<-> slave-02
5.9 Check Log slave-02
การเชื่อมต่อระหว่าง master
<-> slave-02
ทำงานได้ปกติ
5.10 เพิ่ม Node เสร็จเรียบร้อย
6.1 ไปที่เมนู New Item
6.2 กำหนดชื่อ Job (item) โดยเลือกเป็นแบบ Pipeline
จากนั้นคลิก OK
6.3 ระบุข้อมูลต่าง ๆ ของ Pipeline ลงไป
- Pipeline นี้สามารถใช้ตัวอย่างจาก GitHub Repo นี้ได้ https://github.com/jittagornp/spring-boot-reactive-jenkins-pipeline
- ถ้าใครเขียน Pipeline ไม่เป็น สามารถเรียนรู้ได้จากบทความนี้ พื้นฐานการเขียน Jenkins Pipeline
เสร็จเรียบร้อย Pipeline ที่ 1
6.4 ลอง Clone เป็น Pipeline ที่ 2,3,4 ...9,10
Clone เสร็จเรียบร้อย 10 Pipeline
6.5 ลอง Build ทั้ง 10 Pipeline ด้วยการคลิกที่รูปนาฬิกาทางขวามือของแต่ละ Pipeline
จะเห็นว่ามีการกระจาย Load ไป Run Pipeline แต่ละ Node (แต่ละ Agent)
6.6 เข้าไป Check แต่ละ Node ในโฟลเดอร์ Workspace (/var/jenkins_home/workspace
) จะเห็นว่ามีการกระจาย Load ไปยังแต่ละ Node จริง ๆ
- Log หรือ Status ต่าง ๆ จะแสดงเฉพาะบน Master เท่านั้น
- ถ้าเข้าไปดูที่เครื่อง Slave แต่ละเครื่องจะพบว่า Status บนหน้าจอ GUI ของ Jenkins เครื่องนั้น จะว่างเปล่าแบบนี้
เพราะ Status ต่าง ๆ จะแสดงเฉพาะบน Master เท่านั้น