Publish:

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

Github Action ์„ ์ด์šฉํ•ด Pull Request ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  auto-merge ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ ์šฉํ•˜๋ฉด์„œ ๊ฒช์—ˆ๋˜ ์˜ค๋ฅ˜ ์ƒํ™ฉ๊ณผ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

PR ์ƒ์„ฑ์˜ ๊ท€์ฐฎ์Œ..

github flow ๋ฅผ ์ด์šฉํ•ด ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋˜๋ฉด Pull Request ์ƒ์„ฑ์ด ํ•„์ˆ˜๋‹ค. ๋ฌธ์ œ๋Š” ๋กœ์ปฌ์—์„œ push ๋ฅผ ํ•œ ํ›„, github ์— ์ ‘์†ํ•ด PR ์„ ์ง์ ‘ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋ฌผ๋ก , ์ด ๊ณผ์ •์—์„œ ์ž‘์—… ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋ฉด์„œ ํ•œ๋ฒˆ ๋” ์ ๊ฒ€ํ•  ์ˆ˜๋„ ์žˆ์–ด ์ˆ˜๋™์œผ๋กœ ์ง์ ‘ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๊ฐ„๋‹จํ•œ ์Šคํ„ฐ๋”” ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—” ์ผ์ผ์ด ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ • ์ž์ฒด๊ฐ€ ๋‹จ์ˆœ ๋ฐ˜๋ณต์ ์ธ ๊ณผ์ •์œผ๋กœ ๋А๊ปด์กŒ๋‹ค.

PR ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” Action

์—ญ์‹œ๋‚˜.. ์ด๋ฏธ Github Action marketplace ์—๋Š” PR ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” workflow ๊ฐ€ ์˜ค๋ž˜์ „๋ถ€ํ„ฐ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์—ˆ๋‹ค.

๊ทธ ์ค‘ star ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ๊ณ , Github staff ๊ฐ€ ์ง์ ‘ ๋งŒ๋“  Crate Pull Request ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

๊ธฐ๋ณธ์ ์ธ ์ž‘์„ฑ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์—ฌ๊ธฐ์— ์˜ต์…˜์œผ๋กœ branch, base, title, body, labels, assignees, reviewers ๋“ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.

  • branch: pr ์‹œ ์ž‘์—… ๋ธŒ๋žœ์น˜ (feature ๋ธŒ๋žœ์น˜ ๋“ฑ)
  • base: ์†Œ์Šค๋ฅผ ํ†ตํ•ฉํ•  ๋ธŒ๋žœ์น˜ (main ๋ธŒ๋žœ์น˜ ๋“ฑ)
  • title: PR ์˜ ์ œ๋ชฉ
  • body: PR ์˜ ๋‚ด์šฉ
  • labels: PR ๋ผ๋ฒจ
  • assignees: PR ์„ ์ž‘์„ฑํ•œ ์‚ฌ๋žŒ
  • reviewers: PR ๋ฆฌ๋ทฐํ•  ์‚ฌ๋žŒ
1
2
3
4
5
6
- uses: actions/checkout@v4

# Make changes to pull request here

- name: Create Pull Request
  uses: peter-evans/create-pull-request@v7

๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ๋‚˜ workflow ๊ฐ€์ด๋“œ๋ฅผ ๋ด๋„ ๊ต‰์žฅํžˆ ์‚ฌ์šฉ๋ฒ•์ด ๊ต‰์žฅํžˆ ๊ฐ„๋‹จํ•ด ๋ณด์ธ๋‹ค. ๋ฐ”๋กœ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด ๋ดค๋‹ค.

๋ฌธ์ œ

