| name | sync-dev-from-master |
| description | Open a dev<-master merge PR that syncs master back into dev after a production release for TrainLCD MobileApp. Creates the chore/dev-from-master branch from origin/master, fills the PR template properly (not with empty stubs), and explicitly warns that the PR must be merged as a merge commit (NOT squash). Use after publish-release (or any time master has drifted ahead of dev). |
sync-dev-from-master
æ¬çªãªãªãŒã¹åŸã« master ãžç©ãŸããå·®åã dev ãžæ»ãããã®ããŒãžPRãäœãã¹ãã«ãpublish-release ã®åŸå·¥çšãšããŠäœ¿ãïŒå¿ããããã®ã§ç¬ç«ã¹ãã«åïŒã
æéèŠ: ãã® PR ã¯å¿
ãéåžžã® merge commit ã§ããŒãžãããsquash / rebase ã¯çŠæ¢ã éå» PR #5838 ã§ squash merge ããŠããŸããmerge commit ãæœ°ããŠæå³ãç¡ããªã PR #5840 ã§åæ²ããäºæ
ããã£ããã¹ãã«å®è¡æãšå®äºå ±åã®äž¡æ¹ã§ãã®æ³šæãæç€ºããã
å
¥å
| é
ç® | å¿
é | æ¢å®å€ |
|---|
release_version | ä»»æ | çç¥å¯ãæå®ãããã°æ¬æã®ãæŠèŠãã« v<version> ãå
¥ãããæªæå®ãªã origin/master:package.json ã® version ã䜿ã |
ãã©ã³ãå㯠chore/dev-from-master åºå®ïŒéå»éçš PR #5838 / #5840 æºæ ïŒãå
¥åã§å€ããããªãã
åææ¡ä»¶
- ã«ã¬ã³ããã£ã¬ã¯ããªããªããžããªã«ãŒãã
gh CLI èªèšŒæžã¿ãgit ã䜿ããã
- äœæ¥ããªãŒãã¯ãªãŒã³ïŒæªã³ããã倿ŽãªãïŒãæ®ã£ãŠããå Žåã¯äžæãããŠãŒã¶ãŒã«ã¯ãªãŒã³ã¢ãããäŸé Œããã
- ãªã¢ãŒããã©ã³ã
origin/dev / origin/master ãååšããã
æé
-
å·®å確èªïŒç¡ããã°äžæïŒ
git fetch origin dev master --tags
git log --oneline origin/dev..origin/master
- 0 ä»¶ãªããmaster 㯠dev ã«å¯ŸããŠé²ãã§ããªããåæ PR äžèŠãã§äžæãå ±åã
- 1 件以äžããã°ç¶è¡ãã³ãããä»¶åãªã¹ãã¯åŸã§æ¬æã«äœ¿ãã®ã§ä¿æã
-
æ¢å open PR ã®ã¬ãŒã
gh pr list --base dev --head chore/dev-from-master --state open --json number,url
- æ¢ã« open ãªãæ°èŠäœæãããæ¢å URL ãè¿ããŠäžæã
- close æžã¿ or merged ã®ã¿ãªãç¶è¡ã
-
æ¢å chore/dev-from-master ã®å®å
šãªåé€ã»åäœæ
éå»ãªãªãŒã¹ã®æãæ®ã£ãŠããæ³å®ã§åãã以äžã®å€å®ã§é²ããã
git show-ref --verify --quiet refs/heads/chore/dev-from-master && echo LOCAL_EXISTS
git ls-remote --heads origin chore/dev-from-master
gh pr list --base dev --head chore/dev-from-master --state all --limit 1 --json number,state,url
- ã±ãŒã¹ A: ã©ãã«ãååšããªã â ãã®ãŸãŸæé 4 ãžã
- ã±ãŒã¹ B: ååšããçŽè¿ PR ã
MERGED â åé€å¯Ÿè±¡ããã©ã³ãåã»çŽè¿ PR çªå·ã»PR URL ããŠãŒã¶ãŒã«æç€ºããå®è¡å¯åŠãæ¿èªåããæ¿èªåŸã®æé ã¯ä»¥äžã®é ã§è¡ã:
- çŸåšãã©ã³ãã
git rev-parse --abbrev-ref HEAD ã§ç¢ºèªãchore/dev-from-master ã«å±
ããšããŒã«ã«åé€ã倱æããããããã®å Žå㯠git switch devïŒãŸãã¯ä»»æã®å®å
šãªæïŒã«éé¿ããã
git push origin --delete chore/dev-from-master ã§ãªã¢ãŒããåé€ã
- ããŒã«ã«ã«ãååšããå Žåã¯
git branch -D chore/dev-from-master ã§åé€ã
- ã±ãŒã¹ C: ååšãããçŽè¿ PR ã
MERGED 以å€ïŒOPEN ã¯æé 2 ã§åŒŸããããæ®ãã®ã¯ CLOSED ãŸã㯠PR ç¡ãïŒ: åé€ããªãã§äžæããŠãŠãŒã¶ãŒã«å€æãä»°ãïŒæªããŒãžäœæ¥ã®å¯èœæ§ïŒã
- ã±ãŒã¹ D: ã±ãŒã¹ B ãŸã㯠CïŒïŒãªã¢ãŒã
origin/chore/dev-from-master ãååšããïŒã§ããã€ããŒã«ã«ã«æª push ã³ããããæã: ãªã¢ãŒãååšã git rev-parse --verify origin/chore/dev-from-master ã§ç¢ºèªããããã§ git cherry origin/chore/dev-from-master ãå®è¡ãåºåã空ã§ãªããã°åé€ããäžæããŠãŒã¶ãŒã«ç¢ºèªãã±ãŒã¹ AïŒã©ãã«ãååšããªãïŒããã¯åå²ããªãïŒãªã¢ãŒãéååšæã® git cherry 㯠fatal ã«ãªãããå®è¡ããªãïŒã
-
ãã©ã³ãã origin/master ããåãåºã㊠push
git fetch origin master
git switch -c chore/dev-from-master origin/master
git push -u origin chore/dev-from-master
- äœãã³ãããã¯ç©ãŸãªãïŒmaster å
端ãã®ãŸãŸïŒãbiome çã®ãã©ãŒããã¿ã¯èµ°ãããªãïŒæ°èŠã³ãããç¡ãïŒã
- push åã«ã察象 SHAïŒ
git rev-parse origin/masterïŒã»åã蟌ãŸããã³ãããä»¶æ°ã»æ¬æã«å
¥ãã version ããŠãŒã¶ãŒã«æç€ºããŠæ¿èªãåãã
- äŸå€: ãã® PR ãçæ°ãã¡ã€ã«ã§è¡çªããå ŽåïŒ
master ããç¹å® PR ã ã cherry-pick ãããªãªãŒã¹ã®åŸã«èµ·ãããåŸè¿°ã®ãçæ°ãã¡ã€ã«ã®ã³ã³ããªã¯ã解決ããåç
§ïŒã¯ããã®æã« origin/dev ãããŒãžããŠè§£æ±ºã³ãããã 1 ã€ã ãç©ãããã以å€ã¯ master å
端ãã®ãŸãŸã
-
PR æ¬æãçµã¿ç«ãŠïŒãã³ãã¬å³å®ã»å
šç¯ãå®å
容ã§åããïŒ
.github/pull_request_template.md ã®ç¯æ§æããã®ãŸãŸäœ¿ããå
šãŠã®ç¯ã§ãã³ãã¬ã® <!-- ... --> ã³ã¡ã³ããæ®ããå®å
容ã«çœ®æããïŒéå»ã®éãªåãæ¹ããããïŒã
æ¬æãã³ãã¬ïŒ<...> ã¯å®å€ã«çœ®æïŒ:
## æŠèŠ
æ¬çªãªãªãŒã¹ **v<release_version>** åŸã« `master` ãã©ã³ããžç©ãŸããå·®åã `dev` ãã©ã³ããžåæããããŒãžPRã§ãã`master` ãš `dev` ã®å±¥æŽãæããããšãç®çã§ãã³ãŒãã®æ°èŠå€æŽã¯å«ã¿ãŸããã
## 倿Žã®çš®é¡
- [ ] ãã°ä¿®æ£
- [ ] æ°æ©èœ
- [ ] ãªãã¡ã¯ã¿ãªã³ã°
- [ ] ããã¥ã¡ã³ã
- [ ] CI/CD
- [x] ãã®ä»
## 倿Žå
容
`master` ã«ç©ãŸããŠã㊠`dev` ã«æªåæ ã®ä»¥äž **<N>** ä»¶ã®ã³ãããã `dev` ã«åã蟌ã¿ãŸãã
<ã³ãããä»¶åã®ç®æ¡æžã>
## ãã¹ã
- [ ] `npm run lint` ãéãããš
- [ ] `npm test` ãéãããš
- [ ] `npm run typecheck` ãéãããš
æ¬PRã¯ã³ãŒã倿Žãå«ãŸãªãããŒãžPRã®ãããåœãã©ã³ãäžã§ lint / test / typecheck ã¯å®è¡ããŠããŸãããåã蟌ãŸããåã³ãããã¯å
ã® PR æç¹ããã³ `master` ãžã®åãèŸŒã¿æç¹ã§æ€èšŒæžã¿ã§ãã
## é¢é£Issue
ãªãïŒãªãªãŒã¹åŸã®åæPRïŒã
## ã¹ã¯ãªãŒã³ã·ã§ããïŒä»»æïŒ
ãªãïŒã³ãŒã倿Žãå«ãŸãªãããŒãžPRïŒã
眮æã«ãŒã«:
<release_version>: å
¥å release_version ãããã°ããïŒå
é v ã¯å¥ããïŒãæªæå®ãªã git show origin/master:package.json | python3 -c "import json,sys;print(json.load(sys.stdin)['version'])" ã®å€ãååŸå€±ææã¯ãæŠèŠãç¯ãã **v<release_version>** ã®éšåãäžžããšå€ãïŒåœæ
å ±ãæžããªãïŒã
<N>: æé 1 ã§æ°ããã³ãããä»¶æ°ã
<ã³ãããä»¶åã®ç®æ¡æžã>: git log --pretty='- %s' origin/dev..origin/master ã®åºåããã®ãŸãŸè²Œãã50 ä»¶ãè¶
ããå Žåã¯å
é 50 ä»¶ + - ...ä» <M> ä»¶ ãä»ããŠçç¥ããçç¥ããæšãã倿Žå
容ãç¯æ«å°Ÿã« 1 è¡æžãã
ãã§ãã¯ããã¯ã¹ã®å€å®:
- 倿Žã®çš®é¡ã¯
ãã®ä» ã®ã¿ ONãä»ã¯å
š OFFãçç±: åœPRã¯ã¢ããªæåã®å€æŽã§ã¯ãªãããŒãžæäœã®ããïŒcreate-pr ã®ã倧åå: å€å®ã¯ã¢ããªã®æåã«å¯Ÿãã倿Žãããé©çšããã³ãããä»¶åã®ããªã¬èªå¥ã«åŒãããããªãïŒã
- ãã¹ã㯠3 é
ç®å
š OFF + äžã«å®è¡ããŠããªãæšã®èª¬ææãåœãã©ã³ãã§èµ°ãããŠããªã以äžãON ã«ããªãïŒèåœå ±ååé¿ïŒã
-
PR äœæ
gh pr create \
--base dev \
--head chore/dev-from-master \
--title "dev<-master" \
--assignee TinyKitten \
--body "$(cat <<'EOF'
<æé 5 ã§çµã¿ç«ãŠãæ¬æ>
EOF
)"
- ã¿ã€ãã«ã¯
dev<-master åºå®ïŒPR #5467 以éå
šãŠãã®è¡šèšïŒã
- Assignee ã¯
TinyKittenïŒCLAUDE.md / ã¡ã¢ïŒã
-
å®äºå ±åïŒããŒãžæ¹æ³ã匷調ïŒ
å®äºå ±åã®åé ã«ã倪åã§ä»¥äžãæžã:
â ãã®PRã¯å¿
ããCreate a merge commitãã§ããŒãžããŠãã ãããSquash / Rebase ã¯çŠæ¢ã§ãã
Squash ãããš master åŽã® merge commit æ§é ãæœ°ããdev ãš master ã®å±¥æŽåå²ãå£ããŸããéå» PR #5838 ã§åããã¹ãèµ·ã PR #5840 ã§åæ²ããå®çžŸããã
ç¶ããŠä»¥äžãç°¡æœã«å ±å:
- PR URL
- 察象 SHAïŒ
origin/master ã® HEADïŒ
- åã蟌ã¿ã³ãããä»¶æ°ãšãé·ãå Žåã¯çç¥ãããåŠã
- 倿Žã®çš®é¡ãã§ãã¯ç¶æ
ïŒ
ãã®ä» ã®ã¿ ONïŒ
- ãã¹ãæ¬ã®ãã§ãã¯ç¶æ
ïŒå
š OFF + 説ææããïŒ
- 䜿çšãã
release_versionïŒã©ãããåã£ããïŒ
çæ°ãã¡ã€ã«ã®ã³ã³ããªã¯ã解決ïŒcherry-pick / hotfix ãªãªãŒã¹åŸïŒ
éåžžã®ãdev ããäžžããšããªãªãŒã¹ã§ã¯ master ã dev ã®å®å
šãªç¥å
ã«ãªãããããã®åæ PR ã¯è¡çªããªãïŒæé 4 ã®ãšãã master å
端ãã®ãŸãŸã§æžãïŒãããã ãªãªãŒã¹ãã©ã³ãã master ããåã£ãŠç¹å® PR ã ã cherry-pick ãããªãªãŒã¹ïŒcreate-release-pr ã«ããã®å€æŽã ãããšæå®ããããããã£ãã¯ã¹åãªã©ïŒã§ã¯ãdev ã master ã«åã蟌ãã§ããªããããmaster ã®ãªãªãŒã¹çæ°ãš dev ã® canary bump çæ°ã ãããããŸãŸ æ®ãããã®åæ PR ãçæ°ãã¡ã€ã«ã§è¡çªããã
è¡çªããã®ã¯çæ°ãã¡ã€ã«ã®ã¿ã§ãã¢ããªã³ãŒãã¯è¡çªããªã:
android/app/build.gradleïŒversionCode / versionNameïŒ
app.config.tsïŒversion / buildNumber / versionCodeïŒ
ios/TrainLCD.xcodeproj/project.pbxprojïŒMARKETING_VERSION / CURRENT_PROJECT_VERSIONïŒ
解決æ¹é: semver ã¯ãªãªãŒã¹çããã«ãçªå·ã¯æå€§å€
| çš®å¥ | æ¡çšããåŽ | çç± |
|---|
semverïŒversion / versionName / MARKETING_VERSIONïŒ | masterïŒãªãªãŒã¹çæ°ïŒ | dev ããªãªãŒã¹æžã¿ããŒãžã§ã³ãžåé²ããããéå» PR #6396 ã semver ç«¶åããªãªãŒã¹çã§è§£æ±ºããŠãã |
ãã«ãçªå·ïŒversionCode / CURRENT_PROJECT_VERSION / buildNumberïŒ | max(dev, master)ïŒé垞㯠dev åŽã倧ããïŒ | ã¹ãã¢ã¯ãã«ãçªå·ã®å調å¢å ãèŠæ±ãããcanary ã§æ¢çºè¡ã®çªå·ããäžãããšæ¬¡å bump ã§è¡çªãã |
解決æé
-
chore/dev-from-masterïŒ= master å
端ïŒã«å±
ãç¶æ
ã§ origin/dev ãããŒãžããïŒæé 4 ã®ãã³ããããç©ãŸãªããååã®å¯äžã®äŸå€ïŒ:
git switch chore/dev-from-master
git merge --no-ff --no-commit origin/dev
-
è¡çªããçæ° 3 ãã¡ã€ã«ã master åŽïŒ--oursïŒã§ç¢ºå®ããŠããããã«ãçªå·ã ã dev åŽã®æå€§å€ãžåŒãäžããïŒäžã¯ master=530/2743ã»dev=531/2744 ã®äŸïŒ:
git checkout --ours android/app/build.gradle app.config.ts ios/TrainLCD.xcodeproj/project.pbxproj
sed -i 's/versionCode 100000530/versionCode 100000531/g' android/app/build.gradle
sed -i "s/buildNumber: '2743'/buildNumber: '2744'/g; s/versionCode: 100000530/versionCode: 100000531/g" app.config.ts
sed -i 's/CURRENT_PROJECT_VERSION = 2743;/CURRENT_PROJECT_VERSION = 2744;/g' ios/TrainLCD.xcodeproj/project.pbxproj
ãããã®çæ°ãã¡ã€ã«ã¯ masterâdev ã§æ°å€ä»¥å€ã®å·®åãç¡ãïŒgit diff origin/dev origin/master -- <path> ã§ç¢ºèªã§ããïŒããã--ours ã§ master ãæ¡ã£ãŠãã³ã³ãã³ãã¯å€±ãããªãã
-
dev ãžã®æ£å³ã®å€åã semver ã ãïŒãã«ãçªå·ã¯æ®ã眮ãïŒã§ããããšã確èªããŠããããŒãžã³ããããäœæã push ãã:
git add android/app/build.gradle app.config.ts ios/TrainLCD.xcodeproj/project.pbxproj
git diff origin/dev HEAD
git commit -m "origin/dev ãããŒãžãçæ°ç«¶åã解決ïŒsemver=<release>ããã«ãçªå·=<max>ïŒ"
git push origin chore/dev-from-master
-
以éã¯éåžžã©ãã merge commit ã§ããŒãžããïŒfinalize-release ã Ruleset äžæç·©åã€ãã§å®è¡ããïŒãããŒãžåŸã¯ dev HEAD ã 2 芪㮠merge commit ã«ãªããgit rev-list --count origin/dev..origin/master ã 0ïŒdev ã master ãå®å
šå
å«ïŒã«ãªãããšãæ€èšŒããã
semver ããªãªãŒã¹çæ°ãžæŽæ°ãã倿ãšãã«ãçªå·ã®æ¡çšå€ã¯æ¬çªã®çæ°ã«é¢ãããããèªåã§ç¢ºå®ãããŠãŒã¶ãŒã«ç¢ºèªããã
泚æäºé
- Squash merge çŠæ¢ãããããã®ã¹ãã«ã®ååšçç±ã®ååãå®è¡æãšå®äºå ±åã§äºéã«æç€ºããã
- ã³ãŒã倿Žãç¡ããã
npx biome check --unsafe --fix ./src ã¯èµ°ãããªãïŒã¡ã¢ã®ã«ãŒã«ã¯ãã³ãããåãã«é©çšããããåœã¹ãã«ã¯æ°èŠã³ããããäœããªãïŒã
publish-release çŽåŸã«åŒã°ããã®ãå
žåã ããmaster ã dev ããé²ãã§ããã¿ã€ãã³ã°ãªãåç¬ã§ã䜿ããïŒhotfix ã master ã«çŽæ¥å
¥ããåŸãªã©ïŒã
- PR ãã³ãã¬ã®ç¯æ§æã¯æ¹å€ããªãïŒCLAUDE.md ã«ãŒã«ïŒã
- æ¢ã« open 㪠dev<-master PR ãããå Žåã¯æ°èŠäœæããæ¢å URL ãè¿ãïŒæé 2ïŒã