Git

Semantic Versioning กับ Git Tags: จัดการ Release อย่างมืออาชีพ

เผยแพร่ · แก้ไขล่าสุด

Semantic Versioning (SemVer) คืออะไร?

Semantic Versioning เป็นระบบการตั้งหมายเลขเวอร์ชันที่ใช้กันอย่างแพร่หลายในวงการพัฒนา Software โดยมีรูปแบบ MAJOR.MINOR.PATCH (เช่น 1.2.3) ระบบนี้ช่วยให้ผู้ใช้และนักพัฒนาสามารถเข้าใจว่าการเปลี่ยนแปลงใดเกิดขึ้นระหว่างแต่ละรุ่นของโปรแกรม ทำให้การจัดการ Release บน Cloud VPS หรือ Cloud Hosting ของ Dot Enterprise เป็นไปอย่างเป็นระบบและชัดเจน

ความหมายของแต่ละตัวเลข

  • MAJOR: เมื่อมีการเปลี่ยนแปลงที่ไม่เข้ากันกับเวอร์ชันก่อนหน้า (Breaking Changes) เช่น เปลี่ยน API หรือ Database Schema
  • MINOR: เมื่อเพิ่มฟีเจอร์ใหม่ที่เข้ากันได้กับเวอร์ชันก่อนหน้า (Backward Compatible) เช่น เพิ่ม endpoint ใหม่
  • PATCH: เมื่อแก้ไข Bug หรือปรับปรุงเล็กน้อยที่ไม่มีผลกระทบต่อ API หรือ Features

ตัวอย่าง: v1.2.3 หมายถึง MAJOR version ที่ 1 (API ไม่เปลี่ยน) MINOR version ที่ 2 (มีฟีเจอร์ใหม่ 2 อย่าง) และแก้ไข PATCH 3 ครั้ง (แก้ bug 3 อย่าง) การใช้ SemVer ช่วยให้การ Upgrade เวอร์ชันไม่ยุ่งยากเกินไป

สร้าง Git Annotated Tags

# สร้าง tag สำหรับรุ่น 1.0.0 (รุ่นแรก)
git tag -a v1.0.0 -m "Release version 1.0.0 - Initial release"

# สร้าง tag สำหรับรุ่น 1.1.0 (เพิ่มฟีเจอร์ใหม่)
git tag -a v1.1.0 -m "Release version 1.1.0 - Added new features"

# สร้าง tag สำหรับรุ่น 1.1.1 (แก้ไข Bug)
git tag -a v1.1.1 -m "Release version 1.1.1 - Bug fixes"

# สร้าง tag บน commit เดิม
git tag -a v1.0.1 <commit-sha> -m "Patch release for v1.0 branch"

Push Tags ไปยัง Remote Repository

# Push tag ชุดแรก
git push origin v1.0.0

# Push ทุก tags ที่มี
git push origin --tags

# Push tag เฉพาะบน branch معين
git push origin --tags --force  # ระวัง: --force จะ override tags เดิม

# ลบ tag บน remote
git push origin --delete v1.0.0

สร้าง GitHub Release จาก Tags

ใน GitHub Repository ให้ไปที่ Releases แล้วคลิก Create a new release เพื่อสร้าง Release Note ที่มีรายละเอียด

  • เลือก Tag ที่ต้องการ (เช่น v1.0.0)
  • ใส่ Release Title (เช่น “Version 1.0.0 – Stable Release”)
  • เขียน Release Notes บรรยายการเปลี่ยนแปลง Features และ Bug Fixes
  • อัปโหลด Binary หรือ Artifact ถ้าเป็น Standalone Application
  • เลือก “Set as a pre-release” ถ้ายังไม่เสร็จสมบูรณ์
  • คลิก Publish release

Conventional Commits สำหรับ Automated Versioning

ใช้ Conventional Commits เพื่อให้ Tools สามารถตัดสินใจเพิ่มเวอร์ชันใด ได้อัตโนมัติ โดยการอ่าน Commit Messages

