지난 글에 이어서 Github Action을 활용한 CI 환경을 구축해보겠습니다.
Repository로 코드를 푸시한 뒤, 코드에 오류가 없을 경우 프로젝트 파일을 jar 파일로 변경하여 이를 AWS S3에 전송하도록 구현해보겠습니다.
Repository의 상단에 보시면 Action이라는 탭이 존재합니다.
이걸 선택해주시면
다음처럼 Repository에서 사용된 언어를 분석하여 화면이 나타납니다.
제 경우에는 Gradle을 활용한 Spring 프로젝트이기 때문에 Java With Gradle을 선택해줍니다.
그럼 다음처럼 yml 파일을 편집하는 창이 나타날 것입니다.
이 파일은 github action이 어떻게 동작할지를 기술하는 파일로,
어떠한 경우에 github action이 동작할지, 어떠한 작업을 수행할지 설정할 수 있습니다.
[Reference : https://docs.github.com/ko/actions/using-workflows/about-workflows]
github action에서 사용하기 위한 문법은 github action 공식 문서에 잘 정리되어 있기 때문에 설명은 넘어가도록 하겠습니다.
# github Action 탭에서 노출시킬 이름
name: Java CI with Gradle
# github Action이 어떠한 상황에서 동작할지를 명시
# 현재 main 브랜치에 push나 pull request 요청이 올 경우 동작하도록 설정
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
# github Action이 어떠한 동작할지 기술
jobs:
build:
runs-on: ubuntu-latest # Runner 동작 환경
# repository의 코드가 러너로 이동하고 실행되는 것을 가능하게하는 코드
steps:
- uses: actions/checkout@v3
# 자바 설치
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
# MySQL 설치
- name: Set up MySQL
uses: samin/mysql-action@v1.3
with:
host port: 3306
container port: 3306
mysql host: jdbc:mysql://localhost:3306/test
mysql database: test
mysql user: chrkb1569
mysql root password: 1234
# gradle을 활용하여 jar파일 생성
- name: Build with Gradle
uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25
with:
arguments: clean bootJar
workflow 작성에 시간이 많이 소모된 것 같습니다 ㅠ
gradle 단계에서 자꾸 오류가 발생하더라구요
커밋이나 PR이 발생하는 경우 자동으로 github Action이 동작하면서 해당 커밋이 main 브랜치에 머지되는 과정에서 오류가 발생하는지 확인해서 사용자에게 알림을 보내줍니다.
저는 다음처럼 이메일로 알림이 왔습니다.
그럼 github Action은 일단 대략적으로 설정이 완료된 것 같으니, 다음은 AWS로 넘어가보겠습니다.
IAM을 통하여 S3에 접근 권한을 가지고 있는 사용자를 생성합니다.
정책의 경우, 직접 정책 연결을 선택한 뒤, 다음처럼 S3와 관련된 모든 권한을 의미하는 S3FullAccess를 선택해줍니다.
그리고 나중에 CodeDeploy도 사용할테니 CodeDeploy와 관련된 모든 권한들 역시 설정해줍니다.
사용자가 정상적으로 생성되었다면, 다음처럼 사용자 정보에서 엑세스 키 만들기를 선택해줍니다.
다음의 과정을 통하여 생성된 키는 엑세스 키와 비밀 엑세스 키로 나뉘어져있는데, 가능하면 파일로 다운받아서 키 정보를 저장해줍시다.
예전에 키 정보를 까먹어서 사용자를 다시 생성했던 경험이 있거든요 ㅋㅋ
IAM을 통하여 사용자 등록을 완료하고, 키까지 발급 받았으면 다음으로 S3를 생성해보겠습니다.
일단 버킷을 생성해주었습니다.
버킷 내부로 들어가면 다음처럼 상단에 메뉴들을 확인할 수 있는데,
권한 메뉴로 들어가서 버킷 정책을 수정해줍니다.
버킷 정책의 경우, 우측 상단의 편집을 클릭한 뒤, 정책 생성기를 통하여 쉽게 만들 수 있습니다.
저는 S3의 모든 서비스를 허용하도록 정책을 설정하였습니다.
그럼 정책을 변경하였으니 테스트를 해볼까요?
다음처럼 버킷 내부 스토리지 화면으로 돌아와서 테스트하기 위한 사진을 업로드해줍니다.
저장된 사진을 선택하면
다음처럼 사진에 대한 정보를 확인할 수 있는데,
우측 하단에 위치한 객체 URL을 클릭해봅니다.
다음처럼 업로드한 이미지를 확인할 수 있으면, 버킷 설정이 완료되었다고 볼 수 있습니다.
AWS IAM과 S3를 생성했으니, github Action의 동작을 통하여 생성된 jar 파일을 S3로 전송할 수 있도록 추가 설정을 해주어야합니다.
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
- name: Set up MySQL
uses: samin/mysql-action@v1.3
with:
host port: 3306
container port: 3306
mysql host: jdbc:mysql://localhost:3306/test
mysql database: test
mysql user: chrkb1569
mysql root password: 1234
- name: Build with Gradle
uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25
with:
arguments: clean bootJar
- name: Make Directory for Jar File
run: mkdir deploy
- name: Copy Jar File
run: cp ./build/libs/*.jar ./deploy/
- name: Move Directory
run: cd ./deploy/
- name: Make zip file
run: zip -r -qq -j ./CI-CD.zip ./deploy
- name: Deliver to AWS S3
env:
AWS_ACCESS_KEY_ID: AKIAVZWOFNCJ3N2TKF5Z
AWS_SECRET_ACCESS_KEY: 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
run: aws s3 cp --region ap-northeast-2 --acl private ./CI-CD.zip s3://chuhah915/
기존 Github Action 스크립트에 jar 파일을 s3로 전송하는 과정을 추가하였습니다.
스크립트를 수정하여 커밋한 뒤, github Action이 동작하였고,
다음처럼 jar 파일이 zip 형태로 S3에 저장된 것을 확인할 수 있었습니다.
현재 2번 과정인 CI까지만 구현하였으며, 추후에는 Code Deploy를 활용하여 EC2 서버에 배포까지 하는 과정을 정리해서 올리도록 하겠습니다.