Docker , GitHub Action을 이용해서 EC2(AWS)에 자동 배포(docker hub)하기 - 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 LinkWindow Link)

5) docker hub 계정(DOCKER_USERNAME) 및 비밀번호(DOCKER_PASSWORD) 대용으로 사용할 token - 만약 다수의 private repository를 운영할려면 해당 링크를 통해 유료 결제를 해야한다.


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

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=alexchoi1/cicd-react" >> $GITHUB_ENV


      # Docker Hub에 로그인하는 단계

      - name: Login to Docker Hub

        uses: docker/login-action@v3

        with:

          username: ${{ secrets.DOCKER_USERNAME }}

          password: ${{ secrets.DOCKER_PASSWORD }}


      # Docker 이미지를 빌드하고 Docker Hub에 푸시하는 단계

      - 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:

      # Docker Hub에 로그인하는 단계

      - name: Login to Docker Hub

        uses: docker/login-action@v3

        with:

          username: ${{ secrets.DOCKER_USERNAME }}

          password: ${{ secrets.DOCKER_PASSWORD }}


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

      - name: Set Docker image

        run: echo "DOCKER_IMAGE=alexchoi1/cicd-react" >> $GITHUB_ENV


      # Docker Hub에서 이미지 pull

      - name: Pull Docker image

        run: sudo docker pull ${{ env.DOCKER_IMAGE }}:latest


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

      - name: Docker run. Stop go_cicd

        run: docker stop go_cicd || true


      - name: Docker run. Remove go_cicd container

        run: docker rm go_cicd || true


      - name: Docker run. Remove image

        run: docker rmi ${{ env.DOCKER_IMAGE }}:latest || true


      - name: Docker run. Run go_cicd container

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






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

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







DOCKER_USERNAME, DOCKER_PASSWORD는 docker hub에 가입된 계정 및 발급한 토큰은 DOCKER_PASSWORD에 넣는다.

퍼블릭 리파지토리가 아닌 프라이빗 리파지토리를 다수 사용할려면 docker hub에 유료 결제를 해야 한다.

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 Action Docker Permission Denied Error AWS(EC2) - sock

docker sudo없이 사용하는 방법


이전글 링크


GitHub Repoistory Link

댓글

이 블로그의 인기 게시물

DAQ로 전압 측정하기-2

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

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