Github Actions를 통한 배포 자동화
개요 및 사전 준비 사항
주의 사항
- EC2 인스턴스에 파이프라인 실습으로 인해 실행되고 있는 애플리케이션이 있다면 프로세스를 종료함
- 이전에 진행한 실습으로 생긴 리소스를 리소스 이름을 확인한 후 모두 삭제하고 진행함
- CodeBuild 빌드 프로젝트
- CodeDeploy 애플리케이션과 배포그룹
- CodePipeline 파이프라인
- EC2 인스턴스에 있는 이전 빌드 결과물
- 안내되어 있는 이름 규칙을 반드시 지켜야 함
- 이름 규칙, 태그 등 안내에 따르지 않으면 리소스가 삭제될 수 있음
- 실습에서 안내하는 기능이나 리소스 외에 다른 기능을 사용하는 경우, 개인 Root 계정을 사용해야 함
프로젝트 사전 준비
- https://start.spring.io/ 를 통해 간단한 프로젝트를 생성하며, 배포 과정에 집중하기 위해 Spring Web 의존 모듈만 선택하여 프로젝트를 구성하여 진행함
- 버전은 SNAPSHOT이 표기되어있지 않은 2.X.X를 선택함
- 프로젝트의 이름으로 빌드 파일이 생성되며, 이후 배포 단계에서 빌드 파일을 실행해야 하기 때문에 설정 파일 구성에 신경 써서 진행해야 함
S3 버킷 비우기
- S3를 저장소로서 사용함
- 개인 버킷의 내용물을 삭제함
- 삭제 버튼을 눌러 저장된 모든 객체를 영구 삭제함
- 정적 웹 사이트 호스팅 비활성화
Github Actions를 통한 배포 Flow
Github Actions이란?
- GitHub Actions는 Github가 공식적으로 제공하는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 CI/CD 플랫폼
- 레포지토리에서 Pull Request 나 push 같은 이벤트를 트리거로 GitHub 작업 워크플로우(Workflow)를 구성할 수 있음
- 워크플로우는 하나 이상의 작업이 실행되는 자동화 프로세스로, 각 작업은 자체 가상 머신 또는 컨테이너 내부에서 실행됨
- 워크플로우는 .yml (혹은 .yaml) 파일에 의해 구성되며, 테스트, 배포 등 기능에 따라 여러 개의 워크플로우도 만들 수 있으며, 생성된 워크플로우는 .github/workflows 디렉토리 이하에 위치함
- 비공개 레포지토리의 경우 Github Actions가 작동할 때의 용량과 시간이 제한되어 있으며 공개 레포지토리는 무료로 사용 가능함
Github Actions를 통한 배포 Flow

