Day_88 03. Github Action을 활용한 CI/CD

작성일

8 분 소요

Github Action을 활용한 CI/CD

1. CI/CD

개발 프로세스 - 개발 환경

Local

  • 각자의 컴퓨터에서 개발
  • 각자의 환경을 통일시키기 위해 Docker 등을 사용

Dev

  • Local 에서 개발한 기능을 테스트할 수 있는 환경
  • Test 서버

Staging

  • Production 환경에 배포하기 전에 운영하거나 보안, 성능 측정하는 환경
  • Staging 서버

Production

  • 실제 서비스를 운영하는 환경
  • 운영 서버

개발 환경을 나누는 이유

실제 운영중인 서비스에 장애가 발생하면 안됨

Dev = Staging = Production 인 경우

  • 소스 코드를 저장하면 바로 반영
  • PyCharm 이 SSH 로 서버에 바로 붙어있고 서비스를 운영중임, 자리비운 상황에 만약 고양이가 코드를 치고 ctrl + s 를 했다면?

이런 상황에 파이썬 문법 오류가 발생했음 $\rightarrow$ 이러면 바로 에러 발생

Git Flow

dev branch 는 Dev Server 라고 보면되고 staging branch 는 Staging Server 라고 보면 되고 main branch 는 Prod Server 라고 보면 됨

CI/CD

서버에 코드를 보내는 것과 반복적으로 진행할 Test 를 어떻게 실행하는 방법은?

Dev Branch 에 Merge 되면 $\rightarrow$ Local 에서 Git Pull & Test 실행 후 괜찮으면 코드 배포(FTP 로 파일 전송) $\rightarrow$ 번거로운 일

Continuous Integration(CI)

Continuous Integration, 지속적 통합

  • 새롭게 작성한 코드 변경 사항이 Build, Test 진행한 후 Test Case 에 통과했는지 확인
  • 지속적으로 코드 품질 관리
  • 10명의 개발자가 코드를 수정했다면 모두 CI 프로세스 진행

Continuous Deploy/Delivery(CD)

Continuous Deply/Delivery, 지속적 배포

  • 작성한 코드가 항상 신뢰 가능한 상태가 되면 자동으로 배포될 수 있도록 하는 과정
  • CI 이후 CD 를 진행
  • dev / staging / main 브랜치에 Merge 가 될 경우 코드가 자동으로 서버에 배포

CI/CD

큰 개념을 생각하면

  • CI : 빌드, 테스트 자동화
  • CD : 배포 자동화

Voila, Streamlit 실습에 적용

  • Local 에서 개발
  • Main 으로 Merge 시 Production Server 에 코드 배포

개인 프로젝트에선 서버를 많이 두지 안흔 경우도 존재 $\rightarrow$ Dev / Staging / Prod 모두 비용

CI/CD 를 활용할 수 있는 도구

많은 솔루션이 존재

2. Github Action

Github Action

Github 에서 출시한 기능으로, 소프트웨어 Workflow 자동화를 도와주는 도구

Github Action - Workflow 예시

1) Test Code

  • 특정 함수의 return 값이 어떻게 나오는지 확인하는 Test Code
  • 특정 변수의 타입이 int 가 맞는가?
  • Unit Test, End to End Test

2) 배포

  • Prod, Staging, Dev 서버에 코드 배포
  • FTP 로 파일 전송할 수도 있고, Docker Image 를 Push 하는 방법 등
  • Node.js 등 다양한 언어 배포도 지원

3) 파이썬, 쉘 스크립트 실행

  • Github Repo 에 저장된 스크립트를 일정 주기를 가지고 실행
  • crontab 의 대용
  • 데이터 수집을 주기적으로 해야할 경우 활용할 수도 있음

https://github.com/actions/setup-python

4) Github Tag, Release 자동으로 설정

  • Main 브랜치에 Merge 될 경우에 특정 작업 실행
  • 기존 버전에서 버전 Up 하기
  • 새로운 브랜치 생성시 특정 작업 실행도 가능

그 외엥도 다양한 Workflow 를 만들 수 있음

사용자가 만들어서 Workflow 템플릿을 공유하기도 함

