Backend & 인프라

[Git Actions] SSH으로 배포하기

UnoCoding 2022. 7. 4. 07:58
SSH 비밀번호 아이디 접속을 통해 배포 하는 방법에 대해 다루겠습니다

✅ 공식문서 🔎

😇 항상 공식 문서가 중요한 법 입니다.!!
👉 공식 홈페이지, 공식 문서

 

GitHub Actions Documentation - GitHub Docs

Automate, customize, and execute your software development workflows right in your repository with GitHub Actions. You can discover, create, and share actions to perform any job you'd like, including CI/CD, and combine actions in a completely customized wo

docs.github.com

 

  • 🌻 특정 소프트웨어 workflow를 자동화할 수 있도록 도와주는 도구로써 사용을 보통 합니다.
    이와 비슷한 자동화 도구는 저가 생각 하기에는 🌻 Jenkins를 이와 같이 쓸 수 있다고 생각합니다.
  • ☕ Workflow의 대표적인 예시
    • 1) Test Code
      • ex) 내가 작성한 Test Code가 통과 하는가?
      • ex) 서버가 스트레스트 테스트를 통과 하는가?
    • 2) 배포
      • 서버에 새로운 기능, 버전 등을 배포
    • 3) 기타 자동화하고 싶은 스크립트
      • 크롤링을 이용한 데이터 수집 및 cron을 이용한 배포

✅ Github Action Core 개념 🔎 

글 참조( https://zzsza.github.io/development/2020/06/06/github-action/ )

 

  • Github Action을 이해하기 위해서 알아야 하는 개념은 Workflow, Event, Job, Step, Action, Runner 등이 있음
  • 1) Workflow
    • 여러 Job으로 구성되고, Event에 의해 트리거될 수 있는 자동화된 프로세스
    • 최상위 개념
    • Workflow 파일은 YAML으로 작성되고, Github Repository의 .github/workflows 폴더 아래에 저장됨
  • 2) Event
    • Workflow를 Trigger(실행)하는 특정 활동이나 규칙
    • 예를 들어 다음과 같은 상황을 사용할 수 있음
      • 특정 브랜치로 Push, Pull Request 할 경우
      • 특정 시간대에 반복(Cron)
      • Webhook을 사용해 외부 이벤트를 통해 실행
    • 자세한 내용은 Events that trigger workflows 참고
  • 3) Job
    • Job은 여러 Step으로 구성되고, 가상 환경의 인스턴스에서 실행됨
    • 다른 Job에 의존 관계를 가질 수 있고, 독립적으로 병렬 실행도 가능함
  • 4) Step
    • Task들의 집합으로, 커맨드를 날리거나 action을 실행할 수 있음
    •  

이외에도 여러 개념이 있습니다. 하지만 저는 지금 해당 글에서 사용하는 개념만 가져 오도록 하며 더욱 깊이 내용을 알고 싶으신 분은 위 공식 문서를 참조 하면 되겠습니다.

⚡ 실습 1(Workflow 작성)

1. Docker build
2. Docker push
3. Docker rm, rmi
4. Docker run

name: deploy-every-fastapi
on:
  push:
    branches: master

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy FastApi MainServer(master)
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USERNAME }}
          password: ${{ secrets.SERVER_PASSWORD }}
          port: ${{ secrets.SERVER_PORT }}
          script: |
            cd ~/Fastapi-cpu-bound 
            git pull
            docker build -t ehghksvjscl/fastapi-cpu-bound .
            docker push ehghksvjscl/fastapi-cpu-bound
            docker rm fastapi-test --force
            docker rmi ehghksvjscl/fastapi-cpu-bound:latest
            nohup docker run -p 8888:8888 --name fastapi-test  ehghksvjscl/fastapi-cpu-bound > nohup.out 2>&1 &
  • on = Event
    • 어떤 조건에 Workflow를 Trigger 시킬지 명시 할 수 있습니다.
    • push할 경우 Workflow를 실행
  on:
    push:
      branches: [ master ]
  • jobs 
    • Workflow는 다양한 Job으로 구성됩니다.
    • 여러 Job이 있을 경우, Default로 병렬 실행 하며
    • runs-on은 어떤 OS에서 실행될지 지정 해 줍니다.
    • steps의 uses는 어떤 액션을 사용할지 지정함. 이미 만들어진 액션을 사용합니다. 누눈가가 appleboy/ssh-action@master 라는 액션을 만들어 놓은 거져
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy FastApi MainServer(master)
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USERNAME }}
          password: ${{ secrets.SERVER_PASSWORD }}
          port: ${{ secrets.SERVER_PORT }}
          script: |
            cd ~/Fastapi-cpu-bound 
            git pull
            docker build -t ehghksvjscl/fastapi-cpu-bound .
            docker push ehghksvjscl/fastapi-cpu-bound
            docker rm fastapi-test --force
            docker rmi ehghksvjscl/fastapi-cpu-bound:latest
            nohup docker run -p 8888:8888 --name fastapi-test  ehghksvjscl/fastapi-cpu-bound > nohup.out 2>&1 &
  • jobs의 이름은 deploy입니다.
  • docker images는 저의 개인 계정의 Public으로 올려 놓은 fastapi-cpu-bound를 사용합니다.
    https://unocoings.tistory.com/16를 참조 하시면 만드는 방법이 있습니다.
  • nohup 명령어는 리눅스에서 프로세스를 실행한 터미널의 세션 연결이 끊어지더라도 지속적으로 동작 할 수 있게 해주는 명령어입니다.

 

 

⚡ 실습 2(Secret Key 저장하기) 

  • Secret Key 등록하기

    • Repository의 Settings - 왼쪽에 Secrets 클릭
    • New secret 클릭하고 Name과 Value 입력하기
    • Repository access 쪽으로 가면, access policy를 정할 수 있음
    • workflow에서 사용할 땐 $ 으로 사용하고, python에선 os.getenv(변수 이름)으로 사용

✅ 확인 해 보기

확인 하기 위한 절차

 

1. 확인

😀😀 배포 성공!!!