Github Actions
- Github Actions는 설정 파일(.yml)에 따라 Github Repository에 특정 변동사항을 트리거로 작동됨
- main 브랜치에 push 하는 경우 작동하도록 설정한 후 진행
- Github Actions는 main 브랜치에 적용된 변동 사항을 기준으로 프로젝트를 빌드하며, 빌드를 마친 프로젝트를 AWS의 S3 버킷에 저장하고, Code Deploy에 S3에서 EC2로 배포 명령을 내림
S3
- Github Actions를 통한 배포 자동화에서는 저장소로써 사용함
- Github Actions에서 빌드한 결과물이 압축되어 S3으로 전송되고, 버킷에 저장됨
Code Deploy
- Github Actions에서 배포 명령을 받은 Code Deploy는 S3에 저장되어 있는 빌드 결과물을 EC2 인스턴스로 이동함
- 프로젝트 최상단에 위치한 appepec.yml 설정 파일에 의해 쉘 스크립트 등 단계에 따라 특정 동작을 함
- Code Deploy가 S3 버킷에서 EC2 인스턴스로 프로젝트를 이동할 수 있도록 EC2 인스턴스에 Code Deploy Agent의 설치가 필요함
- OS별, 버전별 설치 방법이 상이하기 때문에 반드시 공식문서를 참고하며 진행해야 함
EC2
- Code Deploy에 의해 빌드 과정을 거친 프로젝트가 EC2 인스턴스로 전달되고, .yml (설정 파일)과 .sh (쉘 스크립트)에 의해 각 배포 결과를 로그로 저장하며 빌드 파일(.jar)을 실행함
- 해당 과정이 원활히 진행되기 위해, EC2 인스턴스에 접속하여 알맞은 Code Deploy Agent의 설치와 JDK 11 버전 설치가 필요함
리소스 설정하기
Github Actions 생성
Public Repository 생성하기
레포지토리가 비공개(Private)인 경우 Github Actions 사용에 제한이 있을 수 있으므로, 반드시 공개 레포지토리로 생성해야 함
생성한 레포지토리의 Owner는 개인 계정이어야 하며, 여러 Organixation에 소속되어 있는 경우, 레포지토리의 Owner를 확인해야 함
레포지토리를 생성한 후, 미리 만들어놓은 프로젝트를 업로드 함
레포지토리의 Actions 탭을 클릭함
Github Actions탭에선 워크플로를 어떻게 생성할지 선택할 수 있음
상단의 [set up a workflow yourself] 를 클릭하여 빈 yml 설정파일로 워크플로를 설정할 수 있고, 추천 워크플로 구성을 선택하여 진행할 수 있음
- Gradle 빌드가 기본으로 설정되어있는 추천 구성을 사용하여 시작할 것
- 만약 화면의 추천 구성이 보이지 않는 경우 Search workflows 에 'Java with Gradle'을 검색하여 선택하거나, 빈 파일에서 구성할 수 있음
다른 부분은 수정하지 않고 오른쪽 상단의 [Commit changes...] 버튼을 눌러 업로드 함
- 브라우저에서 수정사항을 Commit 하면 Push까지 진행되어 Github Actions가 바로 실행됨
- 웹 브라우저에서 생성한 gradle.yml 파일을 로컬 환경에서도 변경하기 위해선 pull 명령어를 이용해 로컬 코드에 반영해야 함
- gradle.yml 파일이 생성됨과 동시에 워크플로에 작성되어있는 트리거(main 브랜치에 push)로 인해 Github Actions가 실행됨
- Actions 탭에서 생성된 워크플로의 각 단계별 진행상황을 확인할 수 있음
- 실행한 워크플로가 성공하면 초록색 체크가, 실패하면 빨간색 X 모양을 확인할 수 있음
- 진행 / 성공 / 실패 여부는 레포지토리에서 최근 커밋 내역과 함께 표시됨
Github Action 수정
- Github Actions를 AWS 리소스와 연결함
- IAM User를 생성해야 하며, 로그인할 때의 계정이 아닌, 서비스와의 연결을 위한 액세스 키 방식으로 발급된 계정
Github Secret 등록하기
Github Actions에서 워크플로를 실행하는 과정에서 액세스 키가 필요하지만, 공개되면 보안 이슈가 발생할 수 있음
- Github Secret을 이용해 액세스 키 값을 저장한 후 사용할 예정
- Github Secret을 이용해 액세스 키 값을 저장한 후 사용할 예정
레포지토리의 Settings > Secrets > Actions 탭으로 이동한 후 [New repository secret] 버튼을 클릭
Name에는 변수 이름을, Value엔 변수의 값을 저장함
저장해야하는 변수는 두가지로, IAM User를 생성할 때 볼 수 있는 액세스 키 ID 값과, 비밀 액세스 키 값을 각각 저장함
- 한 번 저장하면 값의 일부만은 수정할 수 없으니 주의해야 함
- 덮어쓰기는 가능하지만, 저장된 값을 확인하는 것은 불가능
Github Action 설정파일 수정하기
- gradle.yml 파일을 수정함
- 저장된 secret의 이름이 같도록 수정해야 함
- ecrets.AWS_ACCESS_KEY와 secrets.AWS_SECRET_ACCESS_KEY는 이전에 등록한 Github Secret에서 값을 불러오므로 키 값을 yml파일에 바로 적지 않음
- ap-northeast-2 는 서울 리전을 의미함
- IDE를 이용해 파일을 수정하는 경우 (pull 진행 이후) 반드시 push 까지 진행해야 Github Actions가 동작함
- 워크플로를 처음 생성했을 때처럼 브라우저에서 바로 수정할 수도 있음
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
permissions:
contents: read
env:
S3_BUCKET_NAME: be-mason-project
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Build with Gradle
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
arguments: build
# build한 후 프로젝트를 압축합니다.
- name: Make zip file
run: zip -r ./practice-deploy.zip .
shell: bash
# Access Key와 Secret Access Key를 통해 권한을 확인함
# 아래 코드에 Access Key와 Secret Key를 직접 작성하지 않음
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }} # 등록한 Github Secret이 자동으로 불려옴
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # 등록한 Github Secret이 자동으로 불려옴
aws-region: ap-northeast-2
# 압축한 프로젝트를 S3로 전송함
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./practice-deploy.zip s3://$S3_BUCKET_NAME/practice-deploy.zip
- 워크플로가 성공적으로 완료되면 S3 버킷에 압축파일이 전송되었음을 확인할 수 있음
- 만약 실패했다면 어느 단계에서 실패했는지 확인한 후 실패한 이유를 파악한 후 다시 진행해야 함
주의 사항
- 운영 체제 문제로 '~/gradlew' is not executable. 에러가 발생할 수 있음
- 에러가 발생하는 경우 Build with Gradle 이전에 ./gradlew에 권한을 부여하는 단계를 추가함
- 줄 바꿈이 있을 땐 각 단계가 같은 깊이를 유지하도록 간격에 유의해야 함
// 예시 코드
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Add permission // 추가
run: chmod +x gradlew // 추가
- name: Build with Gradle'CS > 데이터베이스' 카테고리의 다른 글
| Cloud - 운영 전략 1 (0) | 2023.06.20 |
|---|---|
| Cloud - 배포 자동화 4 (0) | 2023.06.20 |
| Cloud - 배포 자동화 2 (0) | 2023.06.19 |
| Cloud - 배포 자동화 1 (1) | 2023.06.19 |
| Cloud - 배포 컨테이너 3 (1) | 2023.06.19 |
