Free lesson · LLMOps Engineering

AI திட்டங்களுக்கு trunk-based development-ஐ செயல்படுத்துதல்

GKE-இல் AI/ML திட்டங்களுக்கு உகந்ததாக்கப்பட்ட ஒரு Git branching strategy-ஐ நீங்கள் அமைப்பீர்கள். main எப்போதும் deploy செய்யத்தக்கதாக இருக்கும் ஒரு trunk-based workflow-ஐ உள்ளமைப்பீர்கள். பெயரிடும் மரபுகளுடன் குறுகிய ஆயுள் feature branch-களை உருவாக்குவீர்கள்: feature/add-prompt-template, fix/embedding-pipeline, config/model-parameters. Branch வாழ்க்கைச் சுழற்சியை செயல்படுத்துவீர்கள்: main-இலிருந்து உருவாக்குதல், commit-களை push செய்தல், PR திறத்தல், main-க்கு squash merge செய்தல், branch-ஐ நீக்குதல். இயல்பாக rebase-ஐப் பயன்படுத்த git-ஐ உள்ளமைப்பீர்கள் (git config pull.rebase true). ஒரு prompt template மாற்றத்துடன் workflow-ஐ முழுமையாக (end-to-end) செயல்விளக்கம் செய்வீர்கள்.

Course: DevOps Foundations for GenAI Engineers · Chapter 1 · Git Workflows for AI Teams

Free to read — no subscription required.

அறிமுகம்

ஒரு வாரமாக விலகிச் செல்லும் (drift) feature branch-களிலிருந்து prompt-கள், training JSONL மற்றும் model config-களை நீங்கள் ship செய்யும்போது, ஒரே கோப்பில் training வரிசைகளைச் சேர்த்த அல்லது வெவ்வேறு branch-களில் ஒரே prompt பதிப்பை உயர்த்திய இரண்டு பொறியாளர்களின் மாற்றங்களை Git-ஆல் ஒருங்கிணைக்க முடியாது என்பதை merge நேரத்தில்தான் கண்டறிவீர்கள். இந்த conflict பரப்பு merge செய்ய முடியாதது: ஒவ்வொரு JSONL வரியும் பொருள்ரீதியாக சுயாதீனமானது, மேலும் prompt registry உள்ளீடுகள் ஒரு குறிப்பிட்ட நேரத்தின் உண்மைகள், three-way-merge செய்யப்பட வேண்டிய உரை அல்ல. Branch-கள் 48 மணி நேரத்தைத் தாண்டி பழையதாக அனுமதிக்கும் குழுக்கள், இழந்த sprint நாட்களாகவும், தவறான merge-களுக்குப் பிறகு eval மதிப்பெண்களில் ஏற்படும் அமைதியான பின்னடைவுகளாகவும் (regressions) இந்த விலையைச் செலுத்துகின்றன.

இந்தப் பாடத்தின் முடிவில், ஒரு AI கோட்பேஸில் trunk-based ஒழுங்கை நீங்கள் அமல்படுத்த முடியும்: நோக்கத்தின் அடிப்படையில் branch-களுக்குப் பெயரிடுதல் (feat, data, fix, infra, deps), ஒரு Git hook மூலம் push நேரத்தில் பெயர்களையும் வயதையும் சரிபார்த்தல், மற்றும் prompt மற்றும் data மாற்றங்கள் atomic ஆகவும் bisect செய்யக்கூடியதாகவும் இருக்கும் வகையில் branch வகைக்கு ஏற்ப merge strategy-ஐ உள்ளமைத்தல்.

