▶ 개요
이번 포스팅에서는 컨테이너 환경의 프로젝트에서 많이 쓰이는 CI/CD 구축에 대해 학습해보겠다.
예정되어 있는 포스팅은 다음과 같다.
- 1. 개인 프로젝트에서 많이 쓰는 CI/CD 구축 방법
- 2. 일반 프로젝트에서 많이 쓰는 CI/CD 구축 방법
- 3. 컨테이너 기반(Docker)의 프로젝트에서 많이 쓰이는 CI/CD 구축 방법
위 3단계로 거쳐 각각 상황에 맞는 CI/CD 구축 방법에 대해서 이해해보자.
▶ 전체적인 흐름
▸ 장점
- Docker 기반으로 배포된 서비스에서 가장 간단하게 구성할 수 있는 인프라 구조.
▸ 단점
- 무중단 배포를 구현하거나 여러 EC2 인스턴스에 배포를 해야 하는 상황이라면, 직접 Github Actions에 스크립트를 작성하여 구현해야 함.
▸ 이 방법이 쓰이는 이유
- 컨테이너 기반으로 인프라를 구성했을 때 이 방법을 사용.
- 서버를 여러 대 운영할 필요 없는 소규모 프로젝트일 때 주로 사용.
▶ 사전준비
▶ ECR 설정
도커 이미지 레지스트리 저장소로 ECR을 채택하였음으로, ECR에 대한 초기 설정이 필요하다
아래 과정을 따라하여 ECR을 설정해보자.
▸ IAM 생성 및 역할 생성
1. 아래와 같은 IAM 생성
1-2 생성한 IAM 유저에 액세스 키 생성
2. AmazonEC2ContainerRegistryFullAccess
권한 추가
3. ECR 만들기
4. IAM 역할 생성
AmazonEC2ContainerRegistryFullAccess
정책 추가
5. 생성한 역할을 EC2에 연결
▶ 컨테이너 환경에서의 CI/CD
- 관련 프로젝트 내용은 개인 프로젝트에서 많이 쓰는 CI/CD 구축 방법 참고.
▸ Docker 기반으로 프로젝트 수정
1. dockerfile 작성
FROM eclipse-temurin:17-jdk-alpine AS builder
WORKDIR /usr/src/app
COPY . .
RUN chmod +x gradlew && ./gradlew clean build
FROM eclipse-temurin:17-jdk-alpine AS published
WORKDIR /app
COPY /usr/src/app/build/libs/*SNAPSHOT.jar ./app.jar
EXPOSE 80
ENTRYPOINT ["java", "-jar", "./app.jar"]
▸ EC2가 ECR에 접근할 수 있도록 설정
1. Amazon ECR Docker Credential Helper 설치
https://github.com/awslabs/amazon-ecr-credential-helper?tab=readme-ov-file
2. Configuration 설정
~
경로에서 .docker
라는 폴더를 만들고 config.json
파일을 만들어서 아래와 같이 작성
{
"credsStore": "ecr-login"
}
▸ Github Actions 작성하기
.github/workflows/deploy.yaml
name: Deploy To EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: "1. Github Repo Checkout"
uses: actions/checkout@v4
- name: "2. JDK 17버전 설치"
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: "3. application.yml 파일 만들기"
run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.yml
- name: "4. 테스트 및 빌드하기"
run: ./gradlew clean build
- name: "5. AWS Resource에 접근할 수 있게 AWS credentials 설정"
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ap-northeast-2
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: "6. ECR에 로그인하기"
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: "7. Docker 이미지 생성"
run: docker build -t yshrim12/spring-sample .
- name: "8. Docker 이미지에 Tag 붙이기"
run: docker tag yshrim12/spring-sample ${{ steps.login-ecr.outputs.registry }}/${{ secrets.ECR_REPOSITORY }}:latest
- name: "9. ECR에 Docker 이미지 Push하기"
run: docker push ${{ steps.login-ecr.outputs.registry }}/${{ secrets.ECR_REPOSITORY }}:latest
- name: "10. SSH로 EC2에 접속하기"
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script_stop: true
script: |
docker rm -f spring-sample || true
docker pull ${{ steps.login-ecr.outputs.registry }}/${{ secrets.ECR_REPOSITORY }}:latest
docker run -d -it --name spring-sample -p 8080:8080 ${{ steps.login-ecr.outputs.registry }}/${{ secrets.ECR_REPOSITORY }}:latest
▶ 테스트
- 작동 결과 확인하기