-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Infra/#11] 무중단 배포 자동화 환경 구축 (Docker) #21
Conversation
도커 이미지 Push와 Deploy 파일 세팅 단계를 분리했습니다.
본래 Script는 Github Actions CD 스크립트 실행 시점에 생성되고 S3를 통해 관리되는 자원이지만 작업자들이 프로젝트 작업 과정에서 용이하게 확인하며 관리할 수 있도록 버전관리는 되지 않도록 제외했습니다.
- Deploy 시 사용되는 Health Check API 제공 - Prometheus 모니터링 지표 Collector 출처로 사용
|
appspec.yml
Outdated
version: 0.0 | ||
os: linux | ||
|
||
files: | ||
- source: / | ||
destination: /home/ubuntu | ||
file_exists_behavior: OVERWRITE | ||
|
||
permissions: | ||
- object: /home/ubuntu | ||
pattern: '**' | ||
owner: ubuntu | ||
group: ubuntu | ||
|
||
hooks: | ||
AfterInstall: | ||
- location: script/auth/deploy.sh | ||
timeout: 120 | ||
runas: root | ||
- location: script/auth/switch.sh | ||
timeout: 120 | ||
runas: root | ||
ValidateService: | ||
- location: script/auth/valid.sh | ||
timeout: 60 | ||
runas: root |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 파일은 무엇을 위한 파일인가요..?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Deploy를 사용하려면 작성해주어야 하는 파일입니다!
자세한 내용은 공식문서를!
- pem 키등 외부 S3에 관리되고 있는 자원이 필요하여 테스트 실행 없이 빌드되도록 변경했습니다. - 추후 Test 환경 변수 주입으로 별도 테스트 통과 STEP 생성을 고려해도 좋을 것 같습니다.
- docker 실행에 필요한 자원들을 추가합니다. - Github Secret으로 관리되는 자원에 대해 올바르게 주입되었는지 확인하기 위해서도 사용된 리소스를 /home/ubuntu 내에 저장될 수 있도록 합니다.
- 불필요한 properties 선언을 줄이고 env 파일 분리를 통해 환경변수 관리를 용이하게 하고자 했습니다.
…le.kts` 반영 - 기본 profile로 test가 주입되도록 설정했습니다. - Docker Build 및 Run 시, 복수의 jar 파일 추적으로 인해 인식이 안되는 문제를 해결하기 위해 bootJar 시 생성되는 jar 파일의 이름을 직접 지정했습니다.
- docker 실행 시, env 파일 주입 방식 반영 - build profile 동적 주입 방식 반영 - 필요한 resource S3 copy 방식 반영
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
어렵고 힘들었던 배포네요 수고 정말 많으셨습니다!
Related Issue 🚀
Work Description ✏️
🚨 (주의) Operation 프로젝트까지 반영한 후, 진행해야 합니다. - (완료 ✅)
🚨 (주의) �클라이언트와 논의하여 기존 방식으로 구동 중인 어플리케이션들을 종료하고 진행하기 때문에 잠깐의 셧다운이 필요합니다. - (완료 ✅)
PR Point 📸
※ 환경 변수 주입 방식
기존 각 profile 별
application-{profile}.yml
선언 및 import 하는 파일들마다 profile에 맞춰 주입되는 환경변수들을 단일.properties
파일에 선언해야 하는 구조였습니다.< as-is >
PROD_A_VALUE
&DEV_A_VALUE
중복 선언)< to-be >
.env
파일 내부에SPRING_PROFILES_ACTIVE
선언을 통해 적용).env
파일들로 분리 가능(여러분들이 개발하면서 직접 프로젝트 폴더 내에 자유롭게 생성하고 활용할 수 있도록
.gitignore
에**/src/main/resources/**/*.env
를 추가했습니다. 패키지 만드셔서 env 파일 생성하시구 실행 Configuration에서 env 주입하시는 방식으로 실행시키시면 됩니다!)※ Build 방식
< as-is >
< to-be >
build.gradle.kts
)application-test.yml
및 각 import yml 내 test profile 시 사용될 임시 값은 static 하게 정의되어 있어 CI 과정에서 별도.env
/.properties
파일 주입이 불필요하게 됩니다.Dockerfile
내ARG
활용--build-arg
명령이 없을 경우, 기본값으로 "test"로 돌아가도록 구축했습니다. (참고 :Dockerfile
)※ Run 방식
※ Deploy 방식
CodeDeploy에서 실행하는 배포 단계는 아래와 같습니다. ("무중단 배포 :: Blue-Green")
deploy
scriptswitch
scriptlogging
script※ 파일 관리 방식
Nginx 관련 파일 관리
단일 서버 내에서 2개의 어플리케이션을 운영하기 때문에 특정 레포지토리에서 관리하는 구조를 피했습니다.
번거로울순 있지만 "변경이 빈번하지 않다는 점" & "공통 관심사라는 점"을 근거로 해당 관련 파일들(
*.conf
)들은 EC2 내부에서 직접 관리할 수 있도록 했습니다.(이에 대한 내용들은 노션을 통해 공유할 수 있도록 합니다)
실 리소스 파일 관리
Github Secrets 으로만 관리할 경우, 적용된 값이 올바른 값인지 확인하기 어렵다는 단점이 있습니다.
이에 확인이 필요하거나 직접 관리가 필요한 파일들에 대해서
S3
에 저장하여 CD 과정에서 Copy하여 사용될 수 있도록 했습니다.(리소스 파일의 변경이 필요하거나 파일 내용 확인이 필요할 때, S3에서 확인 및 교체가 가능합니다.)
🚨 단, s3에서 관리하는 만큼 Bucket 이름 & Key (경로 및 파일 명)가 노출되지 않도록 해당 값들에 대해서는 Github Secrets에서 관리할 수 있도록 합니다.