ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • github actions을 사용해 ec2에 docker 서버 빌드배포하기(ci/cd)
    Infra/DevOps 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

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    댓글

Designed by Tistory.