Skip to content

ทำ Auto merge บน github repository

Published
 at 07:00 AM

By : Parinya T. | 2 min read

Table of contents

Show all topics

ที่มาที่ไป

เนื่องจากครั้งที่แล้วผมโดน Vercel limit deploy ไปเพราะ dependabot ทำการอัพเดท dependencies แล้วรันทดสอบรัวๆ พอมันเกิดการเปิด Pull Request เต็มไปหมด แล้วเราก็ต้องมาไล่ merge เข้า branch หลักของเราทีละอันๆ ทำให้เราเสียเวลาไม่น้อยเลย

ถ้าสมมุติว่าเรามีโปรเจ็กต์อยู่เยอะแยะเต็มมือไปหมด แล้วเราต้องคอยไปดูทีละ repository มีอะไรอัพเดท แล้วคอยกด merge ทีละอัน มันต้องใช้เวลามหาศาลเลยทีเดียว

Blog Image

ผมจึงตัดสินใจหาข้อมูลว่า ไหนๆก็มีบอทอยู่ในมือช่วยตรวจสอบอัพเดทพวกนี้แล้ว ควรต้องมีบอทหรือเครื่องมืออะไรที่มันช่วยเรา merge พวกนี้บ้างสิ แล้วผมก็ไปพบเจอเข้ากับ github workflow ตัวหนึ่ง

ชื่อว่า Dependabot Auto Merge ซึ่งทางผู้พัฒนาได้บอกไว้ว่า tools ตัวนี้จะทำการรอให้ CI/CD ทำงานเสร็จทั้งหมด และต้องผ่าน Checking ทั้งหมดก่อนจึงจะ merge ให้

ซึ่งหลังจากที่ลองใช้งานดูก็พบว่าเป็นเช่นนั้นจริงๆ แต่เหตุผลจริงๆ คือ ตัว dependabot นั้นมีการรับคำสั่ง โดยเราจะเป็นผู้ป้อนคำสั่งนั้นเข้าไป อย่างเช่น สั่งให้บอท merge ด้วยพิมพ์การคอมเมนต์ใน PR นั้นๆว่า **@dependabot** merge จากนั้นบอทก็จะ reaction กับคำสั่งของเราและรอให้ CI/CD ทำงานให้เสร็จทั้งหมด โดยที่ผลการทดสอบต้องผ่านทั้งหมดเช่นกัน เพื่อป้องกันไม่ให้ product ของเราพัง

Blog Image

สิ่งที่ workflow ตัวนี้ทำจริงๆนั่นคือ การขอ access เข้าไปใน repository ของเรา และทำการตรวจสอบเมื่อมี pull request ถูกสร้างใหม่ และอ้างอิงว่าเป็นไปตามกฎเกณฑ์ที่เราได้ตั้งค่าไว้หรือไม่

อย่างเช่นในกรณีการใช้งานของผม ผมตั้งให้ auto merge เฉพาะส่วนที่เป็นการอัพเดทเวอร์ชั่นย่อยเท่านั้น ถ้าเกิดมีการอัพเดทเวอร์ชั่นหลัก (เช่น xxxx^11.0.0 เป็น xxxx^12.0.0) auto merge ก็จะไม่ทำงาน แต่ถ้าเป็นอัพเดทย่อย (xxxx^11.0.0 เป็น xxxx^11.0.1) ซึ่งเข้าเงื่อนไขที่ตั้งไว้ ก็จะมีคอมเมนต์เป็นชื่อของเรา โผล่ขึ้นมาสั่งคำสั่ง merge ไว้ทันที และเมื่อ dependabot ทดสอบผ่านแล้วทุกขั้นตอน auto merge ก็จะทำการ merge เข้า branch หลักให้ทันที

วิธีตั้งค่า

💡 1. ไปที่ https://github.com/settings/tokens และ คลิก Generate new token

Blog Image

โดยตั้งค่าในส่วนของ note ตามที่ต้องการให้อ่านแล้วนึกออกว่าใช้ key ทำอะไร

ในส่วนของ scope นั้น เงื่อนไขดังนี้

Blog Image

กรณีนี้ผมเลือก repo เผื่อไว้ใช้กับ private repo ในอนาคตด้วย ขี้เกียจสร้างใหม่บ่อยๆ

จากนั้นคลิก generrate ด้านล่างสุด และ copy ชุดโค้ดออกมาไว้ก่อน (ถ้าทำหายต้อง gen ใหม่อย่างเดียว)

  1. ไปที่ repository บน github ที่ต้องการ ไปยัง setting > secret
Blog Image

💡 2. คลิก New repository secret

Blog Image

ในส่วน Name นั้นใส่ชื่อของ secret ที่เราจำได้ ต้องเป็นอักษรพิมพ์ใหญ่ทั้งหมด

ในส่วนของ Value นั้นให้ใส่ชุดโค้ดที่ได้จากขั้นตอนข้างบน

💡 3. กด Add secret และ กลับไปที่หน้าโค้ดได้เลย

name: auto-merge

on:
  pull_request_target:

jobs:
  auto-merge:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: ahmadnassri/action-dependabot-auto-merge@v2
        with:
          target: minor
          github-token: ${{ secrets.ชื่อ-secret-ที่เราสร้างไว้ }}

หมายเหตุ: ในกรณีของผมใช้ target: patch เนื่องจาก dependencies บางตัว bump ข้ามเวอร์ชั่นแล้ว style เพี้ยน เลยค่อนข้างซีเรียสตรงนี้

ถ้าไม่มีอะไรผิดพลาดหลังจากที่เรา commit ขึ้นไปแล้ว ในส่วนของ action จะปรากฎชื่อ work flow ตาม name ในชุดโค้ดด้านบนขึ้นมา

Blog Image

โดยพื้นฐานเงื่อนไขการทำงานของโค้ดด้านบนผมได้กล่าวถึงไปแล้วขั้นต้น รายละเอียดอื่นๆของ workflow ตัวนี้ รวมถึงการโค้ดและการใช้งานโดยละเอียดกว่านี้ สามารถศึกษาเพิ่มเติมได้ที่

สรุป

หลังจากที่ได้ลองใช้งานมาระยะเวลาสั้นๆ ทำให้เราประหยัดเวลาในส่วนนี้ได้มากอย่างเห็นผล และเอาเวลาไปโฟกัสกับงานในส่วนอื่นของโปรเจ็กต์ มีเวลาไปดูแลโปรเจ็กต์อื่นๆได้มากขึ้น ซึ่งจริงๆ ในส่วนของ target ถ้าเราตั้งเป็น major เราก็จะปล่อยลืมได้เลย แต่ผมเลือกเป็น minor ไว้เพราะยังอยากเข้ามาตรวจสอบผลเองให้แน่ใจจริงๆ เวลามีการอัพเดทข้ามเวอร์ชั่นของ dependencies เท่านั้นเอง