• ์๋ ํ์ธ์~ ์ด์ ์ ์ด์ํ๋ ๋ธ๋ก๊ทธ ๋ฐ GitHub, ๊ณต๋ถ ๋ด์ฉ์ ์ ๋ฆฌํ๋ Study-GitHub ๊ฐ ์์ต๋๋ค!
• ๐
๐ GitHub Action์ ํตํ Build ์๋ํ (SpringBoot + Maven)
์๋ ํ์ธ์! ์ด๋ฒ์ ์ ๋ฆฌํ ๋ด์ฉ์ GitHub Action์ ํตํด ํ๋ก์ ํธ๋ฅผ ์๋์ผ๋ก Build ํ๋๋ก ์ค์ ํด๋ณด๊ฒ ์ต๋๋ค.
ํ์ฌ AWS EC2์ Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๊ณ ์๋๋ฐ์, ๋ฐฐํฌํ๊ธฐ๊น์ง์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ก์ปฌ์์ ์ฝ๋ ์์ -> Commit -> GitHub PR -> Merge
- AWS์์ ์์ ๋ ์ฝ๋ pull -> ์คํ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง(kill) -> ๋ฉ์ด๋ธ ๋น๋ -> ์ ํ๋ฆฌ์ผ์ด์ ์คํ
์๊ฐ์ด ์์ฒญ ์ก์๋จน๋ ๋ด์ฉ์ ์๋์ง๋ง, ๊ทธ๋๋ ํ ๋ฒ ๋ฐฐํฌํ ๋๊น์ง ๊ต์ฅํ ๋ง์ ์์ ์ด ์ด๋ฃจ์ด์ง๊ฒ ๋ฉ๋๋ค.
๋ํ ์ง์ ์์ผ๋ก ์์ ์ ํ๋ค๋ฉด ์ค์ํ ์ฌ์ง๋ ์๊ธฐ๊ณ , ๋ฐฐํฌ๋ฅผ ๋ง์ดํ๋ฉด ํ ์๋ก ๋ ๋ง์ด ์๊ฐ์ ์ก์๋จน๊ฒ ์ฃ ?
๋ฐ๋ผ์ ์ด๋ฌํ ๊ณผ์ ์ ํ ๋ฒ ์๊ฐ์ ๋ค์ฌ ์๋ํ๋ฅผ ์งํํด๋์ผ๋ฉด, ์ดํ ๋ฐ๋ณต์ ์ธ ์์ ์ ํ ํ์๊ฐ ์์ต๋๋ค!!
์ฆ, ์ด์ ๊ฐ์ ๊ณผ์ ์ CI(Continuous Integration) - ์ง์์ ํตํฉ , CD(Continuous Delivery) - ์ง์์ ์ ๋ฌ
์ด๋ผ๊ณ ํฉ๋๋ค.
์๋ก ๊ฐ๋ฐํ ๊ธฐ๋ฅ, ๋น์ฆ๋์ค ๋ก์ง ๋ฑ์ ์ค์ ์๋น์ค์ ๋ฐ์ํ๊ธฐ ์ํด์๋ ์์ ๊ฐ์ ๊ณผ์ ์ธ ๋จธ์ง, ํ ์คํธ, ๋น๋, ๋ฐฐํฌ ๋ฑ๋ฑ์ ์์ ์ด ํ์ํ๋ฐ ์ด๋ฌํ ์์ ์ ์๋ํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
CircleCI, TravisCI, Jenkins ๋ฑ๋ฑ ์ฌ๋ฌ ์ ๋ช ํ CI / CD ํด์ด ์กด์ฌํ๋๋ฐ์, ์ ๋ GitHub Action์ ํตํด ์งํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
GitHub Action์ ๊นํ๋ธ์์ ๊ณต์์ ์ผ๋ก ์ ๊ณตํ๋ CI / CD ํด์ธ๋ฐ ์ ๋ ์ฌ์ฉํด๋ณด์ง ์์๊ณ , ๊นํ๋ธ์์ ์ผ์ํ๋ ๊ฐ๋ฐ ํ๊ฒฝ์ผ๋ก ๋ชจ๋ ๊ณผ์ ์ ๊ด๋ฆฌํ ์ ์๋ ํธ๋ฆฌํจ์ด ์๊ธฐ ๋๋ฌธ์ GitHub Action์ ์ ํํ์ต๋๋ค!
(์ด๋ฒ ํฌ์คํ ์์ ์งํํ ๋ด์ฉ์ GitHub์ ์ด๋ฒคํธ ๋ฐ์ ์(Push & PR) ์๋์ผ๋ก Build๋ฅผ ์งํํ๋ ๊ณผ์ ์ ๋๋ค.)
๐ฏ GitHub Action yml ํ์ผ ์์ฑํ๊ธฐ
์ ๋ Spring Boot + Maven + IntelliJ ํ๊ฒฝ์์ ์์ ์ ์งํํ๊ณ ์์ต๋๋ค.
yml ํ์ผ์ GitHub์ Actions ํญ์์ ์ง์ ์์ฑ์ ํ ์ ์๊ณ , ์ง์ ์ฝ๋๋ฅผ ์์ฑํด๋ ๋ฉ๋๋ค.
์ฐ๋ํ GitHub ํ๋ก์ ํธ์์ Actions ํญ์ผ๋ก ๋ค์ด๊ฐ๋๋ค.
Java with Maven ์ ์ ํํฉ๋๋ค. (Set up this workflow)
๊ฒฝ๋ก๋ ๋ณด์๋ฉด ํ๋ก์ ํธ > .github/workflows/ymlํ์ผ
ํญ์ ์์ ๊ฐ์ ๊ตฌ์กฐ๊ฐ ๋์ด์ผ ํฉ๋๋ค.
yml ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ์์ฑ๋์ด ์์ต๋๋ค.
on:
- ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๋ฉฐ ์ํฌํ๋ก์ฐ๋ฅผ ์คํ์ํค๋ ์กฐ๊ฑด
- ์ ํ์ผ์ main ๋ธ๋์น๋ก push ๋ฐ pr(pull_request)์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์คํ์ด ๋ฉ๋๋ค.
jobs:
- ํ๋์ ์ธ์คํด์ค์์ ์ฌ๋ฌ Step(์ปดํ์ผ, ํ ์คํธ, ๋น๋, ๋ฐฐํฌ ๋ฑ๋ฑ)์ ๊ทธ๋ฃนํ์์ผ ์คํํ๋ ์ญํ ์ผ๋ก, ๋ณ๋ ฌ๋ก ์คํ๋ฉ๋๋ค.
- runs-on: GitHub Action ์คํฌ๋ฆฝํธ๊ฐ ์๋๋ OS ํ๊ฒฝ์ ์ง์ ํฉ๋๋ค.
- uses: actions/checkout@v2: ํ๋ก์ ํธ ์ฝ๋๋ก checkout์ ํฉ๋๋ค.
- uses: actions/setup-java@v2: GitHub Action์ด ์คํ๋ OS์ Java๋ฅผ ์ค์นํฉ๋๋ค.
- steps: ํ์ ๋ถ๋ถ์ ํด๋น steps์ ๋ํ ์์ฑ์ ๋๋ค.
๋จผ์ ์์ ๊ฐ์ด ์ค์ ์ํ๊ณ main ๋ธ๋์น์ push๋ pr์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์๋, ์ ์์ ์ผ๋ก build๊ฐ ๋๋์ง ํ ์คํธํด๋ด ์๋ค.
๐ฏ GitHub Action์ ํตํด ๋น๋ํ๊ธฐ
์ ์์ฑ์ด ๋๋๋ฉด push ํน์ PR์ ํตํด ๋น๋๋ฅผ ํ์ธํด๋ด ๋๋ค.
๊ฐ๋จํ ์์ ์ ์งํํ ํ main ๋ธ๋์น๋ก PR์ ์์ฒญํ๋ฉด ์์ ๊ฐ์ด GitHub Action ์ด ์๋ํฉ๋๋ค.
ํ์ฌ Actions ์ด ์งํ์ค์ด๋ฉฐ, ์์ ์๋ฃ ์ ์๋์ ๊ฐ์ ํ์๊ฐ ๋ํ๋๊ฒ ๋ฉ๋๋ค.
workflow์ ๋ก๊ทธ๋ฅผ ํ์ธํ๊ณ ์ถ์ผ๋ฉด ํด๋น build๋ฅผ ํด๋ฆญํฉ๋๋ค.
๊ทธ๋ผ ์์ ๊ฐ์ด ๊ฐ job ๋ณ๋ก ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๐ฏ GitHub Action์ Time ๋ก๊ทธ ์ถ๊ฐํ๊ธฐ
yml ํ์ผ์ build ์์ ์ ํ์ฌ ์๊ฐ์ ์ถ๋ ฅํ๋ job์ ์ถ๊ฐํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
- name: Get Current Time
uses: 1466587594/get-current-time@v2
id: current-time
with:
format: YYYY-MM-DDTHH:mm:ss
utcOffset: "+09:00" # ๊ธฐ์ค์ด UTC์ด๊ธฐ ๋๋ฌธ์ ํ๊ตญ์๊ฐ์ธ KST๋ฅผ ๋ง์ถ๊ธฐ ์ํด +9์๊ฐ ์ถ๊ฐ
- name: Print Current Time
run: echo "Current Time=${{steps.current-time.outputs.formattedTime}}" # current-time ์์ ์ง์ ํ ํฌ๋งท๋๋ก ํ์ฌ ์๊ฐ ์ถ๋ ฅ
shell: bash
์ ์ฝ๋๋ฅผ yml ํ์ผ์ ํฌํจํ ๋ค ์ ์ฒด ์ฝ๋๋ฅผ ํ์ธํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: Oneline-GitHub Action
on: # ์ด๋ฒคํธ ๊ฐ์ง, ์ํฌํ๋ก์ฐ๋ฅผ ์คํ์ํค๋ ์กฐ๊ฑด ์ค์
push:
branches: [ main ] # push ๋๋ฉด ์คํ๋ ๋ธ๋์น ์ ํ(main)
pull_request:
branches: [ main ] # pull_request(PR) ๋๋ฉด ์คํ๋ ๋ธ๋์น ์ ํ(main)
jobs: # job - ํ๋์ ์ธ์คํด์ค์์ ์ฌ๋ฌ Step์ ๊ทธ๋ฃน์์ผ ์คํํ๋ ์ญํ , ๋ณ๋ ฌ๋ก ์คํ
build:
runs-on: ubuntu-latest
steps: # ์์ฐจ์ ์ผ๋ก ๋ช
๋ น์ด ์ํ
- name: Checkout
uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'adopt'
- name: Build with Maven
run: mvn -B package --file back/pom.xml
- name: Get Current Time
uses: 1466587594/get-current-time@v2
id: current-time
with:
format: YYYY-MM-DDTHH:mm:ss
utcOffset: "+09:00" # ๊ธฐ์ค์ด UTC์ด๊ธฐ ๋๋ฌธ์ ํ๊ตญ์๊ฐ์ธ KST๋ฅผ ๋ง์ถ๊ธฐ ์ํด +9์๊ฐ ์ถ๊ฐ
- name: Print Current Time
run: echo "Current Time=${{steps.current-time.outputs.formattedTime}}" # current-time ์์ ์ง์ ํ ํฌ๋งท๋๋ก ํ์ฌ ์๊ฐ ์ถ๋ ฅ
shell: bash
์ ๊ณผ์ ์ ๋๋ธ ํ push๋ฅผ ์งํํ๊ณ GitHub Action์ ํ์ธํ๋ฉด ์์ ๊ฐ์ด ๋น๋์์ ์ ์๊ฐ์ด ์ถ๋ ฅ๋๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
๐ฏ GitHub Action์ cache ์ ์ฉํ๊ธฐ
GitHub Action์์ workflows ์๊ฐ์ ๋จ์ถ์ํค๊ธฐ ์ํด cache๋ฅผ ์ ์ฉํด ๋ด ์๋ค.
์์ธํ ๋ด์ฉ์ ์๋ ์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
https://docs.github.com/en/actions/guides/caching-dependencies-to-speed-up-workflows
# Caching dependencies
- name: Cache Maven packages
uses: actions/cache@v2
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
yml ํ์ผ์์ build ๋ฐ๋ก ์์ ์ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์์ ๊ฐ์ด ์ ์ฉํ๊ณ ํ ์คํธ๋ฅผ ์งํํด๋ด ๋๋ค.
์บ์๋ฅผ ์ ์ฉํ๊ธฐ ์ ์๋ build ์๊ฐ์ด ํ๊ท 70 ~ 80์ด์ ๋ ๊ฑธ๋ ธ๋ค๋ฉด,
์บ์๋ฅผ ์ ์ฉํ ํ์๋ ํ๊ท 50 ~ 60์ด์ ๋์ ์๊ฐ์ด ์์๋ฉ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก 20~30% ์ ๋์ ์๊ฐ์ด ๋จ์ถ๋์๋๋ฐ์, ๊ฝค ์ ์ ํ ๊ฒ ๊ฐ์ต๋๋ค ๐
References
- https://jojoldu.tistory.com/543
- https://isntyet.github.io/deploy/github-action%EA%B3%BC-aws-code-deploy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-spring-boot-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0(1)/
- https://docs.github.com/en/actions/guides/building-and-testing-java-with-maven
- https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions
'DevOps' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
GitHub-Actions๋ก CI/CD ๊ตฌ์ถํ๊ธฐ(AWS, Docker, SpringBoot) (18) | 2022.05.03 |
---|---|
[Docker] Spring Boot + Docker + AWS EC2 ๋ฐฐํฌํ๊ธฐ(MacOS M1) (1) | 2021.07.19 |
[Apache Kafka] ์นดํ์นด Window ์ค์น & ํ ์คํธ (0) | 2021.02.06 |
๋๊ธ