κΉνλΈ ν 리νμ€νΈ μν κ²μ¬
νμ¬ νμ¬μμ μν΄ λͺ©νλ λΉ λ₯Έ μ 무 μ²λ¦¬λ₯Ό μν΄μ κ°λ¨ν λ°©μμ μ·¨ν¨μ λ°λΌμ μ§μμ μΈ μ±μ₯μ μ΄λ£¨μ΄λμΌλ μ νμ λν μ λ’°μ±μ λ¬Έμ λ₯Ό κ²½ννκ³ λμλ μ ν νμ§μ κ°ννκΈ° μν μ½λ νμ§ λλ ν μ€νΈ μλνμ λν νκ²½ ꡬμΆμ νμμ±μ λλΌκ³ λ§μ κ²λ€μ μλνκ³ μλ€. κΉνλΈ ν 리νμ€νΈλ₯Ό μννκ³ μμμΌλ μ½λ λ¦¬λ·°κ° μ£Όμ ν ν¬ κΈ°μ μ΄λ μ€ννΈμ μ²λΌ κ°λ° λ¬Ένλ‘ μ μ°©λμ΄μμ§ μμμΌλ‘ μΈν΄μ λ¨μ ν μ€νΈ μ½λλ₯Ό μμ±νλλ‘ μꡬνλ€κ±°λ μ μ λΆμ λꡬλ₯Ό ν΅ν΄ μ½λ νμ§μ λν΄μ λΆμνκ³ λ¦¬ν©ν λ§μ μννλ κ³Όμ μ΄ μλ€λ³΄λ κ°λ°μλ€μ΄ μ€μ€λ‘ νΈν λ°©μμ μ¬μ©ν΄μ μμ μ건μ λν΄μ μ²λ¦¬ν΄μλ€.
νμ΄ νλ‘κ·Έλλ°μ μ νΈνλ μλμ΄ κ°λ°μλ κΉνλΈ μ½λ리뷰μ λν΄μλ μ΅κ΄ν λμ΄μμ§ μμκΈ°μ λΉλ‘ λΈλμΉ λ³΄νΈ κΈ°λ₯μ ν΅ν΄ λ¦¬λ·°μ΄ μΉμΈμ λ°λλ‘ κ°μ νλλΌλ μμΈνκ² μ½λ λ³κ²½μ¬νμ κ²ν νμ§ μκ³ μΉμΈλ§ ν΄λ²λ¦¬λ μν©μ΄ λ°μνμλ€. κ·ΈλΌμλ λΈλμΉ λ³΄νΈ κΈ°λ₯μΌλ‘ λΆνΈν¨μ κ°μ ν¨μΌλ‘μ¨ μμ μ λν΄ λΈλμΉλ₯Ό λ§λ€μ΄μ μμ νκ³ ν 리νμ€νΈλ₯Ό μμ²νλ λ°©λ²μ λν΄μλ λͺ¨λ κ°λ°μλ€μ΄ μ΅μν΄μ‘λ€κ³ μκ°μ΄ λ λ€. μλ¬΄νΌ κΉνλΈ ν 리νμ€νΈλ₯Ό νμ©ν¨μλ μ λλ‘ λ μ½λ 리뷰 λ¬Ένκ° μ΄λ£¨μ΄μ§μ§ μκΈ° λλ¬Έμ μ΅μν μ½λ νμ§μ λν΄μ κ°λ°μλ€μ΄ μΈμ§ν μ μλλ‘ κΉνλΈ ν 리νμ€νΈ μ μν κ²μ¬λ₯Ό ν΅ν΄ 리뷰 μ΄μΈμλ μν κ²μ¬κ° ν΅κ³Όλμ΄μΌλ§ μνλ λΈλμΉμ λ¨Έμ§ν μ μλλ‘ κ°μ νκ³ μ νλ€.
ν 리νμ€νΈμ λν΄ μ λλ‘ λ¦¬λ·°ν΄μΌνλ€κ³ λ§νμΌλ λΉμ₯ μ 무λ₯Ό μ²λ¦¬νλλ° λΆνΈν¨μ΄ μμΌλ―λ‘ λ°μλ€μ¬μ§μ§ μμλ€.
λ°λΈμ΅μ€μ μ΄μ΄ GitOpsκ° λ μ€λ₯΄λ μκΈ°μ νμΈνλ κ²μ ν 리νμ€νΈμ λν΄ μν 체ν¬λ₯Ό μνν μ μλλ‘ μ€μ ν μ μλ€λ κ²μ΄μλ€. μ€μ λ‘ λ€μκ³Ό κ°μ΄ λλΆλΆμ μ€νμμ€μμλ ν 리νμ€νΈλ‘ λ³κ²½λλ λΆλΆμ λν΄μ μν 체ν¬λ₯Ό μννλλ‘ κΉνλΈ μ‘μ μ ν΅ν΄ μν¬νλ‘μ°λ₯Ό ꡬμ±ν΄λμ κ²μ νμΈν μ μλ€.
ν 리νμ€νΈ μ μ½λ μν κ²μ¬λ₯Ό μννλ κ²μ λν μ΄μ μ 무μμ΄ μμκΉ? νμ¬ μ‘°μ§μ κΈ°μ€μμλ μ λλ‘ λ μ½λ 리뷰 λ¬Ένκ° κ°μΆμ΄μ Έ μμ§ μκΈ° λλ¬Έμ κΈ°λ³Έμ μΈ μ½λ νμ§μ λν΄μλ Checkstyle λλ ESLintλ₯Ό μννμ¬ μ μ λΆμμ μννκ³ μλμΌλ‘ 컨벀μ μ λ§μΆλλ‘ κ°μ ν μ μλ€λ κ²μ μλ€. μμ λ§μ μ½λ© 컨벀μ μ΄ κ°μΆμ΄μ§μ§ μμ μ μ κ°λ°μλ€μκ²λ μλμ΄ κ°λ°μλ€μ΄ 리뷰νμ§ μλλΌλ 컨벀μ μ λν μ€μμ±μ μΈμ§μν€κ³ κ°μ΄λν μ μκΈ° λλ¬Έμ΄λ€.
κΉνλΈ μ‘μ
ν 리νμ€νΈ μ μν κ²μ¬λ₯Ό μνν μ μλλ‘ κΉνλΈ μ‘μ μ ν΅ν΄ μν¬νλ‘μ°λ₯Ό μμ±ν μ μλ€. λ§μ κ°λ°μλ€μ΄ 곡μ νμ¬ μ¬μ©νλ μ‘μ λ€ μ€μμ μν κ²μ¬λ₯Ό μν΄ reviewdogλ₯Ό κΈ°λ°μΌλ‘ μννλ μλμ λκ°μ§ μν¬νλ‘μ°λ₯Ό μ μ©ν΄λ³΄κΈ°λ‘ νμλ€. μ‘°μ§ λ΄μμ κ²°μ ν μλ° μ½λ© 컨벀μ μ΄ μμ΄λ κΈ°λ³Έμ μΈ κ΅¬κΈ μλ° μ€νμΌμ ν΅ν΄μ μν κ²μ¬λ₯Ό μνν μ μμΌλ©° νλ‘ νΈμλ μ½λμ λν΄μλ ESLintλ₯Ό μννλλ‘ λμ΄μμΌλ―λ‘ μ λκ°μ§ μν¬νλ‘μ°λ§ μννλλΌλ μΆ©λΆν μ½λ νμ§μ ν₯μμν€κ³ μ μ§ν μ μμ κ²μ΄λΌ μκ°λλ€.
κΉνλΈ μ‘μ μν¬νλ‘μ° νμΌ : .github/workflows/pr-checks.xml
name: PR Checks
on:
workflow_dispatch:
pull_request:
branches:
- main
paths:
- '**.java'
- '**.js'
- '**.vue'
jobs:
checks:
name: Checks
runs-on: ubuntu-latest # ubuntu-22.04
strategy:
matrix:
java: [11]
node: [12]
steps:
- uses: dorny/paths-filter@v2
id: changes
with:
filters: |
java:
- '**.java'
vuejs:
- '**.vue'
- '**.js'
- uses: actions/checkout@v2
###########################################
## Java Checkstyle
###########################################
- if: steps.changes.outputs.java == 'true'
name: Set up JDK ${{ matrix.Java }}
uses: actions/setup-java@v3
with:
distribution: corretto
java-version: ${{ matrix.java }}
cache: 'gradle'
- if: steps.changes.outputs.java == 'true'
name: Run checkstyle
uses: nikitasavinov/checkstyle-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
reporter: github-pr-check
tool_name: 'checkstyle'
checkstyle_version: 10.3
checkstyle_config: checkstyle.xml
###########################################
## Node ESLint
###########################################
- if: steps.changes.outputs.vuejs == 'true'
name: Setup Node.js ${{ matrix.node }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node }}
cache: 'npm'
cache-dependency-path: npm-shrinkwrap.json
- if: steps.changes.outputs.vuejs == 'true'
name: Cache Dependencies
id: npm-cache
uses: actions/cache@v3
with:
path: '**/node_modules'
key: ${{ runner.os }}-node-${{ hashFiles('**/npm-shrinkwrap.json') }}
restore-keys: |
${{ runner.os }}-node-
- if: steps.changes.outputs.vuejs == 'true' && steps.npm-cache.outputs.cache-hit != 'true'
name: Install Dependencies
run: npm ci
- if: steps.changes.outputs.vuejs == 'true'
name: Run eslint
uses: reviewdog/action-eslint@v1
with:
reporter: github-pr-check
eslint_flags: '--ext .js,.vue ./src/main/resources/static/js'
μ²μμλ κ°λ¨νκ² ν 리νμ€νΈκ° μμ±λκ³ μ»€λ°μ΄ νΈμλμμλ 체ν¬μ€νμΌκ³Ό ESLintκ° λμνλλ‘ μμ±νμμΌλ λ°±μλ μμ μμλ λΆνμνκ² ESLintλ₯Ό μννκ³ νλ‘ νΈμλ μμ μμλ λΆνμνκ² μλ° νμΌμ λν 체ν¬μ€νμΌμ μννλ λΉν¨μ¨μ μΈ λμμ μννλ ꡬ쑰μλ€. μΆκ°μ μΈ κ°μ μ ν΅ν΄ ν 리νμ€νΈ μ paths λ¬Έλ²μ νμ©ν΄μ .java, .js, .vue νμΌμ λν λ³κ²½μ¬νμ΄ μμλλ§ μν κ²μ¬μ λν μν¬νλ‘μ°κ° μ€νλ μ μλλ‘ λ³κ²½νμΌλ©° dorny/paths-filterλ₯Ό ν΅ν΄μ μλ° νμΌμ λν λ³κ²½μ¬νμ΄ μλ€λ©΄ 체ν¬μ€νμΌμ μννκ³ νλ‘ νΈ νμΌμ λν λ³κ²½μ¬νμ΄ μλ€λ©΄ ESLintκ° κ°λ³μ μΌλ‘ μνν μ μλλ‘ νμλ€.
κ΅¬κΈ μ²΄ν¬μ€νμΌμ νμ¬ μ½λμ μ ν©νμ§ μλ€κ³ νλ¨λμ΄ κ°μ₯ κ°λ¨ν κ·μΉμΌλ‘ μνν μ μλλ‘ μ»€μ€ν°λ§μ΄μ§ λ 체ν¬μ€νμΌ νμΌμ μΆκ°νμ΅λλ€.