728x90
CI/CD란?
- Continuous Integration/Continuous Deployment(Delivery)의 약자로, 지속적인 통합과 지속적인 제공을 의미
- 기본 개념
- 지속적인 통합(Continuous Integration): 자동화된 빌드와 자동화된 테스트를 제공
- 지속적인 서비스 제공 (Continuous Delivery)
- 지속적인 배포(Continuous Deployment): 배포를 자동화하여 배포 시간을 단축하고 코드 결과물을 빠르게 지속적으로 제공
왜 Docker?
- 애플리케이션 개발과 배포가 편해짐
- Docker Container 내부에서 여러 소프트웨어를 설치해도 호스트 OS에 영향이 없음
- CI 과정의 테스트에서 Docker를 활용
- 어떤 서버에 올려도 같은 환경으로 구성된 컨테이너로 동작하기 때문에 표준화된 배포를 구성할 수 있음
- Docker가 가상화에서 사실상 표준의 위치임
- 여러 애플리케이션의 독립성과 확장성이 높아짐
1. AWS DB 배포하기
- AWS RDB에서 데이터베이스를 생성
- 표준생성, 프리티어, 퍼블릭 액세스: 예, 추가 구성: 초기 데이터베이스 이름 설정 후 생성
2. CI (빌드, 테스트 자동화)
Github Actions - set up a workflow yourself -> 를 클릭하여 새 yml파일을 생성
- application-prod.yml 파일의 내용을 github의 secrets의 repository에 저장한다.
- 해당 파일을 가져와서 ./src/main/resources 위치에 application-prod.yml 파일로 저장한다.
- 이후 application-prod.yml 환경에서 프로그램을 빌드시킨다.
name: Build check
on:
pull_request:
branches:
- develop
jobs:
build:
name: Build check
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'corretto'
- name: make application-prod.yml // application-prod.yml 파일 생성
run: |
cd ./src/main/resources
touch ./application-prod.yml
echo "${{ secrets.YML_PROD }}" > ./application-prod.yml
shell: bash
- name: Grant execute permission for gradlew // gradle 빌드 실행 권한을 부여
run: chmod +x gradlew
- name: Build with Gradle
env:
SPRING_PROFILES_ACTIVE: prod // application-prod.yml 환경에서 빌드
run: ./gradlew clean build --stacktrace
shell: bash
3. AWS S3 생성
모든 퍼블릭 액세스 차단
4. AWS IAM 사용자 생성
권한 설정
- AWSCodeDeployFullAccess
- AmazonS3FullAccess
IAM 사용자 > 보안 자격 증명 > 액세스 키 만들기
AWS 외부에서 실행되는 애플리케이션 선택
액세스 키, 비밀 액세스 키 저장
5. 액세스 키, 비밀 액세스 키 설정
Github Settings > Secrets and Variables > actions > Repository Secrets에 추가
- AWS_ACCESS_KEY_ID - 액세스 키 ID
- AWS_PRIVATE_ACCESS_KEY - 비밀 액세스 키
6. EC2 설정
이후 수동 배포를 해보고, 강의 수강을 하면서 살을 더 붙일 예정이다.
참고
'TIL' 카테고리의 다른 글
[240113] MapStruct unmapped 오류 수정 (0) | 2024.01.13 |
---|---|
[240111] Docker image, Docker container (0) | 2024.01.11 |
[240108] Refresh Token 구현 전의 고려 사항 (0) | 2024.01.08 |
[240106] permitAll()과 shouldNotFilter (0) | 2024.01.06 |
[240104] 심화 프로젝트 마무리 :: 트러블 슈팅 (0) | 2024.01.04 |