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 Link, Window 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
이전글 링크
GitHub Repoistory Link
댓글
댓글 쓰기