åã¹ãã«èªäœã®ä»æ§ïŒå®å
šåŒã»æ€èšŒã»æ¬æãã³ãã¬ã»squash merge çŠæ¢èŠåïŒã¯ãã®ãŸãŸæµçšããããã®ã¹ãã«ã¯ å·®åæ
å ±ã®å
èªã¿ã»æ¿èªã®çµ±å ã«å ããsync PR ã® merge commit ããŒãžãŸã§ ãæ
ãã
-
å
±éååŠçïŒãã§ãããš version 解決ïŒ
git fetch origin dev master --tags
version ãæªæå®ãªã:
git show origin/master:package.json | python3 -c "import json,sys;print(json.load(sys.stdin)['version'])"
ã§ååŸãMAJOR.MINOR.PATCH 圢åŒïŒSemVerïŒã§ãªããã°äžæã
-
ãã¬ãã©ã€ãïŒå
šãµãã¹ãã«ã®å®è¡èšç»ãå
èªã¿ïŒ
ãã®æ®µéã§ã¯äœãæžãæãã»push ããªãã以äžãå
šéšå
ã«ç¢ºèªããå®è¡èšç»ã 1 æ¬ã«ãŸãšãããå€±ææ¡ä»¶ïŒéè€ã¿ã°ã»version äžäžèŽã»æ¢åæã«æªããŒãžã³ãããçïŒã¯ããã§æ€ç¥ããæ¿èªã²ãŒãåã«äžæããã
publish-release åŽã®å
èªã¿:
- æ¢åã¿ã°éè€:
git tag --list "v<version>" ãš git ls-remote --tags origin "refs/tags/v<version>" ã®ããããã«åºåãããã°äžæã
- æ¢å Release éè€:
gh release view "v<version>" --json tagName ãå®è¡ããexit 0ïŒ=ååšïŒãªãäžæãexit 1 ã〠stderr ã« release not found ãå«ãå Žåã®ã¿ãéè€ãªãããšããŠç¶è¡ããã以å€ã®é 0 çµäºïŒèªèšŒãšã©ãŒã»ã¬ãŒãå¶éã»éä¿¡é害çïŒã¯å€å®äžèœãªã®ã§äžæããstderr ãå ±åããã
- master HEAD SHA:
git rev-parse origin/master
- master HEAD ä»¶å:
git log -1 --format='%s' origin/master
- package.json version äžèŽç¢ºèª â äžäžèŽã§äžæã
sync-dev-from-master åŽã®å
èªã¿:
- masterâdev å·®åä»¶æ°:
git rev-list --count origin/dev..origin/master ãš git log --pretty='- %s' origin/dev..origin/master
- 0 ä»¶ãªã sync ãã¹ããã ãšããŠãã©ã³ã«èšé²ïŒäžæã§ã¯ãªãïŒã
- æ¢å open 㪠dev<-master PR:
gh pr list --base dev --head chore/dev-from-master --state open --json number,url
- æ¢ã« open ãªã æ°èŠäœæã¯ã¹ããããæ¢å URL ãæµçš ãšããŠãã©ã³ã«èšé²ã
- æ¢å
chore/dev-from-master ã®ç¶æ
ïŒopen PR ãç¡ãåæã§ïŒ:
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
- ããŒã«ã«æª push ã³ãããæç¡:
git show-ref --verify --quiet refs/heads/chore/dev-from-master ã§ããŒã«ã«æã®ååšã確èªããæããªã git cherry origin/chore/dev-from-master ãå®è¡ãåºåã空ã§ãªããã° äžæ ããŠãŠãŒã¶ãŒã«ç¢ºèªïŒèªåã§ã¯åé€ããªãïŒã
- è£è¶³: ãªã¢ãŒã
origin/chore/dev-from-master ãæ¢ã«å逿žã¿ã§ããŒã«ã«æã ãæ®ãã±ãŒã¹ã§ã¯ãgit cherry origin/... 㯠HEAD åºæºã§èª€å°ãããå®äœå€å®ã¯ git log chore/dev-from-master --not origin/masterã»--not origin/dev ããšãã«ç©ºïŒïŒ master/dev ã«å®å
šããŒãžæžã¿ã»åºæã³ãããç¡ãïŒãã§è¡ãã空ãªãå®å
šãªæ®éªžãšããŠåé€å¯Ÿè±¡ã«èšé²ããã
- çŽè¿ PR ã
MERGED â æ¿èªåŸã«åé€ã»åäœæäºå®ãšããŠãã©ã³ã«èšé²ã
- ãã以å€ïŒ
CLOSED ã®ã¿ãPR ç¡ãçïŒâ äžæããŠãŠãŒã¶ãŒã«ç¢ºèªïŒèªåã§ã¯åé€ããªãïŒã
ããŒãžæ¹åŒå¶çŽã®å
èªã¿ïŒdev RulesetïŒ:
OWNER_REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner) ã解決ããgh api "repos/$OWNER_REPO/rules/branches/dev" --jq '.[] | select(.type=="pull_request") | {ruleset_id, allowed: .parameters.allowed_merge_methods}' ãèªãã
allowed_merge_methods ã« merge ãå«ãŸãã â ãããŒãžæã® Ruleset ç·©åã¯äžèŠããšãã©ã³ã«èšé²ã
- å«ãŸããªãïŒ
["squash"] çïŒâ ãããŒãžæã« Ruleset <id> ãäžæç·©åïŒmerge 远å ïŒâããŒãžâ埩å
ããšãã©ã³ã«èšé²ãruleset_id ãæ§ããã
pull_request ã«ãŒã«èªäœãç¡ãïŒPR å¿
é ã§ãªãïŒâ Ruleset ç·©åäžèŠãšããŠãã©ã³ã«èšé²ã
-
æ¿èªã²ãŒãïŒäžæ¬ïŒ
以äžãã©ãŒãããã§å®è¡èšç»ãèŠçŽãã1 åã ã ãŠãŒã¶ãŒæ¿èªãåããæ¿èªãåºããæé 4ã6 ãé£ç¶å®è¡ããéäžã§æ¢ããªããããŒãžãš Ruleset äžæç·©åããã® 1 åã®æ¿èªã«å«ããïŒããŒãžçŽåã§æ¹ããŠæ¿èªãåããªãïŒã
finalize-release å®è¡èšç» (version=v<version>)
[publish-release]
- ã¿ã°: v<version> (annotated, ã¡ãã»ãŒãž "v<version>")
- 察象 SHA: <origin/master SHA>
- master HEAD ä»¶å: <ä»¶å>
- package.json version äžèŽ: OK
- GitHub Release: --target master --generate-notes --latest
[sync-dev-from-master]
- masterâdev å·®å: <N> ä»¶
- æ¢å chore/dev-from-master: <æã (çŽè¿ PR #<M> MERGED) â åé€ã»åäœæ | ç¡ã â æ°èŠäœæ>
- PR: base=dev, head=chore/dev-from-master, title="dev<-master"
- ããŒãž: äœæåŸã« merge commit ã§ããŒãžïŒ--delete-branchïŒ
- dev Ruleset: <merge èš±å¯æžã¿ â ç·©åäžèŠ | squash-only (ruleset #<id>) â äžæç·©å ["squash"]â["squash","merge"] â ããŒãž â 埩å
>
ã¹ãããå€å®æã¯è©²åœã»ã¯ã·ã§ã³ã以äžã«å·®ãæ¿ãã:
- å·®å 0 ä»¶:
[sync-dev-from-master] skip (master 㯠dev ãšåææžã¿)ïŒãã®å ŽåããŒãžã»Ruleset ç·©åãäžèŠïŒ
- æ¢å open PR ãã:
[sync-dev-from-master] æ¢å PR ãæµçš (URL: <url>) â å PR ã merge commit ã§ããŒãž
æ¿èªãåŸãããªããã°äžæã
-
publish-release ã®å®äœãå®è¡ïŒæ¿èªæžã¿åæïŒ
publish-release ã¹ãã«ã®æé 4ã5 ãèµ°ããã:
git tag -a "v<version>" -m "v<version>" <origin/master SHA>
git push origin "v<version>"
gh release create "v<version>" --target master --title "v<version>" --generate-notes --latest
ãã¬ãã©ã€ãã§ç¢ºèªæžã¿ã®é
ç®ïŒã¿ã°ã»Release éè€ãversion äžèŽãSHAïŒã¯ãç Žå£æäœçŽåã« é察話ã§åæ€èšŒ ããïŒè¿œå æ¿èªã¯åããªãïŒãåæ€èšŒã§äžäžèŽãåºãå ŽåïŒäžŠè¡ãªãªãŒã¹çã§ç¶æ
ãå€ãã£ãŠããïŒã¯å®å
šã®ããäžæããæ€ç¥å
容ã®ã¿å ±åããã
-
sync-dev-from-master ã®å®äœãå®è¡ïŒãã¬ãã©ã€ãå€å®ã«åŸãïŒ
- ã¹ãããå€å® â æé ãé£ã°ãã
- æ¢å open PR æµçš â ãã® URL ãå®äºå ±åã«äœ¿ãããã©ã³ãåäœæã PR æ°èŠäœæã¯ããªãã
- éåžžå®è¡ â
sync-dev-from-master ã¹ãã«ã®æé 3ã6 ãèµ°ããã:
- å¿
èŠãªã
git push origin --delete chore/dev-from-masterïŒãã¬ãã©ã€ãã§æ¿èªæžã¿åæãåæ¿èªããªãïŒã
git switch -c chore/dev-from-master origin/master â git push -u origin chore/dev-from-master
- PR æ¬æããã³ãã¬æºæ ã§çµã¿ç«ãŠãŠ
gh pr createïŒrelease_version ã«ã¯æé 1 ã® version ãæž¡ãïŒã
-
sync PR ã merge commit ã§ããŒãžïŒdev Ruleset äžæç·©åã€ãïŒ
sync ã ã¹ãããïŒå·®å 0 ä»¶ïŒãããå Žåã¯ãã®æé ãé£ã°ããæ°èŠäœæã»æµçšããããã§ dev<-master PR ãååšããå Žåã®ã¿å®è¡ãããç·©åâããŒãžâ埩å
㯠1 ã€ã® bash åŒã³åºãã«ãŸãšããset +e ã§ããŒãžå€±æãæ¡ã£ãŠåŸ©å
ãç¡æ¡ä»¶å®è¡ããïŒéäžã§é¢æ°ãåãããŠåŸ©å
ãé£ã¶äºæ
ãé²ãïŒã
ããŒãžåã«ã³ã³ããªã¯ãã確èªããã gh pr view <n> --json mergeable,mergeStateStatus ã CONFLICTING ãè¿ãå Žåãmaster ããç¹å®ã³ãããã ãã cherry-pick ãããªãªãŒã¹ïŒcreate-release-pr ã®ããã®å€æŽã ããæå®ãªã©ïŒã®åŸã«èµ·ãã çæ°ãã¡ã€ã«ã®ããã ãå
žåããã®ãšã㯠Ruleset ç·©åããå
ã« sync-dev-from-master ã®ãçæ°ãã¡ã€ã«ã®ã³ã³ããªã¯ã解決ãã«åŸã£ãŠçæ°ã解決ãïŒæ¬çªçæ°ã®å€æã¯ãŠãŒã¶ãŒæ¿èªãåãïŒãPR ã MERGEABLE ã«ããŠãã 6-3 以éãžé²ããmergeable ã¯ããã·ã¥çŽåŸã«éåæã§å€ãå€ãè¿ãããšããããããgit merge-base --is-ancestor origin/dev origin/chore/dev-from-master ã§æ§é çãªå
å«ã確èªãããšããã
- ããŒãžå¯Ÿè±¡ PR çªå·ã確å®ïŒæé 5 ã§æ°èŠäœæ or æµçšãã PRïŒãããŒã«ã«ã
chore/dev-from-master ã«å±
ããšãã©ã³ãåé€ã§æ¯éãåºããã git switch devïŒãŸãã¯å®å
šãªæïŒãžéé¿ããã
OWNER_REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner) ã解決ããã¬ãã©ã€ãã®ãããŒãžæ¹åŒå¶çŽãèšé²ã䜿ã:
- dev ã
merge ãèš±å¯æžã¿ â ç·©åäžèŠããã®ãŸãŸæé 6-5 ã®ããŒãžãžã
- squash-only çã§
merge äžèš±å¯ â æé 6-3 ã®äžæç·©åãè¡ãã
- äžæç·©åïŒãã«å®çŸ©ãããã¯ã¢ããããŠãã PUTïŒã
RS_ID ã¯ãã¬ãã©ã€ãã§æ§ãã ruleset_id:
RS_ID=<ãã¬ãã©ã€ãã§æ§ãã ruleset_id>
gh api "repos/$OWNER_REPO/rulesets/$RS_ID" > ruleset_backup.json
ruleset_backup.json ãã name,target,enforcement,conditions,bypass_actors,rules ãåãåºããpull_request ã«ãŒã«ã® allowed_merge_methods ã«ã®ã¿ merge ã远å ãã ruleset_relaxed.json ãçæïŒä»ã¯äžåå€ããªããæ¢åæ¹åŒ squash ã¯æ®ãïŒã
gh api -X PUT "repos/$OWNER_REPO/rulesets/$RS_ID" --input ruleset_relaxed.json \
--jq '.rules[] | select(.type=="pull_request") | .parameters.allowed_merge_methods'
- ããŒãžïŒmerge commitïŒ:
gh pr merge <n> --merge --delete-branch
--squash / --rebase ã¯äœ¿ããªãã
- required check äžæç«ã»ã³ã³ããªã¯ãçã§åŒŸãããŠã force/admin ããŒãžããªããããŒãžå€±æã¯æ¡ã£ãŠæ¬¡ã®åŸ©å
ãžé²ãïŒPR 㯠open ã®ãŸãŸæ®ãïŒããªã
mergeStateStatus=UNSTABLEïŒå¿
é ã§ãªã倱æãã§ãã¯ãããã ãïŒã¯éåžžããŒãžå¯èœã
- 埩å
ïŒç·©åããå Žåã¯å¿
ãå®è¡ïŒ:
gh api -X PUT "repos/$OWNER_REPO/rulesets/$RS_ID" --input ruleset_backup.json \
--jq '.rules[] | select(.type=="pull_request") | .parameters.allowed_merge_methods'
ããŒãžã倱æããŠããŠã Ruleset ã¯å¿
ã埩å
ããã 埩å
ã® PUT èªäœã倱æããå Žåã¯æåªå
ã§ãŠãŒã¶ãŒã«ç¥ãããïŒRuleset ãç·©ãããŸãŸæŸçœ®ããªãïŒã
- æ€èšŒ:
git fetch origin dev master åŸã
- dev HEAD ã 2 芪ãæã€ merge commitïŒsquash ãããŠããªãïŒã§ããããš:
git rev-list --parents -n 1 origin/dev ã®èŠªã 2 ã€ã
git rev-list --count origin/dev..origin/master ã 0ïŒdev ã master ãå®å
šå
å«ïŒã
- äžæãã¡ã€ã«
ruleset_backup.json / ruleset_relaxed.json ãåé€ããããŒã«ã« dev ã git pull --ff-only origin dev ã§è¿œåŸãããã
-
å®äºå ±å
1 ã¬ã¹ãã³ã¹ã§ä»¥äžãå ±åãã:
- publish-release ã®çµæ: ã¿ã°åã察象 SHAãRelease URLãLatest å€å®ãRelease æ¬æã®åé æ°è¡ãµããª
- sync-dev-from-master ã®çµæ:
- éåžžå®è¡æ: PR URLãåã蟌ã¿ã³ãããä»¶æ°ã倿Žã®çš®é¡ã»ãã¹ãæ¬ãã§ãã¯ç¶æ
- ã¹ãããæ:
skip (å·®åãªã)
- æµçšæ:
æ¢å PR ãæµçš: <url>
- ããŒãžçµæïŒsync PR ãååšããå ŽåïŒ:
- æåæ: ããŒãžã³ããã SHAïŒ2 芪㮠merge commit ã§ããæšïŒã
origin/dev..origin/master = 0ãdev Ruleset ã <äžæç·©åã㊠merge commit ã§ããŒãžâ埩å
ïŒ["squash"] ã«åŸ©åž°ïŒ| ç·©åäžèŠïŒmerge èš±å¯æžã¿ïŒ>
- 倱ææ: PR 㯠open ã®ãŸãŸã»Ruleset ã¯åŸ©å
æžã¿ã§ããæšãæç€ºãã
sync-dev-from-master åç¬åå®è¡ã§ã¯ãªãæåœãŠã®æ¹éïŒCI ä¿®æ£åŸã«æå or åããŒãžïŒãæ¡å
- â è£è¶³: sync PR ã merge commit ã§ããŒãžããïŒsquash ããŠããªãïŒããšãæç€ºãsquash ãããš merge commit æ§é ãæœ°ã㊠dev/master å±¥æŽãå£ããïŒPR #5838 / #5840 ã®æèšïŒãæåã§ããŒãžãçŽãç¶æ³ã«ãªã£ãå Žåãå¿
ããCreate a merge commitãã䜿ãããšã