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
GitHub Repoistory Link
댓글
댓글 쓰기