jenkins-pipeline-in-action
jenkins-pipeline-in-action

หลังจากเราได้เรียนรู้กันแล้วว่าอะไรคือ Jenkins Pipeline และความสุดยอดของมันในการเปลี่ยนจาก การมานั่ง config บนหน้าเว็ปโง่ๆ มาเป็นการเขียนโค้ดที่ทําให้ควบคุม workflow ได้ง่ายมากกว่าเดิมมากๆ

วันนี้สิ่งที่จะมาพูดถึงก็คือเรื่องของการนํา Jenkins Pipeline มาใช้งานจริงๆ จะต้องเรียนรู้อะไรบ้าง โดยเนื้อหาส่วนใหญ่ใช้มาจากที่นี้ TUTORIAL.md ของตัว Jenkins Pipeline plugin มันเองเลย และก็จะผสมๆ document ที่ควรรู้และอื่นๆไว้ด้วย แต่จงจําไว้ว่าหลักๆคือ

  1. node
  2. stage
  3. steps

ที่เหลือก็แค่ tools ที่ช่วยให้เราสร้าง pipeline ที่ดีได้ (Jenkins Pipeline ใช้ Groovy Script น่ะ เพราะฉะนั้น syntax หรืออะไรที่เราจะเขียนอ่านจาก document มันได้)

เริ่มคิดแบบ Jenkins Pipeline ยังไง?

จากเดิมที่เราเวลาจะใช้ Jenkins ในอดีตเราจะต้องมานั่งสร้าง Jobs แล้วมัน setup upstream และ downstream ให้มัน เพื่อที่มันจะได้ trigger build ต่อไปกันเป็นถอดๆ ใน ปัจจุบันเรามี Pipeline แล้ว เราก็จะมีวิธีคิดที่แตกต่างกันออกไป เราจะใช้วิธีมองให้ทุกอย่างเป็น Stageๆ ไป ไม่มองอะไรแยกออกมาเป็นส่วนๆ เช่น Stage ดังต่อไปนี้

  1. Preparation
  2. Checkout
  3. Build
  4. Static Code Analysis
  5. Package
  6. Smoke Testing
  7. Publish

ตัวอย่าง stage ข้างบนนี้เป็นตัวอย่างที่นึกถึง stage และขั้นตอนว่าเราควรทําอะไรบ้างเวลาจะรัน flow ของการ deploy app ทีนึง โดยหลักๆการจะ deploy app มันจะต้องมีเรื่องของการเตรียม env. เช่นเครื่องที่จําเป็นอย่าง path ของ jdk, หรือ node version อะไร,proxy set หรือยัง เป็นต้น

ทีนี้หลังจาก prepare เสร็จเราก็ไป checkout repository ลงมา เพื่อที่จะเอาไป build (ถ้าเป็นจังหวะนี้ของ Frontend Project เราก็อาจจะต้อง npm,bower,typing install หรืออื่นๆเหมือนเรานั่งอยู่หน้าจอ cmd แล้วกดนั้นแหละ)

หลังจากนั้น โดยปกสิส่วนมาก Dev จะมี Static Code Analysis หรือ Sonar ไว้ในการวิเคราะห์โค้ดที่ตัวเองเขียนขึ้นมาว่าดีหรือไม่ดี เราอาจจะทําให้หรูโดยการดึงตัวแปรมาเช็คค่าว่าผ่านเกณฑ์หรือไม่ก็ได้

ต่อมาก็ทํา Packaging  ในขั้นตอนนี้ส่วนใหญ่ต้องนึกถึง QA น่ะ ว่าเราตกลงกับเค้าว่าอย่างไร ว่าจะให้ Package แบบไหนออกมา เช่น ถ้าตกลงว่าจะรันเทสด้วย Web Platform ก็ให้ build ออกมาเป็น JavaScript ธรรมดา แต่ถ้าตกลงว่าจะเป็น Devices เช่น Apple หรือ Android บนเครื่องที่เราเตรียมไว้ก็ต้องลง software เพิ่ม อย่าเช่น Xcode หรือ android emulator ด้วย เพื่อให้ Step ถัดไปอย่าง Smoke Testing ทํางานได้สะดวกสบายมากยิ่งขึ้น

หลังจากผ่านทุก Stage มาได้สุดท้ายก็แค่ Publish ขึ้น repository software ซักตัว เช่น Jfrog ก็ได้

เนี้ยแหละจบละ วิธีคิดอย่าง Jenkins Pipeline จริงๆมันก็คล้ายๆวิธีคิด downstream upstream แหละแค่เปลี่ยนมาเป็นโค้ดเพื่อให้มันยืดหยุ่นมากกว่าและไม่มี dependencies ระหว่าง UI กับ โค้ดนั้นเอง

ตัวอย่าง Jenkins Pipeline 

เราได้วิธีคิดเรื่องการแบ่ง Stage ละ ทีนี้เรามาดูกันว่าเครื่องมือที่ Jenkins Pipeline มีให้จะมีไรบ้าง โดยใช้ TUTORIAL.md  ตัวนี้น่ะ เราจะเห็นว่า มันไปเรียกใช้ repository ตัวนี้ใน github simple-maven-project-with-tests เพื่อให้ง่ายต่อการจําลองสถานการณ์นั้นเอง ซึ่งมันก็ไม่ได้ทําไรนอกจัน random ให้ pass บ้าง fail บ้าง เพื่อจําลอง Behavior ของ Jenkins เรานั้นเอง

