티스토리 뷰
프로젝트를 진행할 때 변경한 코드가 올려져 있는 Github Repository로 부터 서버에서 pull해서 build하고 deploy하는 과정이 너무 번거로웠다. 나는 이러한 문제를 해결하기 위해서 Github Actions를 사용하여 Repository에 특정한 이벤트(나와 같은 경우 pull request)가 발생하면 자동으로 빌드하고 빌드된 프로젝트 파일을 AWS S3에 올리도록 하였다. 그 후는 AWS Code Deploy가 배포 서버(EC2)에 배포하는 과정을 거친다. 이번 포스팅은 GithubActions으로 Spring Boot 프로젝트 CI 적용하는 부분을 작성하였다.
Github Actions 구성요소
Github Actions Workflow의 각 job은 가상 머신 runner 또는 컨테이너에서 실행된다.
Workflow
- Pull Request나 이슈 생성과 같이 레포지토리에서 이벤트가 발생할 때 트리거된다.
- repository 내 .github/workflow 디렉토리에 YAML 파일로 정의되며 여러개의 workflows를 가질 수 있다.
- 순차적이거나 병행하는 하나 이상의 jobs를 구성할 수 있다.
Event
- workflow가 실행되도록 하는 레포지토리내 특정한 activity이다.
- pull request, opens an issue, pushes a commit to a repository와 같은 activity가 해당된다.
Job
- 동일한 Runner에서 실행되는 workflow의 단계 집합이다.
- Job 내 각 단계는 순서대로 실행되며 서로 종속적이다. 예를 들면 응용 프로그램을 빌드하는 단계 다음에 빌드된 응용프로그램을 테스트하는 단계를 가질 수 있다.
- 기본적으로 다른 Job과는 종속성이 없으며 서로 병렬로 실행된다. 다른 Job과 종속성이 있다면 실행 전 그 Job이 완료될 때까지 기다린다.
Runner
- Workflow가 트리거 될 때 실행하는 서버이다.
- 각 Runner는 단일 작업을 실행할 수 있다.
- Github은 Workflow를 실행할 수 있는 Ubuntu Linux, Microsoft Windows 및 macOS Runner를 제공한다.
이제 본격적으로 GithubActions를 적용해보자.
요약
1. Github Repository에 Workflow 생성
2. AWS S3에 빌드 파일 저장하는 권한 생성
3. AWS S3에 빌드된 결과물 업로드
1. Github Repository에 Workflow 생성
1. 상단의 [set up a workflow yourself] 를 클릭하여 빈 yml 설정파일로 워크플로를 설정
추천 워크플로 구성을 선택하여 진행할 수 있으며 나는 Gradle 빌드가 기본으로 설정되어있는 추천 구성을 사용하였다.
2. 기본 구성 그대로 Github Actions 워크 플로를 생성한다.
오른쪽 상단의 [Commit changes...] 버튼을 눌러 업로드 한다.
gradle.yml 파일이 생성됨과 동시에 워크플로에 작성되어있는 트리거(main 브랜치에 push)로 인해 Github Actions가 실행된다. 실행한 workflow가 성공하게 되면 초록색이 실패하게 되면 빨간색이 뜬다.
3. Github Repository에 변경사항이 발생 시 프로젝트를 빌드한 후 압축시키는 코드 작성
Github Repository에 변경사항 발생 시 프로젝트를 빌드한 후 결과물을 압축하여 Runner . 디렉토리에 압축시킨다.
name: Java CI with Gradle
# event: branches "main"에 push
on:
push:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
# Java11 설치
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
# MySQL 설정
- name: Setup MySQL
uses: mirromutth/mysql-action@v1.1
with:
mysql database: 'main'
mysql user: 'admin'
mysql password: ${{ secrets.MYSQL_PASSWORD }}
# Gradle 허용
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# Build
- name: Build with Gradle
run: ./gradlew clean build
# Build된 프로젝트 디렉토리 .에 복사
- name: Copy jar
run: cp build/libs/{본인 프로젝트 이름}.jar .
# 프로젝트 압축
- name: Make zip file
run: zip -r ./{본인 프로젝트 이름}.zip .
shell: bash
2. AWS S3 업로드 권한 생성
1. AWS S3에 빌드된 결과물을 업로드하는 IAM 사용자 생성
다음과 같이 권한을 추가한다.
2. 생성한 IAM 사용자 엑세스키 생성
생성한 IAM 사용자 > 보안 자격 증명 > 엑세스 키에서 엑세스 키 만들기
엑세스 키는 보안을 위해 외부에 노출되지 않도록 주의해야 한다.
3. Github Secret에 엑세스 키 값 저장
Github Actions에서 워크플로를 실행하는 과정에서 액세스 키가 필요하지만 공개되면 보안이슈가 발생되기 때문에 Github Secret을 이용해 엑세스 키 값을 저장한 후 사용해야 한다.
레포지토리의 Settings > Secrets and Variables > Actions 탭으로 이동한 후 [New repository secret] 버튼을 클릭한다.
AWS_ACCESS_KEY에 Access key ID, AWS_SECRET_ACCESS_KEY에 Secret access key 값을 넣는다.
4. gradle.yml에 Access Key와 Secret Access Key를 통해 권한을 확인하는 STEP을 추가한다.
# Access Key와 Secret Access 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
3. AWS S3에 빌드된 결과물 업로드
1. 결과물을 업로드 할 S3 버킷을 생성한다.
2. gradlew.yml 파일에 압축한 프로젝트를 S3 버킷에 보내는 STEP을 추가한다.
# 환경설정
env:
S3_BUCKET_NAME: dodom-springboot //본인의 S3 버킷 이름
# 압축한 프로젝트를 S3로 전송
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./dodom-deploy.zip s3://$S3_BUCKET_NAME/dodom-deploy.zip
여기까지 빌드한 프로젝트를 S3에 업로드하는 과정을 끝냈다.
이 과정에서 나는 빌드할 때 parameter store 관련하여 제대로 설정이 되지 않아 에러도 많이 겪었다. 처음에 Github Actions에 의해 빌드될 때 EC2에서 빌드하는줄 알았는데 생각해보니 말도 안되는 것이었다!! 그리고 찾아보니 Runner라는 서버에서 빌드하는 것을 알게 되고 어떻게 진행되는지에 대해 자세하게 알아보게 되었다. 난 아키텍처 그림을 머릿속에서 상상하고 구현해내는 것을 좋아하는데 그게 머릿속에서 그려지는 순간 너무 재밌고 뿌듯했다 :)
다음 게시물은 S3에 업로드 된 파일을 AWS Code Deploy에게 배포하는 명령을 내려 EC2에 배포하는 과정을 담아볼것이다.
'Infra' 카테고리의 다른 글
[DevOps] CI/CD란 무엇인가? (0) | 2023.07.28 |
---|---|
클라우드 서비스란? (0) | 2021.02.15 |
- Total
- Today
- Yesterday
- 정렬
- CI/CD
- JPA
- persistencecontext
- acm
- 자바
- appliationeventlistener
- LeetCode
- IAM
- Route53
- 네트워크
- EC2
- java
- Spring Boot
- Spring
- githubactions
- 트랜잭션
- springboot
- 영속성 컨텍스트
- entitylisteners
- DevOps
- CI와 CD의 차이
- CodeDeploy
- aws
- network
- 지연 대기열
- 프로그래머스
- fetchcount()
- Hibernate
- 영속 상태
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |