Hello Jenkins world EP1 รู้จัก และ ติดตั้ง Jenkins Master & Agent แบบ The Flash

Narawit Rattanasuriya
Sirisoft
Published in
6 min readApr 11, 2022

ย้อนกลับไปเมื่อ 1 ปีก่อน ผมได้มีโอกาสเข้าไปทำงานให้กับลูกค้าที่ธนาคารแห่งหนึ่ง จนไปได้เจอกับ Tools ตัวนึงที่คอยทำหน้าที่ดูแลการทำ CICD ของ App ทั้งหมด ณ ธนาคารแห่งนั้น เป็นคุณลุงชื่อว่า “Jenkins” ที่อยู่ในรูปของพ่อบ้าน ใส่สูท ผูกหูกระต่ายสีแดง เลยอยากจะมาแชร์ความรู้ให้ฟังกันครับ

Jenkins คืออะไร?

Jenkins เป็น Open source Tools ที่ใช้ในการทำ CICD ไม่ว่าจะเป็นการ automate build application , การ automate deploy หรือ การทำ automate test ที่มี plugin ให้เลือกใช้งานอย่างหลากหลาย

Jenkins ดียังไง?

  • ฟรี! เนื่องจากเป็น Open source tools
  • มี Community support
  • มี Plugin ให้เลือกใช้อย่างจุใจ
  • User friendly ใช้งานและติดตั้งง่ายมาก
  • ติดตั้งได้ในหลาย platform ไม่ว่าจะเป็น Docker , Kubernetes , VM , Local machine , Cloud

ซึ่งในวันนี้ผมก็จะมาสอนติดตั้ง Jenkins 2 แบบ คือ

  1. ติดตั้งผ่าน Homebrew
  2. ติดตั้งผ่าน Docker

ติดตั้ง Jenkins ด้วย Homebrew บน Mac

Pre-requisite

  • Homebrew
  • เครื่อง MAC

ขั้นแรกเข้าไปที่ Terminal บนเครื่อง Mac ของเราแล้วพิมพ์ Command นี้ครับ

brew install jenkins-lts

brew services start jenkins-lts

output ที่ได้จากการติดตั้ง Jenkins ผ่าน Homebrew

จะเห็นได้ว่าจาก console log ของการ install จะมีการติดตั้ง dependency ที่จำเป็นให้กับ Jenkins ให้เราด้วยเลยนั่นก็คือ OpenJDK นั่นเองครับ

จากนั้นทดลองเข้าไปที่ localhost:8080 หน้าจอจะแสดงตำแหน่งของ token ที่ใช้ในการ unlock Jenkins โดยให้เราใช้ command ข้างล่างเพื่อดู token

หน้าสำหรับ unlock Jenkins

Cat /Users/[USERNAME]/.jenkins/secrets/initialAdminPassword

แสดงรหัสผ่านที่ใช้ในการ unlock Jenkins

ใส่ token ที่ได้จาก command หลักจากนั้น Jenkins จะให้เราเลือกว่าจะติดตั้ง recommend plugin หรือ custom เองโดยเราจะเลือกเป็น recommend ก่อนนะครับ โดย plugin ตัวอื่นๆเราค่อยไปติดตั้งทีหลังเอา

สามารถเลือก custom plugin ได้

หลังจากนั้น Jenkins จะติดตั้ง plugin ให้เรารอประมาณ 3–5 นาที

ติดตั้ง plugin ที่จะใช้งาน
สร้าง user admin
กำหนด URL ที่จะเข้าใช้งาน

ติดตั้งเสร็จเรียบร้อย

หน้าจอติดตั้งสำเร็จ
หน้า Dashboard Jenkins

ติดตั้ง Jenkins ด้วย Docker

Pre-requisite

  • docker

ขั้นตอนแรกทำการ pull image Jenkins จาก dockerhub

docker pull jenkins/jenkins:lts-jdk11

docker pull image จาก Dockerhub

รัน container โดยทำการ map volume เพื่อเก็บข้อมูลของ Jenkins workspace ไว้บนเครื่องเพื่อให้ข้อมูลไม่หายไปหลังจาก container หยุดทำงาน และ ทำการ map port จากใน container จาก 8080 เป็น 8081 เพื่อป้องกันการ port ชนกันกับเครื่อง MAC

docker run -d -v jenkins_home:/var/jenkins_home -p 8081:8080 -p 50000:50000 --name jenkins jenkins/jenkins:lts-jdk11

หลังจาก start container แล้ว เราสามารถเข้าไปดูข้อมูลของ Jenkins ได้ที่ localhost:50000

ดูข้อมูลของ Jenkins

และเข้าใช้งานได้ที่ localhost:8081 โดยเราจะเจอหน้าให้ unlock Jenkins เหมือนกับการ install ด้วย homebrew

หน้าจอสำหรับการ unlock Jenkins

ซึ่งในการดูข้อมูลรหัสผ่านที่ใช้ในการ unlock Jenkins ได้เราต้องทำการเข้าไปยัง Jenkins container ก่อนด้วย command

docker exec -it jenkins /bin/sh

