2023.08.07 - [웹개발] - [docker] fastapi + nginx 블루 그린 배포(무중단배포)[1]

이전편에 이어서 github actions에서 workflow 코드를 공유하겠다.

이전 nginx 설정편을 보고 싶다면 위의 링크를 참고 부탁드린다.

 

github actions workflow를 위한 파일(.yml)

github 화면

위의 github 화면에서 New workflow를 누르면 여러 Template이 나오는데 docker image를 선택했다.

이후 아래처럼 코드를 변경했다.

name: Docker Image CI

on:
  push:
    branches: [ "main" ]

jobs:
  build: 
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v3
    
    # Docker 이미지 Build (1)        
    - name: docker image build
      run:
        docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }} .
    
    # DockerHub Login (2)
    - name: docker login 
      uses: docker/login-action@v2
      with: 
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_TOKEN }}

    # Docker Hub push (3)
    - name: docker Hub push
      run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }}
    
  # 배포
  deploy:
    needs: build # build 후에 실행되도록 정의
    name: Deploy
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Deliver File
        uses: appleboy/scp-action@v0.1.4
        with:
          host: ${{ secrets.EC2_REMOTE_IP }}
          username: ${{ secrets.USER }}
          key: ${{ secrets.EC2_SSH_KEY }}
          port: 22
          source: "bluegreen/deploy_blue_green.sh,bluegreen/docker-compose.yml"
          target: "/home/ec2-user/"
      # ec2 접속
      - name: Application Run
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.EC2_REMOTE_IP }}
          username: ${{ secrets.USER }}
          key: ${{ secrets.EC2_SSH_KEY }}
          port: 22
          script: |
            cd /home/ec2-user/bluegreen
            docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_PASSWORD }}
            docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPONAME }}
            chmod 777 ./deploy_blue_green.sh
            chmod 777 ./docker-compose.yml
            ./deploy_blue_green.sh
            docker image prune -f
            docker system prune --volumes -f

정말 위 코드를 삽질의 삽질을 거듭하며 만들었다. 정말 너무 힘들었다....

한 단계 한 단계 설명을 붙이도록 하겠다.

 

github에 코드에 push가 발생하면 아래와 같이 동작한다.

빌드단계

1) docker build를 수행한다.

2) docker hub에 로그인한다.(private저장소라서 로그인을 수행해야 한다. private으로 만들지 않았다면 괜찮다.)

3) docker hub 에 private repository에 push한다.

배포단계

4) 빌드단계가 끝나고(needs: build 코드를 위에서 확인할 수 있다) 배포단계를 수행한다.
    ec2에 scp로 deploy_blue_green.sh, docker-compose.yml파일을 /home/ec2-user/bluegreen 경로에 전송한다.

5)ssh로 ec2에 접속한 후 빌드시 수행했던 방식으로 docker hub에 로그인한다.

6)docker pull을 통해서 빌드시 docker hub에 올려놨던 image를 받는다.

7)미리 전송해놓았던 deploy_blue_green.sh을 실행한다.

8)쓸모없는 용량을 없애기위해 image와 캐시들을 삭제한다.

 

위에서 ${{secrets.블라블라}} 는 보안을 위해 github에서 설정하는 부분이니 구글링에 수많은 자료가 검색되니 참고 부탁드린다.

 

다음시간에는 deploy_blue_green.sh, docker-compose.yml 설정을 다뤄보도록 하겠다.

반응형

+ Recent posts