📗 CI/CD
빌드부터 배포까지의 과정을 자동화하고, 잘 되는지 모니터링 하는 방법
🧩 CI (Continuous Integeration, 지속적 통합)
- 빌드와 테스트를 자동화하는 과정
- 변경 사항을 자동으로 테스트해 애플리케이션에 문제 없음 보장
- 코드를 정기적으로 빌드, 테스트하므로 여러 명이 동시에 작업해도 충돌 방지하고 모니터링 가능
🧩 CD (Continuous Deployment, 지속적 제공과 지속적 배포)
- 배포 준비가 된 코드를 자동으로 서버에 배포하는 작업을 자동화하는 것
○ 지속적 제공에서의 CD
- 애플리케이션에서 적용한 코드의 빌드와 테스트를 성공적으로 진행했을 때, 코드 저장소(예 : 깃허브)에 자동으로 업로드하는 과정
○ 지속적 배포에서의 CD
- 릴리스 = 지속적 제공을 통해 성공적으로 병합한 코드 내역을 배포 환경(예 : AWS)으로 보내는 것
- 지속적 제공의 다음 단계까지 자동화
📗 깃허브 액션 사용하기
리포지토리 (=코드 원격 저장소)에 이벤트 발생 시 특정 작업을 하거나, 주기적으로 특정 작업을 반복할 수 있게 하는 서비스
- 예) 코드 작성해 깃허브에 업데이트하면, 코드에 문제 없는지 자동으로 코드 빌드, 테스트한 후 배포
🧩 깃허브 리포지토리 생성하고 코드 푸시하기
코드 푸시(push)
: 깃허브에 코드 업로드하는 행위
깃허브에 새 리포지토리를 만들고, 해당 프로젝트 폴더로 들어가 [GIt Bash Here]을 눌러 git을 실행하여 아래와 같이 명령어를 작성한다.
// 1. 특정 폴더를 깃 저장소로 만듦
git init
// 2. [깃-깃허브 연결] 깃허브 리포지토리 - 로컬의 깃 저장소 연결
git remote add origin git@github.com:${사용자계정명}/springboot-blog.git
// 3. 로컬 저장소의 변경 사항 등 이력을 스테이지(변경 사항 미리 모아놓는 곳)에 올리는 명령어
git add .
// 4. 로컬 저장소에 변경 이력, 변경한 파일들 올리기 위한 명령어
git commit -m "커밋 메시지"
// 5. 브랜치명을 main으로 바꾸기
git branch -M main
// 6. 원격 저장소에 저장하기
git push origin main
1,2번은 초기 설정 단계라 필요한 과정이고, 나중에 push할 때는 3-6단계만 하면 된다.
🧩 깃허브 액션 스크립트 작성하기 (CI)
1) 프로젝트 최상단에 .github 디렉터리 만들기 ⊃ workflows 디렉터리 만들기 ⊃ ci.yml 파일 생성해 아래 스크립트 작성하기
# 1. 워크플로 이름 지정
name: CI
# 2. 워크플로 시작할 트리거 조건 지정 (메인 브랜치에 푸시할 때마다)
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest # 3. 실행 환경 지정
# 4. 실행 스텝 그룹화해 지정
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: '17'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build With Gradle
run: ./gradlew clean build
◆ 실행 스텝 그룹화 정리
○ uses
: 지정한 리포지토리 확인하고 코드에 대한 작업 실행
→ action/check-out
에는 checkout이라는 작업의 v3 버전 실행
○ name
: 스텝 이름 지정
○ run
: 실행할 명령어 입력
→ ./gradlew clean build
: 그래들 사용해 프로젝트를 빌드 이전 상태로 돌리고 다시 빌드하는 명령어 실행
2) ci.yml 파일에 대해 커밋&푸시 진행
3) 해당 리포지토리의 [Actions]에 들어가 CI 실행되는지 확인
🧩 깃허브 액션 스크립트 작성하기 (CD)
1) 빌드 시 일반 jar 파일만 생성하도록 build.gradle 파일 변경하기
jar {
enabled = false
}
WHY?
: plain이 붙은 jar 파일은 plain archive로, 애플리케이션 실행에 필요한 의존성을 포함하지 않고 소스 코드의 클래스 파일과 리소스 파일만 포함하는데, 이것만으로는 서비스를 실행할 수 없기 때문이다!
2) 깃허브 액션 스크립트에서 만든 ci.yml 파일명을 cicd.yml로 변경하고 코드 추가하기
# 1. 워크플로 이름 지정
name: CI/CD
# 2. 워크플로 시작할 트리거 조건 지정 (메인 브랜치에 푸시할 때마다)
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest # 3. 실행 환경 지정
# 4. 실행 스텝 그룹화해 지정
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
distribution: 'corretto'
java-version: '17'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build With Gradle
run: ./gradlew clean build
# 현재 시간 가져오기
- name: Get current time
uses: josStorer/get-current-time@v2.0.2
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
# 배포용 패키지 경로 저장 (빌드 이후 생성된 jar 파일 찾아 artifact라는 환경 변수에 값 넣음)
- name: Set artifact
run: echo "artifact=$(ls ./build/libs)" >> $GITHUB_ENV # $GITHUB_ENV : 깃허브 워크플로 전체적으로 사용할 수 있는 환경 변수
# 빈스토크 배포
- name: Beanstalk Deploy
uses: einaregilsson/beanstalk-deploy@v20
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }} # 깃허브 액션에서 가져오는 비밀값
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
application_name: springboot-blog
environment_name: springboot-blog-env
version_label: github-action-${{steps.current-time.outputs.formattedTime}}
region: ap-northeast-2
deployment_package: ./build/libs/${{env.artifact}}
3) AWS의 IAM 서비스에 접속해 [사용자] - [사용자 생성] 버튼 눌러 사용자 생성하기 (사용자명 : github-action)
→ IAM이란? AWS 리소스를 사용하도록 권한을 부여하는 서비스
4) [직접 정책 연결] - AdministratorAccess-AWSElasticBeanstalk 선택해 검색→ 빈스토크를 사용하기 위해 필요한 모든 관리 권한을 사용자에게 제공하는 권한
5) 액세스 키 만들기
: [보안 자격 증명] - [액세스 키 만들기]
6) 생성된 액세스 키는 이 화면에서 딱 한 번만 확인 가능하므로, 값을 미리 복사하거나 [.csv 파일 다운로드]를 눌러 보관해둔다.
7) 복사한 값을 등록하러 깃허브 리포지토리로 간다.
→ [Settings] - [Secrets and variables] - [Actions] - [New repository secret]
AWS_ACCESS_KEY_ID(액세스 키)와 AWS_SECRET_ACCESS_KEY(비밀 액세스 키)를 등록한다.
application.yml 파일의 client-id와 client-secret을 임의의 무의미한 값으로 변경한 후, (참고)
커밋&푸시하고 해당 리포지토리의 [Actions]에 들어가 실제로 배포가 잘 되었는지 확인한다.
EB 환경에서 확인해도 잘 업데이트 된 것을 확인할 수 있다,,
(해당 글 내용은 📗 스프링 부트 3 백엔드 개발자 되기 - 자바 편을 읽고 정리한 내용입니다.)
이로 인해 미루고 미루던 AWS 이용한 배포 작업과 CI/CD, 그리고 책 완독!!!
'📚 관련 독서 > 스프링 부트 3 백엔드 개발자 되기 - 자바 편' 카테고리의 다른 글
부록 (값 검증, 예외처리) (0) | 2024.02.28 |
---|---|
[SpringBoot] 11장 AWS에 프로젝트 배포하기 (0) | 2024.02.22 |
[SpringBoot] 10장 OAuth2 ver. 로그인/로그아웃 구현 (0) | 2024.02.21 |
[SpringBoot] 09장 JWT ver. 로그인/로그아웃 구현 (0) | 2024.02.13 |
[SpringBoot] 08장 스프링 시큐리티 ver. 로그인/로그아웃, 회원 가입 구현 (0) | 2024.02.13 |