முக்கிய சொற்கள்

  • Trunk — எப்போதும் deploy செய்யக்கூடிய நிலையில் இருக்கும் ஒரே பகிரப்பட்ட branch (பொதுவாக main); ஒவ்வொரு commit-ம் schema, evaluation மற்றும் infrastructure சரிபார்ப்பைத் தூண்டுகிறது, எனவே prompt-கள், model-கள் மற்றும் config-களுக்கு trunk-தான் உண்மையின் ஆதாரம்.
  • குறுகிய கால feature branch — trunk-க்கு மீண்டும் merge ஆவதற்கு முன் அதிகபட்சம் 48 மணி நேரம் மட்டுமே வாழும் branch; prompt மற்றும் JSONL drift-ஐ இயந்திரத்தனமாகத் தீர்க்கக்கூடிய அளவுக்குச் சிறியதாக வைத்திருப்பது இந்த நேர வரம்புதான்.
  • Squash merge — ஒரு feature branch-இல் உள்ள ஒவ்வொரு commit-ஐயும் trunk-இல் ஒரே atomic commit ஆகச் சுருக்குகிறது, இதனால் git bisect WIP சேமிப்புகளுக்குப் பதிலாக "add summarization prompt v3" போன்ற பொருள்ரீதியாக அர்த்தமுள்ள அலகுகளில் தரையிறங்குகிறது.
  • Branch protection rule — branch pattern-க்கு ஏற்ப தேவையான check-கள் மற்றும் merge strategy அடிப்படையில் merge-களைக் கட்டுப்படுத்தும் remote-இல் (GitHub/GitLab) உள்ள server-side கொள்கை; இதனால் ஒரு local hook தவிர்க்கப்பட்டாலும் கொள்கை நிலைத்திருக்கும்.
  • Prompt registry — prompt ID-களை பதிப்பு எண்கள் மற்றும் கோப்புப் பாதைகளுடன் இணைக்கும், trunk-இல் track செய்யப்படும் JSON கோப்பு (எ.கா. prompt_registry.json); "ஒரு branch-க்கு ஒரு பதிப்பு உயர்வு" என்ற விதி, பின்னடைவுகளை எளிதில் காரணம் கண்டறியக்கூடியதாக்குகிறது.

கருத்துகள்

Integration-ஐத் தொடர்ச்சியானதாகவும், prompt/data மாற்றங்களை atomic ஆகவும் ஆக்குவதே இலக்கு. அதை அடைய மூன்று கருத்துகள் இணைகின்றன: நோக்கத்தை குறியிடும் branch வகைப்பாடு, drift-ஐ வரம்பிடும் 48 மணி நேர ஆயுட்காலம், மற்றும் தணிக்கைத்தன்மையைப் பாதுகாக்கும் வகைவாரியான merge strategy. இந்தக் கருத்துகளைச் செயல்படுத்தும் branch validator மற்றும் pre-push hook ஆகியவை code-இல் விளக்கப்பட்டுள்ளன (Code Walkthrough பார்க்கவும்).

AI கோட்பேஸ்களுக்கு குறுகிய கால branch-கள் ஏன் முக்கியம்

AI repository-கள் நீண்ட கால branch-களை உடைக்கும் மூன்று artifact வகைகளைக் கொண்டுள்ளன. Prompt மற்றும் config கோப்புகள் இணையான திருத்தங்கள் மோதும் பகிரப்பட்ட தொகுதிகள். JSONL training கோப்புகள் append மூலம் வளர்கின்றன, இரண்டு branch-கள் வெவ்வேறு வரிசைகளைச் சேர்க்கும்போது Git கொடியிடும் ஆனால் சரியாகத் தீர்க்க முடியாத ஒன்றுடன் ஒன்று கலந்த diff-கள் உருவாகின்றன — மறுஉருவாக்கத்திற்கு வரி வரிசை முக்கியம். Dependency graph-கள் அடர்த்தியானவை: serving config, preprocessing-ஐச் சார்ந்தது, அது feature-store schema-ஐச் சார்ந்தது, எனவே இந்த மூன்றில் எதுவும் தனித்தனியாக மாறினால் வலிமிகுந்த rebase உறுதி.

Branch ஆயுட்காலத்தை 48 மணி நேரமாக வரம்பிடுவது conflict சாளரத்தைச் சுருக்குகிறது. முடிவடையாத வேலை நிறுத்தி வைக்கப்பட்ட branch-களில் இல்லாமல் trunk-இல் feature flag-களுக்குப் பின்னால் அமர்கிறது. Renovate மற்றும் Dependabot PR-கள் சுத்தமாகத் தரையிறங்குகின்றன, ஏனெனில் அவை பொருந்துவதற்கு முன் ஆழமான rebase தேவைப்படும் அளவுக்கு எந்த மனித branch-ம் பழையதாக இல்லை.

