GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

Java๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์˜คํ”ˆ ์†Œ์Šค์ธ ๊ฒฝ์šฐ๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ตœ๊ทผ Travis-CI์™€ TeamCity์—์„œ GitHub Actions๋กœ ๋‚ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ค‘ ์ผ๋ถ€๋ฅผ ์ด๋™ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ณ  ์ด๊ฒƒ์ด ๊ฒฐ๊ณผ์˜€์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์„ ์ž๋™ํ™”ํ•  ๊ฒƒ์ธ๊ฐ€?

๋จผ์ € ์ž๋™ํ™”ํ•  ํ”„๋กœ์ ํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Spring boot/Java 11/Maven์—์„œ ์ž‘์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์˜ ๋ชฉ์ ์— ๋”ฐ๋ผ ์šฐ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์— ์ „ํ˜€ ๊ด€์‹ฌ์„ ๋‘์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฃผ๋ณ€์˜ ์ธํ”„๋ผ๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ์ค‘์š”ํ•˜๋ฏ€๋กœ ๊ฐ„๋‹จํ•œ REST API ์ปจํŠธ๋กค๋Ÿฌ์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์†Œ์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: github.com/antkorwin/github-actions ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•์˜ ๋ชจ๋“  ๋‹จ๊ณ„๋Š” ์ด ํ”„๋กœ์ ํŠธ์˜ ํ’€ ์š”์ฒญ์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

JIRA ๋ฐ ๊ณ„ํš

์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ JIRA๋ฅผ ์ด์Šˆ ์ถ”์ ๊ธฐ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ด ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ๋ณด๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฑฐ๊ธฐ์— ์ฒซ ๋ฒˆ์งธ ์ด์Šˆ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

์ž ์‹œ ํ›„์— 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 ๋ฉ”์ด๋ธ์ด ๊ฐ‘์ž๊ธฐ ์šฐ๋ฆฌ์—๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฌป๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š๋„๋ก ๋น„๋Œ€ํ™”ํ˜• ๋ชจ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

์—„์ฒญ๋‚œ! ์ด์ œ ๋งˆ์Šคํ„ฐ์— ์ปค๋ฐ‹ํ•  ๋•Œ๋งˆ๋‹ค ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ž๋™ํ™”

์กฐ๋ฆฝ์€ ์ข‹์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ž‘๋™์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์ž๋™ํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ 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์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์„ค์ •์—์„œ ๋น„๋ฐ€์— ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

์—์„œ ํ† ํฐ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. codecov.io GitHub๋ฅผ ํ†ตํ•ด ์Šน์ธํ•œ ํ›„ ๊ณต๊ฐœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งํฌ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉด ๋ฉ๋‹ˆ๋‹ค. GitHub ์‚ฌ์šฉ์ž ์ด๋ฆ„/[์ €์žฅ์†Œ ์ด๋ฆ„]. ๊ฐœ์ธ ์ €์žฅ์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” Github์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— codecov ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

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 ๋ด‡์€ ๊ฐ ํ’€ ์š”์ฒญ์„ ์ž…๋ ฅํ•˜๊ณ  ์ ์šฉ ๋ฒ”์œ„ ๋ณ€๊ฒฝ ๊ทธ๋ž˜ํ”„๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

์ •์  ๋ถ„์„๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์—์„œ ์ •์  ์ฝ”๋“œ ๋ถ„์„์„ ์œ„ํ•ด 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 - ๋‹ค์Œ์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. sonarcloud.io ๋น„๋ฐ€๊ธ€๋กœ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. GITHUB_TOKEN - ์ด๋Š” GitHub๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๋‚ด์žฅ ํ† ํฐ์œผ๋กœ, ์ด๋ฅผ ํ†ตํ•ด sonarcloud[bot]๊ฐ€ Git์— ๋กœ๊ทธ์ธํ•˜์—ฌ ํ’€ ์š”์ฒญ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Dsonar.projectKey โ€” ์†Œ๋‚˜์˜ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์€ ํ”„๋กœ์ ํŠธ ์„ค์ •์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Dsonar.์กฐ์ง โ€” GitHub์˜ ์กฐ์ง ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

ํ’€ ์š”์ฒญ์„ ํ•˜๊ณ  sonarcloud[bot]๊ฐ€ ๋Œ“๊ธ€์— ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ

