Release Branch คือสาขาใน Git Flow ที่สร้างจาก develop เพื่อเตรียมการเผยแพร่รุ่นเฉพาะสำหรับการปรับใช้ โดยจะกำหนดเวอร์ชันของแอปพลิเคชัน แก้ไขบั๊กสุดท้าย และอัปเดตเมตาดาต้า โดยไม่เพิ่มคุณสมบัติใหม่ ตามที่ Vincent Driessen, 2010 กล่าว สาขา release แยกการเตรียมการเผยแพร่ออกจากการพัฒนาปัจจุบัน ทำให้ทั้งสองกิจกรรมสามารถดำเนินการควบคู่กันไปได้
ประเด็นสำคัญ
release/X.Y.Z ตามเวอร์ชันของแอปพลิเคชันRelease Branch (สาขาเผยแพร่) คือสาขาชั่วคราวใน Git Flow ที่สร้างจาก develop เมื่อทีมตัดสินใจว่าชุดคุณสมบัติปัจจุบันพร้อมสำหรับการเผยแพร่ โดยจะดำรงอยู่ตราบเท่าที่การเตรียมการเผยแพร่ครั้งสุดท้ายใช้เวลา ตั้งแต่ไม่กี่ชั่วโมงจนถึงหลายวัน
วัตถุประสงค์หลักของสาขา release คือการหยุดชุดคุณสมบัติเฉพาะสำหรับการเผยแพร่โดยไม่หยุดการพัฒนาเวอร์ชันถัดไป ในขณะที่สาขา release กำลังถูกเตรียมสำหรับการปรับใช้ นักพัฒนาคนอื่นสามารถรวมสาขาคุณสมบัติเข้า develop สำหรับการเผยแพร่ครั้งต่อไปได้
ในสาขา release จะไม่สร้างคุณสมบัติใหม่ มีเพียงการแก้ไขบั๊ก การอัปเดตเวอร์ชันแอปพลิเคชัน การแปลภาษา และเอกสารประกอบ เมื่องานทั้งหมดเสร็จสมบูรณ์ สาขา release จะถูกรวมเข้า main (ทำเครื่องหมายเป็นการเผยแพร่) และกลับไปยัง develop (เพื่อให้การแก้ไขบั๊กไปถึงเวอร์ชันอนาคต)
ตามที่ Atlassian, 2024 กล่าว สาขา release มีความสำคัญอย่างยิ่งสำหรับโปรเจกต์ที่มีรอบการเผยแพร่เป็นประจำ เนื่องจากช่วยให้กระบวนการเผยแพร่สามารถคาดการณ์ได้และมีเสถียรภาพ
วงจรชีวิตของสาขา release ตั้งแต่การสร้างจนถึงการลบประกอบด้วยหลายขั้นตอน การเข้าใจแต่ละขั้นตอนช่วยให้ทีมประสานงานและหลีกเลี่ยงข้อผิดพลาดได้
release/2.5.0 develop ยังคงรับสาขาคุณสมบัติสำหรับเวอร์ชันถัดไปv2.5.0ขั้นตอนที่ 6 — การรวมกลับเข้า develop — มักถูกลืม แต่มีความสำคัญอย่างยิ่ง หากไม่มีขั้นตอนนี้ การแก้ไขบั๊กที่ทำในสาขา release จะไม่ไปถึง develop และข้อผิดพลาดเดียวกันอาจปรากฏขึ้นอีกในการเผยแพร่ครั้งถัดไป
อายุของสาขา release ขึ้นอยู่กับความซับซ้อนของการเผยแพร่และคุณภาพของโค้ดใน develop โดยเฉลี่ยแล้ว การเตรียมการใช้เวลา 2 ถึง 5 วันทำการสำหรับแอปพลิเคชันมือถือขนาดกลาง
ในสาขา release จะดำเนินการชุดงานที่จำกัดอย่างเคร่งครัด การเบี่ยงเบนใดๆ จากรายการนี้ละเมิดโมเดล Git Flow และสร้างความเสี่ยงต่อเสถียรภาพของการเผยแพร่
| ประเภทการเปลี่ยนแปลง | อนุญาต | ตัวอย่าง |
|---|---|---|
| การกำหนดเวอร์ชัน | ใช่ | อัปเดต versionName ใน build.gradle |
| การแก้ไขบั๊ก | ใช่ | แก้ไขการค้างเมื่อเริ่มต้น |
| การแปลภาษา | ใช่ | เพิ่มคำแปลสำหรับหน้าจอใหม่ |
| เอกสารประกอบ | ใช่ | อัปเดต CHANGELOG และ README |
| คุณสมบัติใหม่ | ไม่ | เพิ่มหน้าจอโปรไฟล์ใหม่ |
| การปรับโครงสร้าง | ไม่ | เขียนเลเยอร์เครือข่ายใหม่ |
| การอัปเดตไลบรารี | ด้วยความระมัดระวัง | เฉพาะเวอร์ชันแพตช์สำหรับการแก้ไขบั๊ก |
กฎ ห้ามคุณสมบัติใหม่ เป็นกฎที่สำคัญที่สุดในสาขา release หากคุณสมบัติไม่ทันสำหรับการเผยแพร่ ก็รอรอบถัดไป การพยายามผลักดันคุณสมบัติที่ยังไม่เสร็จเข้าไปในสาขา release เป็นสาเหตุหลักของการพลาดกำหนดส่งและบั๊กในระบบจริง
ในสาขา release หมายเลขเวอร์ชันของแอปพลิเคชันจะต้องได้รับการอัปเดต สำหรับ Android คือฟิลด์ versionCode และ versionName ใน build.gradle สำหรับ iOS คือ CFBundleShortVersionString ใน Info.plist
// build.gradle (ระดับแอป) — อัปเดตเวอร์ชันในสาขา release
android {
defaultConfig {
versionCode 42
versionName "2.5.0"
}
}
// สำหรับ iOS — อัปเดต Info.plist
// CFBundleShortVersionString = 2.5.0
// CFBundleVersion = 42
นักพัฒนามือใหม่มักสับสนระหว่างสาขา release และ hotfix แม้ว่าวัตถุประสงค์จะแตกต่างกันโดยพื้นฐาน การเลือกประเภทสาขาที่ผิดอาจทำให้การแก้ไขที่สำคัญล่าช้าหรือขัดขวางกระบวนการเผยแพร่
หากพบข้อผิดพลาดระหว่างการเตรียมการเผยแพร่ (ในสาขา release) — เป็นการแก้ไขบั๊กปกติ หากพบข้อผิดพลาดในระบบจริง (บน main) — เป็น hotfix และสร้างจาก main แม้ว่าสาขา release จะมีอยู่แล้วก็ตาม
มาตรฐาน การตั้งชื่อสาขา release ที่เป็นหนึ่งเดียวช่วยให้การนำทางในคลังเก็บข้อมูลง่ายขึ้นและช่วยให้ระบบ CI/CD ตรวจจับโดยอัตโนมัติว่าสาขาเป็นส่วนหนึ่งของกระบวนการเผยแพร่
release/2.5.0release/merlinrelease/2024-12-01รูปแบบ release/X.Y.Z เป็นรูปแบบที่ต้องการ เนื่องจากเชื่อมโยงสาขากับหมายเลขเวอร์ชันที่จะกำหนดให้กับการเผยแพร่อย่างชัดเจน ซึ่งช่วยให้การค้นหาและการประมวลผลอัตโนมัติโดยสคริปต์ CI/CD ง่ายขึ้น
การรวมกลับ (merge back) ของสาขา release เข้า develop เป็นหนึ่งในการดำเนินการที่สำคัญที่สุดและมักถูกมองข้ามบ่อยที่สุด หากไม่มี การแก้ไขบั๊กทั้งหมดที่ทำในสาขา release จะคงอยู่เฉพาะในเวอร์ชันเผยแพร่และไม่ถึงรอบการเผยแพร่ถัดไป
กระบวนการรวมกลับจะดำเนินการหลังจากสาขา release ถูกรวมเข้า main แล้ว ขั้นแรก release ถูกรวมเข้า develop จากนั้นจึงลบ ซึ่งรับประกันว่า develop มีการแก้ไขทั้งหมดที่ทำระหว่างการเตรียมการเผยแพร่
หลังจากการรวมกลับ อาจเกิดความขัดแย้ง โดยเฉพาะอย่างยิ่งหากสาขาคุณสมบัติใหม่ที่แก้ไขไฟล์เดียวกันปรากฏใน develop แล้ว นักพัฒนาที่รับผิดชอบการเผยแพร่จะแก้ไขความขัดแย้งเหล่านี้และพุช develop ไปยังเซิร์ฟเวอร์
บางทีมใช้ rebase แทน merge สำหรับการรวมกลับเพื่อให้ประวัติเป็นเส้นตรง อย่างไรก็ตาม merge ปลอดภัยกว่าสำหรับ develop เนื่องจากไม่ได้เขียนประวัติคอมมิตที่นักพัฒนาคนอื่นอาจใช้งานอยู่แล้ว
มาดูวงจรการทำงานกับสาขา release อย่างสมบูรณ์ ตั้งแต่การสร้างจนถึงการลบหลังจากการเผยแพร่แอปพลิเคชันมือถือเวอร์ชัน 2.5.0 สำเร็จ
# 1. สร้างสาขา release จาก develop
git checkout develop
git pull origin develop
git checkout -b release/2.5.0
# 2. อัปเดตเวอร์ชันและแก้ไขบั๊ก
git add build.gradle
git commit -m "Bump version to 2.5.0"
# 3. แก้ไขบั๊ก (เฉพาะ bugfixes)
git add src/fix/
git commit -m "Fix crash on payment screen"
# 4. ส่งสาขา release ไปยังเซิร์ฟเวอร์
git push origin release/2.5.0
# 5. รวม release เข้า main
git checkout main
git pull origin main
git merge --no-ff release/2.5.0
git tag -a v2.5.0 -m "Release 2.5.0"
git push origin main --tags
# 6. รวมกลับเข้า develop
git checkout develop
git merge --no-ff release/2.5.0
git push origin develop
# 7. ลบสาขา release
git branch -d release/2.5.0
git push origin --delete release/2.5.0
คำสั่งที่ 5 และ 6 — การรวมสองครั้ง — มีความสำคัญอย่างยิ่ง ขั้นแรก main ได้รับโค้ดการเผยแพร่และแท็ก จากนั้น develop ซิงค์กับการแก้ไขบั๊กจาก release หากข้ามขั้นตอนที่ 6 การแก้ไขจากการเผยแพร่จะไม่ถึงรอบการพัฒนาถัดไป
สำหรับโปรเจกต์มือถือที่มีการเผยแพร่เป็นประจำ กระบวนการสร้างสาขา release และอัปเดตเวอร์ชันสามารถทำให้เป็นอัตโนมัติผ่านสคริปต์ CI/CD GitHub Actions ช่วยให้สร้างเวิร์กโฟลว์ที่เมื่อคลิกปุ่มจะสร้างสาขา release ด้วยการอัปเดตเวอร์ชันอัตโนมัติ
สำหรับโปรเจกต์มือถือที่มีการเผยแพร่เป็นประจำ กระบวนการสร้างสาขา release และอัปเดตเวอร์ชันสามารถทำให้เป็นอัตโนมัติผ่านสคริปต์ CI/CD GitHub Actions ช่วยให้สร้างเวิร์กโฟลว์ที่เมื่อคลิกปุ่มจะสร้างสาขา release ด้วยการอัปเดตเวอร์ชันอัตโนมัติ
# GitHub Actions — ทำให้การสร้างสาขา release เป็นอัตโนมัติ
name: Create Release Branch
on:
workflow_dispatch:
inputs:
version:
description: 'Release version (e.g. 2.5.0)'
required: true
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Create release branch
run: |
git checkout develop
git checkout -b release/${{ inputs.version }}
git push origin release/${{ inputs.version }}
คำถามที่พบบ่อย
มีได้เพียงสาขา release เดียวในเวลาเดียวกัน หากคุณทำตาม Git Flow การมีสาขา release ที่ใช้งานอยู่สองสาขาหมายถึงทีมกำลังพยายามเผยแพร่สองเวอร์ชันควบคู่กัน ซึ่งละเมิดหลักการของการเผยแพร่ตามลำดับและสร้างความสับสนเกี่ยวกับเวอร์ชัน
ลบคอมมิตของคุณสมบัติที่ยังไม่เสร็จออกจากสาขา release ผ่าน git revert และเลื่อนคุณสมบัติออกไปจนกว่าการเผยแพร่ครั้งถัดไป อย่าเผยแพร่ฟังก์ชันที่ยังไม่เสร็จในระบบจริง หนี้ทางเทคนิคและบั๊กที่อาจเกิดขึ้นไม่คุ้มกับความเร่งรีบ
สำหรับการเผยแพร่แบบง่ายที่มีการแก้ไขครั้งเดียว สามารถข้ามสาขา release และรวมโดยตรงจาก develop ไปยัง main อย่างไรก็ตาม สำหรับการเผยแพร่มาตรฐาน สาขา release เป็นสิ่งจำเป็น เนื่องจากกำหนดเวอร์ชัน แยกการเตรียมการ และรับประกันการรวมสองครั้งของการแก้ไขบั๊ก
ใช้ git revert บน main เพื่อสร้างคอมมิตใหม่ที่ยกเลิกการเปลี่ยนแปลงทั้งหมดของการเผยแพร่ จากนั้นลบแท็กการเผยแพร่ด้วยคำสั่ง git push origin --delete vX.Y.Z หลังจากแก้ไขปัญหาแล้ว ให้สร้างสาขา release ใหม่พร้อมหมายเลขแพตช์ที่เพิ่มขึ้น
Release candidate (RC) คือสิ่งประดิษฐ์ของการ build ที่ผ่านการทดสอบครั้งสุดท้าย Release branch คือสาขา Git ที่ใช้สร้าง release candidate สาขา release หนึ่งสาขาสามารถสร้าง build RC หลายตัว (RC1, RC2, ฯลฯ) เมื่อแก้ไขบั๊ก
สรุป
release/X.Y.Z พร้อมหมายเลขเวอร์ชัน SemVerเราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม