Pipeline as Code กับ Jenkins

Pipeline as Code คือการที่เราเขียนโค้ดเพื่อสร้างขั้นตอนของการ delivery/deployment แทนที่เราจะมานั่งปรับแต่งเครื่องมือที่ใช้ทำ continuous integration and continuous delivery/deployment (CI/CD) อย่างตัวที่เรารู้จักกันดี เช่น Jenkins เป็นต้น

Pipeline คือ?

แปลตรงตัวเลยมันก็คือท่อนั่นเอง (รูป 1) ไม่ว่าจะเป็นท่อส่งแก๊สหรือส่งน้ำ แก๊สหรือน้ำก็จะถูกลำเลียงจากต้นทางไปยังปลายทางตามท่อที่วางไว้ ถ้ามาพูดถึงเรื่องซอฟต์แวร์ก็จะประมาณว่าเราได้ออกแบบขั้นตอนการทำงานเอาไว้เป็นลำดับ แล้วก็ให้เครื่องมือของเราทำตามลำดับที่เราตั้งเอาไว้

Pipeline

รูปที่ 1: ท่อส่งแก๊สและน้ำมันจากเว็บ Sulzer

 

ลองนึกถึง checklist ที่เราทำๆ กัน ปกติเราก็จะทำไปทีละงาน เสร็จไปเป็นงานๆ ไป จนครบทุกงานใน checklist นั้นๆ ทีนี้เราแค่ปรับ checklist นั้นมาให้เป็นท่อ แล้วก็ automate มันซะ! โดยงานแต่ละงานจะทำต่อกันไปเรื่อยๆ เช่น A -> B -> C ถ้างาน A ยังไม่เสร็จก็จะไม่ทำงาน B ต่อ หรือถ้างาน B เกิดพังขึ้นมา งาน C ก็จะไม่ทำต่อ

ประโยชน์อีกอย่างคือมัน transparent เราสามารถดูได้ว่างานที่เราสั่งให้เครื่องทำไปถึงไหนแล้ว มีข้อผิดพลาดตรงไหน เมื่อไหร่โค้ดเราจะขึ้น production อะไรแบบนี้

เป็น Code มีข้อดี?

เนื่องจากมันเป็นโค้ด เราสามารถใส่ในระบบ version control เช่น Git ของเราได้ แล้วก็สะดวกมากเวลาที่เราอยากจะแชร์ให้กับคนอื่นๆ หรือให้คนภายในทีมมีส่วนร่วมในการสร้างขึ้นมันมาก็ได้ อาจจะดูเป็นเรื่องเล็กๆ แต่เรื่องแบบนี้สำคัญมากนะเวลาทำงานเป็นทีม

ทำ Pipeline as Code กับ Jenkins

ติดตั้ง Jenkins

เพื่อความง่ายเราจะใช้ Jenkins Docker Image กันนะครับ 😀 สั่ง

$ docker run --name myjenkins -p 8080:8080 -p 50000:50000 -v $(pwd)/jenkins_home:/var/jenkins_home jenkins:2.46.1

ในที่นี้ใช้ Jenkins เวอร์ชั่น 2.46.1 ส่วนคำสั่งด้านบนนี่เอามาจากเอกสารของ Jenkins Docker Image นะครับ พอสั่งเสร็จแล้วเข้า localhost:8080 จะได้หน้า Unlock Jenkins ตามรูปที่ 3

Unlock Jenkins

รูปที่ 3: Unlock Jenkins

 

ตรงนี้เราต้องกรอก password เริ่มต้นก่อน ซึ่งกรอกแค่ครั้งแรกครั้งเดียว หลังจากที่กรอกแล้วจะไปหน้าติดตั้งปลั๊กอินตามรูปที่ 4 ครับ

Customize Jenkins

รูปที่ 4: Customize Jenkins

 

เราสามารถเลือก "Install suggested plugins" ไปได้เลยครับ หรือถ้าใครอยากเลือกปลั๊กอินเองก็ได้เช่นกัน ปลั๊กอินที่จำเป็นที่ต้องใช้คือ Pipeline แล้วก็พวก Git กับ GitHub ครับ จากนั้นก็รอจนกว่าจะติดตั้งเสร็จ (รูปที่ 5)

Start Jenkins

รูปที่ 5: Start Jenkins

 

หลังจากติดตั้งเสร็จเราก็จะได้สร้าง admin user ครับ (รูป 6)

Create Admin User

รูปที่ 6: Create Admin User

 

