Skip to main content

เนื้อหาภาษาไทย / Thai content

System guide Content reviewed

การใช้ Git Hooks: Trigger Jenkins Build

บทความนี้อธิบายวิธีการใช้ Git Hooks ร่วมกับ Jenkins Webhook เพื่อสร้าง Continuous Integration Pipeline โดย Git Hooks จะ Trigger Jenkins Build อัตโนมัติเมื่อมีกา...

การใช้ Git Hooks: Trigger Jenkins Build

ในบทความที่แล้ว เราได้เรียนรู้วิธีการตั้งค่าให้ Jenkins ส่ง Email แจ้งเตือนเมื่อ Build สำเร็จหรือล้มเหลว ซึ่งเป็นวิธีที่ดีในการรับทราบสถานะของ Build อย่างรวดเร็ว แต่เราสามารถทำให้กระบวนการนี้เป็นอัตโนมัติมากยิ่งขึ้นได้ด้วยการใช้ Git Hooks ร่วมกับ Jenkins Webhook ในบทนี้ เราจะมาเรียนรู้วิธีการใช้ Git Hooks เพื่อ Trigger Jenkins Build อัตโนมัติเมื่อมีการ Push Code ไปยัง Repository ของเรา

Git Hooks คืออะไร?

Git Hooks คือ Script ที่ Git จะ execute โดยอัตโนมัติก่อนหรือหลังเหตุการณ์ต่างๆ เช่น commit, push, receive ฯลฯ Hooks เหล่านี้สามารถใช้เพื่อตรวจสอบ Code Style, รัน Tests หรือ Trigger Build Process ได้

ทำไมต้องใช้ Git Hooks กับ Jenkins?

การใช้ Git Hooks ร่วมกับ Jenkins ช่วยให้เราสามารถสร้าง Continuous Integration (CI) Pipeline ที่สมบูรณ์แบบได้ เมื่อมีการ Push Code ใหม่ Jenkins จะเริ่ม Build โดยอัตโนมัติ ทำให้เราสามารถตรวจจับปัญหาได้ตั้งแต่เนิ่นๆ และแก้ไขได้อย่างรวดเร็ว

ขั้นตอนการทำงาน

  1. Developer Push Code: นักพัฒนาทำการ Push Code ไปยัง Remote Repository
  2. Git Hook Trigger: Git Hook ที่ตั้งค่าไว้จะถูก Trigger
  3. Webhook Call: Git Hook จะส่ง HTTP Request ไปยัง Jenkins Webhook URL
  4. Jenkins Build Trigger: Jenkins รับ Request และเริ่ม Build โปรเจกต์
  5. Build Process: Jenkins ทำการ Build, Test, และ Deploy (ตามที่ตั้งค่าไว้)

สิ่งที่ต้องมี

  • Jenkins ติดตั้งและตั้งค่าเรียบร้อยแล้ว (รวมถึง Email Notification Plugin ถ้าต้องการ)
  • Git Repository ที่มีการตั้งค่า Remote
  • สิทธิ์ในการแก้ไข Git Hooks (มักจะอยู่ใน directory `.git/hooks`)

1. การสร้าง Git Hooks

Git Hooks จะอยู่ใน directory `.git/hooks` ภายใน Git Repository ของคุณ โดย Git จะมี Template Files ให้เราอยู่แล้ว ซึ่งมีนามสกุล `.sample` เราสามารถนำไฟล์เหล่านี้มาแก้ไขและลบนามสกุล `.sample` ออกเพื่อใช้งานได้เลย

Hook ที่เราจะใช้ในบทนี้คือ `post-receive` ซึ่งจะทำงานหลังจากที่ Server ได้รับการ Push Code เรียบร้อยแล้ว

  1. เข้าไปยัง Directory `.git/hooks`: เปิด Terminal และเปลี่ยนไปยัง Directory `.git/hooks` ใน Project ของคุณ
    cd .git/hooks
      
  2. สร้างไฟล์ `post-receive` (ถ้าไม่มี):
    touch post-receive
      
  3. แก้ไขไฟล์ `post-receive`: เพิ่ม Script ด้านล่างลงในไฟล์ `post-receive`
    #!/bin/bash
    
      while read oldrev newrev ref
      do
        branch=$(git rev-parse --symbolic --abbrev-ref $ref)
    
        # Replace with your Jenkins URL and Job Token
        JENKINS_URL="http://your-jenkins-url/job/your-project-name/build?token=your-job-token"
    
        # Trigger Jenkins build only for specific branches (e.g., main, develop)
        if [[ $branch == "main" || $branch == "develop" ]]; then
          echo "Triggering Jenkins build for branch: $branch"
          curl -X POST $JENKINS_URL
        else
          echo "Ignoring push to branch: $branch"
        fi
      done
      

    คำอธิบาย Script:

    • #!/bin/bash: Shebang บอกว่าให้ใช้ Bash Interpreter ในการรัน Script
    • while read oldrev newrev ref: Loop ผ่านการเปลี่ยนแปลงแต่ละ Reference (Branch)
    • branch=$(git rev-parse --symbolic --abbrev-ref $ref): ดึงชื่อ Branch ที่มีการ Push
    • JENKINS_URL="http://your-jenkins-url/job/your-project-name/build?token=your-job-token": กำหนด Jenkins URL และ Job Token (จะต้องแก้ไข)
    • if [[ $branch == "main" || $branch == "develop" ]]: ตรวจสอบว่า Branch ที่ Push เข้ามาตรงกับ Branch ที่เราต้องการให้ Trigger Build หรือไม่ (สามารถแก้ไข Branch ได้ตามต้องการ)
    • curl -X POST $JENKINS_URL: ส่ง HTTP POST Request ไปยัง Jenkins Webhook URL เพื่อ Trigger Build

    ข้อควรระวัง:

    • อย่าลืมเปลี่ยน your-jenkins-url, your-project-name, และ your-job-token ให้เป็นค่าที่ถูกต้อง
    • ควรจำกัด Branch ที่จะ Trigger Build เพื่อป้องกันการ Trigger Build โดยไม่จำเป็น
  4. ให้สิทธิ์ Execute: ทำให้ Script สามารถ Execute ได้
    chmod +x post-receive
      

