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

Narawit Rattanasuriya
Sirisoft
Published in
8 min readMay 20, 2022

จากครั้งที่แล้วที่เราได้ทำการติดตั้ง Jenkins แบบ The Flash! EP1 ไปแล้ว วันนี้เราจะมาดูในมุมของการใช้งานกันบ้างนะครับ

โดยเนื้อหาในวันนี้จะแบ่งออกเป็น 2 ช่วงคือ

  • Jenkins Jobs
  • Jobs Triggers ประเภทต่างๆ

Jobs stages

แต่ก่อนที่เราจะไปลงลึกในการสร้าง Jenkins Jobs กันในวันนี้ ผมขออธิบายก่อนว่าใน แต่ละ Jobs เราจะทำอะไรบ้างนะครับ

  1. Clone Git repository: ทำการ clone repository ที่เก็บ source code ของ Application ของเราจาก Github หรือ Gitlab
  2. Serve application: นำ application ที่ build แล้วไป serve ที่ Jenkins agent node ของเรา
  3. Test access application: ทดลองเปิด application จาก Jobs ของเราว่าสามารถใช้งานได้ไหม

ซึ่งก่อนที่เราจะสร้าง Jobs ขึ้นมา เราจะมาทำการสร้าง application ที่จะใช้ในการรัน Jobs กันก่อนครับ

pre-requisite

  • NodeJS

Jenkins Jobs

Jobs ก็คืองานที่เราต้องการจะทำ โดยจะมอบหมายให้ Jenkins เป็นคนจัดการโดยจะแบ่งออกเป็น stage แยกออกจากกัน ซึ่งใน 1 Jobs เนี่ยก็จะสามารถสร้างได้กี่ stage ก็ได้ ปัจจุบัน Jobs ที่ใช้งานกันก็จะมี 2 ประเภทนั่นก็คือ

  1. Freestyle project
  2. 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

จะเห็นว่า app ของเรารันอยู่ที่ port 3000 เรียบร้อยแล้ว

หลังจากนั้นทำการสร้าง repository และ push source code ของเราไปที่ Gitlab โดยจะได้ผลลัพธ์ดังนี้

เราจะได้ repository สำหรับให้ Jobs ของเราเรียกใช้แล้ว

เมื่อมี Project สำหรับสร้าง Job แล้วเรามาเริ่มทำความรู้จักและสร้าง Job แต่ละประเภทกันเลย

Freestyle project

คือ Jobs ที่ใช้งานง่ายมากๆเหมาะสำหรับมือใหม่ที่เพิ่งเริ่มต้นใช้งาน Jenkins โดยลักษณะการทำงานจะคล้ายกับ code block ที่ทำงานต่อกันไปเรื่อยๆ โดย 1 block ก็คือ 1 stage นั่นเอง

เริ่มต้นใช้งาน Freestyle project jobs

เข้าไปที่หน้า Dashboard และกด “new item” หลังจากนั้นกดสร้าง “Freestyle project”

เลือก freestyle Project และ ตั้งชื่อของ Jobs

Jenkins จะพาเราเข้ามายังหน้า configuration ของ jobs โดยผมจะอธิบายการตั้งค่าแบบคร่าวๆให้ฟังดังต่อไปนี้

หน้าจอการตั้งค่า Freestyle Project ในส่วนของ General setting

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

จะเห็นว่ามี error แจ้งเตือนการ authen ไม่ผ่าน

โดยก่อนที่เราจะทำการ pull code มานั้น เราต้องทำการ login git ก่อน โดยกดไปที่ ปุ่ม Add ใน Menu Credentials เพื่อสร้าง credential จาก Git username password

เลือก kind ของ credential เป็น Username and Password หรือจะใช้เป็น access token ก็ได้

หลังจากนั้นเลือก credential ที่สร้างขึ้นมา จะเห็นว่า error แจ้งเตือนได้หายไปแล้ว หลังจากนั้นกำหนด branch ที่เราต้องการใช้งาน

หลังจากเลือกใช้ credential ที่สร้างขึ้นมาแล้ว จะเห็นได้ว่า error ได้หายไปแล้ว

ต่อไปในส่วนของ Build Trigger ผมจะขอข้ามไปก่อนโดยจะมีพูดถึงใน session หลังจากที่รู้จัก Job ทุกประเภทครบแล้ว โดยผมจะมาพูดถึงการตั้งค่า Build Environment แบบคร่าวๆกันก่อนดังนี้ครับ

หน้าจอการตั้งค่า Freestyle Project ในส่วนของ Build Trigger และ 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 นั่นเอง

