Infra/DevOps

github actions을 사용해 ec2에 docker 서버 빌드배포하기(ci/cd)

하우아유두잉 2023. 6. 14. 19:12

 

프로젝트를 클라우드 환경에서 테스트를 하는데, 매번 파일을 업로드하고 빌드/실행 하는게 번거로워서 
Github Actions를 이용해 간단한 CI/CD를 만들었다.

 

 

 

적용된 프로젝트는 nestjs로 만든 서버이다.

 

1. Dockerfile 생성

나의 경우 node 18.12.1 버전으로 개발했지만, 최신 버전을 사용하려면 lts를 붙이면 된다. (latest의 약자다.)

FROM node:18.12.1

ARG PORT=9090

RUN mkdir -p /usr/src/app

WORKDIR /usr/src/app

COPY . ./

RUN yarn install
RUN npx prisma generate
RUN yarn build:prod

EXPOSE $PORT

CMD [ "yarn", "start:prod" ]

 

 

2. .github/workflows/cicd.yaml

github actions 워크플로우를 아래와 같이 작성했다.

name: cicd

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [18.12.1]
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1

      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_PASSWORD }}

      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:latest
          push-args: --disable-content-trust

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: ssh connect & production
        uses: appleboy/ssh-action@v0.1.10
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          password: ${{ secrets.PASSWORD }}
          port: ${{ secrets.PORT }}
          script: |
            cd server
            docker login --username ${{ secrets.DOCKERHUB_USERNAME }} --password ${{ secrets.DOCKERHUB_PASSWORD }}
            docker system prune -a --volumes -f
            docker compose pull -q
            docker compose up --force-recreate --build -d --quiet-pull 2>log.out
            cat log.out

 

3. secrets 추가

secrets는 아래 이미지 처럼 추가했다.

password를 사용하는 방법은 좋지 않아 token 키를 발행하는게 좋은데, 편의상 이대로 진행했다.

 

 

 

4. ec2 생성

AWS에서 EC2 인스턴스를 생성한다.

나의 경우 ubuntu를 구축했다.

 

인스턴스가 생성되면 콘솔에서 접속한다.

 

5. ubuntu 사용자의 passwd를 지정해주자.

패스워드는 깃허브에서 설정한 패스워드와 같아야한다.

sudo passwd ubuntu

# Enter new UNIX password:
# Retype new UNIX password:
# passwd: password updated successfully

 

6. 도커를 설치해주자.

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update

sudo apt install docker-ce docker-ce-cli containerd.io

 

7. 도커 권한 설정.

sudo groupadd docker

sudo usermod -aG docker $USER

newgrp docker

 

8. 프로젝트 디렉토리를 생성해주자.

디렉토리명은 앞서 cicd.yaml 파일에서 deploy > scripts 작성된 이름과 일치해야 한다.

mkdir ~/server

 

9. 해당 폴더에 docker-compose.yaml 파일을 생성하자.

image부분은 나의 경우 docker hub private repository를 사용했다.

version: "3"

services:
  app:
    env_file:
     - .env
    container_name: server
    restart: always
    image: IMAGE_URL:latest
    ports:
      - "3000:3000"

나의 경우엔 .env 파일을 직접 생성했다.

github에 .env도 같이 push 하면 안해줘도 된다.

 

 

10. github 푸시

main으로 push 이벤트가 발생되면, github actions가 발동된다.

git push origin main

 

진행상황은 Actions 탭에서 확인 할 수 있다.

 

build와 deploy 잡이 완료된걸 확인 할 수 있다.

 

모두 성공했다면 아래와 같은 결과가 나타난다.

 

 

 

참고

https://velog.io/@chaerim1001/DockerGithub-Actions-CICD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0#2-docker-composeyml