사용하는 개발 및 배포 전략!

텐엑스·2023년 10월 4일
0


일반적으로 개발을 시작할 때 여러 명의 작업자가 같이 작업을 진행하는 경우가 많습니다. 그럴 경우 작업이 겹치지 않도록 각자의 로컬에서 개발하고 확인 후 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)를 사용해서 관리를 진행합니다.


위 과정들을 요약해 보면 이렇게 정리할 수 있습니다.

  1. 로컬에서 개발

  2. develop 브랜치에 push

  3. github actions에서 이미지 빌드

  4. docker hub, harbor에 이미지 push

  5. 개발 서버에 떠있는 watchtower에서 업데이트된 이미지 감지 및 배포

  6. 개발 서버 확인

  7. develop 브랜치에서 main 브랜치로 merge

  8. github actions에서 이미지 빌드

  9. 빌드 된 이미지 ECR에 push

  10. 무중단 배포를 위한 ECS 서비스 업데이트

    1. ECS 클러스터 생성 시 CODE_DEPLOY로 설정
    2. aws codedeploy를 사용하여 블루/그린 배포를 설정
    3. 서비스 업데이트를 시작할 때 새 태스크 정의를 사용하여 서비스를 업데이트함
    4. codedeploy는 기존 태스크를 종료하기 전에 새 태스크를 시작하여 무중단 배포를 보장
  11. 로드밸런서(ALB) 사용

이렇게 현재 사용하고있는 개발 및 배포 전략을 알아봤습니다.

profile
엔아이 마케팅 개발팀입니다

0개의 댓글

관련 채용 정보