Java๋ก ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๊ธฐ ์ํด ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์คํ ์์ค์ธ ๊ฒฝ์ฐ๋ ์๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ๋๋ ์ต๊ทผ Travis-CI์ TeamCity์์ GitHub Actions๋ก ๋ด ๋ฆฌํฌ์งํ ๋ฆฌ ์ค ์ผ๋ถ๋ฅผ ์ด๋ํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ ์ด๊ฒ์ด ๊ฒฐ๊ณผ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ฌด์์ ์๋ํํ ๊ฒ์ธ๊ฐ?
๋จผ์ ์๋ํํ ํ๋ก์ ํธ๊ฐ ํ์ํฉ๋๋ค. Spring boot/Java 11/Maven์์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๊ธฐ์ฌ์ ๋ชฉ์ ์ ๋ฐ๋ผ ์ฐ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ์ ํ ๊ด์ฌ์ ๋์ง ์์ ๊ฒ์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ฃผ๋ณ์ ์ธํ๋ผ๋ ์ฐ๋ฆฌ์๊ฒ ์ค์ํ๋ฏ๋ก ๊ฐ๋จํ REST API ์ปจํธ๋กค๋ฌ์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค.
์ฌ๊ธฐ์์ ์์ค๋ฅผ ๋ณผ ์ ์์ต๋๋ค:
JIRA ๋ฐ ๊ณํ
์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก JIRA๋ฅผ ์ด์ ์ถ์ ๊ธฐ๋ก ์ฌ์ฉํ๋ฏ๋ก ์ด ํ๋ก์ ํธ์ ๋ํ ๋ณ๋์ ๋ณด๋๋ฅผ ๋ง๋ค๊ณ ๊ฑฐ๊ธฐ์ ์ฒซ ๋ฒ์งธ ์ด์๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
์ ์ ํ์ JIRA์ GitHub๋ฅผ ๊ฒฐํฉํ์ฌ ์ด๋ค ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์๋์ง ๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๋ ํ๋ก์ ํธ ์กฐ๋ฆฝ์ ์๋ํํฉ๋๋ค
์ฐ๋ฆฌ์ ํ ์คํธ ํ๋ก์ ํธ๋ maven์ ํตํด ๊ตฌ์ถ๋์์ผ๋ฏ๋ก ๊ตฌ์ถ์ด ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ํ์ํ ๊ฒ์ mvn clean ํจํค์ง๋ฟ์ ๋๋ค.
Github Actions๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ํํ๋ ค๋ฉด ์์ ํ๋ฆ์ ์ค๋ช ํ๋ ์ ์ฅ์์ ํ์ผ์ ์์ฑํด์ผ ํฉ๋๋ค. ์ด๋ ์ผ๋ฐ yml ํ์ผ๋ก ์ํํ ์ ์์ต๋๋ค. "yml ํ๋ก๊ทธ๋๋ฐ"์ ์ข์ํ๋ค๊ณ ๋งํ ์๋ ์์ง๋ง ๋ฌด์์ ํ ์ ์์ต๋๊น? .github/ ๋๋ ํฐ๋ฆฌ ์ํฌํ๋ก/ ํ์ผ build.yml์์ ์ด ์์ ์ ์ํํฉ๋๋ค. ์ฌ๊ธฐ์์ ๋ง์คํฐ ๋ธ๋์น๋ฅผ ๋น๋ํ ๋์ ์์ ์ ์ค๋ช ํฉ๋๋ค.
name: Build
on:
pull_request:
branches:
- '*'
push:
branches:
- 'master'
jobs:
build:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v1
- name: set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 1.11
- name: Maven Package
run: mvn -B clean package -DskipTests
on โ ์ด๊ฒ์ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋ ์ด๋ฒคํธ์ ๋ํ ์ค๋ช ์ ๋๋ค.
์ผ๊ธฐ: pull_request/push โ ๋ง์คํฐ์ ๋ํ ํธ์๊ฐ ์ด๋ฃจ์ด์ง๊ณ ํ ์์ฒญ์ด ์์ฑ๋ ๋๋ง๋ค ์ด ์ํฌํ๋ก๋ฅผ ์์ํด์ผ ํจ์ ๋ํ๋ ๋๋ค.
๋ค์์ ์์ ์ ๋ํ ์ค๋ช ์ ๋๋ค(์์ ) ๋ฐ ์คํ ๋จ๊ณ(๋จ๊ณ) ๊ฐ ์์ ๋ง๋ค.
๊ณ์ํด์ - ์ฌ๊ธฐ์ ๋์ OS๋ฅผ ์ ํํ ์ ์์ต๋๋ค. ๋๋๊ฒ๋ Mac OS๋ ์ ํํ ์ ์์ง๋ง ๊ฐ์ธ ๋ฆฌํฌ์งํ ๋ฆฌ์์๋ Linux์ ๋นํด ์๋นํ ๋น์๋๋ค.
์ฌ์ฉ ์๋ฅผ ๋ค์ด actions/setup-java ์์ ์ ์ฌ์ฉํ์ฌ Java 11์ฉ ํ๊ฒฝ์ ์ค์นํ๋ ๋ฑ ๋ค๋ฅธ ์์ ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
...์ ์ํ์ฌ ๊ณผ ์ก์ ์ ์์ํ๋ ๋ฐ ์ฌ์ฉํ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ ์ก์ ์ ์ ๋ฌ๋ ์ธ์์ ๋๋ค.
๋จ์ ๊ฒ์ Maven์์ ํ๋ก์ ํธ ๋น๋๋ฅผ ์คํํ๋ ๊ฒ๋ฟ์
๋๋ค. run: mvn -B clean package
ํ๋๊ทธ -B ๋ฉ์ด๋ธ์ด ๊ฐ์๊ธฐ ์ฐ๋ฆฌ์๊ฒ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฌป๊ณ ์ถ์ดํ์ง ์๋๋ก ๋น๋ํํ ๋ชจ๋๊ฐ ํ์ํ๋ค๊ณ ๋งํฉ๋๋ค.
์์ฒญ๋! ์ด์ ๋ง์คํฐ์ ์ปค๋ฐํ ๋๋ง๋ค ํ๋ก์ ํธ ๋น๋๊ฐ ์์๋ฉ๋๋ค.
ํ ์คํธ ์คํ ์๋ํ
์กฐ๋ฆฝ์ ์ข์ง๋ง ์ค์ ๋ก๋ ํ๋ก์ ํธ๋ฅผ ์์ ํ๊ฒ ์กฐ๋ฆฝํ ์ ์์ง๋ง ์๋์ด ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์ ๋จ๊ณ๋ ํ ์คํธ ์คํ์ ์๋ํํ๋ ๊ฒ์ ๋๋ค. ๋ํ PR ๊ฒํ ๋ฅผ ์ํํ ๋ ํ ์คํธ ํต๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ ๊ฒ์ด ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. ํ ์คํธ๊ฐ ํต๊ณผํ์ผ๋ฉฐ ๋ณํฉ์ ์ํํ๊ธฐ ์ ์ ๋ธ๋์น๋ฅผ ์คํํ๋ ๊ฒ์ ์์ด๋ฒ๋ฆฐ ์ฌ๋์ด ์๋ค๋ ๊ฒ์ ํ์คํ ์ ์ ์์ต๋๋ค.
ํ ์์ฒญ์ ์์ฑํ๊ณ ๋ง์คํฐ์ ๋ณํฉํ ๋ ํ ์คํธ๋ฅผ ์คํํ๋ ๋์์ ์ฝ๋ ์ ์ฉ ๋ฒ์์ ๋ํ ๋ณด๊ณ ์ ์์ฑ์ ์ถ๊ฐํ ๊ฒ์ ๋๋ค.
name: Build
on:
pull_request:
branches:
- '*'
push:
branches:
- 'master'
jobs:
build:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v1
- name: set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 1.11
- name: Maven Verify
run: mvn -B clean verify
- name: Test Coverage
uses: codecov/codecov-action@v1
with:
token: ${{ secrets.CODECOV_TOKEN }}
ํ ์คํธ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด jacoco ํ๋ฌ๊ทธ์ธ๊ณผ ํจ๊ป codecov๋ฅผ ์ฌ์ฉํฉ๋๋ค. codecov์๋ ์์ฒด ์์ ์ด ์์ง๋ง ํ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ค๋ฉด ํ ํฐ์ด ํ์ํฉ๋๋ค.
${{ secrets.CODECOV_TOKEN }}
โ ์ฐ๋ฆฌ๋ ์ด ๊ตฌ์ฑ์ ํ ๋ฒ ์ด์ ๋ณด๊ฒ ๋ ๊ฒ์
๋๋ค. ๋น๋ฐ์ GitHub์ ๋น๋ฐ์ ์ ์ฅํ๋ ๋ฉ์ปค๋์ฆ์ด๋ฉฐ, ์ ์ฅ์ ์ฝ๋ ๋ฒ ์ด์ค์ ํฌํจ๋์ด์๋ ์ ๋๋ ๋น๋ฐ๋ฒํธ/ํ ํฐ/ํธ์คํธ/URL ๋ฐ ๊ธฐํ ๋ฐ์ดํฐ๋ฅผ ๊ฑฐ๊ธฐ์ ์ธ ์ ์์ต๋๋ค.
GitHub์ ๋ฆฌํฌ์งํ ๋ฆฌ ์ค์ ์์ ๋น๋ฐ์ ๋ณ์๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์์ ํ ํฐ์ ์ป์ ์ ์์ต๋๋ค.
POM ํ์ผ์ jacoco ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํฉ๋๋ค.
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.4</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<!-- attached to Maven test phase -->
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<reportFormat>plain</reportFormat>
<includes>
<include>**/*Test*.java</include>
<include>**/*IT*.java</include>
</includes>
</configuration>
</plugin>
์ด์ codecov ๋ด์ ๊ฐ ํ ์์ฒญ์ ์ ๋ ฅํ๊ณ ์ ์ฉ ๋ฒ์ ๋ณ๊ฒฝ ๊ทธ๋ํ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์ ์ ๋ถ์๊ธฐ๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
๋๋ถ๋ถ์ ์คํ ์์ค ํ๋ก์ ํธ์์ ์ ์ ์ฝ๋ ๋ถ์์ ์ํด Sonar Cloud๋ฅผ ์ฌ์ฉํ๋๋ฐ, travis-ci์ ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค. ๋ฐ๋ผ์ GitHub Actions๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ฌ ๋์ผํ ์์ ์ ์ํํ๋ ๊ฒ์ ๋ ผ๋ฆฌ์ ์ธ ๋จ๊ณ์ ๋๋ค. ์ก์ ์์ฅ์ ๋ฉ์ง ๊ฒ์ด์ง๋ง ์ด๋ฒ์๋ ์กฐ๊ธ ์ค๋งํ์ต๋๋ค. ์ต๊ด์ ์ผ๋ก ํ์ํ ์ก์ ์ ์ฐพ์์ ์ํฌํ๋ก์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ Sonar๋ Maven ๋๋ Gradle์์ ํ๋ก์ ํธ๋ฅผ ๋ถ์ํ๊ธฐ ์ํ ์์ ์ ์ง์ํ์ง ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ๋ฌผ๋ก ๋ฌธ์์ ์ด๋ฐ ๋ด์ฉ์ด ์ ํ ์๋๋ฐ ๋๊ฐ ์ฝ๋์?!
์์ ์ ํตํด์๋ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก mvn ํ๋ฌ๊ทธ์ธ์ ํตํด ์ํํ๊ฒ ์ต๋๋ค.
name: SonarCloud
on:
push:
branches:
- master
pull_request:
types: [opened, synchronize, reopened]
jobs:
sonarcloud:
runs-on: ubuntu-16.04
steps:
- uses: actions/checkout@v1
- name: Set up JDK
uses: actions/setup-java@v1
with:
java-version: 1.11
- name: Analyze with SonarCloud
# set environment variables:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
# run sonar maven plugin:
run: mvn -B verify sonar:sonar -Dsonar.projectKey=antkorwin_github-actions -Dsonar.organization=antkorwin-github -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=$SONAR_TOKEN -Dsonar.coverage.jacoco.xmlReportPaths=./target/site/jacoco/jacoco.xml
SONAR_TOKEN - ๋ค์์์ ๊ตฌํ ์ ์์ต๋๋ค.
Dsonar.projectKey โ ์๋์ ํ๋ก์ ํธ ์ด๋ฆ์ ํ๋ก์ ํธ ์ค์ ์์ ํ์ธํ ์ ์์ต๋๋ค.
Dsonar.์กฐ์ง โ GitHub์ ์กฐ์ง ์ด๋ฆ์ ๋๋ค.
ํ ์์ฒญ์ ํ๊ณ sonarcloud[bot]๊ฐ ๋๊ธ์ ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
๋ฆด๋ฆฌ์ค ๊ด๋ฆฌ
๋น๋๊ฐ ๊ตฌ์ฑ๋์๊ณ ํ ์คํธ๊ฐ ์คํ๋์์ผ๋ฏ๋ก ๋ฆด๋ฆฌ์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. GitHub Actions๋ฅผ ํตํด ๋ฆด๋ฆฌ์ค ๊ด๋ฆฌ๊ฐ ์ด๋ป๊ฒ ํจ์ฌ ์ฌ์์ง๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ง์ฅ์๋ ์ฝ๋ ๋ฒ ์ด์ค๊ฐ bitbucket์ ์๋ ํ๋ก์ ํธ๊ฐ ์์ต๋๋ค(๋ชจ๋ ๊ฒ์ด "๋ฎ์๋ bitbucket์ ์ฐ๊ณ ๋ฐค์๋ GitHub์ ์ปค๋ฐํฉ๋๋ค"๋ผ๋ ์ด์ผ๊ธฐ์ ๊ฐ์ต๋๋ค). ๋ถํํ๊ฒ๋ bitbucket์๋ ๋ฆด๋ฆฌ์ค ๊ด๋ฆฌ ๋๊ตฌ๊ฐ ๋ด์ฅ๋์ด ์์ง ์์ต๋๋ค. ๊ฐ ๋ฆด๋ฆฌ์ค์ ๋ํด ์๋์ผ๋ก ํฉ๋ฅ ํ์ด์ง๋ฅผ ์์ฑํ๊ณ ๋ฆด๋ฆฌ์ค์ ํฌํจ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ฑฐ๊ธฐ์ ๋์ ธ์ผ ํ๊ณ , ๋ง์์ ๊ถ์ ์ ๊ฒ์ํ๊ณ , Jira์ ์์ ์ ๊ฒ์ํ๊ณ , ์ ์ฅ์์์ ์ปค๋ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๋ฌธ์ ์ ๋๋ค. ์ค์ํ ๊ฐ๋ฅ์ฑ์ด ๋ง์ผ๋ฉฐ, ๋ฌด์ธ๊ฐ๋ฅผ ์๊ฑฐ๋ ์ง๋๋ฒ์ ์ด๋ฏธ ๋ฆด๋ฆฌ์ค๋ ๊ฒ์ ์ ๋ ฅํ ์ ์์ต๋๋ค. ๋๋ก๋ ๋์ด์ค๊ธฐ ์์ฒญ์ ๋ฌด์์ผ๋ก ๋ถ๋ฅํด์ผ ํ ์ง ๋ช ํํ์ง ์์ต๋๋ค. ๊ธฐ๋ฅ์ธ์ง, ๋ฒ๊ทธ ์์ ์ธ์ง, ํ ์คํธ ํธ์ง์ธ์ง, ์๋๋ฉด ๋ญ๊ฐ ์ธํ๋ผ์ ์ธ ๊ฒ .
GitHub ์์ ์ด ์ด๋ป๊ฒ ์ฐ๋ฆฌ์๊ฒ ๋์์ด ๋ ์ ์๋์? ํ๋ฅญํ ์์ ์ด ์์ต๋๋ค. ๋ฆด๋ฆฌ์ค ์ด์์ ์ฌ์ฉํ๋ฉด ๋ฆด๋ฆฌ์ค ๋ ธํธ ํ์ผ ํ ํ๋ฆฟ์ ์ค์ ํ์ฌ ํ ์์ฒญ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ค์ ํ๊ณ ๋ฆด๋ฆฌ์ค ๋ ธํธ ํ์ผ์์ ์๋์ผ๋ก ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค.
๋ณด๊ณ ์ ์ค์ ์ ์ํ ์์ ํ ํ๋ฆฟ(.github/release-drafter.yml):
name-template: 'v$NEXT_PATCH_VERSION'
tag-template: 'v$NEXT_PATCH_VERSION'
categories:
- title: ' New Features'
labels:
- 'type:features'
# ะฒ ััั ะบะฐัะตะณะพัะธั ัะพะฑะธัะฐะตะผ ะฒัะต PR ั ะผะตัะบะพะน type:features
- title: ' Bugs Fixes'
labels:
- 'type:fix'
# ะฐะฝะฐะปะพะณะธัะฝะพ ะดะปั ะผะตัะบะธ type:fix ะธ ั.ะด.
- title: ' Documentation'
labels:
- 'type:documentation'
- title: ' Configuration'
labels:
- 'type:config'
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
template: |
## Changes
$CHANGES
์ด์ ๋ฆด๋ฆฌ์ค๋ฅผ ์์ฑํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค(.github/workflows/release-draft.yml).
name: "Create draft release"
on:
push:
branches:
- master
jobs:
update_draft_release:
runs-on: ubuntu-18.04
steps:
- uses: release-drafter/release-drafter@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
์ด์ ๋ถํฐ ๋ชจ๋ ํ ์์ฒญ์ ๋ฆด๋ฆฌ์ค ๋ ธํธ์ ์๋์ผ๋ก ์์ง๋ฉ๋๋ค. ๋ง๋ฒ์ ๋๋ค!
์ฌ๊ธฐ์ ์ง๋ฌธ์ด ์๊ธธ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๊ฐ PR์ ํ๊ทธ๋ฅผ ๋ฃ๋ ๊ฒ์ ์์ด๋ฒ๋ฆฌ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๊ทธ๋ฌ๋ฉด ์ด๋ค ์นดํ ๊ณ ๋ฆฌ์ ๋ฃ์ด์ผ ํ ์ง ๋ช ํํ์ง ์์ผ๋ฉฐ ๋ค์ ๊ฐ PR์ ๊ฐ๋ณ์ ์ผ๋ก ์๋์ผ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ค๋ฅธ ์์ (๋ ์ด๋ธ ๊ฒ์ฆ๊ธฐ)์ ์ฌ์ฉํ์ฌ ํ ์์ฒญ์ ํ๊ทธ๊ฐ ์๋์ง ํ์ธํ๋ฉด ๋ฉ๋๋ค. ํ์ ํ๊ทธ๊ฐ ์์ผ๋ฉด ํ์ธ์ด ์คํจํ๊ณ ํ ์์ฒญ์ ์ด์ ๋ํ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
name: "Verify type labels"
on:
pull_request:
types: [opened, labeled, unlabeled, synchronize]
jobs:
triage:
runs-on: ubuntu-18.04
steps:
- uses: zwaldowski/match-label-action@v2
with:
allowed: 'type:fix, type:features, type:documentation, type:tests, type:config'
์ด์ ๋ชจ๋ ํ ์์ฒญ์ type:fix, type:features, type:documentation, type:tests, type:config ํ๊ทธ ์ค ํ๋๋ก ํ์๋์ด์ผ ํฉ๋๋ค.
ํ ์์ฒญ์ ์๋ ์ฃผ์
๋์ด์ค๊ธฐ ์์ฒญ์ ํตํ ํจ๊ณผ์ ์ธ ์์
๊ณผ ๊ฐ์ ์ฃผ์ ๋ฅผ ๋ค๋ฃจ์์ผ๋ฏ๋ก ๋ผ๋ฒจ๋ฌ์ ๊ฐ์ ์์
์ ๋ํด ์ด์ผ๊ธฐํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ด๋ ๋ณ๊ฒฝ๋ ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก PR์ ํ๊ทธ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋๋ ํฐ๋ฆฌ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ด ํฌํจ๋ ํ ์์ฒญ์ [build]๋ก ํ์ํ ์ ์์ต๋๋ค. .github/workflow
.
์ฐ๊ฒฐํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
name: "Auto-assign themes to PR"
on:
- pull_request
jobs:
triage:
runs-on: ubuntu-18.04
steps:
- uses: actions/labeler@v2
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
๋ํ ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ์ ๋์ด์ค๊ธฐ ์์ฒญ ์ฃผ์ ๊ฐ์ ๋์ ๊ด๊ณ๋ฅผ ์ค๋ช ํ๋ ํ์ผ์ด ํ์ํฉ๋๋ค.
theme:build:
- ".github/**"
- "pom.xml"
- ".travis.yml"
- ".gitignore"
- "Dockerfile"
theme:code:
- "src/main/*"
theme:tests:
- "src/test/*"
theme:documentation:
- "docs/**"
theme:TRASH:
- ".idea/**"
- "target/**"
ํ ์์ฒญ์ ์๋์ผ๋ก ๋ ์ด๋ธ์ ๋ฐฐ์นํ๋ ์์ ๊ณผ ํ์ ๋ ์ด๋ธ์ด ์๋์ง ํ์ธํ๋ ์์ ์ ์ฐ๊ฒฐํ๋ ๋ฐ ์ฑ๊ณตํ์ง ๋ชปํ์ต๋๋ค. match-label์ ๋ด์ด ์ถ๊ฐํ ๋ ์ด๋ธ์ ๋ณด๊ณ ์ถ์ดํ์ง ์์ต๋๋ค. ๋ ๋จ๊ณ๋ฅผ ๊ฒฐํฉํ ์์ ๋ง์ ์ก์ ์ ์์ฑํ๋ ๊ฒ์ด ๋ ์ฌ์ด ๊ฒ ๊ฐ์ต๋๋ค. ํ์ง๋ง ์ด ํ์์์๋ ์ฌ์ฉํ๊ธฐ๊ฐ ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. ๋์ด์ค๊ธฐ ์์ฒญ์ ์์ฑํ ๋ ๋ชฉ๋ก์์ ๋ ์ด๋ธ์ ์ ํํด์ผ ํฉ๋๋ค.
๋ฐฐํฌํ ์๊ฐ์ ๋๋ค.
GitHub Actions(ssh๋ฅผ ํตํด, scp๋ฅผ ํตํด, docker-hub๋ฅผ ์ฌ์ฉํ์ฌ)๋ฅผ ํตํด ์ฌ๋ฌ ๋ฐฐํฌ ์ต์ ์ ์๋ํ๋๋ฐ, ์๋ง๋ ํ์ดํ๋ผ์ธ์ด ์๋ฌด๋ฆฌ ๋น๋ค์ด์ ธ ์๋๋ผ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์๋ฒ์ ์ ๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ ๊ฒ์ด๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค. ์ด๋ค.
์ ์ฒด ์ธํ๋ผ๋ฅผ ํ ๊ณณ์ ๋ณด๊ดํ ์ ์๋ ์ต์ ์ด ๋ง์์ ๋ค์์ผ๋ฏ๋ก GitHub ํจํค์ง(๋ฐ์ด๋๋ฆฌ ์ฝํ ์ธ , npm, jar, docker์ฉ ์ ์ฅ์)์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ GitHub ํจํค์ง์ ๊ฒ์ํ๊ธฐ ์ํ ์คํฌ๋ฆฝํธ:
name: Deploy docker image
on:
push:
branches:
- 'master'
jobs:
build_docker_image:
runs-on: ubuntu-18.04
steps:
# Build JAR:
- uses: actions/checkout@v1
- name: set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 1.11
- name: Maven Package
run: mvn -B clean compile package -DskipTests
# Set global environment variables:
- name: set global env
id: global_env
run: |
echo "::set-output name=IMAGE_NAME::${GITHUB_REPOSITORY#*/}"
echo "::set-output name=DOCKERHUB_IMAGE_NAME::docker.pkg.github.com/${GITHUB_REPOSITORY}/${GITHUB_REPOSITORY#*/}"
# Build Docker image:
- name: Build and tag image
run: |
docker build -t "${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}:latest" -t "${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}:${GITHUB_SHA::8}" .
- name: Docker login
run: docker login docker.pkg.github.com -u $GITHUB_ACTOR -p ${{secrets.GITHUB_TOKEN}}
# Publish image to github package repository:
- name: Publish image
env:
IMAGE_NAME: $GITHUB_REPOSITORY
run: docker push "docker.pkg.github.com/$GITHUB_REPOSITORY/${{ steps.global_env.outputs.IMAGE_NAME }}"
๋จผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ JAR ํ์ผ์ ๋น๋ํ ํ GitHub ๋์ปค ๋ ์ง์คํธ๋ฆฌ ๊ฒฝ๋ก์ ์ด๋ฏธ์ง ์ด๋ฆ์ ๊ณ์ฐํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์์ง ๋ฐ๊ฒฌํ์ง ๋ชปํ ๋ช ๊ฐ์ง ํธ๋ฆญ์ด ์์ต๋๋ค.
- echo "::set-output name=NAME::VALUE"์ ๊ฐ์ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ฉด ํ์ฌ ๋จ๊ณ์์ ๋ณ์ ๊ฐ์ ์ค์ ํ์ฌ ๋ค๋ฅธ ๋ชจ๋ ๋จ๊ณ์์ ์ฝ์ ์ ์์ต๋๋ค.
- ์ด ๋จ๊ณ์ ์๋ณ์ ${{ steps.global_env.outputs.DOCKEHUB_IMAGE_NAME }} ๋ฅผ ํตํด ์ด์ ๋จ๊ณ์์ ์ค์ ๋ ๋ณ์์ ๊ฐ์ ์ป์ ์ ์์ต๋๋ค.
- ํ์ค GITHUB_REPOSITORY ๋ณ์๋ ์ ์ฅ์ ์ด๋ฆ๊ณผ ์์ ์(โowner/repo-nameโ)๋ฅผ ์ ์ฅํฉ๋๋ค. ์ ์ฅ์ ์ด๋ฆ์ ์ ์ธํ๊ณ ์ด ์ค์์ ๋ชจ๋ ๋ด์ฉ์ ์๋ผ๋ด๊ธฐ ์ํด bash ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค: ${GITHUB_REPOSITORY#*/}
๋ค์์ผ๋ก Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋ํด์ผ ํฉ๋๋ค.
docker build -t "docker.pkg.github.com/antkorwin/github-actions/github-actions:latest"
๋ ์ง์คํธ๋ฆฌ์ ๋ก๊ทธ์ธํฉ๋๋ค:
docker login docker.pkg.github.com -u $GITHUB_ACTOR -p ${{secrets.GITHUB_TOKEN}}
๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ์ง๋ฅผ GitHub ํจํค์ง ์ ์ฅ์์ ๊ฒ์ํฉ๋๋ค.
docker push "docker.pkg.github.com/antkorwin/github-actions/github-actions"
์ด๋ฏธ์ง ๋ฒ์ ์ ํ์ํ๊ธฐ ์ํด ์ปค๋ฐ SHA ํด์์ ์ฒซ ๋ฒ์งธ ์ซ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. GITHUB_SHA ๋ง์คํฐ์ ๋ณํฉํ ๋๋ฟ๋ง ์๋๋ผ ํ ์์ฒญ ์์ฑ์ ๋ฐ๋ผ ์ด๋ฌํ ๋น๋๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ ์ฌ๊ธฐ์๋ ๋์์ค๊ฐ ์์ต๋๋ค. ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด SHA๋ git ๊ธฐ๋ก์ ํ์๋ ํด์์ ์ผ์นํ์ง ์์ ์ ์์ต๋๋ค. ์์ /์ฒดํฌ์์ ์์ ์ด PR์ ๊ต์ฐฉ ์ํ ์์ ์ ํผํ๊ธฐ ์ํด ๊ณ ์ ํ ํด์๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ชจ๋ ๊ฒ์ด ์ ์๋ํ๋ค๋ฉด ์ ์ฅ์์์ ํจํค์ง ์น์ (https://github.com/antkorwin/github-actions/packages)์ ์ด๋ฉด ์๋ก์ด ๋์ปค ์ด๋ฏธ์ง๊ฐ ํ์๋ฉ๋๋ค.
์ฌ๊ธฐ์์ Docker ์ด๋ฏธ์ง ๋ฒ์ ๋ชฉ๋ก๋ ๋ณผ ์ ์์ต๋๋ค.
๋จ์ ๊ฒ์ ์ด ๋ ์ง์คํธ๋ฆฌ์ ์๋ํ๋๋ก ์๋ฒ๋ฅผ ๊ตฌ์ฑํ๊ณ ์๋น์ค๋ฅผ ๋ค์ ์์ํ๋ ๊ฒ์ ๋๋ค. ๋์ค์ systemd๋ฅผ ํตํด ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค.
๋ชจ๋ํฐ๋ง
GitHub Actions๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ํ์ธ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฐ๋จํ ์ต์
์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ์ ๋ถํ
์ ํ๋ฆฌ์ผ์ด์
์๋ ์ก์ถ์์ดํฐ๊ฐ ์์ผ๋ฏ๋ก ์ํ๋ฅผ ํ์ธํ๊ธฐ ์ํด API๋ฅผ ์์ฑํ ํ์์กฐ์ฐจ ์์ต๋๋ค. ๊ฒ์ผ๋ฅธ ์ฌ์ฉ์๋ฅผ ์ํด ์ด๋ฏธ ๋ชจ๋ ์์
์ ์๋ฃํ์ต๋๋ค. ํธ์คํธ๋ฅผ ๋์ด์ค๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. SERVER-URL:PORT/actuator/health
$ curl -v 127.0.0.1:8080/actuator/health
> GET /actuator/health HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.61.1
> Accept: */*
< HTTP/1.1 200
< Content-Type: application/vnd.spring-boot.actuator.v3+json
< Transfer-Encoding: chunked
< Date: Thu, 04 Jun 2020 12:33:37 GMT
{"status":"UP"}
์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฒ์ cron์ ์ฌ์ฉํ์ฌ ์๋ฒ๋ฅผ ํ์ธํ๋ ์์ ์ ์์ฑํ๋ ๊ฒ๋ฟ์ ๋๋ค. ๊ฐ์๊ธฐ ์๋ฒ๊ฐ ์๋ตํ์ง ์์ผ๋ฉด ํ ๋ ๊ทธ๋จ์ผ๋ก ์๋ฆผ์ ๋ณด๋ ๋๋ค.
๋จผ์ cron ์์ ํ๋ฆ์ ์คํํ๋ ๋ฐฉ๋ฒ์ ์์ ๋ณด๊ฒ ์ต๋๋ค.
on:
schedule:
- cron: '*/5 * * * *'
๊ฐ๋จํฉ๋๋ค. Github์์ ์นํ
์ ์ ํ ๋ง์ง ์๋ ์ด๋ฒคํธ๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์ฌ์ค์กฐ์ฐจ ๋ฏฟ์ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ฌธ์์ ๋์ ์์ต๋๋ค.
์ปฌ์ ํตํด ์๋์ผ๋ก ์๋ฒ ์ํ๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
jobs:
ping:
runs-on: ubuntu-18.04
steps:
- name: curl actuator
id: ping
run: |
echo "::set-output name=status::$(curl ${{secrets.SERVER_HOST}}/api/actuator/health)"
- name: health check
run: |
if [[ ${{ steps.ping.outputs.status }} != *"UP"* ]]; then
echo "health check is failed"
exit 1
fi
echo "It's OK"
๋จผ์ , ์๋ฒ๊ฐ ์์ฒญ์ ์๋ตํ ๋ด์ฉ์ ๋ณ์์ ์ ์ฅํ๊ณ , ๋ค์ ๋จ๊ณ์์๋ ์ํ๊ฐ UP์ธ์ง ํ์ธํ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ค๋ฅ์ ํจ๊ป ์ข ๋ฃํฉ๋๋ค. ์์ผ๋ก ์ด๋ค ํ๋์ "์๋"ํด์ผ ํ๋ค๋ฉด, 1 ๋ฒ ์ถ๊ตฌ - ์ ํฉํ ๋ฌด๊ธฐ.
- name: send alert in telegram
if: ${{ failure() }}
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_TO }}
token: ${{ secrets.TELEGRAM_TOKEN }}
message: |
Health check of the:
${{secrets.SERVER_HOST}}/api/actuator/health
failed with the result:
${{ steps.ping.outputs.status }}
์ด์ ๋จ๊ณ์์ ์์
์ด ์คํจํ ๊ฒฝ์ฐ์๋ง ํ
๋ ๊ทธ๋จ์ผ๋ก ๋ณด๋
๋๋ค. ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ค๋ฉด appleboy/telegram-action์ ์ฌ์ฉํฉ๋๋ค. ๋ฌธ์์์ ๋ด ํ ํฐ๊ณผ ์ฑํ
ID๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์ ์ฝ์ ์ ์์ต๋๋ค.
Github์ ์๋ฒ์ URL๊ณผ ํ ๋ ๊ทธ๋จ ๋ด์ ํ ํฐ์ ๋ํ ๋น๋ฐ์ ์์ฑํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
๋ณด๋์ค ํธ๋ - ๊ฒ์ผ๋ฅธ ์ฌ๋๋ค์ ์ํ JIRA
์ ๋ JIRA๋ก ๋์๊ฐ๊ฒ ๋ค๊ณ ์ฝ์ํ๊ณ , ๋์์์ต๋๋ค. ๋๋ ๊ฐ๋ฐ์๊ฐ ๊ธฐ๋ฅ์ ๋ง๋ค๊ณ ๋ธ๋์น๋ฅผ ๋ณํฉํ์ง๋ง ๋ฌธ์ ๋ฅผ JIRA๋ก ๋์ด์ค๋ ๊ฒ์ ์์ด๋ฒ๋ฆฐ ์คํ ๋์ ์ํฉ์ ์๋ฐฑ ๋ฒ ๊ด์ฐฐํ์ต๋๋ค. ๋ฌผ๋ก ์ด ๋ชจ๋ ์์ ์ ํ ๊ณณ์์ ์ํํ๋ฉด ๋ ์ฌ์ธ ์ ์์ง๋ง ์ค์ ๋ก๋ IDE์์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๋ธ๋์น๋ฅผ bitbucket ๋๋ GitHub์ ๋ณํฉํ ๋ค์ ์์ ์ Jira๋ก ๋๋๊ทธํฉ๋๋ค. ์ด๋ฅผ ์ํด์๋ ์ ์ฐฝ์ ์ด์ด์ผ ํฉ๋๋ค. , ๋๋ก๋ ๋ค์ ๋ก๊ทธ์ธํ๋ ๋ฑ์ ์์ ์ด ์์ต๋๋ค. ๋ค์์ ํด์ผ ํ ์ผ์ ์๋ฒฝํ๊ฒ ๊ธฐ์ตํ๋ฉด ๋ณด๋๋ฅผ ๋ค์ ์ด ํ์๊ฐ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์์นจ์ ์คํ ๋์ ์์ ์์ ๋ณด๋๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐ ์๊ฐ์ ๋ณด๋ด์ผ ํฉ๋๋ค.
GitHub๋ ์ด ์ผ์์ ์ธ ์์ ์๋ ๋์์ด ๋ฉ๋๋ค. ์ฐ์ ํ ์์ฒญ์ ์ ์ถํ ๋ ์ด์๋ฅผ code_review ์ด์ ์๋์ผ๋ก ๋์ด ๋์ ์ ์์ต๋๋ค. ๋น์ ์ด ํด์ผ ํ ์ผ์ ๋ธ๋์น ๋ช ๋ช ๊ท์น์ ๋ฐ๋ฅด๋ ๊ฒ ๋ฟ์ ๋๋ค:
[ะธะผั ะฟัะพะตะบัะฐ]-[ะฝะพะผะตั ัะฐัะบะฐ]-ะฝะฐะทะฒะฐะฝะธะต
์๋ฅผ ๋ค์ด ํ๋ก์ ํธ ํค "GitHub Actions"๊ฐ GA์ธ ๊ฒฝ์ฐ GA-8-jira-bot
GA-8 ์์
์ ๊ตฌํํ๊ธฐ ์ํ ๋ถ๊ธฐ๊ฐ ๋ ์ ์์ต๋๋ค.
JIRA์์ ํตํฉ์ Atlassian์ ์์ ์ ํตํด ์ด๋ฃจ์ด์ง์ง๋ง ์๋ฒฝํ์ง๋ ์์ต๋๋ค. ์ผ๋ถ๋ ์ ์๊ฒ ์ ํ ํจ๊ณผ๊ฐ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ํ์คํ ์๋ํ๊ณ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ๋ค์ ๋ํด์๋ง ๋ ผ์ํ ๊ฒ์ ๋๋ค.
๋จผ์ atlassian/gajira-login ์์ ์ ์ฌ์ฉํ์ฌ JIRA์ ๋ก๊ทธ์ธํด์ผ ํฉ๋๋ค.
jobs:
build:
runs-on: ubuntu-latest
name: Jira Workflow
steps:
- name: Login
uses: atlassian/gajira-login@master
env:
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
์ด๋ ๊ฒ ํ๋ ค๋ฉด JIRA์์ ํ ํฐ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๊ธฐ์ ์ค๋ช
๋์ด ์์ต๋๋ค.
๋ธ๋์น ์ด๋ฆ์์ ์์ ์๋ณ์๋ฅผ ์ถ์ถํฉ๋๋ค.
- name: Find Issue
id: find_issue
shell: bash
run: |
echo "::set-output name=ISSUE_ID::$(echo ${GITHUB_HEAD_REF} | egrep -o 'GA-[0-9]{1,4}')"
echo brach name: $GITHUB_HEAD_REF
echo extracted issue: ${GITHUB_HEAD_REF} | egrep -o 'GA-[0-9]{1,4}'
- name: Check Issue
shell: bash
run: |
if [[ "${{steps.find_issue.outputs.ISSUE_ID}}" == "" ]]; then
echo "Please name your branch according to the JIRA issue: [project_key]-[task_number]-branch_name"
exit 1
fi
echo succcessfully found JIRA issue: ${{steps.find_issue.outputs.ISSUE_ID}}
GitHub ๋ง์ผํ๋ ์ด์ค์์ ๊ฒ์ํ๋ฉด ์ด ์์ ์ ๋ํ ์์ ์ ์ฐพ์ ์ ์์ง๋ง Atlassian์ ์ด ์์ ์ ์ด๋ค ์์ผ๋ก๋ ๋ด ํ๋ก์ ํธ์์ ์์ ํ๊ณ ์ถ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ธ๋์น ์ด๋ฆ์ ์ฌ์ฉํ์ฌ grep์ ์ฌ์ฉํ์ฌ ๋์ผํ ์์ ์ ์์ฑํด์ผ ํ์ต๋๋ค. , ๊ฑฐ๊ธฐ์ ๋ฌด์์ด ์๋ชป๋์๋์ง ์์๋ด๋ ค๋ฉด ์์ผ๋ก ๊ฐ์ ์ผ์ ํ๋ ๊ฒ๋ณด๋ค ๋ ์ค๋ ๊ฑธ๋ฆฝ๋๋ค.
๋จ์ ๊ฒ์ ๋์ด์ค๊ธฐ ์์ฒญ์ ์์ฑํ ๋ ์์ ์ "์ฝ๋ ๊ฒํ " ์ด๋ก ์ด๋ํ๋ ๊ฒ์ ๋๋ค.
- name: Transition issue
if: ${{ success() }}
uses: atlassian/gajira-transition@master
with:
issue: ${{ steps.find_issue.outputs.ISSUE_ID }}
transition: "Code review"
GitHub์๋ ์ด์ ๋ํ ํน๋ณํ ์กฐ์น๊ฐ ์์ต๋๋ค. ํ์ํ ๊ฒ์ ์ด์ ๋จ๊ณ์์ ์ป์ ์ด์ ID์ ์์์ ์ํํ JIRA์ ์น์ธ๋ฟ์ ๋๋ค.
๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ง์คํฐ์ ๋ณํฉํ ๋ ์์ ๊ณผ GitHub ์ํฌํ๋ก์ ๋ค๋ฅธ ์ด๋ฒคํธ๋ฅผ ๋์ด์ ๋์ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ๊ฒ์ ์ผ์์ ์ธ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ๋ ค๋ ์์๋ ฅ๊ณผ ์๊ตฌ์ ๋ฌ๋ ค ์์ต๋๋ค.
์กฐ์ฌ ๊ฒฐ๊ณผ
ํด๋์ DEVOPS ๋ค์ด์ด๊ทธ๋จ์ ๋ณด๋ฉด ์ด์์ ์ ์ธํ ๋ชจ๋ ๋จ๊ณ๋ฅผ ๋ค๋ฃจ์์ต๋๋ค. ์๋ํด ๋ณด๋ฉด ์์ฅ์์ ํฌํ ๋ฐ์คํฌ ์์คํ ๊ณผ์ ํตํฉ์ ์ํ ๋ช ๊ฐ์ง ์กฐ์น๋ฅผ ์ฐพ์ ์ ์์ผ๋ฏ๋ก ํ์ดํ๋ผ์ธ์ด ์ ํ๋์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ฒ ์ ํ๊ฒ ๋ถ์ํ๊ณ ๊ทธ ์ฌ์ฉ์ ๋ฐ๋ผ ๊ฒฐ๋ก ์ ๋์ถํ ์ ์์ต๋๋ค.
์ฅ์ :
- ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด ๋ฏธ๋ฆฌ ์ค๋น๋ ์์ ์ ์ ๊ณตํ๋ ๋ง์ผํ๋ ์ด์ค๋ ๋งค์ฐ ๋ฉ์ง์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์์ค ์ฝ๋๋ฅผ ๋ณด๊ณ ์ ์ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๊ฑฐ๋ GitHub ์ ์ฅ์์ ์ง์ ์์ฑ์์๊ฒ ๊ธฐ๋ฅ ์์ฒญ์ ๊ฒ์ํ ์๋ ์์ต๋๋ค.
- ์ด์ ๋ธ๋ฆฌ ๋์ ํ๋ซํผ ์ ํ: Linux, mac os, windows๋ ๋งค์ฐ ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์ ๋๋ค.
- Github ํจํค์ง๋ ํ๋ฅญํ ๊ธฐ๋ฅ์ ๋๋ค. ์ ์ฒด ์ธํ๋ผ๋ฅผ ํ ๊ณณ์ ๋ณด๊ดํ๋ ๊ฒ์ด ํธ๋ฆฌํ๊ณ , ๋ค๋ฅธ ์ฐฝ์ ํตํด ์ํํ ํ์๊ฐ ์์ผ๋ฉฐ, ๋ชจ๋ ๊ฒ์ด ํ๋ ๋ฒ์ ๋ง์ฐ์ค ํด๋ฆญ ๋ฐ๊ฒฝ ๋ด์ ์์ผ๋ฉฐ GitHub Actions์ ์๋ฒฝํ๊ฒ ํตํฉ๋ฉ๋๋ค. ๋ฌด๋ฃ ๋ฒ์ ์ Docker ๋ ์ง์คํธ๋ฆฌ ์ง์๋ ์ข์ ์ฅ์ ์ ๋๋ค.
- GitHub๋ ๋น๋ ๋ก๊ทธ์ ๋น๋ฐ์ ์จ๊ธฐ๋ฏ๋ก ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ฐ๋ฒํธ์ ํ ํฐ์ ์ ์ฅํ๋ ๊ฒ์ ๊ทธ๋ค์ง ๋ฌด์ญ์ง ์์ต๋๋ค. ๋ชจ๋ ์คํ ๋์ ์ฝ์์์ ์์ํ ํํ์ ๋น๋ฐ์ ๋ณผ ์ ์์์ต๋๋ค.
- ์คํ ์์ค ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ๋ฌด๋ฃ
๋จ์ :
- YML, ์, ๋ ๊ทธ ์ฌ๋์ ์ข์ํ์ง ์์์. ์ด๋ฌํ ํ๋ฆ์ผ๋ก ์์ ํ ๋ ์ ๊ฐ ๋ฐ์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ปค๋ฐ ๋ฉ์์ง๋ "yml ํ์ ์์ "์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํญ์ ์ด๋๊ฐ์ ๋๋ ๊ฒ์ ์์ด๋ฒ๋ ธ๊ฑฐ๋ ์๋ชป๋ ์ค์ ์ผ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋๊ธฐ์ ์๋ฅผ ๋ค๊ณ ์คํฌ๋ฆฐ ์์ ์์ ์๋ ๊ฒ์ ๊ฐ์ฅ ์ฆ๊ฑฐ์ด ๊ฒฝํ์ด ์๋๋๋ค.
- DEBUG, ์ปค๋ฐ์ผ๋ก ํ๋ฆ ๋๋ฒ๊น , ์ฌ๊ตฌ์ถ ์คํ ๋ฐ ์ฝ์๋ก ์ถ๋ ฅํ๋ ๊ฒ์ด ํญ์ ํธ๋ฆฌํ ๊ฒ์ ์๋์ง๋ง "๊ณผ๋ํ ์์ " ๋ฒ์ฃผ์ ๊ฐ๊น์ต๋๋ค. ๋ฌด์์ด๋ ๋๋ฒ๊น ํ ์ ์์ผ๋ฉด ํธ๋ฆฌํ IDEA๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ๋ ๋ฐ ์ต์ํฉ๋๋ค. .
- Docker๋ก ๋ํํ๋ฉด ๋ฌด์์ด๋ ์ก์ ์ ์์ฑํ ์ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก javascript๋ง ์ง์๋ฉ๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ ์ทจํฅ์ ๋ฌธ์ ์ด์ง๋ง js ๋์ ๋ค๋ฅธ ๊ฒ์ ์ ํธํฉ๋๋ค.
๋ชจ๋ ์คํฌ๋ฆฝํธ๊ฐ ํฌํจ๋ ์ ์ฅ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ค์์ฃผ์๋ ๊ฐ์ด ๊ณต์ฐํ ๊ฑฐ์์
๋ณด๊ณ ์ Heisenbug 2020 Piter ์ปจํผ๋ฐ์ค์์. ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ ๋ ์ค์๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ๋ฟ๋ง ์๋๋ผ Java ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ ์ธํธ๋ก ์์ ํ๋ ๋น๊ฒฐ๋ ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค!
์ถ์ฒ : habr.com