일반적으로 개발을 시작할 때 여러 명의 작업자가 같이 작업을 진행하는 경우가 많습니다. 그럴 경우 작업이 겹치지 않도록 각자의 로컬에서 개발하고 확인 후 Github를 이용해서 작업을 하게 됩니다. 그 순서를 알아보도록 하자!
우선 개발을 하려면, 각자 개발자 PC에 개발 및 테스트 환경이 셋업 되어 있어야 합니다. 각 개발자마다, 설치된 서버 환경을 local 환경이라고 하고 이 local 환경을 구축할 시에 가장 주의해야 할 점은 모든 개발자가 같은 개발 환경을 사용해야 한다는 것입니다. 실제로 많이 일어나는 문제인데, 다른 version은 JVM를 사용하거나, 다른 버전의 Tomcat을 사용하거나 Lang (문자 local 설정)을 서로 다르게 해서, 정작 코드를 합칠 때, local에서 잘 작동했던 코드가 작동하지 않는 경우가 많습니다.
로컬 개발 환경을 맞추었다면 Github develop 브랜치에 push를 해서 확인을 하고 Github actions에서 이미지 빌드 후 docker hub, habor에 이미지를 push를 합니다. 현재는 public으로 docker hub를 사용하고 있지만 추후에 habor로 변경할 계획입니다.
개발 서버에 push 되어있는 watchtower에서 업데이트된 이미지 감지 및 배포하고 개발 서버에서 확인을 진행 후 develop 브랜치에서 main 브랜치로 merge 후 Github action에서 이미지를 빌드하고 빌드 된 이미지를 ECR에 push 하게 됩니다.
name: Deploy hyeon9mak assignment
on:
push:
branches:
- master
jobs:
deploy:
runs-on: ubuntu-latest
env:
AWS_REGION: ap-northeast-2
ECS_CLUSTER_NAME: backend
ECR_REPOSITORY_NAME: hyeon9mak-dev
ECS_CONTAINER_NAME: hyeon9mak-container
ECS_SERVICE_NAME: hyeon9mak-service-dev
TASK_DEFINITION_NAME: hyeon9mak-task-dev
# Github actions 자동배포 과정에서 사용할 환경변수들
# AWS ECS 콘솔에서 이름이 모두 일치하는지 확인이 필요하다.
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Configure AWS credentials For Devzone
uses: aws-actions/configure-aws-credentials@v1
with:
# Github Repository Secrets에 값 등록 필요!
aws-access-key-id: $
aws-secret-access-key: $
aws-region: $
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Install JDK 11
uses: actions/setup-java@v2
with:
distribution: 'temurin'
java-version: 11
cache: 'gradle' # https://github.com/actions/setup-java#caching-packages-dependencies
- name: build gradle
run: ./gradlew clean build
- name: Download dd-java-agent
run: wget -O assignment-api/dd-java-agent.jar https://dtdg.co/latest-java-tracer
# wget 명령의 -O 옵션을 통해 파일의
# 경로 및 이름을 지정하여 datadog agent 다운로드
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: $
SERVICE_TAG: . # Dockerfile의 경로
IMAGE_TAG: $ # Github가 제공하는 SHA 암호화 사용
run: |
# Build a docker container and
# push it to ECR so that it can
# be deployed to ECS.
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY_NAME:$IMAGE_TAG $SERVICE_TAG
docker push $ECR_REGISTRY/$ECR_REPOSITORY_NAME:$IMAGE_TAG
echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY_NAME:$IMAGE_TAG"
- name: Download Task Definition Template
run: |
aws ecs describe-task-definition \
--task-definition $ \
--query taskDefinition \
> task-definition.json
- name: Fill in the new image ID in the Amazon ECS task definition
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: task-definition.json
container-name: $
image: $
- name: Deploy Amazon ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: $
service: $
cluster: $
wait-for-service-stability: true
AWS 액세스 키와 보안 키의 경우 yml 파일에 노출되기 민감한 정보이므로, Github Secrets를 통해서 관리를 합니다. 애플리케이션 Repository > Settings > Secrets > Actions 메뉴로 접근해서 Repository secret으로 등록합니다.
해당 키의 값들은 아래 명령을 통해서 확인할 수 있습니다.
$ ~/.aws/credentials
[default]
aws_access_key_id = {액세스 키}
aws_secret_access_key = {보안 키}
애플리케이션 Repository에 자동배포용 yml 파일이 준비되면, 이후 브랜치에 커밋내용이 푸시가 될 때마다 자동으로 ECS 수동배포 과정이 반복됩니다.
이후 로드밸런서(ALB)를 사용해서 관리를 진행합니다.
로컬에서 개발
develop 브랜치에 push
github actions에서 이미지 빌드
docker hub, harbor에 이미지 push
개발 서버에 떠있는 watchtower에서 업데이트된 이미지 감지 및 배포
개발 서버 확인
develop 브랜치에서 main 브랜치로 merge
github actions에서 이미지 빌드
빌드 된 이미지 ECR에 push
무중단 배포를 위한 ECS 서비스 업데이트
로드밸런서(ALB) 사용
이렇게 현재 사용하고있는 개발 및 배포 전략을 알아봤습니다.