κ°μ
κΉ νλ‘μ° Git flow
μ½λμ λ²μ μ μ΄λ₯Ό μν΄ κΉ Git μ μ¬μ©νλ©΄ λ³΄ν΅ κΉ νλ‘μ° Git flow λ₯Ό νμ©νκ³ κ³μ€ κ²μΌλ‘ μκ°ν©λλ€.
ν΅μμ μΌλ‘ κΉ νλ‘μ°λ₯Ό νμ©νλ©΄ κΈ°λ³Έμ΄ λλ λΈλμΉ (λ³΄ν΅ main) μ μ½λ ν΅ν©μ© λΈλμΉ (λ³΄ν΅ dev), μμ μ© λΈλμΉ (features/*, fix/*, β¦) β¦ λ± μ¬λ¬ λΈλμΉλ₯Ό κ΄λ¦¬ν΄μΌ ν©λλ€.
μμ μ΄ μλ£λ μ½λλ μ¬λ¬ λ¨κ³λ₯Ό κ±°μ³ κΈ°λ³Έ λΈλμΉλ‘ λ³ν©λ©λλ€.
μ΄ λ, λΈλμΉκ° λ³ν©κ³Ό μ½λ 리뷰λ₯Ό μν΄ κΉνλΈμ ν 리νμ€νΈ κΈ°λ₯μ λ§μ΄ νμ©νκ³ κ³μ€ κ²μΌλ‘ μκ°ν©λλ€.
νμ¬ μν
μ κ° λ³΄ν΅ κ΄λ¦¬λ μ μ₯μλ μλμ κ°μ΄ μ²λ¦¬νκ³ μμ΅λλ€.
- μμ λΈλμΉ (features/1-some-feature)μμ μ½λλ₯Ό μμ±νκ³ , μ½λ ν΅ν©μ μν λΈλμΉ (dev)λ‘ ν 리νμ€νΈλ₯Ό μμ±ν©λλ€.
- μ½λ λ¦¬λ·°κ° νμν κ²½μ° μ½λ 리뷰λ₯Ό μ§ννκ³ , κ΄λ ¨ μ μ°¨κ° λ§λ¬΄λ¦¬λλ©΄ μμ λΈλμΉμ λ³κ²½μ¬νμ μ½λ ν΅ν©μ μν λΈλμΉμ λ³ν©λλ€.
- μ½λ ν΅ν©μ μν λΈλμΉμ μ½λκ° κ²μ λ±μ μ¬μ λ‘ κΈ°λ³Έ λΈλμΉλ‘ λ³ν©λμ΄μΌ νλ κ²½μ°, μ½λ ν΅ν©μ μν λΈλμΉμμ κΈ°λ³Έ λΈλμΉλ‘ λ³ν©λλ ν 리νμ€νΈλ₯Ό μμ±ν©λλ€.
- μμ±λ ν 리νμ€νΈλ νμν μ μ°¨λ₯Ό λ§μΉ ν κΈ°λ³Έ λΈλμΉλ‘ λ³ν©ν©λλ€.
μμ λΈλμΉμμ μ½λ ν΅ν©μ μν λΈλμΉλ‘μ ν 리νμ€νΈ μμ±μ μλννμ§ μμ΅λλ€.
μλννλ €λ©΄ μ»€λ° λ©μμ§ λλ λ€λ₯Έ λ°©λ²μ ν΅ν΄ κ°λ₯νκ² μ§λ§, μκ°μ΄ νλ₯΄λ©΄ μ κΈ°μ΅μ΄ λμ§ μλ λ±μ μ¬μ λ‘ μλ―Έκ° μμ΄μ Έ λ²λ Έμ΅λλ€.
νμ§λ§, μμ λΈλμΉμμ μ½λ ν΅ν©μ μν λΈλμΉλ‘μ ν 리νμ€νΈκ° μλ£λλ κ²½μ° μ΄ ν μμ±μ΄ νμν ν 리νμ€νΈλ μλννλ©΄ μκ³ λ₯Ό μ€μΌ μ μμμ΅λλ€.
μλν
κΉνλΈμ μν¬νλ‘μ°λ μ¬λ¬κ°μ§ νΈλ¦¬κ±°λ₯Ό μ 곡νκ³ μμ΅λλ€.
μ΄ μ€ ν 리νμ€νΈκ° μλ£λμμ λ, μ§μ λ μν¬νλ‘μ°λ₯Ό μ€ννλ νΈλ¦¬κ±°λ₯Ό νμ©νλ©΄ λκ² λ€κ³ μκ°νμ΅λλ€.
name: 'Wokring branch pull closed as completed'
on: # rebuild any PRs and main branch changes
pull_request:
types: ['closed']
jobs:
create-pr-to-main:
if: github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'dev'
# ...
μ μν¬νλ‘μ° μ μλ ν 리νμ€νΈκ° μλ£λλ©΄ νΈλ¦¬κ±° λλ μν¬νλ‘μ°μ λλ€.
κ·Έλ¦¬κ³ , create-pr-to-main
μμ
μ νμ¬ μ΄λ²€νΈ μ λ³΄μ€ ν 리νμ€νΈκ° λ³ν©λκ³ , ν 리νμ€νΈμ λ² μ΄μ€ λΈλμΉκ° dev
λΈλμΉλ©΄ μ€νλ©λλ€.
κ·Έλ¦¬κ³ , ν 리νμ€νΈμ μμ±μ κΉνλΈ μ»€λ§¨λλΌμΈ λꡬ gh
λ₯Ό νμ©νλ©΄ 컀맨λλΌμΈμμ κ°νΈνκ² μμ±ν μ μμ΅λλ€.
ν 리νμ€νΈ μμ± μλν
ν 리νμ€νΈμ μμ±
ν 리νμ€νΈλ₯Ό μμ±νλ €λ©΄ κΈ°λ³Έμ μΌλ‘ μλ μ λ³΄κ° νμν©λλ€.
- ν€λ head λΈλμΉ μ΄λ¦
- λ² μ΄μ€ base λΈλμΉ μ΄λ¦
- μ λͺ©
- λ³Έλ¬Έ
ν€λ λΈλμΉλ νμ¬ μμ ν λ΄μ©μ ν΄λΉνλ λΈλμΉμ λλ€. λ² μ΄μ€ λΈλμΉλ νμ¬ μμ ν λ΄μ©μ λ³ν©νλ €λ λΈλμΉμ λλ€.
μμ±νλ €λ ν 리νμ€νΈμ ν€λ λΈλμΉλ μν¬νλ‘μ°λ₯Ό νΈλ¦¬κ±°ν μλ£λ ν 리νμ€νΈμ λ² μ΄μ€ λΈλμΉ μ΄λ¦μ μ¬μ©νλ©΄ λκ² μ΅λλ€.
μμ±νλ €λ ν 리νμ€νΈμ λ² μ΄μ€ λΈλμΉλ κΉ νλ‘μ°μ μν΄ κ²°μ λλ λΆλΆμ΄λΌ μκ°ν©λλ€.
κΉ νλ‘μ°μ μ μμ λ°λΌ λ² μ΄μ€ λΈλμΉλ₯Ό κ²°μ ν μ μκ² μ§μ ν΄μ£Όμλ©΄ λκ² μ΅λλ€.
μ λͺ©μ κ°λ΅νκ² λ² μ΄μ€ λΈλμΉ μ΄λ¦μ΄λ νμν μ 보λ₯Ό κ²°μ νλ©΄ λ κ² κ°μ΅λλ€.
λ³Έλ¬Έ μμ νμν λ΄μ©μ μμ±νλ©΄ λκ² μ΅λλ€. μ λ μμ±λλ ν 리νμ€νΈμ ν¬ν¨λ μλ£λ ν리νμ€νΈ λͺ©λ‘μ μ¬μ©νκ³ μΆμ΄μ, κ΄λ ¨ ν리νμ€νΈλ₯Ό μμ§νλ κΉνλΈ μ‘μ μ μμ±ν΄μ μ¬μ©νκ³ μμ΅λλ€.
bbonkr/get-overview-of-pull-requests-action μμ±μ€μΈ ν 리νμ€νΈμ λ² μ΄μ€ λΈλμΉ, ν€λ λΈλμΉ, μ μ₯μμ κΈ°λ³Έ λΈλμΉλ₯Ό μ λ ₯νλ©΄ μ΄μ ν 리νμ€νΈ μλ£ μμ λΆν° νμ¬κΉμ§ μ μ₯μμ κΈ°λ³ΈλΈλμΉλ‘ λ³ν©λ ν 리νμ€νΈμ λ²νΈ λͺ©λ‘μ μ 곡νλ κΉνλΈ μ‘μ μ λλ€.
κΉνλΈ μν¬νλ‘μ°
name: 'PR completed'
on:
pull_request:
types: ['closed']
permissions:
contents: write
pull-requests: write
env:
MAIN_BRANCH_NAME: main
jobs:
create-or-update-pull:
if: github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'dev'
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Get overview of PULL_REQUEST
uses: bbonkr/get-overview-of-pull-requests-action@v1
id: get_overview
with:
github_token: ${{ github.token }}
base: main
head: ${{ github.event.pull_request.base.ref }}
default_branch: dev
- name: Create pull
if: ${{ steps.get_overview.outputs.pull_number == '' }}
run: |
gh pr create --base ${{ env.MAIN_BRANCH_NAME }} \
--head ${{ github.event.pull_request.base.ref }} \
--label '${{ steps.get_overview.outputs.labels }}' \
--project '${{ env.PROJECT_NAME }}' \
--reviewer ${{ steps.get_overview.outputs.reviewers }} \
--assignee ${{ steps.get_overview.outputs.assignees }} \
--body '${{ steps.get_overview.outputs.body }}' \
--title 'Release ${{ env.MAIN_BRANCH_NAME }} π'
env:
GITHUB_TOKEN: ${{ github.token }}
- name: Update pull
if: ${{ steps.get_overview.outputs.pull_number != '' }}
run: |
gh pr edit ${{ steps.get_overview.outputs.pull_number }} \
--body '${{ steps.get_overview.outputs.body }}' \
--title 'Release ${{ env.MAIN_BRANCH_NAME }} π' \
--add-label '${{ steps.get_overview.outputs.labels }}'
env:
GITHUB_TOKEN: ${{ github.token }}
ν μ λ°μ΄νΈ λͺ λ Ή μ€νμ κΆνκ΄λ ¨ λ¬Έμ κ° λ°μνλ©΄,
pull:write
,content:write
,org:read
κΆνμ΄ μλ κ°μΈ μΈμ¦ ν ν°μ λ§λ€μ΄ μν¬λ¦Ώμ μ μ₯ ν μ¬μ©νμλ©΄ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€.
κΉνλΈ μν¬νλ‘μ°κ° λμν λ‘κ·Έλ μλ λ§ν¬μμ νμΈνμ€ μ μμ΅λλ€.
μκ°μ΄ μ§λλ©΄ μ€ν λ‘κ·Έ μ κ·Όμ΄ λΆκ°λ₯ν μλ μμ΅λλ€.
λ§μΉ¨
μμ μκ°ν΄λλ¦° μν¬νλ‘μ°λ νλμ λΈλμΉλ§ λμμΌλ‘ νκ³ μμ΄ ν¬κ² λμμ΄ λμ§ μλλ€κ³ μκ°λ μ μμ΅λλ€.
λ³ν©ν΄μΌ νλ λΈλμΉμ λ¨κ³κ° μ‘°κΈ λ§μμ§λ©΄, λ§μ μκ³ λ₯Ό λ μ μμ κ²μ΄λΌ μκ°ν©λλ€.
κ·Έλ¦¬κ³ , μν¬νλ‘μ°μ νμνμ μμ μ λͺκ°μ§ λ μΆκ°νμλ©΄ μ§μ κ΄λ¦¬ν λ΄μ©μ΄ μ‘°κΈ μ€μ΄λ€μ μμ κ²μ΄λΌ μκ°νλ©°, μ μ λΉμ·ν λ΄μ©μΌλ‘ κ³ λ―Όνκ³ κ³μ λΆλ€μκ² λμμ΄ λμλ©΄ μ’κ² μ΅λλ€.
μΆκ°ν λ¨κ³ μΆμ²
- μ½λμ λ²μ κ³Ό κΉ νκ·Έ λκΈ°ν
- μ λ²μ μμ±μ κΉνλΈ λ¦΄λ¦¬μ¦ μμ±