title ์€ ๋‹จ์ˆœํžˆ ์ž‘์—… ๋ธŒ๋žœ์น˜์—์„œ main ๋ธŒ๋žœ์น˜๋กœ ํ‘ธ์‹œํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ‘œ์‹œํ•˜๊ณ , body ์˜ ๋‚ด์šฉ์œผ๋กœ๋Š” ๋ธŒ๋žœ์น˜ ํ‘ธ์‹œ ์ƒํƒœ์™€ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. assignees ์˜ ๊ฒฝ์šฐ ๋กœ์ปฌ์—์„œ push ํ•œ ์‚ฌ๋žŒ์˜ github ๊ณ„์ •์ด ์ฐํ˜€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ${{ github.actor }} ๋กœ ์ž‘์„ฑํ•˜๊ณ , reviewers ๋Š” ํŒ€์› ์ „์ฒด๊ฐ€ ์„ ํƒ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ github var ์— ์ง์ ‘ REVIEWERS ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ธ์›์ˆ˜์— ๋งž๊ฒŒ , ๋กœ ๊ตฌ๋ถ„ํ•ด ๋“ฑ๋กํ–ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
name: Auto PR and Merge

on:
  push:
    branches:
      - 'sw**'
      - 'cm**'

jobs:
  create-pull-request:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Create Pull Request
        id: cpr
        uses: peter-evans/create-pull-request@v7
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          base: main
          branch: ${{ github.ref_name }}
          title: "[auto] ${{github.ref_name}} โ†’ main"
          body: |
            - ์ž๋™ PR: `${{ github.ref_name }} โ†’ main`
            - ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€: `${{ github.event.head_commit.message }}`
          labels: auto-merge
          assignees: ${{ github.actor }}
          reviewers: ${{ vars.REVIEWERS }}
          draft: false

์ด๋Œ€๋กœ ๋งŒ๋“ค๊ณ  ๋กœ์ปฌ์—์„œ push ํ•˜๋ฉด github ์— ์ž๋™์œผ๋กœ PR ์ด ์ƒ์„ฑ๋  ์ค„ ์•Œ์•˜๋Š”๋ฐ, ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์ง€๋„ ์•Š์„ ๋ฟ๋”๋Ÿฌ ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ•ด๋„ ์•„๋ฌด๋Ÿฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์—†์–ด main ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ์„ ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด์—ˆ๋‹ค.

actions setting ๋ฌธ์ œ

์ฐพ์•„๋ณด๋‹ˆ github action ๊ถŒํ•œ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋‚˜์™€์„œ ์„ค์ •์„ ๋‹ค์‹œ ํ•ด์คฌ๋‹ค. Repository > Settings > Actions > General ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด ๋งจ ์•„๋ž˜ ๋ถ€๋ถ„์— Workflow permissions ๋ถ€๋ถ„์ด ์žˆ๋‹ค.

Read and Write ๊ถŒํ•œ์„ ์ฒดํฌํ•˜๊ณ , ์•„๋ž˜์— Github Actions ๊ฐ€ PR ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ๋„ ์ฒดํฌํ•œ๋‹ค.

์ž˜๋ชป๋œ branch ์˜ต์…˜ ์‚ฌ์šฉ

์ด๋ฒˆ์—” action ์€ ์ž‘๋™ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ PR ์ž๋™ ์ƒ์„ฑ์€ ๋˜์ง€ ์•Š์•˜๋‹ค. workflow ๋กœ๊ทธ ๋‚ด์—ญ์„ ๋ณด๋‹ˆ ๊ณ„์† main ๊ณผ feature ๋ธŒ๋žœ์น˜๊ฐ€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์—†์–ด ๋ณ‘ํ•ฉ์ด ์•ˆ๋œ๋‹ค๊ณ  ๋‚˜์™”๋‹ค. ๋ถ„๋ช… ๋กœ์ปฌ์—์„œ๋Š” ์ž‘์—…ํ•œ ๋‚ด์šฉ์ด ์žˆ๊ณ , ์ด๋ฅผ push ํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์—†๋‹ค๊ณ  ํ•˜๋‹ˆ ๋„์ €ํžˆ ์›์ธ์„ ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†์—ˆ๋‹ค.

