본문 바로가기

Git

Github Action으로 S3에 배포해보자

이번 시간에는 Github Action으로 S3에 자동 배포했던 여정을 기재해보려고 합니다.

 

Github Action을 왜 도입했어요?

테스트 서버 혹은 운영 서버에 배포하려고 할 때 매번 PC에 접속해서 git pull하는 과정을 반복했었어야 했습니다.

 

그러나 이러한 과정은 서버를 잠시 멈추거나 개발자의 작은 실수로 인해 서버 상태가 좋지 못한 상태로 변경이 될 수도 있는 등 불안한 요소가 항시 존재하였습니다.

 

이를 방지하고 배포하는 데 걸리는 시간을 줄이고자 Github Action을 도입하게 되었습니다.

 

* 사실 매번 git pull하기 너무 귀찮았어요...

 

편리하지만 복잡할 거 같은데요?

처음에는 도입이 꺼려질 수도 있습니다. 저 역시 그랬구요.

 

그러나 아래 예제 코드를 보면서 하나씩 알아가보면 금방 적응할 수 있습니다.

 

GitHub Action Secret 설정

우선 yml에서 사용할 수 있도록, AWS에 접근이 가능한 AWS-ACCESS-KEY와 SECRET-KEY를 Github에 설정하여야 합니다.

 

- 배포를 원하는 Repository에 접속한 뒤 Settings > Secrets > Actions을 선택합니다.

 

- Actions Secrets 우측의 New repository secret를 선택합니다.

키 목록 화면

 

- Name과  Secret에 해당해는 값을 입력한 후 Add secret를 클릭합니다.

  Name : 키의 이름

  Secret : 내용 혹은 값

키 등록 화면

 

- 위의 키 등록 과정을 한번 더 반복하여  AWS-ACCESS-KEY와 SECRET-KEY를 등록합니다.

  저는 키 이름을 AWS_ACCESS_KEY_ID 와 AWS_SECRET_ACCESS_ID 로 각각 지정하였습니다.

  등록이 완료되었다면 아래와 같은 화면이 나와야합니다.

키 등록이 완료된 후의 키 목록

 

Github Workflow 생성

Github에서 workflow를 생성하여 EC2에 자동배포가 이루어지도록 해보겠습니다.

 

- 배포가 필요한 Repository에서 Actions 탭을 선택한 후, set up a workflow yourself를 클릭합니다.

  (만일 필요한 템플릿이 이미 있을 경우 검색하여 Configure를 클릭하면 됩니다.)

Github Actions 화면

 

- 이를 클릭한다면 아래 화면처럼 Github에서 제공하는 예제 workflow가 기재되어있으나  EC2에 배포하기 위해 일부 수정이 필요합니다. 배포 yml은 아래와 같이 기재하였으며, 이를 하나씩 알아보고 이어서 배포과정을 기재해보겠습니다.

 

* workflow 설명

git-action-test라는 Repository에서 push이벤트가 일어났을 때 그 프로젝트를 빌드하여 AWS S3에 배포하는 과정입니다.

 

  • name: 현재 workflow의 이름
    • on : workflow에서 이벤트가 발생했을 때 on을 사용하여 어떤 이벤트가 발생할 때 실행할 지 정의
      • push : push 이벤트가 발생하였을 시 하여야 할 행동 (현재는 git-action-test 브런치에 push 이벤트가 발생했을 때 이벤트가 실행됩니다.)
      • branches : 어떤 브랜치를 관찰할 것인지 정의

 

  • jobs : 병렬로 실행할 작업들
    • build : job의 고유 아이디 (이메일 주소처럼 고유한 이름이므로 작명은 원하는 대로 하면 됩니다)
      • name : job의 이름 (깃헙 UI에 표시될 이름)
      • runs-on : 어떤 OS에서 실행할 지 지정
      • strategy : 
        • matrix:
          • node-version : 어떤 node버전을 사용할 지 정의합니다.
      • steps : 실행 순서
        • name : 과정별 이름
        • uses : 어떤 액션을 사용할 지 지정 ( 이미 만들어진 액션을 사용할 때만 사용 )
        • with : node-version 별로 모두 작업을 실행 ( 만일 matrix에 배열로 [12, 14] 기재 시 2개의 job이 생성)
        • run : 커맨드 ( AWS cli나 node 빌드 시 사용하는 명령어들을 기재 )
        • env : 환경 변수 지정
  •  

  

나머지 작업은 개발환경에 따라 상시 변동이 있을 수 있으므로 여기서는 맨 밑의 작업(Deploy S3)에 대해서만 상세히 알아보겠습니다.

 

- Deploy S3의 job에서의 환경변수(env)에는 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY를 작성해줍니다.

 

그러면 github action secrets에 등록된 키의 값을 가져옵니다.

 

- build라는 폴더에 있는 파일을 서울리전의 S3 버킷에 올려야 하므로 아래와 같은 명령어를 삽입합니다. 

run에서는 s3 cli 를 참고하여 작성하였습니다.

aws s3 sync --delete --region ap-northeast-2 build s3://{{secrets.bucket-name}}
 
* build폴더에 있는 파일들을 S3 버킷과 비교해 변경된 내용들만 파일을 업로드하는것이 좀 더 효율적이며,
 
그 과정에서 build폴더에서 삭제된 파일들은 버킷에서도 자동으로 삭제되도록 하였습니다. 

 

- Start Commit을 하여 Repository에 커밋합니다.

 

- 이후 한번 push하여 정상작동하는지 테스트를 합니다. 성공하면 좌측에 초록색 체크표시가 표시됩니다.

 

Github Action 테스트

 

마치며...

자동으로 배포해준다는 이점은 알고있었으나 작성오류로 인한 서버 오류가 발생할까봐 많이 두려웠습니다.

그러나 이번 기회를 빌어 두려움을 뒤로하고 도입한 결과, 엄청난 시간절감과 함께 개발자의 실수로 인한 서버 내 파일 손상을 원천적으로 차단할 수 있게되어 결과적으로 잘한 선택이었습니다.

여러분들도 이를 기회로 자동배포기능을 사용하여 시간을 절약하고 실수를 줄이는 길이 되었으면 합니다.

'Git' 카테고리의 다른 글

Git으로 내 코드를 관리해보자 #1  (0) 2022.09.12