ããã«ã¡ã¯ãã©ã¤ã¯ã«äºæ¥é¨ ã¨ã³ã¸ãã¢ã®èæ± @kichionã§ã
å»å¹´(2021å¹´)ããããã³ãã¨ã³ãç°å¢ã®ç«ã¡ä¸ããè¡ããç¾å¨ã¯ããã¯ã¨ã³ãã«æ»ã£ã¦ãã¦æè¡è² åµã®è§£æ¶ãªã©ãä¸å¿ã«ã·ã¹ãã æ¹åãè¡ã£ã¦ãã¾ã
ã©ã¤ã¯ã«ã§ã¯æ©ããããã¤ã¯ããµã¼ãã¹åã«ãããã³ã¼ããã¼ã¹ã30è¿ãGithub repositoryã«åæ£ãã¦ããéè¤ã³ã¼ããæ£ä¹±ãã¦ããç¶æ
ã§ãã
ä»åã¯ã³ã¼ããã¼ã¹ã®å
±éåçã¨ãã¦golangã§æ¸ããã社å
ç¨ã®ã©ã¤ãã©ãªãé
å¸ããæ¹æ³ãç´¹ä»ãã¾ã
åæ
å¤é¨API
ã©ã¤ã¯ã«ã§ã¯äºæ¥ãã¡ã¤ã³ã¨ãã¦Google Business Profileã¨å¼ã°ããGoogle æ¤ç´¢/ããããªã©ã«ãåºã®æ
å ±ã表示ãããã¼ã«ãå©ç¨ãã¾ã
ãã®ãããåã·ã¹ãã ããBusiness Profile APIsã使ãã¾ã
éçºè¨èª
ã©ã¤ã¯ã«ã§ã¯ä»åç´¹ä»ãã社å ã©ã¤ãã©ãªã¨åã·ã¹ãã ã®ããã¯ã¨ã³ãéçºè¨èªã¨ãã¦golangãæ¡ç¨ãã¦ãã¾ã
Github Organization
SOTã¨ãã¦Github Organizationã®GitHub Team Planãå©ç¨ãã¦ãã¾ã
åºæ¬çã«ã¢ããªã±ã¼ã·ã§ã³ã®ã³ã¼ãã¯private repositoryã§ç®¡çããã¦ãããGithub Actionsã®å©ç¨ãTeamãã©ã³ã®å¶éå
ã§è¡ã£ã¦ãã¾ã
解決ãããã£ãåé¡
ã©ã¤ã¯ã«ã§ã¯åæ£ããã³ã¼ããã¼ã¹ãããããå¤é¨ã®APIï¼ä»¥ä¸ãGBP APIï¼ãå©ç¨ãã¦ãããGBP APIå®è¡ã®ã³ã¼ãã忣ãã¦ãã¾ãã
Tokenå©ç¨ããªãã©ã¤æ¹æ³(exponential backoffãªã©)ãé¨åçã«éè¤ãã¦ãããå¤ãrepositoryã§ã¯ãªãã©ã¤ãªã©ãè¡ããªããªã©ã®åé¡ãããã¾ãã
ä¸è¨ã以å¤ã«ãæ§ã ãªåé¡ãæµ®ã彫ãã«ãªãã¾ãã
- ã³ã¼ããDRYã§ã¯ãªã
- Tokenå©ç¨ããªãã©ã¤æ¹æ³ãåä¸ã§ã¯ãªãã®ã§ã·ã¹ãã ã®èªç¥è² è·ãé«ã
- GBP APIã¯ã©ã¤ã¢ã³ãã©ã¤ãã©ãªãgolangã§ã¯åå¨ããªã
- GBP API version upã®åº¦ã«ã³ã¼ãã®ã³ãããå¿ è¦ã«ãªã
äºæ¥è¦æãå¶ããããã«ã·ã¹ãã ã®æ°ãå¢ãããçµæGBP APIã®version up対å¿ãè¾ããªããä»åã®å ±éåãè¡ããã¨ã«ãªãã¾ãã
社å ã©ã¤ãã©ãªé å¸
å®éã«åãçµãã 社å ã©ã¤ãã©ãªé å¸ã®ä»çµã¿ãç´¹ä»ãã¾ã
é å¸ããã¼