1
2
3
fatal: remotes/origin/main...remotes/origin/sw-test4: no merge base

[INFO] Both branches are the same. No action needed.

๊ต‰์žฅํžˆ ๋งŽ์€ ์‹œ๋„์™€ ์ˆ˜์ •์„ ๊ฑฐ๋“ญํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ PR ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๋‹ค.. ๊ฒฐ๊ตญ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ง์ ‘ ์ด์Šˆ๋ฅผ ๋‚จ๊ฒจ ๋ฌผ์–ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. issues ์— ๋“ค์–ด๊ฐ€๋ณด๋‹ˆ ๋ญ”๊ฐ€ ๋น„์Šทํ•œ ์ƒํ™ฉ์„ ๊ฒช๊ณ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฝค ์žˆ๋Š”๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์—ฌ์„œ ๋จผ์ € ํ•ด๋‹น ๊ธ€๋“ค์„ ํ™•์ธํ•ด ๋ดค๋‹ค. ๋ญ”๊ฐ€ branch ์„ค์ •์— ๋Œ€ํ•œ ์ด์Šˆ ๊ฐ™์•˜๋‹ค. ๋‚˜๋„ ๋‚ด ๋ฌธ์ œ๋ฅผ ์ด์Šˆ๋กœ ๋‚จ๊ฒจ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

๋‹คํ–‰ํžˆ ๋‹ต๋ณ€์ด ํ•˜๋ฃจ๋งŒ์— ๋„์ฐฉํ•ด ํ™•์ธํ•ด๋ดค๋‹ค. ์—ญ์‹œ branch ์˜ต์…˜์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ์ž˜๋ชป๋˜์—ˆ๋‹ค. github.ref_name ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ branch ์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ์ปฌ์—์„œ sw-test ๋ผ๋Š” ๋ธŒ๋žœ์น˜ ๋ช…์œผ๋กœ push ํ•˜๊ฒŒ ๋˜๋ฉด sw-test ๋ผ๋Š” ๊ฐ’์ด ์ € ๋ณ€์ˆ˜ ๋Œ€์‹  ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ ๊ธ€์ด๋‚˜ Crate Pull Request action ๋ฉ”๋‰ด์–ผ์„ ๋ด๋„ ๋ธŒ๋žœ์น˜ ๋ช…์„ ์ง์ ‘ ๋ช…์‹œํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜์™€ ์žˆ์–ด, ๊ทธ๋ƒฅ ๋ธŒ๋žœ์น˜ ๋ช…๋งŒ ์ ์œผ๋ฉด ๋˜๋Š” ์ค„ ์•Œ์•˜๋‹ค. ์ €๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ ์ด๋ผ๋Š” ์ƒ๊ฐ์€ ์ „ํ˜€ ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

์•„๋งˆ workflow ๊ฐ€ ๋™์ž‘ํ•˜๋ฉด์„œ ๋‚ด๋ถ€์ ์œผ๋กœ github ์•ก์…˜์„ ํŠธ๋ฆฌ๊ฑฐ ํ•œ branch ์˜ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค. GPT ์— ๋ฌผ์–ด๋ณด๋‹ˆ github.event.ref ๋ฐฉ์‹์œผ๋กœ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ํ•ด๋‹น ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ด ๋ดค๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
jobs:
  auto-pr:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Code
        uses: actions/checkout@v3

      - name: Create Pull Request to main
        id: create_pr
        uses: peter-evans/create-pull-request@v7
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          base: main
          branch: ${{ github.event.ref }}  # refs/heads/sw-test
          title: "[auto] ${{ github.event.head_commit.message }}"
          body: |
            ์ž๋™ PR ์ƒ์„ฑ: `${{ github.ref_name }} โ†’ main`
            ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€: `${{ github.event.head_commit.message }}`
          labels: auto-merge
          assignees: ${{ github.actor }}
          reviewers: ${{ vars.REVIEWERS }}
          draft: false