cat /var/jenkins_home/secrets/initialAdminPassword

รหัสผ่านที่ใช้ในการ unlock Jenkins

หลังจากนั้นขั้นตอนการ install ก็จะเหมือนกับการ install ด้วย homebrew เลยครับ ผมขออนุญาตข้ามเลยนะครับ

Jenkins Master และ Agent

หนึ่งในความสามารถพิเศษของคุณลุง Jenkins ที่เราจะมาพูดถึงในวันนี้ด้วยก็คือ การทำงานแบบ Master และ Agent ที่จะสามารถแยกร่างคุณลุง Jenkins มาช่วยกันทำงานเพิ่มได้ครับ

โดยจะใช้ Master Node เป็นเครื่อง MAC และใช้ agent node เป็น docker (เป็น docker image คนละตัวกับที่ติดตั้ง jenkins ด้านบนนะครับ)

โดยสิ่งที่จำเป็นในการสร้าง agent ก็ต้องมี Java ติดตั้งอยู่ด้วยครับ และวิธีที่เราจะสามารถ connect agent ได้มีดังนี้ครับ

1. Launch agent by connecting it to the controller — เป็นวิธีการ connect โดยใช้ไฟล์ script agent.jar ในการ connect เครื่อง agent ไปยังเครื่อง master

2. Launch agents via ssh — เป็นวิธีการ connect Jenkins agent โดยใช้ private key และ public key ในการ connect ผ่าน ssh

วันนี้เราจะเลือกเป็น “Launch agent via ssh” ซึ่งจะเป็นวิธีที่เราเลือกใช้ในวันนี้ครับ

Jenkins Master และ Jenkins Agent

ขั้นตอนแรกให้เรา generate private key และ public key ด้วย command นี้บน terminal ของเครื่อง Master กันก่อนนะครับ

ssh-keygen -f ~/.ssh/jenkins_agent_key
ให้ทำการใส่ passphrase และทำการ generate key ครับ

โดยเราจะได้ไฟล์ออกมา 2 ไฟล์คือ public key และ private key โดยสามารถดู content ของไฟล์ได้ด้วย command นี้

cat ~/.ssh/jenkins_agent_key
cat ~/.ssh/jenkins_agent_key.pub
private key ที่ถูก generate ออกมา
public key ที่ถูก generate ออกมา

หลังจากนั้นให้ไปที่ menu “Manage Jenkins → Manage Credentials → add credential” เพื่อทำการสร้าง credential จาก key ที่เรา generate ไว้เมื่อขั้นตอนที่แล้ว

เข้าไปที่ menu “Manage Jenkins” ตามด้วย menu “Manage Credentials”
กดที่ Domain Global และกดปุ่ม Add credentials

ต่อมาทำการตั้งค่า credential ดังนี้

  1. เลือกประเภทของ credential เป็น “SSH Username with private key”
  2. กำหนด ID ของ credential เป็น agent-key
  3. กำหนด Username เป็น username ของเครื่อง Master
  4. เลือกการใส่ key เป็น Enter directly โดยนำข้อมูลของไฟล์ private ที่อยู่ใน path ~/.ssh/jenkins_agent_key มาใส่
หน้าจอการสร้าง credential

หลังจากนั้นเราจะทำการสร้าง docker container ซึ่งก็คือ agent ที่เราจะทำการเชื่อมต่อด้วยนั่นเอง โดยใช้ command ด้านล่างนี้ ซึ่งทำการกำหนด ชื่อ และ map port 22 สำหรับ connect ผ่าน ssh ไว้ด้วย รวมถึงกำหนดค่า public key ที่เราจะใช้ในการ connect กับเครื่อง master ไว้ด้วยครับ

docker run -d --name=agent1 -p 22:22 -e "JENKINS_AGENT_SSH_PUBKEY=[YOUR_PUBLIC_KEY]" jenkins/ssh-agent
docker agent รันเป็น container เรียบร้อยแล้ว

หลังจากนั้นให้เราไปที่หน้า dashboard ของ Master Node บนเครื่อง MAC แล้วเข้าไปที่ Menu “Manage Jenkins → Manage Node and Clouds → New Node”

กดที่ Menu “Manage Jenkins
กดที่ Menu “Manage Nodes and Clouds
ในหน้านี้เราจะเห็นข้อมูลของ master node ของเราด้วย โดยเราจะกดไปที่ Menu “New Node” เพื่อสร้าง agent node ครับ

ทำการตั้งชื่อของ agent และกด Create

ตั้งชื่อ Agent ว่า “agentDocker

หลังจากนั้นเราจะเข้ามาสู่หน้าตั้งค่า Agent ครับ

โดยผมจะอธิบาย field ต่างๆในการสร้าง agent ไว้ดังนี้ครับ

Name: ชื่อของ agent ที่สร้าง

Number of executors: จำนวน build ที่ Jenkins agent สามารถทำงานได้พร้อมกัน

Remote root directory: path ของ Jenkins Home ที่เราติดตั้ง Jenkins (ในที่นี้คือ /home/jenkins)

