์ด๋ณด ๊ฐ๋ฐ์๋ ๋ฐ๋ผํ๋ GitHub Actions CI ํ์ดํ๋ผ์ธ ์ค์ ๊ฐ์ด๋๐
์๋ ํ์ธ์! ๐ ํน์ ‘GitHub Actions’๋ผ๋ ๋ง์ ๋ค์ด๋ดค์ง๋ง, ‘์ด๊ฒ ๊ณผ์ฐ ๋ญ์ง?’ ํ๋ฉด์ ๋ง๋งํ๋ ์ ์๋์? ๐ค ์ค๋์ ๊ฐ๋ฐ ์ด๋ณด์๋ ์ฝ๊ฒ ๋ฐ๋ผ ํ ์ ์๋ GitHub Actions๋ฅผ ํ์ฉํ CI(์ง์์ ํตํฉ) ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ์น์ ํ๊ฒ ์๋ ค๋๋ฆด๊ฒ์! ๐ป๐ก
์ด ๊ธ ํ๋๋ฉด, ์์ฐ! ์ด์ ๋ ๋ด ํ๋ก์ ํธ์ ์๋ ๋น๋(๋น๋ ์๋ํ), ํ ์คํธ, ๋ฐฐํฌ๊น์ง ๐ค๐ฅ ์๋ฒฝํ๊ฒ ์ ์ ํ ์ ์์ต๋๋ค! ๐โจ
์, ๊ทธ๋ผ ์์ํด๋ณผ๊น์? ๐
๐ GitHub Actions๋? ๐ค
- โ GitHub ๋ด์์ ์ ๊ณตํ๋ CI/CD ๋๊ตฌ๋ก์, ์ฝ๋ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํ๋ฉด ์๋์ผ๋ก ๋น๋ ๋๋ ํ ์คํธ๋ฅผ ์ํํ๋ ๊ฒ!
- โ ๊ฐ๋ฐ์ ์ ๋ง์ด ์ ๊ฐ๋ ์๋ํ ๊ฐ๋ฅ! โจ
- โ ์คํ์์ค, ๊ฐ์ธ ํ๋ก์ ํธ, ํ์ฌ ํ๋ก์ ํธ ๋ชจ๋ ํ์ฉ ๊ฐ๋ฅ
๐ฅ ์ GitHub Actions๋ฅผ ์จ์ผ ํ ๊น? ๐ญ
- โ ํธ๋ฆฌํ ์ฐ๋์ฑ: GitHub ์ ์ฅ์ ๋ฐ๋ก ์ฐ๋ํ์ฌ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
- โ ๋ฌด๋ฃ ์ ๊ณต๋ ์ถฉ๋ถ: ๋๋ถ๋ถ์ ์๊ท๋ชจ ํ๋ก์ ํธ์ ๋ฌด์ ํ ์ฌ์ฉ ๊ฐ๋ฅ
- โ ์ปค์คํฐ๋ง์ด์ง ์ฉ์ด: ๋ค์ํ ์ํฌํ๋ก์ฐ์ ์ก์ ์ ๊ณต
- โ ์๋ํ๋ก ์๊ฐ ์ ์ฝ + ์ค์ ๋ฐฉ์ง! ๐ฅณ
๐ ๏ธ ์์ํ๊ธฐ ์ ์ ์ค๋น๋ฌผ ์ฒดํฌ๋ฆฌ์คํธ! โ
- ๐ป GitHub ๊ณ์ (๋น์ฐํ ํ์! ๐)
- ๐ ํ๋ก์ ํธ ์ ์ฅ์ (๊ณต๊ฐ ๋๋ ๋น๊ณต๊ฐ ์ ํ)
- ๐งฉ ๊ธฐ์ด์ ์ธ Git & GitHub ์ฌ์ฉ๋ฒ ์ดํด
- โ๏ธ (์ ํ) Docker, Node.js, Python ๋ฑ ์ฌ์ฉํ๋ ๊ธฐ์ ํ๊ฒฝ ์ดํด
๐ฆ GitHub Actions CI ํ์ดํ๋ผ์ธ ๋จ๊ณ๋ณ ์ธํ ๊ฐ์ด๋
1. ๐ก ์ํฌํ๋ก์ฐ ํ์ผ ์์ฑํ๊ธฐ
- โ
.github/workflows
ํด๋ ๋ง๋ค๊ธฐ - โ
ci.yml
๋๋build.yml
๋ฑ ์ด๋ฆ์ ํ์ผ ์์ฑ - โ ํ์ผ์ ์๋์ ๊ฐ์ด ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ ๋ ฅ
yaml
name: CI ํ์ดํ๋ผ์ธ ๐
on:
push:
branches:
- main # main ๋ธ๋์น์ ํธ์ํ๋ฉด ์๋ ์์
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest # ์ฐ๋ถํฌ ์ต์ ๋ฒ์ ํ๊ฒฝ์์ ์์
steps:
- name: ์ฒดํฌ์์ โ๏ธ
uses: actions/checkout@v3 # ์ฝ๋๋ฅผ ๋ฐ์์ค๋ ์์
- name: Node.js ์ค์น ๐ ๏ธ
uses: actions/setup-node@v3
with:
node-version: '14' # ์ฌ์ฉํ๋ Node ๋ฒ์ ์
๋ ฅ
- name: ์์กด์ฑ ์ค์น ๐ฆ
run: npm install
- name: ํ
์คํธ ์คํ โ
run: npm test
โญ ์ด๋ก์จ ๊ธฐ๋ณธ์ ์ธ ์๋ํ ์ํฌํ๋ก์ฐ๊ฐ ์์ฑ! ๐
2. ๐งช ํ ์คํธ ์๋ํ ์ถ๊ฐํ๊ธฐ
- โ
ํ
์คํธ ์คํฌ๋ฆฝํธ ์์ฑ:
package.json
์test
๋ช ๋ น์ด ๋ฑ๋ก - โ ์ํฌํ๋ก์ฐ์ ํ ์คํธ ๋จ๊ณ ์ถ๊ฐ
yaml
- name: ํ
์คํธ ์คํ โ
run: npm test
- โญ Tip!: ์คํจ ์ ์๋ฆผ ๋ฐ๊ธฐ ์ํด ์ฌ๋(Slack), ์ด๋ฉ์ผ ์ฐ๋๋ ๊ฐ๋ฅ ๐
3. ๐ง ๋ฐฐํฌ ์๋ํ ๊ตฌ์ฑํ๊ธฐ
- โ ๋ฐฐํฌํ ์๋ฒ ๋๋ ํด๋ผ์ฐ๋ ์ฐ๋
- โ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ๋๋ ๋ช ๋ น์ด ์์ฑ
- โ ์๋ ๋ฐฐํฌ ์์
yaml
- name: ๋ฐฐํฌ ์์ ๐
run: |
scp -r ./dist user@yourserver:/var/www/html
โญ ์ฃผ์!: ๋ฐฐํฌ ์ ์์ ์ฅ์น๋ก ๋ฐฐํฌ ์กฐ๊ฑด ์ ํํ๋ ๊ฒ๋ ์ถ์ฒ! ๐
โ ๏ธ ์์ฃผ ํ๋ ์ค์ ๋ฐ ํด๊ฒฐ์ฑ ์ฒดํฌ๋ฆฌ์คํธ
โ
์ํฌํ๋ก์ฐ ํ์ผ ์์น๊ฐ .github/workflows
์์ ์ ํํ ๋ค์ด๊ฐ์ผ ํจ!
โ
trigger ์กฐ๊ฑด(์ธ์ ์์ํ ์ง) ์ ๋ง์ถฐ์ผ ํจ!
โ
ํ๊ฒฝ ๋ณ์/์ํฌ๋ฆฟ(SECRET) ๋ณด์ ์ค์!
โ
๋น๋ ์๋ฌ ์ ๋ก๊ทธ ๊ผผ๊ผผํ ํ์ธ!
โ
์์
์คํจ ์ ์๋ฆผ ๋ณด๋ด๊ธฐ ์ค์ ์ถ์ฒ! ๐ฉ
๐ ์ค์ TIP! ์ด๋ณด๋ ์ฝ๊ฒ ๋ฐ๋ผ ํ๋ ํ ๊ณต๊ฐ
- โ ๊ถ์ฅ ์ก์ ํ์ฉ: ๋ณต์กํ ์์ ์ ์ปค๋ฎค๋ํฐ์์ ๋ง๋ ์ก์ ์กฐํํด์ ์จ๋ณด์ธ์!
- โ ๋น์ฉ ๊ฑฑ์ NO! ๋ฌด๋ฃ ์ฉ๋ ์ต๋ ํ์ฉํ๊ธฐ
- โ ๋จ๊ณ๋ณ ์ ๊ฒ: ์์ ๋จ์๋ก ๋ง๋ค์ด์ ์ฒดํฌํ๊ธฐ (์ฝ๋ ํ๋ ์์ ํ ๋ฐ๋ก ํ์ธ)
- โ ์๋ํ๋ง์ด ๋ต!: ๋ฐ๋ณต๋๋ ์์ ์ ๋ฐ๋์ ์๋ํํ์ธ์!
๐ ๊ฒฐ๋ก ์ ๋ฆฌ์ ๋ค์ ๋จ๊ณ ์ถ์ฒ ๐ฏ
โ ํต์ฌ ํฌ์ธํธ ์ ๋ฆฌ
- ๊นํ๋ธ ์ํฌํ๋ก์ฐ๋
.github/workflows
ํด๋์ YAML ํ์ผ๋ก ์์ฑ! - ํธ์ ์ด๋ฒคํธ์ PR์ ๋ฐ๋ผ ์๋ ์ํ!
- ๋น๋, ํ ์คํธ, ๋ฐฐํฌ ๋ฑ ๋ค์ํ ๋จ๊ณ ๊ตฌ์ฑ ๊ฐ๋ฅ!
- ์ปค์คํฐ๋ง์ด์ง์ผ๋ก ๋๋ง์ CI/CD ๋ฉ ๋ง๋ค๊ธฐ!
๐ ์ถ๊ฐ ์๋ฃ ๋ฐ ๋งํฌ
- GitHub Actions ๊ณต์ ๋ฌธ์
- ๋ฌด๋ฃ ์ปค๋ฎค๋ํฐ ์ก์ ๋ชจ์
- ์ด๋ณด์๋ฅผ ์ํ CI/CD ๊ฐ๋ ์ ๋ฆฌ ๋ธ๋ก๊ทธ
๐ฅ ์ง๊ธ ๋ฐ๋ก ์ค์ต ์์ํด์, ๋ด ์ฝ๋๋ฅผ ์๋์ผ๋ก ๊ฒ์ฆใ๋ฐฐํฌํ๋ ๋๋ํ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํด๋ณด์ธ์! ๐
๊ถ๊ธํ ์ ์ด ์๊ฑฐ๋, ๋ ๊น์ด ์๊ณ ์ถ๋ค๋ฉด ๋๊ธ ๋๋ ์ชฝ์ง ์ฃผ์ธ์! ๐โจ
ํ์ดํ
! ๐ฅณ๐ป
์ด์ ๊ธ ๋ณด๊ธฐ!!