Hello Jenkins world EP2 รู้จัก Jenkins Jobs และ การ Triggers แบบ Automate!
จากครั้งที่แล้วที่เราได้ทำการติดตั้ง Jenkins แบบ The Flash! EP1 ไปแล้ว วันนี้เราจะมาดูในมุมของการใช้งานกันบ้างนะครับ
โดยเนื้อหาในวันนี้จะแบ่งออกเป็น 2 ช่วงคือ
- Jenkins Jobs
- Jobs Triggers ประเภทต่างๆ
Jobs stages
แต่ก่อนที่เราจะไปลงลึกในการสร้าง Jenkins Jobs กันในวันนี้ ผมขออธิบายก่อนว่าใน แต่ละ Jobs เราจะทำอะไรบ้างนะครับ
- Clone Git repository: ทำการ clone repository ที่เก็บ source code ของ Application ของเราจาก Github หรือ Gitlab
- Serve application: นำ application ที่ build แล้วไป serve ที่ Jenkins agent node ของเรา
- Test access application: ทดลองเปิด application จาก Jobs ของเราว่าสามารถใช้งานได้ไหม
ซึ่งก่อนที่เราจะสร้าง Jobs ขึ้นมา เราจะมาทำการสร้าง application ที่จะใช้ในการรัน Jobs กันก่อนครับ
pre-requisite
- NodeJS
Jenkins Jobs
Jobs ก็คืองานที่เราต้องการจะทำ โดยจะมอบหมายให้ Jenkins เป็นคนจัดการโดยจะแบ่งออกเป็น stage แยกออกจากกัน ซึ่งใน 1 Jobs เนี่ยก็จะสามารถสร้างได้กี่ stage ก็ได้ ปัจจุบัน Jobs ที่ใช้งานกันก็จะมี 2 ประเภทนั่นก็คือ
- Freestyle project
- Pipeline
สร้าง Application ด้วย NodeJS
ใช้ command ในการสร้าง NodeJs Application
mkdir myapp //สร้าง folder myapp สำหรับเก็บ applicationcd myapp //เข้าไปที่ folder myappnpm install express // install express module สำหรับสร้าง app nodejs
สร้างไฟล์ myapp.js ด้วย vi (หรือใช้ Code editor ตัวอื่นที่ถนัดได้เลยครับ)
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
node myapp.js
หลังจากนั้นทำการสร้าง repository และ push source code ของเราไปที่ Gitlab โดยจะได้ผลลัพธ์ดังนี้
เมื่อมี Project สำหรับสร้าง Job แล้วเรามาเริ่มทำความรู้จักและสร้าง Job แต่ละประเภทกันเลย
Freestyle project
คือ Jobs ที่ใช้งานง่ายมากๆเหมาะสำหรับมือใหม่ที่เพิ่งเริ่มต้นใช้งาน Jenkins โดยลักษณะการทำงานจะคล้ายกับ code block ที่ทำงานต่อกันไปเรื่อยๆ โดย 1 block ก็คือ 1 stage นั่นเอง
เริ่มต้นใช้งาน Freestyle project jobs
เข้าไปที่หน้า Dashboard และกด “new item” หลังจากนั้นกดสร้าง “Freestyle project”
Jenkins จะพาเราเข้ามายังหน้า configuration ของ jobs โดยผมจะอธิบายการตั้งค่าแบบคร่าวๆให้ฟังดังต่อไปนี้
Discard old builds : เป็นการตั้งค่าการเก็บ history build เก่าของ Jobโดยสามารถตั้งค่าได้การลบ build ได้ 2 แบบคือ 1.ลบ build หากเกินจำนวนวันที่กำหนด 2.ลบ build หากจำนวน build เกินกว่าจำนวนที่กำหนด
GitHub project: เป็นการกำหนด Github Project ที่จะใช้ใน Job
This build requires lockable resources: กำหนดให้มีการ lock resource สำหรับ Jobs นี้ โดยหาก Jobs นี้มีการใช้งานอยู่ build อื่นจะต้องเข้าคิวรอจนกว่า jobs นี้จะทำงานเสร็จ
This project is parameterized: สร้างตัวแปรสำหรับให้ผู้ใช้งานสามารถกำหนดค่าได้ก่อนที่จะ build job
Throttle builds:
Disable this project: ปิดการใช้งาน Job โดยหลังจาก disable แล้วจะไม่สามารถกด build ได้
Execute concurrent builds if necessary: ตั้งค่าให้สามารถทำ concurrent build ได้
Restrict where this project can be run: เลือก agent ที่จะใช้ในการ run job นี้
ต่อมาเราจะทำการ config Source Code Management หรือก็คือ setting ว่าจะทำการ pull source code จาก repository ไหนมาสร้าง Job
โดยก่อนที่เราจะทำการ pull code มานั้น เราต้องทำการ login git ก่อน โดยกดไปที่ ปุ่ม Add ใน Menu Credentials เพื่อสร้าง credential จาก Git username password
หลังจากนั้นเลือก credential ที่สร้างขึ้นมา จะเห็นว่า error แจ้งเตือนได้หายไปแล้ว หลังจากนั้นกำหนด branch ที่เราต้องการใช้งาน
ต่อไปในส่วนของ Build Trigger ผมจะขอข้ามไปก่อนโดยจะมีพูดถึงใน session หลังจากที่รู้จัก Job ทุกประเภทครบแล้ว โดยผมจะมาพูดถึงการตั้งค่า Build Environment แบบคร่าวๆกันก่อนดังนี้ครับ
Delete workspace before build starts: ทำการ clear workspace ก่อน build job
Use secret text(s) or file(s): ทำการ binding ตัวแปรจากไฟล์ หรือ text เข้ากับตัวแปรที่สร้างขึ้นมาใหม่ โดยค่าเหล่านั้น จะไม่แสดงข้อมูลออกมายัง console output เช่น binding pasword ของ app เข้ากับตัวแปร “mypassword” โดยหากจะเรียกใช้งานก็สามารถเรียกใช้งานจากตัวแปร “mypassword” ได้
Abort the build if it’s stuck: ตั้งค่าเวลาในการ abort build โดยหาก job ใช้เวลาทำงานเกินเวลาที่กำหนดจะ abort build ทิ้ง
Add timestamps to the Console Output: แสดง timestamp ของ build ที่ console output ด้วย
ต่อมาเป็น step Build และ Post-build Action หรือก็คือ สร้าง stage การทำงานของ Job นั่นเอง
โดยเราจะสร้าง stage แรกขึ้นมาก่อนโดยกดที่ปุ่ม Add build step แล้วเลือก “Execute shell”
โดยใน stage ที่เราจะสร้างนี้ก็คือ stage สำหรับการ serve app ครับ โดยจะใส่ command ขึ้นมา 2 commandโดย command แรกจะเป็นการ install dependency และ command ที่ 2 เป็นการ serve myapp ของเราขึ้นมาเป็น background service ครับ
npm install express
nohup node myapp.js &
ต่อมาเป็น stage ของการเรียกใช้งาน myapp ของเรา และทำการปิดการทำงานของ app หลังจากใช้งานเสร็จ
curl $HOSTNAME:3000
kill -9 $(lsof -t -i:3000)
และใน post build หรือหลังจากการทำงานทุกครั้งเราสามารถเพิ่ม stage ให้ job ได้ เช่น ให้ไปทำ job อื่นๆต่อ หรือ ให้ update code ขึ้นไปบน git ด้วย หรือ ทำการเก็บบันทึก artifact ของ app ไว้ได้ด้วย
กด save หลังจากตั้งค่า job เสร็จแล้ว จะกลับมาที่หน้าของ job ให้กด build now เพื่อรัน job
หลังจาก job ทำงานเสร็จสิ้นแล้วสามารถตรวจสอบการทำงานได้ที่ Console Output
Pipeline
คือ Jobs ที่ใช้ groovy script ในการเขียนไฟล์ jenkinsfile หรือก็คือไฟล์สำหรับเก็บ Pipeline ขึ้นมา โดยไฟล์ pipeline จะประกอบไปด้วย syntax ดังนี้
pipeline { agent any //กำหนด agent ที่จะใช้รัน pipeline stages {
stage('Hello') { //ตั้งชื่อ stage
steps { //กำหนด steps ในการทำงาน
echo 'Hello World' //คำสั่งต่างๆที่ทำงานใน steps
}
}
}
}
เริ่มต้นใช้งาน pipeline
เข้าไปที่หน้า Dashboard และกด “new item” หลังจากนั้นกดสร้าง “Pipeline”
โดยการตั้งค่า pipeline job จะคล้ายๆกับการตั้งค่า freestyle project job โดยมี option ที่เพิ่มขึ้นมาดังนี้
Do not allow the pipeline to resume if the controller restart: ตั้งค่า pipeline ไม่ให้ทำการ resume หากมีการ restart Jenkins
Pipeline speed/durability override: ตั้งค่าความเร็วในการ build ของ pipeline โดยสามารถตั้งค่าให้ทำการ build เร็วขึ้นได้แต่จะไม่มีการบันทึกข้อมูลสำรองในการ build ไว้
preserve stashes from completed builds: ตั้งค่าให้เก็บข้อมูล stash หรือ ข้อมูลไฟล์ในการ build jobs ที่สำเร็จไว้ด้วย
หลังจากนั้นทำการสร้าง Jenkinsfile ที่ repository ของ myapp ตามนี้ครับ
pipeline { environment{ hostname = "localhost" } agent any stages { stage('Serve application') { steps { sh "npm install express" sh "node myapp.js&" } } stage('Test access application') { steps { sh "curl ${hostname}:3000" sh "kill -9 \$(lsof -t -i:3000)" } } }}
กลับมาที่หน้า settings ของ Pipeline โดย Job ประเภท Pipeline เราสามารถเลือกใช้งาน script ได้ 2 ประเภทคือ
- pipeline script คือ pipeline script ที่สร้างขึ้นเองจากหน้า configure ของ Jenkins
2. Pipeline script from SCM คือ เลือกใช้งาน pipeline script โดยไปค้นหา Jenkinsfile บน Repository ที่ตั้งค่าไว้
โดยเราจะเรียกใช้งาน Pipeline script จาก SCM โดยให้เราใส่ Repository URL และกำหนด credential รวมถึง branch ที่จะใช้ในการ pull code ด้วย
ทำการกำหนด path ของ Jenkinsfile ที่อยู่ใน Repository ของเรา โดย Job จะทำการ pull code และทำการค้นหาว่ามีไฟล์ Jenkinsfile อยู่ใน Path บน Repository ของเรารึเปล่า
รัน Pipeline แล้วเข้าไปดูผลลัพธ์ที่ menu console output
Jobs Triggers ประเภทต่างๆ
ต่อมาเราจะมาพูดถึงเรื่อง Job Triggers ประเภทต่างๆกันครับ โดย Job Trigger เนี่ยคือ action ที่ทำให้ Job ของเรารันขึ้นมานั่นเอง ไม่ว่าจะเป็นแบบ Manual หรือ Auto โดยมี Job trigger ให้เราเลือกใช้งานได้หลากหลายดังนี้
- Manual Trigger
- Cron
- Polling SCM
- Trigger after other build
- Remote API
- Web hook
Manual Trigger
เป็นการ trigger แบบ default โดยเข้ามาที่หน้า jobs บน Jenkins dashboard แล้วกด “Build Now”
Cron
เป็นการตั้งเวลา trigger โดยตั้งเวลาเป็นรอบๆ โดยใช้รูปแบบของ cron ในการตั้งค่า เช่น กำหนดให้มีการ trigger build job ทุกๆ 1 นาที จะตั้งค่าเป็น
*/1 * * * * //ตั้งค่าให้มีการ trigger job ทุก 1 นาทีH * * * * //ตั้งค่าให้มีการ trigger job ทุก 1 ชั่วโมง
Polling SCM
เป็นการตั้งเวลา trigger โดยตั้งเวลาไปคอยตรวจสอบการเปลี่ยนแปลงบน Git Repository ของเราเป็นรอบๆ โดยหากมีการเปลี่ยนแปลงของ Repository จะทำการ Trigger Jobs โดยใช้รูปแบบของ cron เหมือนกับรูปแบบก่อนหน้านี้ในการตั้งค่า
Trigger after other build
เป็นการกำหนดให้ทำการ Trigger Job หลังจากที่ Build อื่นทำงานเสร็จสิ้น ส่วนใหญ่จะใช้ในกรณีที่ app 2 app มีความเกี่ยวข้องกัน
Remote API
เป็นการ trigger ผ่านการ call API โดยก่อนที่จะทำการใช้งาน trigger ประเภทนี้ จะต้องทำการสร้าง Token ของ Jenkins ก่อนแล้วจึงนำไปใช้ร่วมกับ Remote API ของ Build นั้นๆ โดยการสร้าง Token ให้เราไปที่ Menu “Configure” จาก Tab ด้านบนของ Jenkins
หลังจากนั้นกดที่ปุ่ม Add new Token เพื่อทำการ generate Token ขึ้นมา แล้วทำการ copy Token เก็บไว้ก่อน
หลังจากนั้นให้กลับไปที่ Job ที่เราต้องการใช้งาน Trigger
นำ Token ที่สร้างไว้มาใส่ในช่อง Authentication Token แล้วทดลอง call API ตามนี้
Webhook
คือ trigger ที่จะสั่งให้ Job ของเราทำงาน ก็ต่อเมื่อมีการ push code มาที่ repository ที่เราตั้งค่าไว้ โดยมี step การทำงานตามรูปด้านล่างนี้
มาเริ่มทำกันเลยครับ
ก่อนอื่น เราจะต้องทำการ generate Token ขึ้นมา 2 ตัวก่อนครับ
โดย Token ตัวที่ 1 ก็คือ Token สำหรับการ authen user ก่อนที่จะเข้ามา trigger pipeline โดยเราสามารถ generate โดยกดไปที่ชื่อ User ด้านขวาบนของ Jenkins และเลือกที่ menu “configure”
ในหน้า configure ใน menu API token ให้เรากด “add new Token” แล้วกดที่ปุ่ม “generate” เพื่อสร้าง token
และ Token ที่ 2 เป็น token เพื่อใช้สำหรับใช้เชื่อมต่อ webhook ที่ pipeline กับ Gitlab เข้าด้วยกันครับ โดยเราจะใช้ web generate token ขึ้นมา https://randomkeygen.com/
หลังจากนั้นนำ token ที่ generate ได้จากเว็บมาวางไว้ที เมนู “Build Trigger” เลือกที่ “Trigger build remotely” และใส่ token ที่ได้จากเว็บลงไปครับ เพื่อตั้งค่าว่า pipeline ของเราจะถูก trigger ได้ด้วย token ที่กำหนดไว้เท่านั้นครับ
หลังจากที่เราติดตั้ง token ที่ pipeline แล้วเราสามารถเรียกใช้งาน Pipeline ได้ผ่าน URL รูปแบบนี้เลยครับ
http://[username]:[token1]@[jenkins_URL]/job/pipeline-jobs/build?token=[token2]
ซึ่งตอนนี้ webhook trigger จะยังไม่รู้จัก jenkins_URL ของเราเนื่องจากเราติดตั้ง Jenkins ไว้ที่เครื่องส่วนตัวของเราเองโดยเราจะแก้ไขปัญหาโดยการ serve jenkins ของเราให้เป็น public URL ก่อน เพื่อให้ Gitlab สามารถส่ง event ไป trigger ยัง pipleine ได้ด้วย ngrok โดยทำตามขั้นตอนดังนี้ครับ
****หาก Jenkins ของเรามี public IP อยู่แล้วให้ข้ามขั้นตอนนี้ไปได้เลยครับ****
- สมัครสมาชิก ngrok https://dashboard.ngrok.com/signup
- ติดตั้ง ngrok ได้ที่ link นี้ https://ngrok.com/download
- หลังจากนั้นเข้าไปยัง link https://dashboard.ngrok.com/get-started/your-authtoken และ copy command ไปรันบน terminal ของเครื่องที่รัน Jenkins อยู่
- รัน command “
ngrok http 8080
” เพื่อทำการ serve Jenkins ของเราไปให้มี Public URL
โดยหลังจากนำ token และ URL มารวมกันจะได้หน้าตาแบบนี้ครับ
หลังจากนั้นไปที่ Repository ของเราบน Gitlab และเข้าไปที่ menu “Settings → Webhooks”
เราจะเข้ามาที่หน้า setting webhook บน Repo ของเรา ให้นำ URL ด้านบนมาใส่ และทำการกำหนด trigger ว่าจะใช้แบบไหน โดยเราจะเลือกใช้เป็น Push events เพื่อทำการทดสอบนะครับ เสร็จแล้วกด Add Webhook ได้เลย
เรามาลองทดสอบด้วยการเปลี่ยนแปลง script ใน source code แล้ว push ขึ้นมาบน git กันครับ
กลับมาที่หน้า Pipeline บน Jenkins ของเราจะพบว่า Pipeline ถูกเรียกใช้งานแล้ว
สรุป
- Job คือ การสร้าง script automation เพื่อทำงานอย่างใดอย่างหนึ่งบน Jenkins
- Job จะมี stage ย่อยอยู่ข้างใน Job อีกทีหนึ่ง โดยในแต่ละ stage ก็จะมีการทำงานที่ต่างกัน
- Job ประเภท Pipeline จะต้องใช้ JenkinsFile ที่เขียนด้วย groovy script
- Jobs trigger แบบ Auto มี 5 ประเภทคือ Cron, Polling SCM, Trigger after other build, Remote API, Webhook
- การใช้งาน Webhook Trigger กับ Gitlab public จะต้องมี Public URL ของ Jenkins
ก็จบไปอีกแล้วนะครับ สำหรับเนื้อหาของ Hello Jenkins world EP2 หวังว่าทุกคนจะได้ประโยชน์และสามารถนำไปใช้งานกันได้นะครับ สำหรับใครที่ยังไม่ได้อ่าน EP1 สามารถกลับไปอ่านได้ที่นี่เลย
EP1: Hello Jenkins world รู้จัก และ ติดตั้ง Jenkins Master & Agent แบบ The Flash
แล้วพบกันได้ใน Ep ถัดๆไปได้ที่ https://www.facebook.com/sirisoft นะครับ สวัสดีครับ :)