# MINOR: เพิ่มฟีเจอร์ใหม่ (Bump minor version)
feat: add new user login feature

# PATCH: แก้ไข Bug (Bump patch version)
fix: resolve login form validation bug

# MAJOR: Breaking change (Bump major version)
feat!: redesign authentication system
BREAKING CHANGE: login endpoint now requires OAuth token

# Refactor: ไม่เพิ่มเวอร์ชัน
refactor: improve code performance in auth module

# Documentation: ไม่เพิ่มเวอร์ชัน
docs: update README with authentication flow

# Style: ไม่เพิ่มเวอร์ชัน
style: fix indentation in auth.js

ใช้ Tools สำหรับ Automated Tagging

Tools เช่น standard-version หรือ semantic-release สามารถอัตโนมัติปรับเวอร์ชันตามสตรีม Commits โดยการอ่าน Conventional Commits ซึ่งช่วยให้ Release Process เป็นไปอย่างอัตโนมัติและลดข้อผิดพลาด

# ติดตั้ง standard-version
npm install --save-dev standard-version

# เรียกใช้ release
npm run release

# เรียกใช้โดยกำหนดเวอร์ชัน
npm run release -- --release-as 2.0.0

ไฟล์ package.json เพื่อ Version Control

{
  "name": "my-awesome-app",
  "version": "1.2.3",
  "description": "A professional application with semantic versioning",
  "repository": {
    "type": "git",
    "url": "https://github.com/user/my-awesome-app.git"
  },
  "scripts": {
    "release": "standard-version",
    "release:dry": "standard-version --dry-run",
    "release:major": "standard-version --release-as major",
    "release:minor": "standard-version --release-as minor",
    "release:patch": "standard-version --release-as patch"
  },
  "devDependencies": {
    "standard-version": "^9.5.0"
  }
}

บูรณาการกับ Git Tag

เพื่อให้เข้าใจการใช้งาน Git Tags ได้ลึกขึ้นไป คุณสามารถดูรายละเอียดใน บทความ Git Tags สำหรับ Version Release นอกจากนี้ยังมี บทความเกี่ยวกับ Release Management ด้วย Git ที่แสดงวิธีการจัดการ Release แบบมืออาชีพ

Conventional Commits และการดำเนินการต่อ

สำหรับการเขียน Commit Messages ที่มีมาตรฐาน คุณควรอ่านบทความ Conventional Commits Standard เพื่อทำให้ Team Collaboration ดีขึ้น นอกจากนี้คุณสามารถใช้ GitHub Actions สำหรับ CI/CD เพื่อทำให้ Release Process เป็นไปอย่างอัตโนมัติเมื่อ Tag ใหม่ถูกสร้าง

ตัวอย่าง Workflow จริง

# ขั้นตอนที่ 1: พัฒนาฟีเจอร์ใหม่
git checkout -b feature/login-oauth
# เขียน code
git add .
git commit -m "feat: add OAuth login support"

# ขั้นตอนที่ 2: สร้าง Pull Request และ Merge
git push origin feature/login-oauth
# สร้าง PR และ merge เข้า main

# ขั้นตอนที่ 3: สร้าง Release
git checkout main
git pull origin main
npm run release  # สร้าง tag และ Release Notes อัตโนมัติ
git push origin main --tags

สรุป

Semantic Versioning ร่วมกับ Git Tags ช่วยให้การจัดการ Release เป็นไปอย่างเป็นระบบและมืออาชีพ ทำให้ผู้ใช้เข้าใจการเปลี่ยนแปลงของแต่ละเวอร์ชันได้ชัดเจน และโดยใช้ Conventional Commits ร่วมกับ Tools เช่น standard-version คุณสามารถทำให้ Release Process เป็นไปอย่างอัตโนมัติ ลดข้อผิดพลาด และประหยัดเวลาของ Team ได้

บทความที่เกี่ยวข้อง