มาทำความรู้จักกับ Jenkins X กันหน่อย
ซึ่งเป็น project ใหม่ที่ทาง cloudbees เป็นหัวหน้าทีมพัฒนา
มีเป้าหมายเพื่อช่วยให้การทำ Continuous Delivery และใช้งาน Kubernestes ง่ายขึ้น
หรือเป็น Automated pipeline บน Kubernetes นั่นเอง
ดังนั้นมาทำความรู้จักและใช้งานกันหน่อย

ปล.
project นี้ยังอยู่ในช่วงเริ่มต้นเท่านั้น
project นี้ไม่ได้มาแทนที่ Jenkins
แต่เข้ามาช่วยให้การทำงานกับ container และ cloud ง่ายและสะดวกขึ้น
โดยไปดู Roadmap เพิ่มได้

ถ้าถามว่า Jenkins X คืออะไร

ตอบสั้น ๆ ว่า CI/CD platform สำหรับ Kubernetes นั่นเอง
เป็น sub-project ของ Jenkins

Jenkins X นั้นถูกออกแบบด้วยเป้าหมายตาม DevOps เลย นั่นคือ

  • Time to market ที่เร็วกว่า
  • ปรับปรุงการ deploy ให้บ่อยขึ้น
  • ช่วยทำให้เวลาในการแก้ไขสั้นลง
  • ลดจำนวนข้อผิดพลาดของการ release ระบบลง
  • ค่า Mean Time To Recovery ให้เร็วขึ้น

สถาปัตยกรรมของ Jenkins X เป็นอย่างไร ?

แสดงตามรูปแลย

มี component ที่สำคัญดังนี้

  • Kubernetes และ Docker โดยที่หัวใจคือ Kubernetes ซึ่ง Cloud provider หลัก ๆ สนับสนุนอยู่แล้วทั้ง Google Azure และ AWS
  • ใช้ Helm (Kubernetes Package Manager) กับ Draft ในการจัดการ configuration ของระบบงาน เนื่องจากการใช้งานผ่าน kubectl และ YAML ตรง ๆ ของ Kubernetes นั้นมีความซับซ้อนและเกิด human error ได้ง่าย
  • Jenkins X ถูกออกแบบมาเพื่อการทำงานที่มีหลาย ๆ ทีม รวมถึง microservices อีกด้วย
  • จัดการ versioning, สร้าง change log ให้แบบอัตโนมัติ

มาดูความสามารถของ Jenkins X กันบ้าง

  • มี command line ให้ใช้งาน ทั้งการสร้าง cluster, project, จัดการ environment และการ deploy
  • มี pipeline ให้ใช้งานโดย default อยู่แล้ว (Build -> Test -> Packaging -> Deploy)
  • สามารถจัดการ environment ได้ง่าย ๆ ซึ่งสามารถใช้ชื่อ Testing, Staging และ Production ได้เลย ทำให้ง่ายขึ้นไปอีก
  • สามารถทำการ promote version ของ application ไปยัง environment ต่าง ๆ ได้เลย แสดงดังรูป

  • Preview environment ใน pull request แต่ละตัวนั้น สามารถสร้าง environment ขึ้นมาเพื่อทดสอบ ก่อนจะ merge มายัง branch หลัก ซึ่งช่วยลดปัญหาต่าง ๆ ลงไปได้มาก
  • มีระบบ Addon ให้ใช้งาน นั่นคือสามารถเพิ่ม software ต่าง ๆ เข้ามาได้เลย ซึ่งตอนนี้ยังมีน้อย

มาลองใช้งาน Jenkins X กันดีกว่า

ขั้นตอนที่ 1 ติดตั้ง jx ก่อน เป็น command line สำหรับใช้งาน

ขั้นตอนที่ 2 สร้าง Cluster ของระบบ

โดยที่สนับสนุนทั้ง

  • GKE (Google Cloud Engine)
  • AWS (Amazon Web Services)
  • AKS (Azure Container Service)
  • Local ด้วย minikube

ตัวอย่างชุดคำสั่ง

$jx create cluster gke
$jx create cluster aws
$jx create cluster aks
$jx create cluster minikube

