Github Action

오늘은 GitHub Actions라는 빌드, 테스트 및 배포 파이프라인을
자동화할 수 있는 CI/CD 플랫폼을 배워보려한다.

Pull Request나 push 같은 이벤트를 트리거로 Workflow를 구성할 수 있다.
Workflow는 하나 이상의 작업이 실행되는 자동화 프로세스로, 각 작업은 자체 가상 머신
또는 컨테이너 내부에서 실행된다.


Github Actions를 통한 자동화 배포 Flow

image

  1. 레포지토리에 변화가 생기면 Github Actions 작동
  2. 프로젝트 빌드 결과물(.jar) S3로 전송 및 저장
  3. CodeDeploy로 배포 명령
  4. 프로젝트 빌드 결과물(.jar) CodeDeploy로 전달
  5. EC2 배포 및 샐행

GitHub Actions는 설정파일(.yml)에 따라 Github Repository에
특정 변동사항을 트리거로 작동된다. 트리커는 Pull Request나 push 같은 이벤트를
사용할 수 있다고 위에서 얘기 했었었다.

on:
  push:
    branches: [ "main" ]

간단한 예시로 main브랜치에 push가 되어질때를 트리거로 사용하는 .yml설정이다.

Github Actions에서 빌드를 마치고 빌드 결과물을(.jar) AWS S3 버킷에 객체를 저장한다.
그리고 Code Deploy로 배포 명령이 내려진다.
(즉, S3는 빌드한 결과물을 저장해주는 용도로만 사용할 것이다.)

그렇게 Code Deploy가 배포 명령을 받으면
S3에 저장되어 있던 빌드 결과물이 EC2 인스턴스로 이동한다.
그리고 appspec.yml파일에 설정한대로 shell script를 동작한다.

그렇게되면 EC2에서 .yml,.sh파일들에 의해 빌드파일(.jar)을 실행하고
배포 결과를 로그로 남길 수 있다.
즉, EC2에서는 Code Deploy Agent의 설치와 JDK 버전 설치가 필요하다.


Github Actions 생성

이제 자동 배포과정은 위에서 알아 보았으니
Github Actions을 이용해 설정을 진행해보자.

image

테스트용으로 만든 Repository의 상단의 Actions를 들어가서
Java with Gradle을 찾아 구성을 클릭해준다.


image

눌러 주고나면 상단에 .yml파일을 저장할 경로가 나오고
이름을 설정해 줄 수 있다. 기본이름인 gradle.yml로 설정 후

하단에는 gradle.yml 파일에 대한 설정을 해주어야한다.
위에서 잠깐 얘기했던 변동사항 트리거 설정, JDK 설치
build한 후 압축하는 기능, AWS credentials 구성, 압축한 파일 S3 전송
CodeDeploy에게 배포 명령 등 다양한 Workflow를 설정해 줄 수 있다.

해당 설정을 마쳤다면, Start commit 버튼을 눌러준 후 Commit new file을 눌러 주면 된다.
gradle.yml 파일은 Repository .github/workflows 경로에 저장된다.

그리고 Actions에서 우리가 설정한 gradle.yml 설정대로
Workflow가 진행되는 것을 확인 할 수 있다.

image

모든 과정이 완료되면 위와 같이 녹색으로 표시가 된다.
이제 S3에 빌드파일 객체가 전달되었을 것이고
Code Deploy의 작동을 모아놓는 appspec.yml설정이 제대로 되어있고
script .sh들의 코드가 정상적으로 들어가 있다면
EC2에 정상적인 배포가 자동으로 이루어졌을 것이다.

Github Actions를 설정하기전에

우리가 이용하는 Code Deploy의 애플리케이션 생성과
appspec.yml, .sh파일에 대한 설정은 끝나 있어야한다.


Github Action Configure AWS credentials

현재 IAM 계정으로 AWS를 이용중이다.
(참고 - AWS 엑세스키 관련 문서)

Github Actions에서 Workflow를 실행하는 과정에서
Access Key가 필요하다. 공개되면 보안 이슈가 발생할 수 있어
Github Secret 기능을 이용해 Access Key 값을 저장한 후 사용할 수 있다.
configure-aws-credentials 레퍼런스를 참고해보면 좋을 것 같다.

jobs:
  build:
    steps:      
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: $ # 등록한 Github Secret
          aws-secret-access-key: $ # 등록한 Github Secret
          aws-region: ap-northeast-2
     
      // ..생략

image

이렇게 키값을 설정해주면
gradle.yml에서 환경변수 사용하듯이 사용이 가능하다.



이렇게 오늘은 Github actions를 이용해
push 한번으로 EC2까지 자동으로 배포되어지는 기능을 사용해 보았다.
안에 엄청나게 복잡한 내용들이 존재하는건 분명하다.

이 기능을 이용해본 입장으로서는 Workflow 구성설정과
AWS CodeDeploy의 .yml,.sh 파일에 대한 내용만
우리가 동작을 원하는대로 설정만 잘해두면 무리없이 동작되는 것 같다.

이렇게 이틀 동안 배포자동화에 대한 두가지 방법을 알아 보았다.
느낀점은 AWS에 대한 공부가 절실하다는 것.
전체적인 흐름을 이해했으니 이제 상세한 공부들이 필요할 시기다.

오늘 공부는 여기서 끝!!


오늘의 커피량: ☕️ ☕️ ☕️
오늘의 점심: 짜파게티, 김치찌개