Profile picture

[Github Actions] 컨테이너 환경의 프로젝트에서 많이 쓰이는 CI/CD 구축 방법

JaehyoJJAng2023년 06월 03일

▶ 개요

이번 포스팅에서는 컨테이너 환경의 프로젝트에서 많이 쓰이는 CI/CD 구축에 대해 학습해보겠다.

예정되어 있는 포스팅은 다음과 같다.

위 3단계로 거쳐 각각 상황에 맞는 CI/CD 구축 방법에 대해서 이해해보자.


▶ 전체적인 흐름

image


▸ 장점

  • Docker 기반으로 배포된 서비스에서 가장 간단하게 구성할 수 있는 인프라 구조.

▸ 단점

  • 무중단 배포를 구현하거나 여러 EC2 인스턴스에 배포를 해야 하는 상황이라면, 직접 Github Actions에 스크립트를 작성하여 구현해야 함.

▸ 이 방법이 쓰이는 이유

  • 컨테이너 기반으로 인프라를 구성했을 때 이 방법을 사용.
  • 서버를 여러 대 운영할 필요 없는 소규모 프로젝트일 때 주로 사용.

▶ 사전준비


▶ ECR 설정

도커 이미지 레지스트리 저장소로 ECR을 채택하였음으로, ECR에 대한 초기 설정이 필요하다

아래 과정을 따라하여 ECR을 설정해보자.


▸ IAM 생성 및 역할 생성

1. 아래와 같은 IAM 생성
image


1-2 생성한 IAM 유저에 액세스 키 생성
image


2. AmazonEC2ContainerRegistryFullAccess 권한 추가
image


3. ECR 만들기
image


4. IAM 역할 생성
AmazonEC2ContainerRegistryFullAccess 정책 추가
image


5. 생성한 역할을 EC2에 연결
image


▶ 컨테이너 환경에서의 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 --from=builder /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

▶ 테스트

  • 작동 결과 확인하기

image


Loading script...