Branch வகைப்பாடு நோக்கத்தைக் குறியிடுகிறது

ஒரு பெயரிடும் மரபு branch பெயர்களை hook-கள் மற்றும் CI-க்கான வழிநடத்தக்கூடிய metadata ஆக மாற்றுகிறது. ஒவ்வொரு branch வகையும் வெவ்வேறு சரிபார்ப்புப் பாதையைத் தூண்டுகிறது: feat/prompt-* eval suite-களை இயக்குகிறது, data/* schema மற்றும் row-count check-களை இயக்குகிறது, fix/* முழு regression-ஐ இயக்குகிறது, infra/* IaC plan/apply-ஐ இயக்குகிறது, deps/* build + dependency audit-ஐ இயக்குகிறது.

Loading diagram...

மூன்று குறுகிய கால branch-கள் ஒரே sprint சுழற்சிக்குள் trunk-க்கு மீண்டும் merge ஆகின்றன. எந்த branch-ம் ஒரு வேலை நாளைத் தாண்டி மற்றொன்றுடன் இணைந்து இருப்பதில்லை; இதுவே JSONL மற்றும் prompt கோப்புகளில் வலிமிகுந்த merge conflict-களை ஏற்படுத்தும் drift-ஐத் தடுக்கிறது.

Squash merge vs merge commit

feat, data, fix மற்றும் infra branch-களுக்கு squash merge இயல்புநிலை, ஏனெனில் trunk ஒரு தொடர் atomic, bisect செய்யக்கூடிய மாற்றங்களாக வாசிக்கப்பட வேண்டும் — "wip" → "fix typo" → "actually fix it" அல்ல, "add summarization prompt v3". deps/* கீழ் உள்ள branch-கள் வெளிப்படையான விதிவிலக்கு: Renovate மற்றும் Dependabot, downstream audit கருவிகள் parse செய்யும் கட்டமைக்கப்பட்ட changelog metadata-ஐ (package பெயர், பதிப்பு வரம்பு, changelog URL) commit message-களில் உட்பொதிக்கின்றன, எனவே அந்த branch-கள் உண்மையான merge commit மூலம் merge ஆகின்றன. முதல் நான்கு prefix-களுக்கு squash தேவை என்றும், deps/*-க்கு மட்டுமே merge commit-கள் அனுமதிக்கப்படும் என்றும் branch protection-ஐ உள்ளமைக்கவும்.

ஒரு branch-க்கு ஒரு prompt உயர்வு

ஒவ்வொரு feature branch-ம் prompt_registry.json-இல் சரியாக ஒரே ஒரு prompt பதிப்பை உயர்த்தி, அதன் eval முடிவுகளையும் உடன் ship செய்கிறது. Branch-கள் குறுகியதாகவும் நோக்கம் இறுக்கமாகவும் இருப்பதால், registry conflict-கள் வெவ்வேறு key-களில் ஒரே நேரத்தில் நடக்கும் உயர்வுகளாகச் சுருங்குகின்றன — அரை நாள் விசாரணை அல்ல, 30 வினாடி சமரசம். Deploy-க்குப் பிறகு ஒரு eval அளவீடு குறையும்போது, trunk-இல் git log --oneline சரியாக ஒரே ஒரு prompt மாற்றத்தைச் சுட்டிக்காட்டுகிறது.

Code Walkthrough

கீழே உள்ள இரண்டு snippet-களும் கருத்துகள் பிரிவில் உள்ள branch வகைப்பாடு, 48 மணி நேர ஆயுட்காலம் மற்றும் local அமலாக்க அடுக்கு ஆகியவற்றைச் செயல்படுத்துகின்றன. முதலாவது regex pattern-கள் மற்றும் வயது check உடன் validator-ஐ வரையறுக்கிறது; இரண்டாவது அதை ஒரு pre-push hook-இல் இணைக்கிறது, இதனால் பழைய அல்லது pattern-க்கு வெளியே உள்ள branch remote-ஐ அடைவதற்கு முன் கொள்கை செயல்படுகிறது.

Code snippetpython
1import re 2import subprocess 3from datetime import datetime, timezone 4from dataclasses import dataclass 5from typing import Optional 6 7BRANCH_PATTERNS = { 8 "feature": re.compile(r"^feat/(prompt|model|pipeline|serve)-[\w-]{3,50}$"), 9 "data": re.compile(r"^data/(training|eval|validation)-[\w-]{3,50}$"), 10 "fix": re.compile(r"^fix/[\w-]{3,50}$"), 11 "infra": re.compile(r"^infra/(gke|helm|terraform)-[\w-]{3,50}$"), 12 "deps": re.compile(r"^deps/(renovate|dependabot)-[\w-]{3,50}$"), 13} 14MAX_BRANCH_AGE_HOURS = 48 15 16@dataclass 17class BranchMetadata: 18 category: str 19 is_valid: bool 20 age_hours: Optional[float] = None 21 is_stale: bool = False 22 23def validate_branch_name(branch: str) -> BranchMetadata: 24 for category, pattern in BRANCH_PATTERNS.items(): 25 if pattern.match(branch): 26 return BranchMetadata(category=category, is_valid=True) 27 return BranchMetadata(category="unknown", is_valid=False) 28 29def get_branch_age_hours(branch: str) -> Optional[float]: 30 result = subprocess.run( 31 ["git", "log", "-1", "--format=%cI", branch], 32 capture_output=True, text=True, 33 ) 34 if result.returncode != 0: 35 return None 36 created = datetime.fromisoformat(result.stdout.strip()) 37 return (datetime.now(timezone.utc) - created).total_seconds() / 3600 38 39def enforce_branch_policy(branch: str) -> BranchMetadata: 40 metadata = validate_branch_name(branch) 41 if not metadata.is_valid: 42 return metadata 43 metadata.age_hours = get_branch_age_hours(branch) 44 if metadata.age_hours is not None and metadata.age_hours > MAX_BRANCH_AGE_HOURS: 45 metadata.is_stale = True 46 return metadata

BRANCH_PATTERNS கருத்துகள் பிரிவில் உள்ள வகைப்பாட்டைக் குறியிடுகிறது: துணை வகை token-கள் (prompt, training, gke போன்றவை) பொறியாளர்களை branch பெயரிலேயே நோக்கத்தை அறிவிக்கக் கட்டாயப்படுத்துகின்றன. MAX_BRANCH_AGE_HOURS = 48 என்பது கொள்கை knob — அதை உயர்த்துவது குறுகிய கால ஒழுங்கைத் தளர்த்துகிறது. enforce_branch_policy இரண்டு check-களையும் இணைக்கிறது; get_branch_age_hours branch tip-இன் committer தேதியை (ISO 8601) வாசித்து மணி நேரத்தை float ஆகத் திருப்பித் தருகிறது, branch இல்லாவிட்டால் பிழை எழுப்புவதற்குப் பதிலாக None திருப்பித் தருகிறது.

Code snippetpython
1import sys 2import subprocess 3from branch_validator import enforce_branch_policy 4 5def get_current_branch() -> str: 6 result = subprocess.run( 7 ["git", "rev-parse", "--abbrev-ref", "HEAD"], 8 capture_output=True, text=True, 9 ) 10 return result.stdout.strip() 11 12def main() -> int: 13 branch = get_current_branch() 14 if branch == "main": 15 return 0 16 metadata = enforce_branch_policy(branch) 17 if not metadata.is_valid: 18 print(f"ERROR: '{branch}' does not match any allowed pattern.") 19 print("Allowed: feat/(prompt|model|pipeline|serve)-..., data/(training|eval|validation)-...,") 20 print(" fix/..., infra/(gke|helm|terraform)-..., deps/(renovate|dependabot)-...") 21 return 1 22 if metadata.is_stale: 23 print(f"WARNING: '{branch}' is {metadata.age_hours:.1f}h old; merge or delete.") 24 return 1 25 print(f"Branch policy OK: [{metadata.category}] {branch}") 26 return 0 27 28if __name__ == "__main__": 29 sys.exit(main())

இந்த hook git rev-parse --abbrev-ref HEAD மூலம் தற்போதைய branch-ஐக் கண்டறிகிறது, trunk-க்கான CI merge commit-கள் பாதிக்கப்படாதவாறு main-இல் உடனே நிறுத்துகிறது, மேலும் தவறான பெயர்கள் அல்லது பழைய branch-கள் இரண்டிற்கும் exit code 1 திருப்பித் தருகிறது. இதை .git/hooks/pre-push ஆக (அல்லது pre-commit framework-இன் pre-push நிலையின் கீழ்) நிறுவி, feat/*, data/*, fix/*, infra/* ஆகியவற்றுக்கு squash merge-களைக் கட்டாயமாக்கும் மற்றும் deps/*-க்கு மட்டுமே merge commit-களை அனுமதிக்கும் server-side branch protection விதிகளுடன் இணைக்கவும்.

இது வேலை செய்கிறது என்பதை நீங்கள் அறிவீர்கள்: (1) wip-stuff-ஐ push செய்வது அனுமதிக்கப்பட்ட pattern-களின் உதவி உரையுடன் நிராகரிக்கப்படும்போது, (2) 50 மணி நேரம் பழைய feat/prompt-foo-ஐ push செய்வது மணி நேர வயதுடன் நிராகரிக்கப்படும்போது, (3) சரியான, புதிய feat/prompt-foo-ஐ push செய்வது OK வரியை அச்சிடும்போது, மற்றும் (4) trunk-இல் prompt_registry.json merge ஆன ஒவ்வொரு branch-க்கும் சரியாக ஒரே ஒரு பதிப்பு உயர்வைக் காட்டும்போது.

துறைசார் பயன்பாடு

செய்ய வேண்டியவை மற்றும் செய்யக்கூடாதவை

செய்ய வேண்டியவை

  1. feat/data/fix/infra branch-களை squash-merge செய்யுங்கள் — WIP commit-களை trunk-இல் ஒரே bisect செய்யக்கூடிய மாற்றமாகச் சுருக்குகிறது, இதனால் eval பின்னடைவுகள் ஒரே ஒரு prompt அல்லது data மாற்றத்தைச் சுட்டிக்காட்டுகின்றன.
  2. deps/* branch-களுக்கு மட்டுமே merge commit-களை அனுமதியுங்கள் — Renovate மற்றும் Dependabot, audit கருவிகள் parse செய்யும் கட்டமைக்கப்பட்ட changelog metadata-ஐ commit message-களில் உட்பொதிக்கின்றன; squash செய்வது அதை அழிக்கிறது.
  3. ஒரு branch-க்கு சரியாக ஒரே ஒரு prompt பதிப்பை உயர்த்துங்கள் — prompt_registry.json conflict-களை எளிமையாக வைத்திருக்கிறது, மேலும் trunk-இல் git log --oneline-ஐ துல்லியமான மாற்ற வரலாறாக ஆக்குகிறது.

செய்யக்கூடாதவை

  1. எந்த branch-ஐயும் 48 மணி நேரத்தைத் தாண்டி வாழ விடாதீர்கள் — JSONL append-கள் மற்றும் prompt திருத்தங்கள் Git-ஆல் தானாகத் தீர்க்க முடியாத drift-ஐக் குவிக்கின்றன; rebase செய்து merge செய்யுங்கள், அல்லது branch-ஐ நீக்குங்கள்.
  2. பகிரப்பட்ட branch-களை force-push செய்யாதீர்கள் — சக ஊழியர்களுக்குக் கீழே வரலாற்றை மீண்டும் எழுதுவது அவர்களின் rebase-களை உடைத்து, trunk-based development சார்ந்திருக்கும் audit trail-ஐ அழிக்கிறது.
  3. பகிரப்பட்ட branch-களில் --no-verify மூலம் pre-push hook-ஐத் தவிர்க்காதீர்கள் — hook-தான் local அமலாக்க அடுக்கு; அதைத் தவிர்த்தால் பழைய அல்லது pattern-க்கு வெளியே உள்ள பெயர்கள் remote-ஐ அடைந்து, server-side branch protection மட்டுமே ஒரே பாதுகாப்பாக எஞ்சும்.

3 hands-on labs come with this lesson — real code, in a cloud IDE. Create a free account to run them. No card.

Free account · no card · straight to the labs

Or get the full path — from

Listen to this lesson

Audio overviews of this lesson's labs and its chapter, from GenBodha Bytes.

More free lessons in DevOps Foundations for GenAI Engineers

All free lessons in LLMOps Engineering →