Hello Jenkins world EP1 รู้จัก และ ติดตั้ง Jenkins Master & Agent แบบ The Flash
ย้อนกลับไปเมื่อ 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 แบบ คือ
- ติดตั้งผ่าน Homebrew
- ติดตั้งผ่าน Docker
ติดตั้ง Jenkins ด้วย Homebrew บน Mac
Pre-requisite
- Homebrew
- เครื่อง MAC
ขั้นแรกเข้าไปที่ Terminal บนเครื่อง Mac ของเราแล้วพิมพ์ Command นี้ครับ
brew install jenkins-lts
brew services start jenkins-lts
จะเห็นได้ว่าจาก console log ของการ install จะมีการติดตั้ง dependency ที่จำเป็นให้กับ Jenkins ให้เราด้วยเลยนั่นก็คือ OpenJDK นั่นเองครับ
จากนั้นทดลองเข้าไปที่ localhost:8080 หน้าจอจะแสดงตำแหน่งของ token ที่ใช้ในการ unlock Jenkins โดยให้เราใช้ command ข้างล่างเพื่อดู token
Cat /Users/[USERNAME]/.jenkins/secrets/initialAdminPassword
ใส่ token ที่ได้จาก command หลักจากนั้น Jenkins จะให้เราเลือกว่าจะติดตั้ง recommend plugin หรือ custom เองโดยเราจะเลือกเป็น recommend ก่อนนะครับ โดย plugin ตัวอื่นๆเราค่อยไปติดตั้งทีหลังเอา
หลังจากนั้น Jenkins จะติดตั้ง plugin ให้เรารอประมาณ 3–5 นาที
ติดตั้งเสร็จเรียบร้อย
ติดตั้ง Jenkins ด้วย Docker
Pre-requisite
- docker
ขั้นตอนแรกทำการ pull image Jenkins จาก dockerhub
docker pull jenkins/jenkins:lts-jdk11
รัน 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
และเข้าใช้งานได้ที่ localhost:8081 โดยเราจะเจอหน้าให้ unlock Jenkins เหมือนกับการ install ด้วย homebrew
ซึ่งในการดูข้อมูลรหัสผ่านที่ใช้ในการ unlock Jenkins ได้เราต้องทำการเข้าไปยัง Jenkins container ก่อนด้วย command
docker exec -it jenkins /bin/sh
cat /var/jenkins_home/secrets/initialAdminPassword
หลังจากนั้นขั้นตอนการ 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” ซึ่งจะเป็นวิธีที่เราเลือกใช้ในวันนี้ครับ
ขั้นตอนแรกให้เรา generate private key และ public key ด้วย command นี้บน terminal ของเครื่อง Master กันก่อนนะครับ
ssh-keygen -f ~/.ssh/jenkins_agent_key
โดยเราจะได้ไฟล์ออกมา 2 ไฟล์คือ public key และ private key โดยสามารถดู content ของไฟล์ได้ด้วย command นี้
cat ~/.ssh/jenkins_agent_key
cat ~/.ssh/jenkins_agent_key.pub
หลังจากนั้นให้ไปที่ menu “Manage Jenkins → Manage Credentials → add credential” เพื่อทำการสร้าง credential จาก key ที่เรา generate ไว้เมื่อขั้นตอนที่แล้ว
ต่อมาทำการตั้งค่า credential ดังนี้
- เลือกประเภทของ credential เป็น “SSH Username with private key”
- กำหนด ID ของ credential เป็น agent-key
- กำหนด Username เป็น username ของเครื่อง Master
- เลือกการใส่ key เป็น Enter directly โดยนำข้อมูลของไฟล์ private ที่อยู่ใน path ~/.ssh/jenkins_agent_key มาใส่
หลังจากนั้นเราจะทำการสร้าง 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
หลังจากนั้นให้เราไปที่หน้า dashboard ของ Master Node บนเครื่อง MAC แล้วเข้าไปที่ Menu “Manage Jenkins → Manage Node and Clouds → New Node”
ทำการตั้งชื่อของ agent และกด Create
หลังจากนั้นเราจะเข้ามาสู่หน้าตั้งค่า 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 ของเราแสดงข้อมูลของ agent ออกมา ซึ่งหมายความว่าเราสามารถใช้งาน agent เครื่องนี้ได้แล้วนั่นเอง
ขั้นตอนต่อมาเราจะทำการทดสอบการใช้งาน agent บน job กันครับ โดยเราจะสร้าง pipeline ขึ้นมา 1 pipeline ครับ
หลังจากนั้นให้เรา 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 } } } }}
หลังจากนั้นกด save และไปยังหน้าของ Jobs และกดปุ่ม Build Now
หลังจากนั้นเข้ามาดู console output
จะเห็นได้ว่า 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 ที่น่าสนใจ!