github token ๋ฌธ์ œ

์ด๋ฒˆ์—” ๋“œ๋””์–ด ์ž๋™์œผ๋กœ PR ์ด ์ƒ์„ฑ๋˜์—ˆ๋‹ค!

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒˆ์—๋Š” GitHub Actions Bot์ด PR์„ ์ƒ์„ฑํ•˜๋ฉด์„œ, ์ฝ”๋“œ๋ฅผ pushํ•œ ์ž‘์„ฑ์ž์กฐ์ฐจ๋„ ์Šค์Šค๋กœ approve(์Šน์ธ)ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ํ˜„์žฌ branch protection rule ์— 1๋ช…์ด ์Šน์ธํ•  ๊ฒฝ์šฐ merge ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •์ด ๋˜์–ด ์žˆ์–ด, ์ด๋ ‡๊ฒŒ ๋  ๊ฒฝ์šฐ ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ์ƒ๋Œ€๋ฐฉ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์—†์ด ์ฝ”๋“œ ์ž‘์„ฑ์ž๊ฐ€ ์Šค์Šค๋กœ ๋ณ‘ํ•ฉํ•˜๊ฒŒ ๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ํ˜ผ์ž์„œ ์ž‘์—…ํ•˜๋Š” ์ €์žฅ์†Œ์˜ ๊ฒฝ์šฐ์—๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ, ๊ณต๋™ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ค‘์š”ํ•œ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

์œ„ token ์˜ต์…˜์— secrets.GITHUB_TOKEN ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ๋”ฐ๋กœ secrets ์— ์ •์˜ํ•  ํ•„์š”์—†์ด github ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ํ† ํฐ์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉฐ, PR ์ƒ์„ฑ์˜ ์ฃผ์ฒด๋Š” Bot ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

โœ… Personal Access Token (PAT) ์‚ฌ์šฉ

Create Pull Request ๋ฉ”๋‰ด์–ผ์— Personal Access Token (PAT) ์‚ฌ์šฉ ์‹œ ๊ถŒํ•œ ์„ค์ •์— ๋Œ€ํ•ด ์ž˜ ๋‚˜์™€ ์žˆ์–ด GH_TOKEN ์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํ† ํฐ์„ ๋งŒ๋“ค๊ณ  secrets ์— ๋“ฑ๋กํ•ด ์คฌ๋‹ค. ๊ทธ๋ฆฌ๊ณ  yml ํŒŒ์ผ token ๋ถ€๋ถ„๋„ secrets.GH_TOKEN ์œผ๋กœ ์ˆ˜์ • ํ›„ ๋‹ค์‹œ ํ…Œ์ŠคํŠธ ํ•ด๋ดค๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์ƒ๋Œ€๋ฐฉ์ด ์ž‘์„ฑํ•œ PR ์ด ๋‚ด ๋‹‰๋„ค์ž„(zhtmr) ์œผ๋กœ ์˜ฌ๋ผ๊ฐ”๋‹ค. ๋‚ด ๊ณ„์ •์—์„œ ๋งŒ๋“  ํ† ํฐ(GH_TOKEN)์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋˜ํ•œ ์˜† Reviewer ๋„ ๋งž์ง€ ์•Š๊ฒŒ ์ถœ๋ ฅ๋œ๋‹ค.

โœ… Assignees ์™€ Reviewer ๊ฐ€ ๋™์ ์œผ๋กœ ๋ณ€ํ•ด์•ผ ํ•œ๋‹ค.

