ทำ Automation ด้วย Jenkins

Prawit Tangmanopeanchai
6 min readSep 14, 2019

--

วันนี้ตั้งใจสร้าง 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

--

--

Prawit Tangmanopeanchai
Prawit Tangmanopeanchai

Written by Prawit Tangmanopeanchai

Head of Cloud Implementation Unit at gosoft (Thailand)

No responses yet