2. การตั้งค่า Jenkins Webhook

Jenkins Webhook ช่วยให้เราสามารถ Trigger Build ผ่าน HTTP Request ได้ เราจะต้องตั้งค่า Webhook ใน Jenkins Job ของเรา

  1. เปิด Jenkins Project: ไปที่ Jenkins Project ของคุณ
  2. Configure: คลิกที่ "Configure"
  3. Build Triggers: เลื่อนลงมาที่ส่วน "Build Triggers" และเลือก "Trigger builds remotely (e.g., from scripts)"
  4. Authentication Token: ใส่ Token ที่ต้องการ (เช่น your-job-token) Token นี้จะต้องตรงกับ Token ที่เราใช้ใน Git Hook Script Jenkins Build Triggers

    หมายเหตุ: หากไม่มีรูปภาพ ให้แทนที่ `https://i.imgur.com/YOUR_IMAGE_URL.png` ด้วย URL รูปภาพที่อธิบายขั้นตอน

  5. Save: คลิก "Save"

ตอนนี้ Jenkins จะรอ HTTP Request ที่มี Token ที่ถูกต้องเพื่อ Trigger Build

3. การทดสอบ Git Hooks

หลังจากที่เราตั้งค่า Git Hooks และ Jenkins Webhook เรียบร้อยแล้ว เราสามารถทดสอบได้โดยการ Push Code ไปยัง Repository ของเรา

  1. Push Code: ทำการ Push Code ไปยัง Branch ที่เรากำหนดไว้ใน Git Hook Script (เช่น `main` หรือ `develop`)
    git push origin main
      
  2. ตรวจสอบ Jenkins: ไปที่ Jenkins Project ของคุณ คุณควรจะเห็นว่ามีการ Build ใหม่เกิดขึ้น Jenkins Build History

    หมายเหตุ: หากไม่มีรูปภาพ ให้แทนที่ `https://i.imgur.com/YOUR_IMAGE_URL_2.png` ด้วย URL รูปภาพที่อธิบายขั้นตอน

  3. ตรวจสอบ Logs: ตรวจสอบ Logs ของ Git Hook (ถ้ามี) เพื่อดูว่า Script ทำงานถูกต้องหรือไม่

ถ้าทุกอย่างทำงานถูกต้อง Jenkins ควรจะเริ่ม Build โดยอัตโนมัติเมื่อมีการ Push Code ใหม่

กรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย

  • ปัญหาเรื่อง Permissions: Git Hook Script อาจไม่มีสิทธิ์ Execute ตรวจสอบให้แน่ใจว่าได้ให้สิทธิ์ Execute ด้วย chmod +x post-receive
  • Jenkins URL ไม่ถูกต้อง: ตรวจสอบให้แน่ใจว่า Jenkins URL และ Job Token ถูกต้อง
  • Firewall: Firewall อาจบล็อก HTTP Request จาก Git Server ไปยัง Jenkins Server ตรวจสอบ Firewall Rules
  • Branch ไม่ตรง: ตรวจสอบให้แน่ใจว่า Branch ที่ Push เข้ามาตรงกับ Branch ที่กำหนดไว้ใน Git Hook Script
  • Jenkins ไม่ได้รับ Request: ตรวจสอบ Jenkins Logs เพื่อดูว่าได้รับ Request จาก Git Hook หรือไม่ อาจมีปัญหาเรื่อง Authentication หรือ Network
  • การ Trigger Build มากเกินไป: หาก Push Code บ่อยๆ Jenkins อาจ Trigger Build มากเกินไป พิจารณาใช้ Branch Filter หรือ Delay ใน Git Hook Script เพื่อลดความถี่ในการ Trigger Build

สรุป

การใช้ Git Hooks ร่วมกับ Jenkins Webhook เป็นวิธีที่มีประสิทธิภาพในการสร้าง Continuous Integration Pipeline ที่สมบูรณ์แบบ ช่วยให้เราสามารถตรวจจับปัญหาได้ตั้งแต่เนิ่นๆ และแก้ไขได้อย่างรวดเร็ว ในบทต่อไป เราจะมาเรียนรู้เกี่ยวกับการ Optimization เพื่อเพิ่มความเร็วให้กับ Application PHP ของเรา

Office.in.th Custom Service

Want to build or adapt a system from this structure?

Office.in.th designs and develops enterprise web applications, API integrations, and public- and private-sector management systems, with long-term support.

See our software development service