2025. 11. 5. 18:18ㆍCI\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 구성 완료이다.
하면서 느끼는건 내가 한번 처음부터 끝까지 구성하는 과정이 필수적으로 여러번 진행되어야 할것만 같다는 느낌이다.
이제 방법과 흐름은 알겠는데 결국 그 키워드와 사용 방법의 싸움인듯 싶다.
그걸 암기해서 사용하느냐, 매번 사용할때 마다 찾아가면서 할거냐..
'CI\CD > CI\CD 종합' 카테고리의 다른 글
| Github Actions(CI/CD 구축) - 확장성을 신경 쓴 프로젝트에서 많이 쓰는 CI/CD: CodeDeploy 및 사전준비 (0) | 2025.10.23 |
|---|---|
| Github Actions(CI/CD 구축) - 일반 프로젝트에서 많이 쓰는 CI/CD (0) | 2025.10.15 |
| Github Actions(CI/CD 구축) - .gitignore에 추가된 파일의 주입 (0) | 2025.10.11 |
| CI/CD (0) | 2025.10.03 |
| CI/CD - EC2에 서버 배포 (0) | 2025.10.03 |