ทำ Automation ด้วย Jenkins
วันนี้ตั้งใจสร้าง jenkins server สำหรับใช้ทำ pipeline ทดสอบการทำระบบ Automation ยกตัวอย่างเช่นการทำ CI/CD
เครื่องมือที่ใช้ครั้งนี้จะประกอบด้วย
Ubuntu 18.04 LTS จาก Google Cloud Platform
Jenkins 2.176.3
JDK version 8
Github
jenkins จะเก็บ project ไว้ภายใต้ directory “/var/lib/jenkins/workspace”
ดังนั้นหากไม่ต้องการให้ข้อมูลเก็บไว้ที่นี่ควรเตรียมที่เก็บเอาไว้ตั้งแต่ต้น แล้วไปแก้ไขที่ file “/etc/default/jenkins” โดยให้แก้ไขค่า “JENKINS_HOME” เป็น directory ที่ต้องการ
ก่อนจะติดตั้ง software อะไรลงไปก็ทำการ update package กันก่อนด้วยคำสั่ง
sudo apt-get update
เนื่องจาก jenkins ทำงานโดยใช้ java ดังนั้นก็ต้องลง java กันก่อน java ที่ jenkins ยอมให้ใช้ได้ตอนนี้มีแค่ version 8 หรือ 11 เท่านั้น ส่วน 9 10 12 หมดสิทธิ์ เลยตัดสินใจเลือกเป็น version 8 ไป โดยติดตั้งโดยใช้คำสั่ง
sudo apt-get install openjdk-8-jdk
ทดสอบว่าติดตั้ง java เรียบร้อยด้วยคำสั่ง “java -version”
java -version
openjdk version “1.8.0_222”
OpenJDK Runtime Environment (build 1.8.0_222–8u222-b10–1ubuntu1~18.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
เป็นอันว่าเราลง java version 8 เรียบร้อย
จากนั้นก็ทำการ add key เพื่อใช้สำหรับติดตั้ง jenkins จาก Debian package repository
wget -q -O — https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
เสร็จแล้วให้ทำการแก้ไข file “ /etc/apt/sources.list” โดยเพิ่มบรรทัดนี้เข้าไปที่ท้ายบรรทัดของ file
deb https://pkg.jenkins.io/debian-stable binary/
จากนั้นก็ทำการ update และเริ่มติดตั้ง jenkins ได้เลย
sudo apt-get update
sudo apt-get install jenkins
หลังติดตั้งเสร็จแล้ว jenkins จะถูก start พร้อมใช้งานได้เลย โดยจะเห็นว่ามี port 8080 เปิดขึ้นมาเพื่อรอให้บริการ
prawit@jenkins-svr:~$ netstat -ntl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::8080 :::* LISTEN
ลองเปิด browser เรียกใช้งานได้เลย โดยเข้าไปที่ ip ของ server แล้วตามด้วยเลข port 8080
เจอหน้านี้ก็เข้าไปดู password ใน file “/var/lib/jenkins/secrets/initialAdminPassword” แล้วนำมาใส่ในช่อง “Administrator password” แล้วกดปุ่ม Continue
เสร็จแล้วเจอหน้านี้ก็เลือก Install suggested plugins (ขี้เกียจเลือกเอง)
เจอหน้านี้ก็ทำการสร้าง admin user ของระบบ jenkins (อย่าลืม user/password ที่ตั้งไว้ด้วยนะ) เสร็จแล้วก็กดปุ่ม Save and Continue
ตั้งชื่อ url แล้วกด Save and Finish
ถึงตรงนี้ Jenkins ก็พร้อมใช้งานแล้ว กดปุ่ม Start using Jenkins ได้เลย
อย่างที่ตั้งใจไว้ว่าอยากจะทำระบบ Automation ก็ลองเริ่มจากการทดสอบโดยตั้งโจทย์ว่าหากมีการเปลี่ยนแปลง source code ใน github แล้วจะให้ jenkins ทำอะไรซักอย่าง ถ้าเป็นพวก dev ก็อาจจะตั้งให้ jenkins ทำการ compile program ให้หลังจากที่มีการ commit code เข้าไปใน github
เริ่มจากเลือก git repo ที่จะใช้สำหรับทดสอบกันก่อน โดยครั้งนี้จะทดสอบโดยสร้าง test repo ขึ้นมาตัวนึงชื่อ “test_jenkins”
จะมี file อยู่ 2 files คือ README.md กับ hello.txt
ทำการ copy git url โดยกดปุ่ม Clone or download แล้วทำการ copy url ออกมา
https://github.com/akumo/test_jenkins.git
จากนั้นไปที่ jenkins แล้วเลือก New Item
ตั้งชื่อ project ว่า “first project” เลือก “Freestyle project” แล้วกดปุ่ม OK
เสร็จแล้วลอง click ที่ link “jenkins” จะได้หน้าจอดังนี้
จะเห็นว่ามี project ที่เราสร้างขึ้นมาแล้ว
เลือก “first project”
เนื่องจากเป็น project ที่เพิ่งสร้างขึ้นมา ตอนนี้ในช่อง Build History เลยยังไม่มีอะไร ก็ลองกด Build Now ดู
จะเห็นว่ามีการ build ครั้งที่ 1 ขึ้นมาแล้ว
คราวนี้ลองกดดู Status
จะเห็นสถานะการ build (เป็นการ build โดยที่ยังไม่มีการสั่งให้ทำอะไรเลย)
ลองกดดู console out เพื่อดูผลลัพธ์ของการ build
คราวนี้ลองกด Back to Project
แล้วเลือกไปที่ “Workspace” เพื่อดูว่าใน workspace มีอะไรอยู่บ้าง
จะพบว่าใน workspace ตอนนี้ยังไม่มี file อะไรอยู่
เราจะเริ่ม config ใน project นี้ทำการเช็ค source code ใน github โดยการกด Configure
เลือกที่ Source Code Management แล้วเลือก Git แล้วนำ git repo url ของเราใส่ในช่อง Repository URL
ส่วนช่อง Branch Specifier ในที่นี้ใส่ “*/master” เพื่อจะบอกว่าเราจะสนใจการเปลี่ยนแปลงทุก file ใน git repo นั้น เสร็จแล้วกด Save
ลองกด Build Now อีกครั้ง
จะเห็นว่ามี build ครั้งที่ 2 เกิดขึ้นมาแล้ว คราวนี้ลองกดที่ Workspace อีกครั้ง
จะเห็นว่าตอนนี้ใน workspace จะมี file ที่นำมาจาก git repo ของเรามาอยู่ใน workspace แล้ว ซึ่งก็จะเก็บไว้ใน “/var/lib/jenkins/workspace” ในเครื่อง server
แต่ตอนนี้ project ของเราหากต้องการจะให้ทำงานอะไรต้องกดที่ Build Now เท่านั้น ยังไม่ทำงานเป็นแบบ automatic คราวนี้เราจะมาทำให้ project ของเราทำงานเป็นแบบ automatic ทุกครั้งที่ source code ใน git มีการถูก commit
โดยเลือก configure
เลือกที่ Build Triggers
เราจะเลือก Poll SCM เพื่อทำการให้ตรวจจาก source code management (ในที่นี้คือ github) โดยให้ทำการตรวจทุก ๆ 1 นาที โดยทำการใส่เครื่องหมาย “*” 5 ตัวเข้าไปในช่อง input แล้วทำการ Save
คราวนี้เราก็ลองไปแก้ไข file ใน git repo ของเราแล้วทำการ commit
แก้ไข file “hello.txt” โดยใส่ “Hello World.” ลงไป
เสร็จแล้วทำการ commit
รอสักพัก (ไม่ถึง 1 นาที) ก็จะเห็นว่า jenkins เริ่มทำงานแล้ว เนื่องจาก jenkins พบว่ามี code change ใน git repo ของเรา
Build ครั้งที่ 3 เป็นการ build แบบ automatic ก็เป็นอันว่าเสร็จ
ลองเข้าไปที่ workspace แล้ว view file “hello.txt” จะพบว่าใน file มี text คำว่า “Hello World.” ที่เราทำการ commit เข้ามา
แต่นี่ก็ยังเป็นแค่ทำให้เห็นว่า jenkins มีการทำงานแบบ automatic เมื่อพบว่ามีการเปลี่ยนแปลงใน git repo เท่านั้น เรายังไม่มีการสั่งให้ jenkins ทำอะไรเลย
คราวนี้เราจะสั่งให้ jenkins มีการทำงานเมื่อพบว่ามีการเปลี่ยนแปลงใน git repo โดยที่มีเราจะทำคือ
1. ให้ jenkins ทำการ touch file ขึ้นมา 1 file มีชื่อว่า test แล้วตามด้วยค่า date
2. ให้ jenkins ทำการ cat ค่าใน file “hello.txt” ออกมา
โดยเข้าไปที่ Configure อีกครั้ง แล้วเลือกไปที่ Build
จากนั้นให้เลือก Add build step
ครั้งนี้เราจะเลือกให้ jenkins ที่งานโดยใช้คำสั่งของ linux จึงเลือกเป็น “Execute shell” แล้วใส่คำสั่งลงไป แล้วกด Save
touch test$(date +%Y%m%d)
cat hello.txt
เสร็จแล้วลองเข้าไปแก้ไข file hello.txt ใน git แล้วทำการ commit อีกครั้ง
แก้จาก “Hello World.” เป็น “Hello Akumo” แล้ว commit ซะ
จากนั้นก็รอไม่ถึงนาทีก็จะเห็นว่า jenkins เริ่มทำงานแล้ว
มาดูผลจาก console output
เข้าไปดูใน workspace ก็จะพบว่ามี file ชื่อ test ตามด้วย date ต่อท้าย ส่วนเมื่อ view file “hello.txt” ก็จะพบว่าข้อมูลใน file เปลี่ยนไปแล้ว
😄 เท่านี้ก็น่าจะพอเห็นภาพในการนำไปใช้กันแล้วนะครับ 😄
=======================================
test$(date +%Y%m%d%H%M%S)
ตัว date time ที่แสดงใน build history จะเป็น GMT+0
หากเราต้องการจะเปลี่ยนให้เป็นวัน เวลาตามประเทศไทย ให้เข้าไปแก้ไขใน file
/etc/default/jenkins
โดยให้แก้ไขค่า “JAVA_ARGS” เป็นดังนี้
JAVA_ARGS="-Djava.awt.headless=true -Duser.timezone=Asia/Bangkok"
เสร็จแล้วให้ทำการ stop / start jenkins ใหม่ก็เป็นอันเสร็จ 😃
service jenkins stop
service jenkins start