원하는 기능이 있는 경우 <기능> github action 등으로 검색!

Action Markerplace : https://github.com/marketplace?type=actions

Awesome Github Action : https://github.com/sdras/awesome-actions

Github Action Pricing

Public Repo : 무료
Private Repo : 아래 조건을 따름

Github Action 제약 조건

  • 하나의 Github Repository 당 Workflow 는 최대 20개까지 등록할 수 있음
  • Workflow 에 존재하는 Job(실행)은 최대 6시간 실행할 수 있으며, 초과시 자동으로 중지됨
  • 동시에 실행할 수 있는 Job 제한 존재

Github Action 사용하는 방식

1) 코드 작업 2) 코드 작업 후, Github Action 으로 무엇을 할 것인지 생각 3) 사용할 Workflow 정의 4) Workflow 정의 후 정상 작동하는지 확인

Workflow 를 검색해보고 생각한 Workflow 가 있으면 그 방법대로 사용하고 없으면 Shell Scrip 사용

Github Action Core

핵심 개념 : Workflow, Event, Job, Step, Action, Runner

Github Action Core - Workflow

  • 여러 Job 으로 구성되고 Event 로 Trigger(실행)되는 자동화된 Process
  • 최상위 개념
  • Workflow 파일은 YAML 으로 작성되고, Github Repository 의 .github/workflows 폴더에 저장

name: Github Action Demo $\rightarrow$ 이게 Workflow 의 이름임

Github Action Core - Event

  • Workflow 를 Trigger 하는 특정 활동, 규칙
  • 특정 Branch 로 Push 하는 경우
  • 특정 Branch 로 Pull Request 하는 경우
  • 특정 시간대에 반복(Cron)

Github Action Core - Jobs

  • Runner 에서 실행되는 Steps 의 조합
  • 여러 Job 이 있는 경우 병렬로 실행하며, 순차적으로 실행할 수도 있음
    • 다른 Job 에 의존 관계를 가질 수 있음(A Job Success 후 B Job 실행)

Github Action Core - Steps

  • Step 은 Job 에서 실행되는 개별 작업
  • Action 을 실행하거나 쉘 커맨드 실행
  • 하나의 Job 에선 데이터를 공유할 수 있음

Github Action Core - Actions

  • Workflow 의 제일 작은 단위
  • Job 을 생성하기 위해 여러 Step 을 묶은 개념
  • 재사용이 가능한 Component
  • 개인적으로 Action 을 만들 수도 있고, Marketplace 의 Action 을 사용할 수도 있음

Github Action Core - Runner

  • Github Action 도 일종의 서버에서 실행되는 개념
  • Workflow 가 실행될 서버
  • Github-hosted Runner : Github Action 의 서버를 사용하는 방법
    • 성능 : vCPU 2, Memory 7GB, Storage 14GB
  • Self-hosted Runner : 직접 서버를 호스팅해서 사용하는 방법

Github Action Hello World!

Github Repository 새로 생성

Add file - Create new file

hello-world.py 를 생성한 후, Commit

Github Repository 에서 Action 클릭

하단에 More continuous integration workflows 클릭

Python application 검색 후 Set up this workflow 클릭

템플릿으로 파일이 생성
Test with pytest 만 수정!

(python hello-world.py) $\rightarrow$ Start commit 으로 커밋

커밋한 후, 노란색 동그라미 클릭!

Github Action 이 실행 중! Details 클릭

초록색으로 바뀌면 Success 를 의미

재실행하는 기능

정의한 Step
클릭시 로그를 확인할 수 있음

Github Action Hello World! - YAML 파일 분석

on : Event, 언제 Workflow 가 실행될 것인가?

jobs : jobs 정의, build 는 job 의 이름!

runs-on : buntu 환경에서 실행

uses : 사용할 Github Action
name : Step 의 이름

uses 없는 경우 : run 에 작성된 쉘 커맨드 실행

3. Mask Classification Streamlit 배포하기

진행 순서

  • Compute Engine 실행
  • SSH 키 생성 및 Github Secrets 설정
  • 터미널에서 최초로 서비스 실행
  • Github Action 을 통한 배포 자동화