์ž‘์„ฑ์ž ๊ณ„์ •์€ PAT ๋ฅผ ๋งŒ๋“  ๊ณ„์ •์„ ๋”ฐ๋ผ๊ฐ„๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ–ˆ๋‹ค. ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค.

  • PR ์˜ ์ž‘์„ฑ์ž ๋‹‰๋„ค์ž„์€ ์‹ค์ œ๋กœ push ํ•œ ๊ณ„์ • ๋‹‰๋„ค์ž„์ด ํ‘œ์‹œ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • Assignees ์—” ์‹ค์ œ ์ž‘์„ฑ์ž๊ฐ€ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๊ณ , Reviewers ์—๋Š” ์ž‘์„ฑ์ž๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์ธ์›์ด ํ‘œ์‹œ๋˜์–ด์•ผ ํ•œ๋‹ค.
token ํŒŒ์‹ฑ

๋จผ์ € PR ์ž‘์„ฑ์ž ๋‹‰๋„ค์ž„์„ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ push ํ•œ ๊ณ„์ •์œผ๋กœ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„  ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌ ์ค‘์ธ ๋ชจ๋‘๊ฐ€ PAT ๋ฅผ ๋ฐœ๊ธ‰ ๋ฐ›์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. github ์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ ํŒ€์›๋“ค์˜ ํ† ํฐ์„ secrets ์— ๋ชจ๋‘ ๋“ฑ๋กํ•ด ์ค€๋‹ค. (GH_TOKEN, GH_TOKEN_CM)

๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ push ํ•˜๋Š” ๊ณ„์ •์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค. push ๋ฅผ ํ•˜๋Š” ๊ณ„์ •์—์„œ github action workflow ๊ฐ€ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์‹ฑํ•˜๋Š” ๋กœ์ง์ด ํ•„์š”ํ•˜๋‹ค. steps ๋ถ€๋ถ„์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
steps:
    - name: Install yq
      run: sudo apt-get update && sudo apt-get install -y yq

    - name: Load token map
      id: token-map
      run: |
        ACTOR="${{ github.actor }}"
        TOKEN_VAR=$(yq ".\"$ACTOR\"" .github/workflows/user-token-map.yml | tr -d '"')  # ์Œ๋”ฐ์˜ดํ‘œ ์ œ๊ฑฐ!
        echo "token_var=$TOKEN_VAR"
        echo "token_var=$TOKEN_VAR" >> $GITHUB_OUTPUT

user-token-map.yml ๋‚ด๋ถ€์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด assignees ๊ฐ€ ๋  ๋‹‰๋„ค์ž„๊ณผ token secrets ๋ณ€์ˆ˜๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค. ๊ผญ yml ์— ์ •์˜ํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๋‹ค๋ฅธ ํ˜•์‹์˜ ํŒŒ์ผ๋กœ ์ •์˜ํ•ด๋„ ๋˜๊ณ , ํŒŒ์ด์ฌ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋„ ์ƒ๊ด€์—†๋‹ค.

1
2
cmnowhere: GH_TOKEN_CM
zhtmr: GH_TOKEN

Load token map ๋‹จ๊ณ„์—์„œ TOKEN_VAR ๋ณ€์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด ์ง€๋Š”๋ฐ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ดํ›„ create pull request ํ•˜๋Š” ๋‹จ๊ณ„์˜ token ์˜ต์…˜ ์—์„œ ์‚ฌ์šฉ๋  ์˜ˆ์ •์ด๋‹ค. ์ฃผ์˜ํ•  ์ ์€ ๊ธฐ์กด์— ํ† ํฐ ๊ฐ’์„ ์ž…๋ ฅํ• ๋•Œ secrets.GH_TOKEN ๋ฐฉ์‹์œผ๋กœ ์ž…๋ ฅ ํ–ˆ๋“ฏ์ด secrets ๋‹ค์Œ์— .(๋งˆ์นจํ‘œ)๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์นจํ‘œ๊นŒ์ง€ ๊ฒฐ๊ณผ์— ๊ฐ™์ด ํฌํ•จ์‹œ์ผœ์•ผ ํ•œ๋‹ค. (".\"$ACTOR\"")

Reviewer ํŒŒ์‹ฑ

