🚩1. 들어가며...
개인 프로젝트를 진행하면서 처음으로 GitHub Actions와 AWS를 활용하여 지속적 통합/배포를 위한 CI/CD Pipeline을 구축했다. 그러던 와중 어떤 순서로 빌드 및 테스트와 배포까지 진행되는지 궁금해져 동작 과정을 하나 하나 정리하려는 목적으로 포스팅한다.
🚩2. CI/CD Pipeline 동작 과정


📌 2-1. 동작 과정 살펴보기 (괄호 안은 동작 장소)
📍 1. 코드 푸시 (로컬 개발 환경 → GitHub)
- 개발자가 main 브랜치에 코드를 push한다.
- 이 과정은 로컬 개발 환경에서 수행되며, 변경사항이 GitHub의 원격 저장소로 전송한다.
📍 2. GitHub Actions 워크플로우 활성화 (GitHub)
- main 브랜치에 코드가 푸시되면, GitHub Actions 워크플로우가 자동으로 활성화된다.
- 이 과정은 GitHub 서버에서 실행된다.
📍 3. 환경 설정 (GitHub Actions Runner)
- JDK 설치 및 환경 설정 파일 생성 과정이 GitHub Actions Runner에서 실행된다.
- 필요한 환경 설정 파일(application.yml, application-dev.yml, application-auth.yml)을 생성한다.
📍 4. 빌드 프로세스 (GitHub Actions Runner)
- Gradle을 사용하여 애플리케이션을 빌드한다.
- 실행 가능한 JAR 파일이 생성된다.
📍 5. 아티팩트 생성 (GitHub Actions Runner)
- 빌드된 애플리케이션(예: JAR 파일)과 다른 필요한 파일들을 ZIP 파일로 압축한다.
📍 6. AWS 자격 증명 구성 (GitHub Actions Runner)
- AWS 서비스에 접근하기 위한 자격 증명을 구성한다.
📍 7. S3에 아티팩트 업로드 (GitHub Actions Runner → AWS S3)
- ZIP 파일을 S3 버킷에 업로드한다.
- 이 과정은 AWS CLI 또는 AWS SDK를 사용해 GitHub Actions Runner에서 수행한다.
📍 8. AWS CodeDeploy를 통한 배포 시작 (GitHub Actions Runner →AWS CodeDeploy)
- AWS CodeDeploy에 배포 요청을 보낸다.
- CodeDeploy 배포 생성:
- aws deploy create-deployment 명령어는 AWS CLI를 사용하여 CodeDeploy에 새로운 배포를 생성하라는 요청을 보낸다.
- 배포 구성:
- --application-name $CODE_DEPLOY_APP_NAME: 배포할 CodeDeploy 애플리케이션의 이름을 지정한다.
- --deployment-config-name CodeDeployDefault.AllAtOnce: 배포 구성을 지정한다. 여기서는 AllAtOnce 전략이 사용되어 모든 대상에게 동시에 배포된다.
- --deployment-group-name $DEPLOYMENT_GROUP_NAME: 배포 그룹의 이름을 지정한다. 배포 그룹은 배포 대상인 EC2 인스턴스들의 집합을 정의한다.
- --s3-location bucket=$BUCKET_NAME,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip: 배포할 아티팩트의 S3 버킷 위치를 지정한다. 이는 배포할 파일이 저장된 S3 버킷의 이름, 파일 유형, 그리고 파일 키(경로)를 포함한다.
- CodeDeploy 배포 생성:
- CodeDeploy는 S S3 버킷에서 ZIP 파일을 EC2 인스턴스로 다운로드하고 배포를 준비한다.
- 다운로드 단계: CodeDeploy가 배포 프로세스를 시작할 때, S3 버킷에서 아티팩트(예: 압축된 파일)를 EC2 인스턴스로 다운로드한다. 이 단계에서 아티팩트는 EC2 인스턴스의 일시적인 위치(임시 디렉토리)에 저장된다.
📍 9. appspec.yml에 따른 배포 실행 (AWS EC2 인스턴스)
- CodeDeploy가 appspec.yml 파일을 참조하여 배포 과정을 진행한다.
- 다운로드된 파일들을 EC2 인스턴스의 지정된 위치로 복사한다.
- 복사 단계: appspec.yml 파일에 정의된 files 섹션에 따라, CodeDeploy는 이 다운로드된 파일들을 EC2 인스턴스 내의 최종 목적지(예: /home/ubuntu/anniehands)로 복사한다. 여기서 "복사"는 다운로드된 파일들을 임시 위치에서 애플리케이션의 작업 디렉토리 같은 최종 위치로 이동시키는 과정을 말한다. ⬅️ 여기서 많이 헷갈렸다...
- deploy.sh 스크립트의 지정된 배포 후크(deploy.sh)를 실행한다.
📍 10. 애플리케이션 실행 (AWS EC2 인스턴스)
- deploy.sh 스크립트는 EC2 인스턴스에서 실행되며, deploy.sh 스크립트에서 이전 버전의 애플리케이션을 종료하고, 새로운 버전의 애플리케이션(JAR 파일)을 실행한다.
- 모든 배포 과정이 완료되면, 새로운 버전의 애플리케이션이 EC2 인스턴스에서 실행되며, 사용자는 업데이트된 서비스를 이용할 수 있다. 🌟
🚩3. 마치며...
처음 도전해보는 CI/CD인 만큼 헷갈리는 부분이 많아 정리해보니 어떤 과정을 거쳐 배포가 되는지 이제 머릿속에 그려지기 시작했다. 이제 내가 개발하고 있는 애플리케이션을 남들도 볼 수 있다는 게 기분이 묘하고
신난다. 그리고 이 과정에서 AWS를 굉장히 많이 사용했는데 다음에는 사용한 AWS들을 하나 하나 정리해봐야 겠다.