Compute Engine 에서 Streamlit 실행하기

인스턴스 생성

인스턴스 이름은 자유롭게 작성
Region : 서울
머신 유형은 메모리가 8GB 이상인 유형으로 설정(vCPU 4개, 16GB 메모리도 추천!)

부팅디스크를 다음과 같이 설정
Ubuntu 20.04 사용

용량은 넉넉하게 주는게 좋음

인스턴스 생성 완료
IP 주소를 확인할 수 있음

SSH 를 클릭하고 브라우저 창에서 열기 클릭

터미널 진입

SSH Key 생성

$ cd ~/.ssh/
$ ssh-keygen -t rsa -b 4096 -C "여러분들의 이메일"
passphrase 는 그냥 엔터

$ cat id_rsa.pub >> authorized_keys

기본적으로 authorized_keys 에 퍼블릭 키가 등록되면 외부에서 접근 가능
단, GCP 는 주기적으로 authorized_keys 파일을 삭제해서 외부에서 키파일 등록하는 과정이 필요
cat id_rsa.pub 을 실행한 후, 복사

GCP Console 로 이동한 후, 메타데이터 클릭

SSH 키로 이동한 후, 수정 클릭

복사한 퍼블릭키를 추가한 후 저장
정상적으로 붙여넣기가 되었으면 왼쪽에 이름이 나타남. 이름이 나타나지 않으면 줄바꿈이나 띄어쓰기로 이슈가 없는지 확인

붙여넣기 할 공간에 키를 복사했을 때 왼쪽에 사용자 이름이 안나올리 없으니 안나오면 잘 못 된거임

Github Repo 로 이동 : https://github.com/zzsza/Boostcamp-AI-Tech-Product-Serving.git

자신의 Github 로 Fork!

지금은 이미 만들어진 repo 를 fork 해서 실행되는지 확인하는 방식

Fork 하면 Settings - Secrets 로 이동한 후, New repository secret 클릭

secret 이 뭐냐면 변수같이 쓸 수 있는 것이고 암호같은거나 외부에 노출이 되면 안되는걸 github repo 에서 쓸 수 있음

인스턴스 외부 IP 복사

Github Secret 에 HOST 추가(방금 복사한 인스턴스 IP)

Secret 에 USERNAME 추가(찾기 어려우면 터미널에 저기에 보이는 부분)

Private Key 를 복사
Private Key 는 길기 때문에 vi github-action 으로 전체 복사

Private Key 는 길기 때문에 vi id_rsa 으로 전체 복사

—–BEGIN ~ KEY—– 까지 전체 복사

Secret 에 SSH KEY 추가(방금 복사한 값)

3개의 Secret 이 등록됨

Github Action 에서 Secret 을 활용할 수 있음

$ : secrets 에 저장된 HOST 의 Value

git config –global credential.helper store : Github Action 에서 추가 인증없이 사용하도록 설정

Fork 한 Repo Clone

$ git clone https://github.com/{여러분들의 Github id}/Boostcamp-AI-Tech-Product-Serving.git

오류 발생..!

Github 에서 암호 입력으로 인증하는 방법이 삭제됨

이를 위해 Github 의 Access Token 발급 필요

Github 의 우측 상단의 계정 클릭 - Settings 클릭

좌측 하단의 Developer settings 클릭

Personal access tokens 클릭 - Generate new token 클릭

Note 를 작성한 후, Expiration 은 No expiration 설정한 후 repo 에 체크한 후 생성

복사! (이 값은 이 창을 나가면 다시는 볼 수 없으므로 어딘가에 잘 저장해두기)

다시 Git Clone 에서 Password 에 방금 복사한 값을 붙여넣기

필요한 프로그램 설치

$ sudo apt-get update
$ sudo apt-get install python3.8-venv -y

Part2 의 CI/CD 폴더로 이동

$ cd Boostcamp-AI-Tech-Product-Serving/part2/04-cicd

$ python3 -m venv venv
$ source venv/bin/activate
$ pip install -r requirements.txt

(10분 이상 소요)

error: invalid command ‘bdist_wheel’는 무시하고 기다리시면 설치가 진행됨

