Coding History

AWS 자동 배포

BlackBirdIT 2024. 11. 14. 16:32

자동화는 깃 push 하면 깃에서 도커 이미지를 빌드하고, 도커 이미지를 서버컴퓨터에 pull한다.

이후 서버 컴퓨터에 해당 이미지가 서비스가 가능한지 아닌지 판단이후 가능하다가면 해당 이미지로 적용후 예전 이미지는 지운다. 이게 자동 배포의 방법. (port는 예를 들자면 구형 8082, 신형 8083으로 번갈아가면서 사용되게함.) 그니까 신형이 나중에 구형이 된다면 새로들어온 놈은 8082에 들어가게 됨.

그니까 이게 자동으로 되게 해야됨.


자동화를 위해서 socatpython 설치

yum install socat -y
yum install python -y

그리고 기존 이미지 삭제

git action으로 동작하기 때문에
프로젝트 루트 디렉토리에 github/workflows/deploy.yml

name: 'deploy'
on:
  push:
    paths:
      - '.github/workflows/**'
      - 'src/**'
      - 'build.gradle'
      - 'Dockerfile'
      - 'readme.md'
      - 'infraScript/**'
    branches:
      - 'main'
jobs:
  makeTagAndRelease:
    runs-on: ubuntu-latest
    outputs:
      tag_name: ${{ steps.create_tag.outputs.new_tag }}
    steps:
      - uses: actions/checkout@v4
      - name: Create Tag
        id: create_tag
        uses: mathieudutour/github-tag-action@v6.1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
      - name: Create Release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ steps.create_tag.outputs.new_tag }}
          release_name: Release ${{ steps.create_tag.outputs.new_tag }}
          body: ${{ steps.create_tag.outputs.changelog }}
          draft: false
          prerelease: false
  buildImageAndPush:
    name: 도커 이미지 빌드와 푸시
    needs: makeTagAndRelease
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Docker Buildx 설치
        uses: docker/setup-buildx-action@v2
      - name: 레지스트리 로그인
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: set lower case owner name
        run: |
          echo "OWNER_LC=${OWNER,,}" >> ${GITHUB_ENV}
        env:
          OWNER: "${{ github.repository_owner }}"
      - name: application-secret.yml 생성
        env:
          ACTIONS_STEP_DEBUG: true
          APPLICATION_SECRET: ${{ secrets.APPLICATION_SECRET_YML }}
        run: echo "$APPLICATION_SECRET" > src/main/resources/application-secret.yml
      - name: 빌드 앤 푸시
        uses: docker/build-push-action@v3
        with:
          context: .
          push: true
          tags: |
            ghcr.io/${{ env.OWNER_LC }}/${도커이미지명}:${{ needs.makeTagAndRelease.outputs.tag_name }},
            ghcr.io/${{ env.OWNER_LC }}/${도커이미지명}:latest
  deploy:
    runs-on: ubuntu-latest
    needs: [ buildImageAndPush ]
    steps:
      - name: AWS SSM Send-Command
        uses: peterkimzz/aws-ssm-send-command@master
        id: ssm
        with:
          aws-region: ${{ secrets.AWS_REGION }}
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          instance-ids: "${AWS-EC2-인스턴스-ID}"
          working-directory: /
          comment: Deploy
          command: |
            mkdir -p /dockerProjects/${도커이미지명}
            curl -o /dockerProjects/${도커이미지명}/zero_downtime_deploy.py https://raw.githubusercontent.com/${깃허브-아이디}/${깃허브-리포지터리명}/main/infraScript/zero_downtime_deploy.py
            chmod +x /dockerProjects/${도커이미지명}/zero_downtime_deploy.py
            /dockerProjects/${도커이미지명}/zero_downtime_deploy.py

기본 틀이고

여기서 다 쓰면 된다.

그래서 난 이렇게 다 입력해서 저장함.

이제 push 하면 action으로 저 친구를 읽고 실행하고 이미지 빌드하겠지.

여튼 그렇게 하고,

루트 디렉토리에서 파이썬 코드도 추가함.

그리고 시도해봤는데,

도커 이미지 빌드에서 문제가 생김. 의존성 주입을 세개정도 했었는데 거기서 문제가 생긴 것 같기도 하고..

의존성 수정 후에 다시 시도했는데

됐음.

여기 릴리즈랑 패키지 생김.

이걸로 버전관리를 한다고 함!

그리고 서버 컴퓨터와 만든 도메인으로 접속해서 확인해보면 된다..