Feature/7 #8
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI/CD | |
on: | |
pull_request: | |
types: [closed] # pull_request closed 됐을 경우 | |
jobs: | |
build: | |
runs-on: ubuntu-22.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: | | |
sudo docker rmi $(docker images -q) | |
sudo docker pull ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7} | |
sudo docker tag ${{ secrets.DOCKER_HUB_REPO }}:${GITHUB_SHA::7} ${{ secrets.PROJECT_NAME }} | |
sudo docker stop ${{ secrets.PROJECT_NAME }} | |
sudo docker rm ${{ secrets.PROJECT_NAME }} | |
sudo docker run -d --name ${{ secrets.PROJECT_NAME }} -p 3000:3000 ${{ secrets.PROJECT_NAME }} |