본문 바로가기
Web

github action EC2 CI/CD 구축

by 봉이로그 2023. 11. 20.

사내에서 팀원들과 사이드프로젝트를 진행하고 있다.

 

초기 서버 환경구성은 AWS에서 도커를 명령어를 이용해 컨테이너를 올리는 형태로 구성했었다.

 

그런데, 추가 기능 및 코드수정이 발생할시에 내가 일일히 직접 AWS에 접속해서 도커이미지를 재생성하고 컨테이너에 올리는게 비효율적이라는 생각이 들었고, CI/CD의 필요성을 뼈저리게 깨닫게 되었다.

 

나는 예전에 스프링으로 백엔드 개발 시 젠킨스를 이용해 배포환경을 구성해본 경험이 있었다.

그런데 젠킨스를 사용하기에는 프로젝트가 소규모 사이즈라고 판단이 들었다.

젠킨스를 사용하기에는 조금 무거울것 같다는 생각이 들었다. 

그래서 사내에서 백엔드개발자분들이 사용하는 깃헙액션을 사용해보기로 했다.

기본적인 깃헙액션 문법 (이외에도 많음)

on

name: CI/CD # 이름을지정 (필수아님)
on: # 이벤트 트리거 지정 (필수)


# use example

# 특정 브랜치일 때 수행
on: 
  push: 
    branches: 
      - main
      
# push일 때 수행
on: push

# push / PR일 때 수행
on: [push, pull_request]

 

jobs

job은 기본적으로 병렬로 실행이 된다.

runs-on

job이 실행될 머신의 타입을 의미한다.

steps

step은 job의 작업 단위이다. step은 작업을 수행하는 각각의 단계가 정의된다.

다양한 작업들이 들어갈 수 있다. 예를 들면 코드를 체크아웃하거나 빌드하거나, 테스트를 실행하거나, 배포하는 등의 작업이 가능하다.

uses

github에서 제공하는 액션을 사용할때 사용된다. 다른 저장소에 있는 액션을 가져와서 사용할때 해당하는 저장소의 경로를 지정한다.

소유자/저장소명@참조자 

ex) actions/setup-node@v4, actions/checkout@v3

with

해당 액션을 실행할 때 필요한 추가적인 옵션들을 지정한다. 액션에 필요한 매개변수들이나 환경변수들을 설정할 수 있다.

 

run

스크립트를 직접 실행하는데 사용한다. 쉘 명령어를 실행하거나, 사용자가 원하는 작업을 수행한다

# 워크플로의 일부로 실행될 작업을 지정
# 각 작업에는 이름이 있으며, 각 작업 내에서 수행해야 하는 단계나 작업을 정
jobs: 

# example

# Job1로 표시되는 job1이라는 작업을 생성
jobs:
  job1:
    name: Job 1 # 스텝 혹은 액션을 지정한다.
	runs-on: ubuntu-latest # job이 실행될 머신의 타입 (필수)
    steps:
      - name: Step 1
        # 스텝에서 진행할 액션들을 지정한다.
        uses: actions/setup-node@v4
        with:
          node-version: 18
      - name: Install dependencies
        run: npm install
      - name: Build
        run: npm run build
        ...
      - name: Step 2
        ...

 

 

AWS에 접속화기 위해 aws-actions/configure-aws-credentials@v1 을 사용했다.

secrets.ACCESS_KEY

secrets.SECRET_KEY

위의 2가지는 AWS의 IAM 을 이용하면 된다.

IAM의 '보안자격증명' 메뉴에서 생성 및 얻을 수 있다.

secret_key는 다운받은 cert를 vi로 실행시켜 얻는 RSA키 이다.

 

깃헙설정에서 secrets으로 시작되는 값들을 등록해준다.

name: CI/CD

on:
  push:
    branches:
      - main
jobs:
  ci:
    runs-on: ubuntu-latest
    steps:

      - name: checkout
        uses: actions/checkout@v3

      - name: AWS configure credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:  
          aws-access-key-id: ${{ secrets.ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.SECRET_KEY }}
          aws-region: ap-northeast-2

      - name: pull github repo
        uses: appleboy/ssh-action@v1.0.0
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu
          key: ${{ secrets.SSH_KEY}}
          script: |
            cd project-folder
            git config --global user.email ${{secrets.MY_EMAIL}}
            git config --global user.name ${{secrets.MY_NAME}}
            git remote set-url origin https://${{ secrets.MY_EMAIL }}:${{ secrets.MY_PASSWORD }}@github.com/GITHUB_URL/project.git

  cd:
    needs: [ci]
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v3

      - name: AWS configure credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:  
          aws-access-key-id: ${{ secrets.ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.SECRET_KEY }}
          aws-region: ap-northeast-2

      - name: build docker
        uses: appleboy/ssh-action@v1.0.0
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu
          key: ${{ secrets.SSH_KEY}}
          script: |
            cd project-folder
            sudo git pull origin
            docker system prune -a -f
            docker compose -p project up --build -d

 

 

 

1. 깃헙 main 브런치에 코드가 merge or push 된다.

2. AWS에 접속하여 코드를 최신화(CI)하고

3. 도커 컨테이너를 서버에 배포(CD) 하게 된다.

 

 

원래는 내가 작성한 플로우가 아니라 도커허브를 이용해서 작업을 한다고 한다.

 

여력이 된다면 그렇게 리팩토링을 해보고 싶다.

 

 

 

'Web' 카테고리의 다른 글

[CSS] 부모 width를 무시하고 width 100%를 주는방법  (0) 2023.03.30
개발관련 유용한 웹사이트  (0) 2023.03.15