ใน blog นี้ผมทำการสร้างบน Google Cloud Engine ดังนี้
ถ้าไม่มี dependency หรือ library ใด ๆ ที่ต้องใช้
จะทำการ download และติดตั้งให้เลย ทั้ง gcloud และ helm
ที่สำคัญอย่าลืมเปิด Google Kubernetes Engine API

ใช้เวลาการสร้าง cluster นานพอสมควรนะ !!
จากนั้นจะทำการเชื่อมต่อไปยัง github
แต่ต้องไปสร้าง API Token มาใช้ก่อน
และเมื่อทุกอย่างเรียบร้อย ก็มีอะไรไม่รู้สร้างมาเพียบ

ลองไปดูใน Google Cloud Console ก็เจอ cluster ที่สร้างดังรูป

ได้ Jenkins ด้วยนะ
บอก username และ password เข้าใช้งานมาให้ครบ
มี job สำหรับ environment แต่ละตัวให้มาพร้อม ทั้ง staging และ production

สร้าง repository ใน Github ให้อีกด้วย
ใช้สำหรับจัดการ environment ต่าง ๆ ของระบบนั่นเอง
สร้างให้ทั้ง staging และ production
รวมทั้งสร้าง webhook ให้อีกด้วย
มันจะทำเยอะไปไหนนะ

เมื่อทุกอย่างพร้อม ก็ได้สิ่งต่าง ๆ มาดังนี้

ว่าแต่มันมีอะไรบ้างมาดูหน่อยสิ

  • Docker Registry V2 สำหรับจัดเก็บ Docker Image
  • Jenkins X App สำหรับดูการ deploy ระบบงาน
  • Nexus Repository Manager Server สำหรับจัดเก็บ library และ dependency ต่าง ๆ

ขั้นตอนที่ 3 ได้เวลาสร้าง Spring Boot Application กันแล้ว

แน่นอนว่าจะทำการสร้าง Git repository
โดยมีทั้ง code
Dockerfile สำหรับใช้สร้าง Docker Image
Jenkinsfile สำหรับสร้าง Job ใน Jenkins
ดังนี้

มีความจริงจังมาก ๆ

จากนั้นจะ trigger ให้ Job ใน Jenkins ทำการ build
ซึ่งมี pipeline มาตรฐานดังนี้

ดูไฟล์ Jenkinsfile ไปแล้วงง มาดูรูป pipeline กันดีกว่า

  • Pull code
  • ทำการ build คือ compile, test และ packaging
  • ทำการ promote ไปยัง environment ต่าง ๆ ทั้ง staging และ production

เมื่อเข้าไปดูรายละเอียดจะพบว่า
มีการสร้าง docker image ของ project
จากนั้นทำการ push ไปยัง Docker Registry V2 ก่อน
ก่อนทำการ promote ไปยัง environment ต่าง ๆ
มีการทำ changelog แบบอัตโนมัติ
มีการทำ versioning ของ project
สร้าง pull request ไปยัง environment ต่าง ๆ เพื่อเริ่มกระบวนการ deploy
แสดงดังรูป

สามารถดูเพิ่มเติมได้ที่ VDO :: Create Spring Boot

มาถึงตรงนี้จะพบว่า

Jenkins X นั้นทำสิ่งต่าง ๆ ให้เยอะมาก (เยอะจนมึนงงกันไปเลย ยิ่งมือใหม่จะงงมาก ๆ)
แต่ก็มองได้สองมุมคือ
มุมแรกมันเยอะไปไหม พังมานี่ยุ่งเลย แก้ไม่ถูกแน่ ๆ
มุมสองมันก็ง่ายดีนะ ไม่ต้องมาสนใจ pipeline เลย แถมมีขั้นตอนเหมือนกันอีก

แต่ถึงอย่างไรก็ตาม นักพัฒนา software ก็ต้องศึกษาเพื่อให้รู้ ข้อดีและข้อเสีย
เพื่อให้เข้าใจมันก่อนที่จะตัดสินใจ

ปล. ตอนนี้ bug เพียบนะ

ขอให้สนุกกับการเขียน code นะครับ