다양한 이유가 있겠지만 로컬에서 배포를 하기에는 무리가 있기 때문에 클라우드 서비스를 이용해서 API를 배포하겠습니다.
직접 배포하는 과정을 코드를 수정할때마다 수행하기엔 번거롭고 서버를 재시작하는 과정에서 중단이 되므로 무중단 서비스를 제공할 수 없게 됩니다.
//Dockerfile
FROM node:20.13.1
COPY package*.json ./
COPY . .
RUN npm install
CMD ["npm", "start"]
//.dockerignore
node_modules
docker build -t umc-study .

docker run --rm -p 3001:3001 --name umc-study-container umc-study



//nodemon.json
{
"watch": ["srcs", "config"],
"ext": "js,json",
"ignore": ["node_modules", "dist"],
"legacyWatch": true,
"delay": 2500
}
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
sudo apt update
sudo apt install docker-ce
name: CI/CD
on:
pull_request:
types: [closed] # pull_request closed 됐을 경우
jobs:
build:
runs-on: ubuntu-20.04 # OS 환경
if: github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'dev'
# pull_request가 dev 브랜치에 merge 됐을 경우
# node-version 과 같이 배열로 돼있으면, 해당 원소를 순회하면서 작업이 반복해서 실행된다.
# 응용해서 runs-on에 여러 OS에서 돌릴 수도 있다.
strategy:
matrix:
node-version: [20.x]
# uses 개념은 다른 사람이 작성한 내용을 실행하는 개념이다.
# actions/checkout: GitHub의 마지막 커밋으로 Checkout 한다.
# actions/setup-node: Node.js를 설치한다.
# run 개념은 명령어를 실행한다. 셸 스크립트와 동일하다.
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
# npm ci는 npm install과 같은 기능을 수행한다.
- run: npm ci
# --if-present 옵션은 npm 스크립트가 존재할 때만 실행시키라는 의미이다.
# 만약 build 스크립트가 없는 경우, 오류 없이 지나간다.
- run: npm run build --if-present
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Docker build
run: |
docker build -t ${{ secrets.PROJECT_NAME }} .
docker tag ${{ secrets.PROJECT_NAME }} ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7}
docker push ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7}
- name: Deploy
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_SERVER_HOST }}
username: ubuntu
key: ${{ secrets.PRIVATE_KEY }}
envs: GITHUB_SHA
script: |
docker rmi $(docker images -q)
docker pull ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7}
docker tag ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7} ${{ secrets.PROJECT_NAME }}
docker stop ${{ secrets.PROJECT_NAME }}
docker rm ${{ secrets.PROJECT_NAME }}
docker run -d --name ${{ secrets.PROJECT_NAME }} -p 3001:3001 ${{ secrets.PROJECT_NAME }}