หน้าจอการตั้งค่า Freestyle Project ในส่วนของ Build และ Post-build Action

โดยเราจะสร้าง stage แรกขึ้นมาก่อนโดยกดที่ปุ่ม Add build step แล้วเลือก “Execute shell”

เลือก execute shell เพื่อสร้าง stage ใน job

โดยใน stage ที่เราจะสร้างนี้ก็คือ stage สำหรับการ serve app ครับ โดยจะใส่ command ขึ้นมา 2 commandโดย command แรกจะเป็นการ install dependency และ command ที่ 2 เป็นการ serve myapp ของเราขึ้นมาเป็น background service ครับ

npm install express
nohup node myapp.js &
ใส่ command ข้างต้นไว้ที่ช่อง command เพื่อกำหนดให้ stage รัน command ของเรา

ต่อมาเป็น stage ของการเรียกใช้งาน myapp ของเรา และทำการปิดการทำงานของ app หลังจากใช้งานเสร็จ

curl $HOSTNAME:3000
kill -9 $(lsof -t -i:3000)
ใส่ command ด้านบนที่ช่อง command

และใน post build หรือหลังจากการทำงานทุกครั้งเราสามารถเพิ่ม stage ให้ job ได้ เช่น ให้ไปทำ job อื่นๆต่อ หรือ ให้ update code ขึ้นไปบน git ด้วย หรือ ทำการเก็บบันทึก artifact ของ app ไว้ได้ด้วย

รายชื่อ action ที่สามารถทำได้ใน post build

กด save หลังจากตั้งค่า job เสร็จแล้ว จะกลับมาที่หน้าของ job ให้กด build now เพื่อรัน job

กดที่ปุ่ม build now ด้านซ้ายมือ

หลังจาก job ทำงานเสร็จสิ้นแล้วสามารถตรวจสอบการทำงานได้ที่ Console Output

จะเห็นว่าสถานะของ Job ทำงานสำเร็จ

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 ที่จะสร้างเป็น Pipeline

โดยการตั้งค่า pipeline job จะคล้ายๆกับการตั้งค่า freestyle project job โดยมี option ที่เพิ่มขึ้นมาดังนี้

การตั้งค่า Pipeline ในส่วนของ General setting

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 ตามนี้ครับ

สร้าง Jenkinsfile และ push ขึ้นมาที่ Git repo ของเรา
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 แบบไหน
  1. pipeline script คือ pipeline script ที่สร้างขึ้นเองจากหน้า configure ของ Jenkins
สร้าง pipeline บนหน้า configure ของ pipeline

2. Pipeline script from SCM คือ เลือกใช้งาน pipeline script โดยไปค้นหา Jenkinsfile บน Repository ที่ตั้งค่าไว้

โดยเราจะเรียกใช้งาน Pipeline script จาก SCM โดยให้เราใส่ Repository URL และกำหนด credential รวมถึง branch ที่จะใช้ในการ pull code ด้วย

กำหนด Repository , branch และ credential ที่ใช้ในการเชื่อมต่อ

ทำการกำหนด path ของ Jenkinsfile ที่อยู่ใน Repository ของเรา โดย Job จะทำการ pull code และทำการค้นหาว่ามีไฟล์ Jenkinsfile อยู่ใน Path บน Repository ของเรารึเปล่า

กำหนด path ของ Jenkinsfile บน Repository ของเรา

รัน Pipeline แล้วเข้าไปดูผลลัพธ์ที่ menu console output

Jobs Triggers ประเภทต่างๆ

ต่อมาเราจะมาพูดถึงเรื่อง Job Triggers ประเภทต่างๆกันครับ โดย Job Trigger เนี่ยคือ action ที่ทำให้ Job ของเรารันขึ้นมานั่นเอง ไม่ว่าจะเป็นแบบ Manual หรือ Auto โดยมี Job trigger ให้เราเลือกใช้งานได้หลากหลายดังนี้

  1. Manual Trigger
  2. Cron
  3. Polling SCM
  4. Trigger after other build
  5. Remote API
  6. Web hook

Manual Trigger

เป็นการ trigger แบบ default โดยเข้ามาที่หน้า jobs บน Jenkins dashboard แล้วกด “Build Now

Cron

เป็นการตั้งเวลา trigger โดยตั้งเวลาเป็นรอบๆ โดยใช้รูปแบบของ cron ในการตั้งค่า เช่น กำหนดให้มีการ trigger build job ทุกๆ 1 นาที จะตั้งค่าเป็น

รูปแบบการตั้งค่าการทำงานของ cron
*/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 เก็บไว้ก่อน

Token ที่ generate ออกมา