๋นŒ๋“œ๊ฐ€ ๊ตฌ์„ฑ๋˜์—ˆ๊ณ  ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์œผ๋ฏ€๋กœ ๋ฆด๋ฆฌ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GitHub Actions๋ฅผ ํ†ตํ•ด ๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ›จ์”ฌ ์‰ฌ์›Œ์ง€๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ง์žฅ์—๋Š” ์ฝ”๋“œ ๋ฒ ์ด์Šค๊ฐ€ bitbucket์— ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(๋ชจ๋“  ๊ฒƒ์ด "๋‚ฎ์—๋Š” bitbucket์— ์“ฐ๊ณ  ๋ฐค์—๋Š” GitHub์— ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค"๋ผ๋Š” ์ด์•ผ๊ธฐ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค). ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ bitbucket์—๋Š” ๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ ๋„๊ตฌ๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•ด ์ˆ˜๋™์œผ๋กœ ํ•ฉ๋ฅ˜ ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฆด๋ฆฌ์Šค์— ํฌํ•จ๋œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฑฐ๊ธฐ์— ๋˜์ ธ์•ผ ํ•˜๊ณ , ๋งˆ์Œ์˜ ๊ถ์ „์„ ๊ฒ€์ƒ‰ํ•˜๊ณ , Jira์˜ ์ž‘์—…์„ ๊ฒ€์ƒ‰ํ•˜๊ณ , ์ €์žฅ์†Œ์—์„œ ์ปค๋ฐ‹ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์‹ค์ˆ˜ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋งŽ์œผ๋ฉฐ, ๋ฌด์–ธ๊ฐ€๋ฅผ ์žŠ๊ฑฐ๋‚˜ ์ง€๋‚œ๋ฒˆ์— ์ด๋ฏธ ๋ฆด๋ฆฌ์Šค๋œ ๊ฒƒ์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ๋ฌด์—‡์œผ๋กœ ๋ถ„๋ฅ˜ํ•ด์•ผ ํ• ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์ธ์ง€, ๋ฒ„๊ทธ ์ˆ˜์ •์ธ์ง€, ํ…Œ์ŠคํŠธ ํŽธ์ง‘์ธ์ง€, ์•„๋‹ˆ๋ฉด ๋ญ”๊ฐ€ ์ธํ”„๋ผ์ ์ธ ๊ฒƒ .

GitHub ์ž‘์—…์ด ์–ด๋–ป๊ฒŒ ์šฐ๋ฆฌ์—๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‚˜์š”? ํ›Œ๋ฅญํ•œ ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆด๋ฆฌ์Šค ์ดˆ์•ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ํŒŒ์ผ ํ…œํ”Œ๋ฆฟ์„ ์„ค์ •ํ•˜์—ฌ ํ’€ ์š”์ฒญ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ํŒŒ์ผ์—์„œ ์ž๋™์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

