Docker , GitHub Action을 이용해서 EC2(AWS)에 자동 배포하기 - React사용

이번 글에서는 Docker와 GitHub Action을 이용해서 CI/CD를 구현하도록 하겠습니다. AWS의 EC2에 자동 배포하도록 블로그 글을 작성하겠습니다.


1. 우선사항

1) Push를 할 GitHub 저장소 생성(링크) - private

2) GitHub Token 생성 - classic 방법으로 생성

- repo, workflow, write:packages, delete:packages가 선택 되어 있어야 한다.

3) AWS 계정

4) 개발 PC에 Docker가 설치 되어 있어야 한다.(Linux Link, Window Link)


위 우선사항이 모두 되었으면 아래는 나의 로컬 환경이다.

OS : macOS Ventura 13.6.1

Docker Version : 24.0.7

Node Version : 20.10.0


1. React Project를 생성한다. (링크)



2. GitHub Repository와 연동


git init

git add .

git commit -m "first commit"

git branch -M master

git remote add origin https://github.com/Alex-Choi0/CICD-EC2-Docker.git

git push -u origin master



3. Dockerfile 생성 및 테스트

1) Dockerfile 생성


FROM node:20.10.0


# 경로 설정하기

WORKDIR /app

# package.json 워킹 디렉토리에 복사 (.은 설정한 워킹 디렉토리를 뜻함)

COPY package.json .

# 명령어 실행 (의존성 설치)

RUN npm install

# 현재 디렉토리의 모든 파일을 도커 컨테이너의 디렉토리에 복사한다.

COPY . .


# 3000번 포트 노출. 실제로는 표시만 해준다.

EXPOSE 3000


# npm start 스크립트 실행

CMD ["npm", "start"]


2) Dockerfile의 이미지 생성 및 docker run으로 실행(참고링크)


docker build -t react:1.0.0


- 이미지 생성



docker run -t 5000:3000 -d --rm --name react_test react:1.0.0



4. ./.github/workflows/main.yml파일 추가하기


name: CI/CD Docker


# 워크플로우를 트리거할 조건을 정의합니다.

# master 브랜치에 푸시될 때마다 이 워크플로우가 실행됩니다.

on:

  push:

    branches: [master]


jobs:

  build:

    # Job 이름 정의

    name: Build

    # 이 Job을 실행할 환경 설정

    runs-on: ubuntu-latest

    steps:

      # GitHub 리포지토리에서 코드를 체크아웃하는 단계

      - uses: actions/checkout@v2


      # Docker Buildx를 설정하는 단계

      - name: Set up docker buildx

        id: buildx

        uses: docker/setup-buildx-action@v1


      # Docker 빌드 레이어를 캐시하여 빌드 시간을 단축하는 단계

      - name: Cache docker layers

        uses: actions/cache@v2

        with:

          path: /tmp/.buildx-cache

          key: ${{ runner.os }}-buildx-${{ github.sha }}

          restore-keys: |

            ${{ runner.os }}-buildx-


      # 리포지토리 소유자 이름을 소문자로 변환하여 환경 변수에 저장하는 단계

      - name: Set lowercase repository owner

        run: echo "REPO_OWNER=$(echo $GITHUB_REPOSITORY_OWNER | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV


      # Docker 이미지를 저장할 경로를 환경 변수에 설정하는 단계

      - name: Set Docker image

        run: echo "DOCKER_IMAGE=ghcr.io/${REPO_OWNER}/github-actions-auto" >> $GITHUB_ENV


      # GitHub Container Registry에 로그인하는 단계

      - name: Login to ghcr

        uses: docker/login-action@v1

        with:

          registry: ghcr.io

          username: ${{ env.REPO_OWNER }}

          password: ${{ secrets.GHCR_PAT }} # GITHUB_TOKEN 대신 GHCR_PAT 사용


      # Docker 이미지를 빌드하고 레지스트리에 푸시하는 단계

      - name: Build and push

        id: docker_build

        uses: docker/build-push-action@v2

        with:

          builder: ${{ steps.buildx.outputs.name }}

          push: true

          tags: ${{ env.DOCKER_IMAGE }}:latest


  deploy:

    # 이 Job이 'build' Job이 완료된 후에 실행되도록 설정

    needs: build

    # Job 이름 정의

    name: Deploy

    # 이 Job을 실행할 환경 설정 (self-hosted 러너와 특정 레이블 사용)

    runs-on: [self-hosted, label-go]

    steps:

      # 리포지토리 소유자 이름을 소문자로 변환하여 환경 변수에 저장하는 단계

      - name: Set lowercase repository owner

        run: echo "REPO_OWNER=$(echo $GITHUB_REPOSITORY_OWNER | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV


      # Docker 이미지를 저장할 경로를 환경 변수에 설정하는 단계

      - name: Set Docker image

        run: echo "DOCKER_IMAGE=ghcr.io/${REPO_OWNER}/github-actions-auto" >> $GITHUB_ENV


      # GitHub Container Registry에 로그인하는 단계

      - name: Login to ghcr

        uses: docker/login-action@v1

        with:

          registry: ghcr.io

          username: ${{ env.REPO_OWNER }}

          password: ${{ secrets.GHCR_PAT }} # GITHUB_TOKEN 대신 GHCR_PAT 사용


      # 기존 Docker 컨테이너를 중지하고 삭제한 후, 새로운 이미지를 기반으로 컨테이너를 실행하는 단계

      - name: Docker run

        run: |

          docker stop go_cicd || true && docker rm go_cicd || true && docker rmi ${{ env.DOCKER_IMAGE }}:latest || true

          docker run -d -p 80:3000 --name go_cicd --restart always ${{ env.DOCKER_IMAGE }}:latest





5. GitHub Repository에 "Actions secrets and variables"를 추가하기

- Repository의 Setting에서 "Secrets and variables"을 선택









6. AWS의 EC2 생성 및 보안그룹 셋팅 (참고링크 : 셋팅1)


1) EC2에 Docker설치 (참고링크 : docker install by terminal)


7. EC2에 GitHub Runner 셋팅

- 해당 EC2는 Ubuntu이기 때문에 Linux으로 선택


Download와 Configure를 EC2 터미널에서 실행한다.


참고로 run.sh파일은 터미널이 열려있을때에만 실행이 된다. 테미널이 닫힌 후에도 백그라운드에서 동작되기를 원한사면 마지막 한칸 띄우고 "&"을 추가하면 된다.


만약 "&"이 아닌 리눅스의 서비스를 이용해서 sh파일을 자동 실행하고 싶다면 'Linux의 systemd 서비스로 부팅시 자동 실행하기' 글을 참고해 주시기 바랍니다.


해당 Runners가 실행중인지는 GitHub Repository의 Runners에서 확인이 가능하다.



8. GitHub Push를 해서 CI/CD를 진행






9. 배포 확인



git hub registry을 사용하지 않고 docker hub를 사용할려고 하면 링크를 참고해 주시기 바랍니다.


만약 에러가 발생하면 아래 링크를 참고

Git Action Docker Permission Denied Error AWS(EC2) - sock

docker sudo없이 사용하는 방법


GitHub Repoistory Link

댓글

이 블로그의 인기 게시물

DAQ로 전압 측정하기-2

Nest JS URL에 있는 쿼리(Query) 읽기

appendChild를 이용하여
  • 늘리기_JavaScript_2번