จะไม่นั่งไล่ลงทีละขั้นตอนน่ะว่าให้คลิ๊กตรงไหนหรือยังไง แต่จะแกะทีละส่วนให้ดู

example-jenkins-pipeline-basic
example-jenkins-pipeline-basic

เจ้านี้คือโค้ดหลักตัวเดียวที่ถ้าเราเข้าใจ เราจะใช้งานเป็นเลยล่ะ

Node

อย่างที่เคยบอก node คือ as soon as an executor slot มันจะรอจนกว่าจะมี Slot ว่างแล้วก็จะรัน step ของเราให้ โดยพื้นฐานถ้าไม่ได้ใส่อะไรให้มันแบบในรูป มันจะไปรันที่ตัว jekins master แต่ถ้าระบุแบบ node(‘JekinsName’) มันก็จะไปรันที่บนเครื่องนั้นทันที ที่เครื่องว่างนั้นเอง

Node ยังมีดีอีกอย่างคือ นอกจากมันจะไประบุเครื่องเฉพาะแล้วมันยังสามารถจัดสรรปันส่วนของพื้นที่เครื่อง หรือ workspace เพื่อให้มันทํางานเฉพาะ workspace นั้นๆได้ด้วย ไม่จําเป็นต้องทั้งเครื่องเลย (ซึ่งไว้่พูดในเชิงลึกทีหลัง)

Git

เวลาเราไปดูตัวอย่างบนเนต เราจะเจอพวก git tool def หรืออะไรพวกนี้ขึ้นมาโดยไม่มีปี่ไม่มีขลุ่ยเลย ไม่ใช่ไรน่ะ เพราะมันเป็น steps ของ Jenkins Pipeline ที่มันเตรียมไว้ให้อยู่แล้วนั้นเอง มันจะช่วยให้เราไม่ต้องไปนั่งเขียนใหม่เองทั้งหมด โดยเราสามารถดูได้จากที่นี้เลย Jenkins Pipeline Steps

ซึ่งการเรียกใช้ Git url แบบนี้ ถ้าเราลองเข้าไปดูที่ document มันก็จะพบว่า

jenkins-pipeline-git-plugin
jenkins-pipeline-git-plugin

git steps มัน require url ของ repository ที่เหลือเป็น optional เพราะฉะนั้นในโค้ดตัวอย่างที่มันทําก็คือ pull code ที่ Url นี้นั่นเอง simple-maven-project-with-tests

Def

def มันคืออะไร? มันคือ keyword ใน groovy ที่ไว้ใช้ประกาศตัวแปรนั้นเอง


def mvnHome = tool 'M3'

เจ้าตัวนี้มีค่าเท่ากับแบบนี้ใน Java เลยล่ะ


String mvnHome = tool("M3")

def มันคือการประกาศตัวแปรไว้เก็บค่านั้นเอง เอ๊ะ เดี๋ยวน่ะ แล้วเจ้า Tool คืออะไร?

Tool

tool คือ step นึงที่ทําหน้าที่ในการไปดึงค่าของชื่อที่มันถูกหมอบหมายไว้มาใช้ เช่น M3 มันเป็นขั้นตอนนึงที่อยู่ใน Tutorial ว่าจะให้ M3 เป็นค่าของ Maven Home นั้นเอง ดังตัวอย่างด่างล่าง

jenkin-pipeline-maven-example-tool
jenkin-pipeline-maven-example-tool

SH 

แล้วตุวสุดท้าย SH คืออะไร? เจ้า SH เนี้ยมันก็ ref. ไปถึง shell script นั้นแหละ มันก็แค่สั่งคําสั่งให้ Maven รันเท่านั้นแหละ ส่วนถ้า Jenkins เราเป็น Window ก็อย่าลืมใช้ bat แทนน่ะ Window Batch Script น่ะ

Managing the environment

อีก steps นึงที่น่าสนใจและคิดว่าน่าจะใช้กันทุก Jenkinsfile แน่ๆคือ env เพราะเจ้าตัวนี้จะสามารถดึงข้อมูลเกี่ยวกับ Path ออกมาได้ และช่วยให้ pipeline เรา dynamic มากขึ้นนั้นเอง เข้าใจว่า env ก็เหมือน env เนี้ยแหละที่มันรวบรมทุกสิ่งอย่างไว้ แต่ถ้าอยากดูเราสามารถ print ออกมาได้ด้วย 

สรุปล่ะ

Jenkins Pipeline ไม่ได้ยากเลย แค่เราต้องคิดให้เป็นว่ามันทํางานยังไง แล้วก็ค่อนข้างชิวมากๆเลยด้วยซำ้ แค่สร้าง stage แยกไว้เป็นส่วนๆ แล้วก็สั่งให้มัน Build อะไรไปตามท้องเรื่องแค่นั้นเอง

Noted

  • Life Cycle ของ Maven เผื่อใครสงสัยว่า เจ้า mvn -B verify คืออะไร
  • ถ้าเราเล่นตาม Tutorial บอกได้เลยว่าเจอ error แน่ๆ อันนี้คือวิธีแก้น่ะ

    workaround-fixed-tutorial
    workaround-fixed-tutorial
  • ถ้า error เรื่อง nohup นั้นเพราเราดันไปใช้ sh ใน windows ไง วิธีแก้ ก็เปลี่ยนเป็น bat ซะนะ
  • Jenkins Document

Leave a Reply

avatar

This site uses Akismet to reduce spam. Learn how your comment data is processed.