๊ธฐ์กด์— ์ด๋ฏธ github var ์— REVIEWER ๋Š” ๋“ฑ๋กํ•ด ๋‘์—ˆ์œผ๋‹ˆ ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

1
2
3
4
5
6
7
- name: Set reviewers except self
  id: reviewers
  run: |
    ALL_REVIEWERS="${{ vars.REVIEWERS }}"
    ACTOR="${{ github.actor }}"
    FILTERED=$(echo "$ALL_REVIEWERS" | tr ',' '\n' | grep -v "^$ACTOR$" | paste -sd "," -)
    echo "filtered=$FILTERED" >> $GITHUB_OUTPUT

๋ชจ๋“  ๋ฆฌ๋ทฐ์–ด(์ž‘์„ฑ์ž ํฌํ•จ)์—์„œ ์ž‘์„ฑ์ž๋ฅผ ์ œ์™ธํ•˜๋Š” ๋ฐฉ์‹(grep -v)์œผ๋กœ FILTERED ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค. ์ดํ›„ create pull request ๋‹จ๊ณ„์—์„œ reviewers ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋  ์˜ˆ์ •์ด๋‹ค.

๊ฐœ์„ 

create pull request

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- name: Create Pull Request to main
  id: create_pr
  uses: peter-evans/create-pull-request@v7
  with:
    author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
    committer: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
    token: ${{ secrets[steps.token-map.outputs.token_var] }}
    base: main
    branch: ${{ github.event.ref }}
    title: "[auto] ${{ github.event.head_commit.message }}"
    body: |
      ์ž๋™ PR ์ƒ์„ฑ: `${{ github.ref_name }} โ†’ main`
      ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€: `${{ github.event.head_commit.message }}`
    labels: auto-merge
    assignees: ${{ github.actor }}
    reviewers: ${{ steps.reviewers.outputs.filtered }}
    draft: false

token ๋ถ€๋ถ„๊ณผ reviewers ๋ถ€๋ถ„์— ์œ„์—์„œ ์ž‘์—…ํ•œ ๋ณ€์ˆ˜ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค. reviewer ์˜ ๊ฒฝ์šฐ ๊ฐ’ ์ž์ฒด๊ฐ€ ์น˜ํ™˜๋˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ${{ steps.reviewers.outputs.filtered }} ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ”๋กœ ๋ณ€์ˆ˜๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ token ์˜ ๊ฒฝ์šฐ secrets ์ดํ›„ ๋ถ€๋ถ„๋งŒ ๋ฐ”๋€Œ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ— ๋ฐฉ์‹์œผ๋กœ๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ( ${{ secrets.์ด๋ถ€๋ถ„ }} )

(์•„๋‹ˆ๋ฉด token ํŒŒ์‹ฑ ์‹œ ์• ์ดˆ์— secrets ๋ผ๋Š” ๋‹จ์–ด๊นŒ์ง€ ํŒŒ์‹ฑํ•ด์„œ ๊ฐ€์ ธ์™€๋„ ๋ ๋“ฏ)

๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ์ด๋ฆ„์„ secrets ์˜ ๊ฐ’์œผ๋กœ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ด„ํ˜ธ์•ˆ์— ์ •์˜ํ•œ๋‹ค.

1
${{ secrets[steps.token-map.outputs.token_var] }}

์ •์ƒ์ ์œผ๋กœ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

auto-merge

ํ•˜๋‚˜ ๋” ์ž๋™ํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ ๋ฐ”๋กœ merge ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋Š” ํ–‰์œ„๋‹ค. ๋ณดํ‹ merge ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๊ฒŒ ๋˜๋ฉด PR ์ž‘์„ฑ์ž๊ฐ€ Merge pull Request ๋ฒ„ํŠผ์„ ์ง์ ‘ ๋ˆŒ๋Ÿฌ ๋ณ‘ํ•ฉ์„ ์™„๋ฃŒํ•œ๋‹ค.