åé ç®
- golang private repositoryã«tag pushãè¡ã
- tag pushã§Github Actionsãèµ·åãã
- Github Actionsããé å¸å ã®repositoryã«å¯¾ãã¦dispatch eventãéç¥ãã
- é å¸ãåããrepositoryã®Github Actionsãèµ·åãã
- golang packageãversion upãã¦Pull Requestã使ãã
é å¸å ã®æ§æ
Githubä¸ã§private repositoryã使ããgolangã§ã³ã¼ããæ¸ãã¾ã
å®éã«é
å¸å
ã¨ãã¦è¡ãè¨å®ãªã©ã¯Github Actionsã«éç´ãã¾ã
Github Actions workflow
Github Actionsã§æåããªã¬ã¼ã¨ãã¦ç¨æããã¦ããrepository dispatchãå©ç¨ããjobãçµã¿ã¾ã
å®éã«dispatch eventãèãéã«ã¯å
¬éããã¦ããActionã§å©ç¨ã§ãããã®ãè¦ã¤ããã®ã§æ¡ç¨ãã¾ã
github/workflows/dispatch-update.yaml
name: dispatch-update on: push: tags: - 'v*' jobs: release: strategy: fail-fast: false matrix: # é å¸å ãå¢ããã¨ãã«è¿½å ãã repo: ['repo1', 'repo2','repo3','repo4'] name: dispatch runs-on: ubuntu-latest steps: - name: dispatch update module uses: peter-evans/repository-dispatch@v1 with: repository: ${{ OrganizationName }}/${{ matrix.repo }} token: ${{ secrets.REPO_ACCESS_TOKEN }} event-type: update-gbpapi-client
secrets.REPO_ACCESS_TOKENã«ã¯Personal access tokenãå©ç¨ãããGithub App Tokenãå©ç¨ãããçæ§ã
ãªæ¹æ³ãããã¾ã
ä»åã¯Full control of private repositoriesãªPersonal access tokenãæ¡ç¨ãã¦ãã¾ã
â» Github App Tokenã®å©ç¨æ¹æ³ãç¥ã£ãã®ã¯å¼ç¤¾ããã¯ããã°ã®å²¸ç°ããã®è¨äºã ã£ãã®ã¯å ç·ã§ã
Github App Tokenã§ã®è¨å®ã«ã¤ãã¦ã¯ä¸è¨ã®ããã°ããåç §ãã ãã
é å¸å ã®æ§æ
ãã¡ããGithubä¸ã§private repositoryã使ãgolangã§ã³ã¼ããæ¸ãã¾ã
é
å¸eventã®åãåãã¨ãã¦ã¯ä»¥ä¸ã®2ç¹ãå¿
è¦ã§ã
- dispatchãåãä»ãã
- private repositoryã®golang packageãgo getã§ããããã«ãã
Github Actions workflow
repository dispatchãåãåãã¤ã¤ãpackage updateããPRã使ãã¾ã
ãã®éã«private repositoryããgo getã§ããããã«ãããããOAuthãã¼ã¯ã³ã使ã£ã¦gitåç
§ãè¡ãã¾ã
ã¾ããprivate repositoryã®golang packageãå±éããããã«GOPRIVATEè¨å®ãç¨ãã¾ã
â» CICDã§go getãè¡ãå ´åã§ãGOPRIVATEè¨å®ãå©ç¨ããå¿
è¦ãããã¾ã
.github/workflows/update-gmbapi-client.yml
name: update-gbpapi-client on: repository_dispatch: types: - update-gbpapi-client jobs: create-pull-request: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 with: go-version: 1.17.3 - name: Set up github token run: git config --global url."https://${{ secrets.LYCLE_GO_MODULES_TOKEN }}:[email protected]/".insteadOf "https://github.com/" - name: Set current client version id: current run: | current_version=$(go list -m all | grep -o -E "(github.com/{{ OrganizationName }}/gbpapi-client .*)?" | grep -o -E "([0-9]+\.){1}[0-9]+(\.[0-9]+)?" | head -n1) current_major_version=$(echo "${current_version}" | grep -o -E "([0-9]+\.)" | head -n1) current_minor_version=$(echo "${current_version}" | grep -o -E "([0-9]+\.)" | tail -n1) echo "current_major_version=${current_major_version}" >> $GITHUB_ENV echo "current_minor_version=${current_minor_version}" >> $GITHUB_ENV - name: Update gmbapi client run: GOPRIVATE="github.com/{{ OrganizationName }}/*" go get github.com/{{ OrganizationName }}/gbpapi-client@latest - name: go mod tidy run: go mod tidy - name: Set latest client version id: latest run: | latest_version=$(go list -m all | grep -o -E "(github.com/{{ OrganizationName }}/gbpapi-client .*)?" | grep -o -E "([0-9]+\.){1}[0-9]+(\.[0-9]+)?" | head -n1) latest_major_version=$(echo "${latest_version}" | grep -o -E "([0-9]+\.)" | head -n1) latest_minor_version=$(echo "${latest_version}" | grep -o -E "([0-9]+\.)" | tail -n1) echo "latest_major_version=${latest_major_version}" >> $GITHUB_ENV echo "latest_minor_version=${latest_minor_version}" >> $GITHUB_ENV - name: Create Pull Request id: cpr uses: peter-evans/create-pull-request@v3 with: title: "⨠Update GBP API Client" base: staging branch: update-gbpapi-client - name: pull request auto merge if: env.current_major_version == env.latest_major_version && env.current_minor_version == env.latest_minor_version env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: gh pr merge ${{ steps.cpr.outputs.pull-request-url }} --merge
ã©ã¤ã¯ã«ãã¼ã ã§ã¯ãã¤ãã¼ã¢ãããã¼ãã®å ´åã¯ãªã¼ããã¼ã¸ãããã¨ããè¦æ±ããã£ãããããã¼ã¸ã§ã³å·®ç°ã確èªãã¦PRããã¼ã¸ãããã¸ãã¯ãçµãã§ãã¾ã
GOPRIVATE
golang v1.13ã§è¿½å ãããè¨å®ã§ã
golang v1.13ããã¯ããã©ã«ãã§sum.golang.orgã«ããå
¬éã®Go checksum databaseã¨ç
§åãã¦æ¤è¨¼ããããã«ãªã£ã¦ãã¾ã
対象ã®ã¢ã¸ã¥ã¼ã«ãprivate repositoryã«ããå ´åã¯checksum databaseã«è¨é²ãããªããããæ¤è¨¼ã失æãã¦ãã¦ã³ãã¼ããã§ãã¾ãã
GOPRIVATEãè¨å®ãããã¨ã§å¯¾è±¡ã®ãã¹ãæ¤è¨¼å¤ã®ãã®ã¨ãã¦æ±ãããã«ã§ãã¾ã
çµããã«
ä¸è¨ã®é å¸ãè¡ã£ã¦ãåé¡ã®è§£æ¶ã«åãã¦å¤§ããåé²ã§ãã¾ãã
- Tokenå©ç¨ããªãã©ã¤å¦çãªã©ãå ±éåã§ãã
- GBP APIã®version upãè¡ãããããªã£ã
- é å¸å ã®GBP API version up対å¿ãèªå使ã®ãã©ã³ãããéå§ãããããªã£ã
GOPRIVATEãå©ç¨ãããã¨ã§APIã®ã¯ã©ã¤ã¢ã³ãã©ã¤ãã©ãªä»¥å¤ã®å
±éå¦çãã©ã¤ãã©ãªåãããããªãã¾ãã
ããããpubsubã£ã½ãä»çµã¿ã®å²ã«ã¯é
å¸å
ã®workflowã«ãªãã¸ããªåã追å ããå¿
è¦ãããããã«ã¯èª²é¡ãæ®ãã¾ã
ãããããMonorepoã§è¯ãã£ãããã¼ãã¨æããé¨åã®ãã¼ã¸ä½æ¥ãªã©æ³¥èãé¨åã®è§£æ¶ã¯ä»å¾ãç²ã
ã¨ç¶ãã¦ããã¾ã