Github Actions(CI/CD 구축) - 확장성을 고려한 컨테이너 기반의 프로젝트에서 많이 쓰는 CI/CD 구축법(Docker+CodeDeploy)

2025. 11. 5. 18:18CI\CD/CI\CD 종합

반응형

이번에는 기존의 GitHub Actions - ECR - EC2를 사용하던 CI/CD에서 CodeDeploy와 S3를 붙여보려고 한다.

이때 CodeDeploy를 쓰는 경우 EC2로 하여금 ECR에서 작업하기 위해 사용자가 작성하던 내용을 실행 하도록 지시할 수 있으며 이를 위해서는 S3에 이를 위한 스크립트 파일등을 저장해두고 EC2가 내려받아 실행하게끔 해야하기에 S3가 같이 사용되게 된다.

 

기존의 workflow를 보면

name: Spring workflow
on:
  push:
    branches:
      - master

jobs:
  Deploy:
    runs-on: ubuntu-latest
    steps:
      # github에서 소스를 runner로 checkout
      - name: Checkout sources from Github
        uses: actions/checkout@v4

      # 빌드를 위해서 jdk 17 설치(setup-java)
      - name: Install JDK17 for Build Sources
        uses: actions/setup-java@v4
        with:
          distribution: 'zulu'
          java-version: 17

      # 빌드에 포함시킬 서버의 비밀 설정이 들어 있는 application.properties 생성
      - name: Create application.properties for builded source settings
        run: echo '${{secrets.APPLICATION_PROPERTIES}}' > ./src/main/resources/application.properties

      # 그레들을 이용한 테스트 및 빌드
      - name: Test and Build
        run : |
          chmod +x ./gradlew 
          ./gradlew clean build

      # AWS리소스에 접근하기 위한 AWS credential 사용
      - name: Use AWS credentials for approach AWS Resources
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: ap-northeast-2
          aws-access-key-id: ${{secrets.AWS_ACCESS_KEY}}
          aws-secret-access-key: ${{secrets.AWS_SECRET_ACCESS_KEY}}

      # ECR에 로그인
      - name: Login ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v2

      # Docker image 생성
      - name: Create Docker Image
        run: docker build -t cicd_repo .

      # Image Tag 붙이기
      - name: Attach Image Tag
        run: docker tag cicd_repo ${{steps.login-ecr.outputs.registry}}/cicd_repo:latest

      # ECR로 docker image push 하기
      - name: Push image to ECR
        run: docker push ${{steps.login-ecr.outputs.registry}}/cicd_repo:latest

여기까지는 그냥 동일하게 간다.

이제 SSH로 접속하지 않을 것이다.

 

먼저 S3에 올릴 내용들을 압축하고

 

S3에 프로젝트 폴더를 업로드 하자.

이건 region인 ap-northeast-2에 있는 s3에 로컬의 ./$GITHUB_SHA.tar.gz을 s3의 spring-boot-server-bucket이라는 버켓의 /$GITHUB_SHAR.tar.gz로 복사하겠다라는 의미로 사용된다.

 

그리고 CodeDeploy로 하여금 EC2 프로젝트에게 코드를 배포하라고 시킨다

CodeDeploy의 정보를 제공하고, 어떻게 배포할지를 설정하고 s3에 어떤걸 어떤 타입으로 어디서 가져올지를 지정해준다

해당 코드가 실행되면 EC2의 CodeDeploy Agent는 S3에서 파일을 내려 받기를 시작하고 appspec.yml을 확인해서 hooks 스크립트를 실행한다.

아래 원래 우리가 갖고 있던 appspec.yml을 보면

추가적으로 바꿀 부분은 없어보인다.

 

start-server.sh는 우리가 기존에 SSH를 통해서 docker로 서버를 종료, 서버 실행 했던 로직으로 갈음해줘야하기에 열어서 수정해주자.(레지스트리 주소는 그냥 하드 코딩하란)

이렇게 하고 commit & push 해보자

 

이렇게 하면 CI/CD 구성 완료이다.

 

하면서 느끼는건 내가 한번 처음부터 끝까지 구성하는 과정이 필수적으로 여러번 진행되어야 할것만 같다는 느낌이다.

이제 방법과 흐름은 알겠는데 결국 그 키워드와 사용 방법의 싸움인듯 싶다.

그걸 암기해서 사용하느냐, 매번 사용할때 마다 찾아가면서 할거냐..

 

반응형