๋ณด๊ณ ์„œ ์„ค์ •์„ ์œ„ํ•œ ์˜ˆ์ œ ํ…œํ”Œ๋ฆฟ(.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 ํƒœ๊ทธ ์ค‘ ํ•˜๋‚˜๋กœ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

ํ’€ ์š”์ฒญ์˜ ์ž๋™ ์ฃผ์„

๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ํ†ตํ•œ ํšจ๊ณผ์ ์ธ ์ž‘์—…๊ณผ ๊ฐ™์€ ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃจ์—ˆ์œผ๋ฏ€๋กœ ๋ผ๋ฒจ๋Ÿฌ์™€ ๊ฐ™์€ ์ž‘์—…์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ 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๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

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์˜ ๊ต์ฐฉ ์ƒํƒœ ์ž‘์—…์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์œ ํ•œ ํ•ด์‹œ๋ฅผ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ–ˆ๋‹ค๋ฉด ์ €์žฅ์†Œ์—์„œ ํŒจํ‚ค์ง€ ์„น์…˜(https://github.com/antkorwin/github-actions/packages)์„ ์—ด๋ฉด ์ƒˆ๋กœ์šด ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

์—ฌ๊ธฐ์—์„œ 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์—์„œ ์›นํ›…์— ์ „ํ˜€ ๋งž์ง€ ์•Š๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์กฐ์ฐจ ๋ฏฟ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฌธ์„œ์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. help.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events-schedule

์ปฌ์„ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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.com/appleboy/telegram-action

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

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์—์„œ ํ† ํฐ์„ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๊ธฐ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. confluence.atlassian.com/cloud/api-tokens-938839638.html

๋ธŒ๋žœ์น˜ ์ด๋ฆ„์—์„œ ์ž‘์—… ์‹๋ณ„์ž๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

  - 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 Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋งˆ์Šคํ„ฐ์— ๋ณ‘ํ•ฉํ•  ๋•Œ ์ž‘์—…๊ณผ GitHub ์›Œํฌํ”Œ๋กœ์˜ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๋ฅผ ๋Œ์–ด์„œ ๋†“์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์€ ์ผ์ƒ์ ์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•˜๋ ค๋Š” ์ƒ์ƒ๋ ฅ๊ณผ ์š•๊ตฌ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

์กฐ์‚ฌ ๊ฒฐ๊ณผ

ํด๋ž˜์‹ DEVOPS ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๋ณด๋ฉด ์šด์˜์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ๋‹ค๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ๋ณด๋ฉด ์‹œ์žฅ์—์„œ ํ—ฌํ”„ ๋ฐ์Šคํฌ ์‹œ์Šคํ…œ๊ณผ์˜ ํ†ตํ•ฉ์„ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์กฐ์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ „ํ™˜๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฒ ์ €ํ•˜๊ฒŒ ๋ถ„์„ํ•˜๊ณ  ๊ทธ ์‚ฌ์šฉ์— ๋”ฐ๋ผ ๊ฒฐ๋ก ์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ ์ง€์˜ฅ์˜ ์›(์ž๋ฐ” ํ”„๋กœ์ ํŠธ์šฉ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•)

์žฅ์  :

  • ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ์ค€๋น„๋œ ์ž‘์—…์„ ์ œ๊ณตํ•˜๋Š” ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค๋Š” ๋งค์šฐ ๋ฉ‹์ง€์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๊ฑฐ๋‚˜ GitHub ์ €์žฅ์†Œ์— ์ง์ ‘ ์ž‘์„ฑ์ž์—๊ฒŒ ๊ธฐ๋Šฅ ์š”์ฒญ์„ ๊ฒŒ์‹œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์–ด์…ˆ๋ธ”๋ฆฌ ๋Œ€์ƒ ํ”Œ๋žซํผ ์„ ํƒ: Linux, mac os, windows๋Š” ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • Github ํŒจํ‚ค์ง€๋Š” ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ์ธํ”„๋ผ๋ฅผ ํ•œ ๊ณณ์— ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•˜๊ณ , ๋‹ค๋ฅธ ์ฐฝ์„ ํ†ตํ•ด ์„œํ•‘ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ๋ชจ๋“  ๊ฒƒ์ด ํ•œ๋‘ ๋ฒˆ์˜ ๋งˆ์šฐ์Šค ํด๋ฆญ ๋ฐ˜๊ฒฝ ๋‚ด์— ์žˆ์œผ๋ฉฐ GitHub Actions์™€ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. ๋ฌด๋ฃŒ ๋ฒ„์ „์˜ Docker ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ง€์›๋„ ์ข‹์€ ์žฅ์ ์ž…๋‹ˆ๋‹ค.
  • GitHub๋Š” ๋นŒ๋“œ ๋กœ๊ทธ์— ๋น„๋ฐ€์„ ์ˆจ๊ธฐ๋ฏ€๋กœ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ํ† ํฐ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ๋ฌด์„ญ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‹คํ—˜ ๋™์•ˆ ์ฝ˜์†”์—์„œ ์ˆœ์ˆ˜ํ•œ ํ˜•ํƒœ์˜ ๋น„๋ฐ€์„ ๋ณผ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๋ฌด๋ฃŒ

๋‹จ์  :

  • YML, ์Œ, ๋‚œ ๊ทธ ์‚ฌ๋žŒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์•„์š”. ์ด๋Ÿฌํ•œ ํ๋ฆ„์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ ์ œ๊ฐ€ ๋ฐ›์€ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” "yml ํ˜•์‹ ์ˆ˜์ •"์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํƒญ์„ ์–ด๋”˜๊ฐ€์— ๋‘๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ ธ๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ์ค„์— ์ผ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ๋„๊ธฐ์™€ ์ž๋ฅผ ๋“ค๊ณ  ์Šคํฌ๋ฆฐ ์•ž์— ์•‰์•„ ์žˆ๋Š” ๊ฒƒ์€ ๊ฐ€์žฅ ์ฆ๊ฑฐ์šด ๊ฒฝํ—˜์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • DEBUG, ์ปค๋ฐ‹์œผ๋กœ ํ๋ฆ„ ๋””๋ฒ„๊น…, ์žฌ๊ตฌ์ถ• ์‹คํ–‰ ๋ฐ ์ฝ˜์†”๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ํŽธ๋ฆฌํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ "๊ณผ๋„ํ•œ ์ž‘์—…" ๋ฒ”์ฃผ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์ด๋“  ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ํŽธ๋ฆฌํ•œ IDEA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…ํ•˜๋Š” ๋ฐ ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. .
  • Docker๋กœ ๋ž˜ํ•‘ํ•˜๋ฉด ๋ฌด์—‡์ด๋“  ์•ก์…˜์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ javascript๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ ์ทจํ–ฅ์˜ ๋ฌธ์ œ์ด์ง€๋งŒ js ๋Œ€์‹  ๋‹ค๋ฅธ ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋œ ์ €์žฅ์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. github.com/antkorwin/github-actions

๋‹ค์Œ์ฃผ์—๋Š” ๊ฐ™์ด ๊ณต์—ฐํ•  ๊ฑฐ์˜ˆ์š” ๋ณด๊ณ ์„œ Heisenbug 2020 Piter ์ปจํผ๋Ÿฐ์Šค์—์„œ. ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•  ๋•Œ ์‹ค์ˆ˜๋ฅผ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋กœ ์ž‘์—…ํ•˜๋Š” ๋น„๊ฒฐ๋„ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค!

์ถœ์ฒ˜ : habr.com