หลังจากนั้นให้กลับไปที่ Job ที่เราต้องการใช้งาน Trigger

นำ Token ที่สร้างไว้มาใส่ในช่อง Authentication Token แล้วทดลอง call API ตามนี้

ทดลองเรียก Remote API
Job ถูกเรียกใช้งาน

Webhook

คือ trigger ที่จะสั่งให้ Job ของเราทำงาน ก็ต่อเมื่อมีการ push code มาที่ repository ที่เราตั้งค่าไว้ โดยมี step การทำงานตามรูปด้านล่างนี้

step การทำงานของ webhook trigger

มาเริ่มทำกันเลยครับ

ก่อนอื่น เราจะต้องทำการ generate Token ขึ้นมา 2 ตัวก่อนครับ

โดย Token ตัวที่ 1 ก็คือ Token สำหรับการ authen user ก่อนที่จะเข้ามา trigger pipeline โดยเราสามารถ generate โดยกดไปที่ชื่อ User ด้านขวาบนของ Jenkins และเลือกที่ menu “configure”

ในหน้า configure ใน menu API token ให้เรากด “add new Token” แล้วกดที่ปุ่ม “generate” เพื่อสร้าง token

กดปุ่ม generate token เพื่อสร้าง token สำหรับการ authen
Token จะแสดงขึ้นมาแค่ครั้งเดียวหลังจากถูก generate หากต้องการใช้ซ้ำแยะยำให้ทำการ copy เก็บเอาไว้ครับ

และ Token ที่ 2 เป็น token เพื่อใช้สำหรับใช้เชื่อมต่อ webhook ที่ pipeline กับ Gitlab เข้าด้วยกันครับ โดยเราจะใช้ web generate token ขึ้นมา https://randomkeygen.com/

เว็บไซต์จะ random generate token ขึ้นมาครับ

หลังจากนั้นนำ token ที่ generate ได้จากเว็บมาวางไว้ที เมนู “Build Trigger” เลือกที่ “Trigger build remotely” และใส่ token ที่ได้จากเว็บลงไปครับ เพื่อตั้งค่าว่า pipeline ของเราจะถูก trigger ได้ด้วย token ที่กำหนดไว้เท่านั้นครับ

ใส่ token ในช่อง Authentication 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 อยู่แล้วให้ข้ามขั้นตอนนี้ไปได้เลยครับ****

  1. สมัครสมาชิก ngrok https://dashboard.ngrok.com/signup
  2. ติดตั้ง ngrok ได้ที่ link นี้ https://ngrok.com/download
  3. หลังจากนั้นเข้าไปยัง link https://dashboard.ngrok.com/get-started/your-authtoken และ copy command ไปรันบน terminal ของเครื่องที่รัน Jenkins อยู่
  4. รัน command “ngrok http 8080” เพื่อทำการ serve Jenkins ของเราไปให้มี Public URL
ไปขั้นตอนที่ 3 หน้าเว็บจะมี command สำหรับ add token ที่ใช้สำหรับ serve application มาให้
หลังจากรัน command “ngrok http 8080” จะได้ public URL คือ “https://cac8-49-231-211-158.ap.ngrok.io

โดยหลังจากนำ token และ URL มารวมกันจะได้หน้าตาแบบนี้ครับ

https://jenkins:11d52005be57a9ea9e70bdebe03edec74f@cac8-49-231-211-158.ap.ngrok.io/job/pipeline-jobs/build?token=YJ16M6ut5h

หลังจากนั้นไปที่ Repository ของเราบน Gitlab และเข้าไปที่ menu “SettingsWebhooks

กดที่ menu “settings → webhooks”

เราจะเข้ามาที่หน้า setting webhook บน Repo ของเรา ให้นำ URL ด้านบนมาใส่ และทำการกำหนด trigger ว่าจะใช้แบบไหน โดยเราจะเลือกใช้เป็น Push events เพื่อทำการทดสอบนะครับ เสร็จแล้วกด Add Webhook ได้เลย

ใส่ URL ที่ใช้ trigger webhook

เรามาลองทดสอบด้วยการเปลี่ยนแปลง script ใน source code แล้ว push ขึ้นมาบน git กันครับ

เปลี่ยนแปลงข้อมูลของ app เรา แล้ว push ขึ้นมาบน Gitlab

กลับมาที่หน้า Pipeline บน Jenkins ของเราจะพบว่า Pipeline ถูกเรียกใช้งานแล้ว

Pipeline ที่ถูกเรียกใช้งานผ่าน Webhook

สรุป

  • 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 นะครับ สวัสดีครับ :)

--

--