아래 코드로 Streamlit 실행

$ nohup streamlit run app.py --server.runOnSave true &

runOnSave : 파일이 변경될 경우 자동으로 다시 실행(Re Run)

nohup 으로 Background 실행

접근이 되지 않는 이슈 : 방화벽 이슈

클라우드 서비스엔 아무나 접근할 수 없도록 설정되어 있음

방화벽 설정을 수정해야 접근할 수 있음

GCP 웹사이트로 다시 이동한 후, 방화벽 규칙 설정 클릭

방화벽 규칙 만들기

이름 : streamlit
대상 : 지정된 대상 태그, 태그 이름은 streamlit

소스 IPv4 범위 : 0.0.0.0/0

  • 누구나 접근할 수 있음

지정된 프로토콜 및 포트

  • tcp : 8501(Streamlit Port)

0.0.0.0/0 은 보안이슈가 있어서 개인프로젝트는 상관없지만 회사에서는 제한을 많이 하기도 함

생성된 방화벽 확인

Compute Engine 페이지로 간 후, 인스턴스의 이름 클릭

수정 클릭 후, 네트워크 태그에 아까 생성한 streamlit 추가한 후 저장

조금만 기다리면 이제 접속 가능!

암호 입력 후 실행하니 정상적으로 동작!

load_model 이 오래 걸린다고 생각하면 Compute Engine 의 성능을 올리는 것도 방법

고생하셨습니다!!!

클라우드 처음 접할 때는 어렵지만, 반복해서 진행하고

관련 내용 습득하면 점점 더 빨라짐

이 부분을 위해 점점 더 자동화..!!

이제 Github Action 을 사용해 배포

Github Action 을 사용한 배포 자동화

Fork 한 Repo 로 이동 $\rightarrow$ Actions 클릭

I understand 클릭

Boostcamp-AI-Tech-Product-Serving/.github/workflow/deploy_ssh.yml 로 이동

ssh-action 을 사용 : SSH 로 붙은 후, 스크립트 실행

push 아래에 paths 의 의미 : 이 경로에 있는 파일이 변경된 경우에 실행!

Github Action Document

deploy_ssh.sh 쉘 스크립트 실행

git pull 받은 후, 라이브러리 설치

Streamlit 은 runOnSave true 로 실행해서 바로 return

Branch 를 추가해서 app.py 의 Title 을 수정 “Mask Classification Model - Github Action Deploy”

Push 후 Pull Request $\rightarrow$ Main Branch 로 Merge

Github Action 실행 중

혹시 2021/11/10 14:30:44 ssh: handshake faild: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain 오류가 발생하면 Secret 키 복사 붙여넣기 신중하게 다시 해보기

Github Action 상에서 Deploy 성공

Streamlit 에서 확인하니 정상적으로 배포!

인스턴스를 중지했다가 다시 실행할 경우 IP 가 변경됨

현재 IP 는 임시로 할당했기 때문

고정 IP 로 설정하면 인스턴스 중지 후 다시 실행해도 그대로 유지!

인스턴스를 클릭하고 네트워크 인터페이스를 보면 외부 IP 에 임시를 발견할 수 있음

VPC 네트워크 - 외부 IP 주소로 이동!

우리가 생성한 boostcamp 에서 사용하고 있는 IP 우측의 예약 클릭

이름을 작성하고 예약 클릭!

다음에서 사용 중 : 없음일 경우 고정 주소 해제(삭제) 실행!

인스턴스를 삭제하면 없음으로 뜸

고정주소를 인스턴스를 쓰고있을때는 무료지만 인스턴스를 사용하고 있지 않고 고정주소를 가지고 있으면 요금 부과됨

삭제를 꼭 해주세요 :)

Special Mission

1) Github Action Workflow 만들기 2) Github Action 을 사용해 Voila, Streamlit 코드 배포하기 3) 나만의 Jupyter Notebook Server 만들기 4) Github Action 의 결과를 Slack 채널에 메세지 보내기(배포 실패, 배포 성공 등) 5) 특정 Branch 가 main 에 Merge 된 경우 Branch 자동으로 삭제하는 Github Action 만들기

댓글남기기