[CI/CD] Github Actions + Docker 자동화

김민재·2024년 9월 24일

CI/CD

목록 보기
3/8

Github Actions

  • 로직을 실행시킬 수 있는 일종의 컴퓨터라고 생각하면 된다.
    빌드, 테스트, 배포에 대한 로직을 실행시키는 역할을 해준다.

GitHub Actions 흐름

  1. 코드 작성 후 Commit
  2. Github에 Push
  3. Push를 감지해서 Github Actions에 작성한 로직이 실행
    3-1. 빌드
    3-2. 테스트
    3-3. 서버로 배포
  4. 서버에서 배포된 최신 코드를 서버를 재실행

Github Actions 사용법

  1. 프로젝트 내에 .github 폴더 생성 / workflows 폴더 생성 / CI.yml 파일 생성
  2. 도커 허브, 레파지토리에 이미지를 생성한다.
    이미지 이름은 배포할때 사용해야한다.
  3. Github Project - Settings - Secrets and Variables - Actions - New Repository secret에 들어간다.
    Docker Hub username, password, EC2_PUBLIC_IP, EC2_SSH_KEY를 각각 저장한다.
    3-1. ec2에서 도커 허브 레파지토리를 만들어야한다.
    sudo docker tag <도커 허브 레파지토리 이름> <도커 허브 유저네임>/<도커 허브 레파지토리>:latest
    3-2. 도커 허브에 로그인한다.
    sudo docker login
    3-3. 이미지를 푸시한다.
    sudo docker push <도커 허브 유저네임>/<도커 허브 레파지토리 이름>:latest
  4. CI.yml 파일에 작성한다.
name: CI/CD Pipeline

# main branch에 push or pr할 때 실행된다.
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '20'

      - name: Install dependencies
        run: npm install

        # 도커 허브에 이미지 생성
      - name: Build Docker image
        run: docker build -t ${{ secrets.DOCKER_HUB_USERNAME }}/blog-api-app:latest .

        # 도커 허브에 로그인
      - name: Docker Login
        run: echo "${{ secrets.DOCKER_HUB_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_HUB_USERNAME }}" --password-stdin

        # 도커 허브에 내용 푸시
      - name: Push Docker image
        run: docker push ${{ secrets.DOCKER_HUB_USERNAME }}/blog-api-app:latest

        # EC2 KEY
      - name: Setup SSH key
        run: |
          echo "${{ secrets.EC2_SSH_KEY }}" > keypair.pem
          chmod 600 keypair.pem

        # EC2 도커 허브에 로그인 하고 PULL을 땡기고 중지된 컨테이너 삭제 후 컨테이너를 삭제하고 재배포한다.
      - name: Deploy to EC2
        run: |
          ssh -i keypair.pem -o StrictHostKeyChecking=no ubuntu@${{ secrets.EC2_IP }} "sudo docker login -u '${{ secrets.DOCKER_HUB_USERNAME }}' -p '${{ secrets.DOCKER_HUB_PASSWORD }}'"
          ssh -i keypair.pem -o StrictHostKeyChecking=no ubuntu@${{ secrets.EC2_IP }} "sudo docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/blog-api-app:latest || true"
          ssh -i keypair.pem -o StrictHostKeyChecking=no ubuntu@${{ secrets.EC2_IP }} "
          sudo docker container prune -f
          sudo docker image prune -a -f
          CONTAINER_ID=\$(sudo docker ps -q --filter 'publish=3000');
          if [ -n \"\$CONTAINER_ID\" ]; then
            sudo docker stop \$CONTAINER_ID;
            sudo docker rm \$CONTAINER_ID;
          fi
           "

          ssh -i keypair.pem -o StrictHostKeyChecking=no ubuntu@${{ secrets.EC2_IP }} "sudo docker run -d -p 3000:3000 --env-file /home/ubuntu/Blog-API/.env  ${{ secrets.DOCKER_HUB_USERNAME }}/blog-api-app:latest"
  • 확인하는 방법은 Github의 Actions에 들어가 확인할 수 있다.

profile
개발 경험치 쌓는 곳

0개의 댓글