GitHub Action
GitHub Action์ ๋น๋์ ํ ์คํธ, ๊ฐ๋ฐ ํ์ดํ๋ผ์ธ์ ์๋ํํ ์ ์๋ CI/CD(์ง์์ ์ธ ํตํฉ/์ง์์ ์ธ ๋ฐฐํฌ) ํ๋ซํผ์ผ๋ก, Git ์ ์ฅ์์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ์ ๋ํ ์๋ํ๋ ์์ ์ ์ํํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค. ์ด๋ฌํ ์์ ์ Git ์ ์ฅ์์ ์ํ ๋ณ๊ฒฝ, ์ ๋ธ๋์น ์์ฑ, ์ฝ๋ ํธ์, ์ด์ ๋ฑ๋ก, Pull Request ๋ฑ์ ๋์์ผ๋ก ํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ๋ ํฌ์งํ ๋ฆฌ์ PR ๋๋ ์์ฉ ๋ฐฐํฌ๋ฅผ ์ํ merged PR ๋น๋์ ํ ์คํธ ์ํฌํ๋ก์ฐ๋ฅผ ์์ฑํ ์ ์๋ค.
Git Action์ ์ฌ์ฉํ๋ฉด ์ ์ฅ์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ง์ ๋ ์์
์ด ์คํ๋์ด ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ์ฝ๋ ํธ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด, ์๋์ผ๋ก ์ฝ๋ ํ
์คํธ, ๋น๋ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ํํ ์ ์๋ค.
GitHub์์๋ Git Action์ ์ฌ์ฉํ์ฌ CI/CD (Continuous Integration/Continuous Deployment) ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋์ผ๋ก ํ
์คํธ๋๊ณ ๋ณํฉ๋ ํ ๋ฐฐํฌ๋ ์ ์๋ค.
Git Action์ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋ฐ ํ๋ ์์ํฌ์์ ์ง์๋๋ค. ๋ฐ๋ผ์ ํ๋ก์ ํธ์ ์ ํฉํ Git Action์ ์ฌ์ฉํ์ฌ ์๋ํ๋ ์์
์ ์ํํ ์ ์๋ค.
GitHub Action์ผ๋ก React ํ๋ก์ ํธ AWS์ ๋ฐฐํฌํ๊ธฐ.
React ํ๋ก์ ํธ๋ฅผ AWS(Amazon Web Services)์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ง๋ง, ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
1) AWS ๊ณ์ ๋ก๊ทธ์ธ
2) EC2 ์ธ์คํด์ค ์์ฑ: EC2๋ Amazon Elastic Compute Cloud์ ์ฝ์๋ก ๊ฐ์ ์ปดํจํ
๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๋ ์๋น์ค์ด๋ค. EC2 ์ฝ์์์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
3) ์ธ์คํด์ค์ Node.js ์ค์น: EC2 ์ธ์คํด์ค์ Node.js๋ฅผ ์ค์นํฉ๋๋ค. Node.js๋ฅผ ์ค์นํ๋ฉด npm๋ ํจ๊ป ์ค์น๋๋ค.
4) React ํ๋ก์ ํธ ๋น๋: ๋ก์ปฌ์์ React ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๋ค. npm run build ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด ๋น๋๋ ํ์ผ์ด build ํด๋์ ์์ฑ๋๋ค.
5) ํ์ผ ์ ์ก: ๋ก์ปฌ์์ ๋น๋๋ ํ์ผ์ EC2 ์ธ์คํด์ค๋ก ์ ์กํ๋ค. ์ด๋ฅผ ์ํด์๋ SCP(Secure Copy) ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
//less
scp -i [key.pem] -r [local_path] [username]@[public_dns]:[remote_path]
6) ์๋ฒ ์คํ: ์ธ์คํด์ค์์ build ํด๋์ ์์นํ index.html ํ์ผ์ ์ด์ด React ์ฑ์ ์คํํ๋ค. ์ด๋ฅผ ์ํด์๋ serve์ ๊ฐ์ Node.js HTTP ์๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
npm install -g serve
serve -s build
7) Elastic Load Balancer ์ถ๊ฐ(Optional): Elastic Load Balancer(ELB)๋ ์ฌ๋ฌ EC2 ์ธ์คํด์ค์ ๋ํ ํธ๋ํฝ ๋ถ์ฐ์ ์ฒ๋ฆฌํ๋ ์๋น์ค๋ก, ์ด๊ฑธ ์ฌ์ฉํ๋ฉด ์๋ฒ ๋ถํ ๋ถ์ฐ ๋ฐ ์ฅ์ ๋๋น์ฑ์ ๋์ผ ์ ์๋ค.
8) Route 53 ๋ฑ๋ก(Optional): Route 53์ AWS์์ ์ ๊ณตํ๋ DNS(Domain Name System) ์๋น์ค๋ก, ์ด๊ฒ์ ์ฌ์ฉํ์ฌ ๋๋ฉ์ธ ์ด๋ฆ์ EC2 ์ธ์คํด์ค์ IP ์ฃผ์์ ๋งคํํ ์ ์๋ค.
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก React ํ๋ก์ ํธ๋ฅผ AWS์ ๋ฐฐํฌํ ์ ์๋ค. ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ด๊ธฐ ์ค์ ์ด ๋ณต์กํ๋ฉฐ, ์๋ฒ ๊ด๋ฆฌ ๋ฐ ๋ณด์ ๋ฑ์ ๋ํ ์ง์์ด ํ์ํ๋ค. ๋ฐ๋ผ์ AWS์ ๋ค๋ฅธ ์๋น์ค์ธ Elastic Beanstalk, Amplify ๋ฑ์ ์ฌ์ฉํ์ฌ ๋ณด๋ค ์ฝ๊ณ ๊ฐํธํ๊ฒ React ์ฑ์ ๋ฐฐํฌํ ์๋ ์๋ค.
GitHub Action ์ํฌํ๋ก์ฐ ๊ตฌ๋ฌธ
ํ๋ก์ ํธ์ GitHub Action์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ GitHub์ ์ฅ์์ `.github/workflows` ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ , YAML ํ์ผ๋ก ์์ฑํด์ผ ํ๋ค. ์๋๋ ๊ธฐ๋ณธ์ ์ธ GitHub Action ์ํฌํ๋ก์ฐ ์คํฌ๋ฆฝํธ ์์์ด๋ค.
name: My GitHub Action Workflow
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Build project
run: |
npm install
npm run build
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
password: ${{ secrets.SERVER_PASSWORD }}
script: |
cd /path/to/deploy
git pull
npm install
npm run build
๐ธ ์ถ์ฒ ๐ธ