github ์—์„  ์ž์ฒด์ ์œผ๋กœ PR ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ auto-merge ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ๋‹ค.

ํ•ด๋‹น ์˜ต์…˜์ด ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์—์„œ PR์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ Enable auto-merge ๋ผ๋Š” ๋ฒ„ํŠผ์ด ๋ณด์ธ๋‹ค. ์ด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋” ์ด์ƒ merge ๋ฅผ ํ•˜๊ธฐ์œ„ํ•ด Merge pull Request ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™” ๋ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ํ•„์š” ์—†์ด github ๊ฐ€ ์•Œ์•„์„œ merge ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ merge ์‹œ์ผœ ์ค€๋‹ค. ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฉด ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š๋Š”๋‹ค. (๋‹น์—ฐํ•จ..)

workflow ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ด Enable auto-merge ๋ฅผ ๋ˆ„๋ฅด๋Š” ํ–‰์œ„๋ฅผ ์ž๋™ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค. github actions marketplace ์— ๊ฐ™์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  automerge ์— ๋Œ€ํ•œ workflow๋„ ์žˆ๊ธธ๋ž˜ ๊ฐ™์ด ์ ์šฉํ•ด ๋ดค๋‹ค.

์šฐ์„  ์ž๋™ ๋ณ‘ํ•ฉ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ๋‹ค์Œ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์–ด์•ผ ํ•œ๋‹ค.

  • ๋Œ€์ƒ ์ €์žฅ์†Œ ์„ค์ •์—์„œ Allow auto-merge ์˜ต์…˜์ด ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • base ๋ธŒ๋žœ์น˜(๋‚˜์˜ ๊ฒฝ์šฐ main)์— ํ•˜๋‚˜ ์ด์ƒ์˜ branch protection rule ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์š”๊ตฌ์‚ฌํ•ญ(ex. 1 approve)์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ auto merge ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด๋ฏธ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ถฉ์กฑ๋˜๋Š” ๊ฒฝ์šฐ์—” ์ฆ‰์‹œ ๋ณ‘ํ•ฉํ•œ๋‹ค.

create pull request ๋‹จ๊ณ„ ์ดํ›„์— ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. ๋ฉ”๋‰ด์–ผ์—์„œ ์ฒ˜๋Ÿผ create pull request ์™€ auto merge ๋ฅผ ํ†ตํ•ฉํ•ด ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ๊ฐœ์ธ ์—‘์„ธ์Šค ํ† ํฐ(PAT) ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- name: Create Pull Request to main
  id: create_pr
  uses: peter-evans/create-pull-request@v7
  with:
    author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
    committer: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
    token: ${{ secrets[steps.token-map.outputs.token_var] }}
    base: main
    branch: ${{ github.event.ref }}
    title: "[auto] ${{ github.event.head_commit.message }}"
    body: |
      ์ž๋™ PR ์ƒ์„ฑ: `${{ github.ref_name }} โ†’ main`
      ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€: `${{ github.event.head_commit.message }}`
    labels: auto-merge
    assignees: ${{ github.actor }}
    reviewers: ${{ steps.reviewers.outputs.filtered }}
    draft: false

- name: Enable Auto Merge
  if: steps.create_pr.outputs.pull-request-operation == 'created' || steps.create_pr.outputs.pull-request-operation == 'updated'
  uses: peter-evans/enable-pull-request-automerge@v3
  with:
    token: ${{ secrets[steps.token-map.outputs.token_var] }}
    pull-request-number: ${{ steps.create_pr.outputs.pull-request-number }}
    merge-method: squash
  env:
    GH_TOKEN: ${{ secrets[steps.token-map.outputs.token_var] }} 

reference

๋ฐฉ๋ฌธํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋Œ“๊ธ€,์ง€์ ,ํ”ผ๋“œ๋ฐฑ ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค๐Ÿ˜Š

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