Labels: ชื่อที่กำกับไว้กับ agent node โดยหากมี build ไหนที่ต้องการเรียกใช้งาน agent จะเรียกใช้งานจาก labels นี้

Usage: เป็นการกำหนดว่าจะให้เรียกใช้งาน agent นี้เมื่อไหร่บ้าง โดยเราจะกำหนดเป็น ใช้งานก็ต่อเมื่อมีการเรียกใช้ label ที่เรากำหนดไว้เท่านั้น

Launch method: วิธีการ connect agent และ master เข้าด้วยกัน โดยจะมีวิธี connect agent node ได้แก่

1. Launch agent by connecting it to the controller — เป็นวิธีการ connect โดยใช้ไฟล์ script agent.jar ในการ connect เครื่อง agent ไปยังเครื่อง master

2. Launch agents via ssh — เป็นวิธีการ connect Jenkins agent โดยใช้ private key และ public key ในการ connect ผ่าน ssh

ให้เราเลือกเป็น “Launch agent via ssh” ซึ่งจะเป็นวิธีที่เราเลือกใช้ในวันนี้ครับ

และทำการตั้งค่าใน menu “Launch agents via ssh” ตามนี้ครับ

Host : localhost

Credential : เลือก credential ที่เราสร้างไว้จาก private key

Host Key Verification Strategy : Manually trusted key Verification Strategy

หลังจากนั้นเราจะได้ agent เพิ่มขึ้นมา 1 เครื่อง โดยเราจะยังไม่สามารถใช้งาน agent ได้จนกว่า agent จะถูก connect เรียบร้อย โดยเราสามารถตรวจสอบการเชื่อมต่อโดยกดไปที่ชื่อของ agent ของเราครับ

agent จะทำการ Launch ขึ้นมา
กดไปที่ menu “Log” เพื่อดู log ของการ connect agent
จาก Log จะเห็นได้ว่า Agent ได้ทำการ connect และ online อยู่

หลังจากนั้น agent ของเราแสดงข้อมูลของ agent ออกมา ซึ่งหมายความว่าเราสามารถใช้งาน agent เครื่องนี้ได้แล้วนั่นเอง

agent สามารถใช้ได้แล้ว

ขั้นตอนต่อมาเราจะทำการทดสอบการใช้งาน agent บน job กันครับ โดยเราจะสร้าง pipeline ขึ้นมา 1 pipeline ครับ

ทดลองสร้าง pipeline เพื่อทดสอบ agent node

หลังจากนั้นให้เรา config pipeline ให้เรียกใช้งาน agent Docker ด้วย pipeline ข้างล่างครับ

pipeline {  agent { label ‘agentDocker’ } // กำหนด label เพื่อเรียกใช้งาน agent    stages {      stage(‘Hello’) {        steps {          script{            sh “whoami” //คำสั่งตรวจสอบ user ที่ใช้รันคำสั่งใน pipeline            sh “pwd” //คำสั่งในการตรวจสอบ directory ปัจจุบันที่ใช้งานอยู่

sh "uname -a" //คำสั่งในการตรวตสอบข้อมูลของเครื่องที่รัน pipeline
} } } }}
สร้าง pipeline script เพื่อเรียกใช้งาน agent node

หลังจากนั้นกด save และไปยังหน้าของ Jobs และกดปุ่ม Build Now

กดปุ่ม build now เพื่อ trigger pipeline

หลังจากนั้นเข้ามาดู console output

console output ของ pipeline

จะเห็นได้ว่า pipeline รันอยู่บน Jenkins agent node เรียบร้อยแล้วครับ

สรุปเนื้อหาในวันนี้

  • Jenkins สามารถติดตั้งได้หลากหลายวิธีมากๆไม่ว่าจะเป็นบน VM , Kubernetes deployment , Local machine , Cloud หรือ แบบ Docker
  • Jenkins มีความสามารถในการทำ Agent node ขึ้นมาช่วยกระจาย Load ของงานได้
  • สามารถ config ให้ Agent ที่สร้างขึ้นมาทำงานได้ตามเงื่อนไขการเรียกใช้ เช่น เรียกใช้แบบสุ่ม หรือ เรียกใช้เฉพาะมีการเรียก Label เท่านั้น

เนื้อหาของ Hello Jenkins world EP1 ก็จบลงเพียงเท่านี้ครับ หวังว่าเพื่อนๆจะได้ประโยชน์กันนะครับ แล้วพบกันได้ใน Ep ถัดๆไปครับ^^ โดยเพื่อนๆสามารถติดตามกันได้ที่ https://www.facebook.com/sirisoft แล้วพบกันใหม่เร็วๆนี้ ขอบคุณครับ 👋🏻👋🏻👋🏻

ALL EPISODE

EP1 : รู้จัก และ ติดตั้ง Jenkins Master&Agent แบบ The Flash

EP2 : รู้จัก Jenkins Jobs และ การ Triggers แบบ Automate!

EP3 : วิธีการจัดการ configuration บน Jenkins และ แนะนำ plugin ที่น่าสนใจ!

--

--