ติดตั้ง Jenkins เสร็จแล้วเรียบร้อย พร้อมใช้งานครับ (รูป 7 และรูป 8)

Jenkins is Ready!

รูปที่ 7: Jenkins is Ready!

 

Welcome to Jenkins

รูปที่ 8: Welcome to Jenkins

 

สร้าง Job ใหม่แบบ Pipeline

เราจะเริ่มสร้างกัน กด "create new jobs" แล้วเลือกพร้อมตั้งชื่อตามรูป 9

Create New Pipeline

รูปที่ 9: Create New Pipeline

 

เลื่อนลงมาด้านล่างในส่วนของ Pipeline เราสามารถเลือกแบบ Pipeline script ได้เพื่อเขียนโค้ดสร้างสำหรับแสดงคำว่า "Hello" กับ "World!" ตรงนี้จะเป็นภาษา Groovy ครับ (ดูตัวอย่างต่างๆ ได้ที่นี่) เราจะเขียนโค้ดตามนี้ลงไป

node {
    stage("stage 1") {
        echo "Hello"
    }
    stage("stage 2") {
        echo "World!"
    }
}

โค้ดด้านบนนี้เราจะประกาศ node (ตอนนี้ใช้คำว่า pipeline) และด้านใน node จะมี stage หลายๆ stage ทำงานต่อๆ กันไปเรื่อยๆ ดูรายละเอียดเพิ่มเติมได้ที่หน้า Syntax ครับ ส่วนตอนนี้เราควรจะได้เหมือนรูปที่ 10

Try Hello World Pipeline

รูปที่ 10: Try Hello World Pipeline

 

ให้ Save แล้วลองกด "Build Now" ดูครับ ถ้าทำตามมาถึงจุดนี้หน้าจะได้ตามรูป 11 เนอะ

Build Successfully in Pipeline

รูปที่ 11: Build Successfully

 

เราสามารถดู logs ของแต่ละ stage ได้ครับ ถ้าเราเอาเม้าส์ไปวางบนพื้นที่สีเขียวของแต่ละ stage มันจะมีปุ่ม Logs ขึ้นมาให้เรากด แล้วเราจะดูได้ว่า stage นั้นทำอะไรลงไป ตามรูป 12 ครับ

See Logs in Stage 2

รูปที่ 12: See Logs in Stage 2

 

เสร็จแล้ว! ทีนี้ถ้าเราอยากจะ automate อะไร เราก็ไปใส่ไว้ใน Pipeline script ได้เลย ไม่เหมือนเมื่อก่อนที่เราต้องมาสร้าง job กันเยอะ แล้วก็เอา job เหล่านั้นมาเชื่อมต่อกันเอง

ใช้ Jenkinsfile และเชื่อมต่อกับ GitHub

แน่นอนว่าเราต้องไปสร้าง repository ที่ GitHub ก่อนเนอะ บทความนี้จะใช้ที่ Pipeline as Code with Jenkins นะครับ ให้เราสร้าง Jenkinsfile ไว้ที่ root ของ repository นี้ เสร็จแล้วก็เอาโค้ดของเราที่ทำไว้ในหัวข้อที่แล้วแปะลงไปในไฟล์นั้น แล้วก็ push เข้า GitHub ไป ทีนี้ก็กลับมาที่ Jenkins ของเราครับ กดที่ "Configure" แล้วก็ปรับให้เป็นไปตามรูปที่ 13

Use Jenkinsfile from SCM

รูปที่ 13: Use Jenkinsfile from SCM

 

เสร็จแล้วให้ Save แล้วลอง Build Now อีกครั้งครับ ควรจะได้ผลเหมือนกับตอนแรกเป๊ะๆ 🙂 ตรงจุดนี้มันจะไปอ่านจาก Jenkinsfile ที่เราเอาเข้า GitHub ไว้ครับ ^^ ทีนี้ใครอยากจะมาแก้ก็แก้ได้ล่ะ

FizzBuzz?

มาถึงตรงนี้อยากฝากให้เป็นการบ้าน ลองแก้ stage 1 ให้เป็นการรันชุดทดสอบ (unit tests) และ stage 2 เป็นการ echo คำว่า "Complete!" ดู ได้ผลอย่างไรแล้วคอมเม้นต์อวดกันมาได้เลย ^^


Kan Ouivirach

Kan Ouivirach

Lead Software Architect

Being interested in Agile software development, I joined an Agile team at Pronto Tools as a Research & Development Architect (as Lead Software Architect now). I am an enthusiastic architect who not only has a scientific mindset, but also a practical approach to software solutions.