GithubAction, Docker, Ec2를 이용해 배포 자동화

오동재·2022년 10월 1일
5

배포

목록 보기
1/2
post-thumbnail
post-custom-banner

docker로 실행되는 web을 EC2에 배포하는 과정을 GithubAction을 사용하여 자동화하자

DockerFile

컨테이너 실행 시 웹이 열리는 도커파일을 준비합니다.

웹을 만들기 전에 배포를 찾아서 이 글으로 왔을 리는 없으니 웹은 잘 만들었다고 생각하겠습니다.
만약 리액트로 웹을 만들었다면 아래와 같이 작성해 줄 수 있고 파일 이름은 Dockerfile입니다.

#Dockerfile
FROM node:16

WORKDIR /usr/src/app
COPY package.json ./

RUN npm install

COPY . .

CMD [ "npm", "start"]

docker daemon을 실행시키고 아래 명령어로 정상적으로 실행되는지 확인합니다.
{포트}에는 자신의 웹이 실행되는 포트를 적으면 됩니다.

docker build --tag my-web:latest .
docker run -d -p 80:{포트} --name my-web my-web:latest

위와 같이 실행하면 localhost:80에서 웹 페이지로 접근할 수 있습니다.
docker에 대한 자세한 내용은 생략하겠습니다.

Github Action

Github repository에서 Action을 설정해줍시다.

  1. 배포할 Dockerfile이 있는 repository로 이동하고 Actions 을 클릭합니다.
  2. set up a workflow yourself를 클릭하여 workflow를 만들어줍시다.
  3. 아래와 같이 main.yml을 만드는 페이지가 뜨는데 파일 이름은 입맛대로 설정하면 됩니다.

    yml파일 내용은 아래와 같이 작성해줍시다. 설명은 주석과 함께 달아놓았습니다.
    ${{ secret.~ }}는 다음 스텝에서 설정해도록 하겠습니다.
name: CICD # actions 이름. 아무렇게나 지어도 됨

on:
  push:
    branches: [main] # main branch에 push될 때 해당 파일을 실행

jobs:
  # 빌드
  build:
    runs-on: ubuntu-latest
    steps: #step 순서대로 실행됨
      # 레포지토리의 파일을 CI 서버로 내려받음
      - name: Checkout 				# step의 이름. 아무렇게나 지어도 됨
        uses: actions/checkout@v2 	# 사용할 동작을 정의
        
      # docker cli 플러그인인 buildx 설치. 후에 도커를 빌드할 수 있게 해줌
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1 
        
      # dockerhub에 이미지를 업로드 하기 위해 도커 로그인
      - name: Login to DockerHub
        uses: docker/login-action@v1 
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }} # dockerhub name
          password: ${{ secrets.DOCKERHUB_TOKEN }} # dockerhub password
          
      # .env파일 생성. 웹을 만들다보면 유출되면 안되는 변수를 .env에 담는다. 배포할 때는 같이 빌드되어야하기 때문에 깃헙 액션으로 설정해줘야 한다.
      - name: Generate Environment Variables File for Production
        run: |
          echo "VARIABLE=$VARIABLE" >> ./dir/.env
        env:
          VARIABLE: ${{ secrets.VARIABLE }}
          
      # docker 이미지를 생성하고 dockerhub에 푸쉬
      - name: Proxy Build And Push
        uses: docker/build-push-action@v2 
        with:
          context: ./dir 			# dockerfile이 있는 위치랑 맞춰주자
          file: ./dir/Dockerfile	# 빌드할 Dockerfile이 있는 디렉토리
          platforms: linux/amd64	# 빌드할 때 사용할 환경.
          push: true				# Dockerhub 푸쉬 여부
          tags: ${{ secrets.DOCKERHUB_USERNAME }}/my-web	# docker 이미지 이름

  # 배포
  deploy:
    needs: build # build 후에 실행되도록 정의
    name: Deploy
    runs-on: [self-hosted, label-go] # AWS ./configure에서 사용할 label명
    steps:
      - name: Login to ghcr
        uses: docker/login-action@v1
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GHCR_TOKEN }}
      - name: Docker run
        run: |
          docker stop my-web && docker rm my-web && docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/my-web:latest

          docker pull ${{ secrets.DOCKERHUB_USERNAME }}/my-web:latest

          docker run -d -p 80:80 --name my-web ${{ secrets.DOCKERHUB_USERNAME }}/my-web:latest
  1. github 레포지토리에서 Settings > Secrets > Actions > New repository secret을 눌러 변수를 생성한다.

    아래와 같이 변수를 선언하는 창이 뜨는데 Name과 Value에 넣어줘야 할 값들은 다음과 같다.

    NameValue
    DOCKERHUB_USERNAMEDockerHub userName
    DOCKERHUB_TOKENDockerHub 토큰
    VARIABLE.env에 들어갈 환경변수
    GHCR_TOKENGithub 로그인을 위한 토큰

    DOCKERHUB_TOKEN

    DOCKERHUB_USERNAME는 자신이 DockerHub에 로그인할 때 사용하는 것을 입력해주면 되고 DOCKERHUB_TOKEN는 Account Settings > Security > New Access Token으로 생성해주면 된다. 생성할 때 알려주는 토큰은 다시 볼 수 없으니 잘 복사해서 옮겨주자.

    GHCR_TOKEN

    깃헙 우측 상단의 자기 프로필을 누른 후 Settings > Developer settings > Personal access tokens > New personal access token로 생성하자.
    다음과 같이 3개의 권한을 체크해주고 생성해준 후 토큰을 잘 복사해서 옮겨주자. 이 토큰은 재발급 받을 수 있다.

EC2

EC2를 생성하고 docker와 github runner를 깔아주자

ec2를 생성하고 ssh로 접속해주자.

ssh 접속 편하게 하기 https://velog.io/@0__h0__/AWS-ssh-config%EC%84%A4%EC%A0%95%EC%9C%BC%EB%A1%9C-ec2-%EA%B0%84%ED%8E%B8%ED%95%98%EA%B2%8C-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0

도커를 설치하고 ec2-user에게 도커를 실행할 권한을 주고 나갔다가 들어와야 한다.

sudo yum update -y
sudo amazon-linux-extras install docker
sudo su usermod -a -G docker ec2-user

아래 명령어가 ec2-user권한으로 실행된다면 docker에 대한 준비는 끝났다.

docker info

이제 runner를 깔아주자
Settings > Actions > Runners > New self-hosted runner를 클릭하여 러너를 생성해주자

ec2환경이 Linux이므로 Linux를 선택하고 그 밑에 나오는 코드를 ec2에서 주르륵 복붙해야 한다.
복붙하기 전에

sudo yum install perl-Digest-SHA -y

위 명령어로 shamsum 명령어를 실행가능하게 해주자

그리고 runner를 설치하다가 config에서 입력값을 입력하는 절차가 있는데 이 때 다른 건 다 엔터키로 넘어가고
label은 label-go라고 입력해주자.
그리고 ./run.sh 로 러너를 실행한 상태에서 메인에 푸쉬가 들어가면 ec2에 배포가 된다.

profile
https://donggni0712.tistory.com 로 이사했습니다~
post-custom-banner

0개의 댓글