์ด๋ฒ ๊ธ์์๋ PR์ ๋ ๋ ธ์ ๋ ํด๋น PR์ด ๋ฌธ์ ๊ฐ ์๋์ง ์๋์ผ๋ก ํ ์คํธ๋ฅผ ์ํํ๊ณ ,
๋ง์ฝ ํ ์คํธ์ ์คํจํ๋ค๋ฉด mergeํ ์ ์๋๋ก ๋ฉ์ธ ๋ธ๋์น๋ฅผ ๋ณดํธํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๐ง Github Actions ์ค์
Repository์ ๋ค์ด๊ฐ์ Actions - Java with Gradle์ ํด๋ฆญํฉ๋๋ค.
์ yml ํ์ผ์ ์๋์ ๊ฐ์ด ์์ ํฉ๋๋ค.
name: Java CI with Gradle
on:
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: ๐ณ JDK 11 ์ธํ
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: ๐ณ gradlew ์คํ ๊ถํ ์ค์
run: chmod +x gradlew
- name: ๐ณ ํ
์คํธ ์งํ
run: ./gradlew --info test
์ดํ yml ํ์ผ ์ด๋ฆ์ ์ํ๋ ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ์ด์ฃผ๊ณ commit changes ๋ฅผ ํด๋ฆญํฉ๋๋ค.
Commit changes๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๊ธฐ๋ณธ์ ์ธ ์ค์ ์ด ์๋ฃ๋ฉ๋๋ค.
ํ๋ฒ PR์ ๋ณด๋ด ํ ์คํธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฑ๊ณต์ ์ผ๋ก ํ ์คํธ๊ฐ ์งํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๐ ์ฑ๊ณตํ๋ ํ ์คํธ์ ๊ฒฝ์ฐ
ํ ์คํธ์ ์ฑ๊ณตํ๋ฉด ์์ ๊ฐ์ด All checks have passed๊ฐ ๋ณด์ฌ์ง๋๋ค.
Actions ์ฐฝ์์๋ ํ์ธํ ์ ์์ต๋๋ค.
๐ ์คํจํ๋ ํ ์คํธ์ ๊ฒฝ์ฐ
@Test
void contextLoads() {
if (1 == 1) {
throw new IllegalArgumentException();
}
}
์์ ๊ฐ์ด ์คํจํ๋ ํ ์คํธ๋ฅผ ์์ฑํ ํ, ์ด๋ฅผ ๋ฐ์ํ PR์ ๋ณด๋ด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด All checks have failed๊ฐ ํ์๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ํ๊ฐ์ง ๋ฌธ์ ๊ฐ ์กด์ฌํ๋๋ฐ์, ์ ์ํฉ์์๋ Merge pull request๋ฅผ ํด๋ฆญํ๋ฉด mergeํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ํฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๊ฒ ์ง๋ง, ๋์ฒด๋ก ํ ์คํธ์ ์คํจํ๋ค๋ฉด ๋ฉ์ธ ๋ธ๋์น์ merge๋๋ ์ํฉ์ ๋ง๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค.
์ด๋ ์กฐ๊ธ ๋ค์ ์ค์ ํ๋๋ก ํ๊ณ , ์ฐ์ ํ ์คํธ์ ๋ํ Report๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
๐ง ํ ์คํธ Report ์ถ๊ฐ
์ํฌํ๋ก์ฐ yml์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํฉ๋๋ค.
name: Java CI with Gradle
on:
pull_request:
branches: [ "main" ]
# Report ๊ฒฐ๊ณผ ์ฐ๊ธฐ ์ํด ํ์
permissions:
checks: write
pull-requests: write
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: ๐ณ JDK 11 ์ธํ
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: ๐ณ gradlew ์คํ ๊ถํ ์ค์
run: chmod +x gradlew
- name: ๐ณ ํ
์คํธ ์งํ
run: ./gradlew --info test
- name: ๐ณ ํ
์คํธ ๊ฒฐ๊ณผ Report
uses: EnricoMi/publish-unit-test-result-action@v2
if: always() # ํ
์คํธ๊ฐ ์คํจํ์ฌ๋ Report๋ฅผ ๋ณด๊ธฐ ์ํด `always`๋ก ์ค์
with:
files: 'build/test-results/**/*.xml'
์ด์ ํ ์คํธ ์คํ ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๐ง ํ ์คํธ ์คํจ ์ ์คํจํ๋ ์ฝ๋์ Comment ์ถ๊ฐ
name: Java CI with Gradle
on:
pull_request:
branches: [ "main" ]
# Report ๊ฒฐ๊ณผ ์ฐ๊ธฐ ์ํด ํ์
permissions:
checks: write
pull-requests: write
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: ๐ณ JDK 11 ์ธํ
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: ๐ณ gradlew ์คํ ๊ถํ ์ค์
run: chmod +x gradlew
- name: ๐ณ ํ
์คํธ ์งํ
run: ./gradlew --info test
- name: ๐ณ ํ
์คํธ ๊ฒฐ๊ณผ Report
uses: EnricoMi/publish-unit-test-result-action@v2
if: always() # ํ
์คํธ๊ฐ ์คํจํ์ฌ๋ Report๋ฅผ ๋ณด๊ธฐ ์ํด `always`๋ก ์ค์
with:
files: 'build/test-results/**/*.xml'
- name: ๐ณ ํ
์คํธ ์คํจ Comment
uses: mikepenz/action-junit-report@v3
if: always()
with:
report_paths: 'build/test-results/test/TEST-*.xml'
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๐ง ํ ์คํธ ์ฑ๊ณต ์์๋ง Merge ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ
๋ ํฌ์งํ ๋ฆฌ์ Settings - Branches - Add branch protection rule์ ํด๋ฆญํฉ๋๋ค.
์์ ๊ฐ์ด Branch name pattern์๋ main์ ์ ๋ ฅํ๊ณ
Require status checks to pass before merging - Require branches to be up to date before merging์ ์ ํํฉ๋๋ค.
์ด๋ ๊ฒ์์ฐฝ์ ์ ๋ ฅํ test๋ ๋ค์ ๋ถ๋ถ์ ๋๋ค.
(์ด๋ workflow yml ํ์ผ์ jobs์ ์์ฑํ ์ด๋ฆ์ ๋๋ค.)
์ ๋ถ๋ถ์ ์ ํ์ฌํญ์ธ๋ฐ ํ ์คํธ๊ฐ ์คํจํ์ ๋, ์ ๋๋ก mergeํ ์ ์๊ฒ ์ค์ ํ๊ธฐ ์ํด์๋ ์ฒดํฌํด์ค๋๋ค.
์ดํ Create๋ฅผ ๋๋ฌ ๊ท์น์ ์์ฑํฉ๋๋ค.
์ด์ ๋ค์ ์คํจํ๋ PR๋ก ๋์์๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด PR์ mergeํ ์ ์๋๋ก ์ค์ ๋ฉ๋๋ค.
์ด๋ ๊ฒ ํด์ PR ์์ฑ ์ ์๋์ผ๋ก Test๋ฅผ ์คํํ๊ณ , ์คํจ ์ Report์ Mergeํ ์ ์๋๋ก ๋ฐฉ์ดํ๋ ๊ธฐ๋ฅ์ Github Actions๋ฅผ ํตํด ์ถ๊ฐํด ๋ณด์์ต๋๋ค.
๋ค์ ๊ธ์์๋ Jenkins๋ฅผ ํตํด ๋ฉ์ธ ๋ธ๋์น์ merge ์ ์๋์ผ๋ก EC2 ์๋ฒ์ ๋ฐฐํฌ๊ฐ ์ด๋ฃจ์ด์ง๋๋ก CD๋ฅผ ์ค์ ํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ง + ์คํจ ์ ์ฌ๋ ์๋ฆผ
8398a7/action-slack@v3
์๋ฅผ ๊ตฌ๊ธ์ ๊ฒ์ํ๋ฉด ๋ง์ ์์๋ฅผ ๋ณผ ์ ์์ ๊ฒ์ ๋๋ค.
๐ Reference