CI/CD은 빠르고 편리한 빌드/테스트/배포를 위한 과정을 의미한다.
이미 배포한 서비스를 업데이트하기 위해 git push를 하고 모든 테스트가 통과된다면 자동으로 배포가 되는 편리한 기능이다.
이를 위한 소프트웨어로 유명한 Jenkins, Bamboo등이 있다.
이러한 소프트웨어는 개인 서버에 설치가 되어 관리가 돼야 한다.
하지만 그 서버가 고장나거나 Jenkins가 다운된다면 난처한 상황이 생길것이다.
이를 위해 Github나 Gitlab에서 클라우드같이 컴퓨터를 대여해주는 식으로 CI/CD서비스를 제공해준다.
그 중 Github Action을 이용한 CI/CD를 알아볼 것이다.
CI/CD가 없다면
1. 개발을 한다.
2. 테스트를 돌린다.
3. 테스트가 모두 통과된 것을 확인하고 원격 저장소에 푸시를 한다.
4. 배포중인 서버에 접속해 git pull을 하고 재배포를 수행한다.
위 과정을 모두 사람이 수행해야 했다.
하지만 CI/CD를 도입하면 2, 4를 자동화할 수 있다.
준비물
로컬 서버(개발용), 원격 서버(e.g. 클라우드, 다른 pc, 컨테이너나 가상머신같은 격리된 환경), 깃허브 아이디, VSCode
목표
간단한 fastapi앱에 CI/CD를 적용할 것이다.
FastAPI 코드 작성
# main.py
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
def func():
return {"message":"hello"}
if __name__ == "__main__":
uvicorn.run(app, port = 9000, host="0.0.0.0")
위 코드같이 간결하게 나와서 FastAPI를 선택했다.
작동 확인
python -m venv venv
source venv/bin/activate # 리눅스 기준!!
pip install fastapi uvicorn
pip freeze > requirements.txt
python main.py
가상환경을 만들어 작동시킨다.
Github에 업로드
venv
__pycache__
우선 가상환경과 캐시파일을 업로드하지 않기 위해 .gitignore를 작성하고 push를 한다.
그 후 원격 저장소에서 clone을 받고 실행해본다.
잘 작동한다.
이제 로컬에서 push를 하면 원격에서 자동으로 pull하게 만들어보자.
워크플로 코드 작성
# .github/workflow/main.yml
name: auto pull
on: [push]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: ssh test
uses: appleboy/ssh-action@v0.1.7
with:
host: ${{secrets.HOST}}
username: ${{secrets.USERNAME}}
key: ${{secrets.KEY}}
port: ${{secrets.PORT}}
script: |
cd CICD
git pull
각 부분이 무슨 역할을 하는지는 다음에 알아보자.
main.yml의 파일명은 맘대로 정해도 되지만 폴더는 정확해야 한다.
아무래도 깃허브에 올라가는 파일이기때문에 HOST와 USERNAME, KEY, PORT는 숨기는게 좋다.
이 값을 사용하려면 Settings -> Secrets and variables -> Actions에서 New repository secret에서 추가하면 된다.
secret을 4개 만들어서 각각 Name에 HOST, USERNAME, KEY, PORT를 쓰고 Secret에 각각 정보를 쓰면 된다.
예를들어 서버 주소가 1.2.3.4라면 아래와 같이 쓴다.
만약 SSH접속을 KEY로 안하고 PASSWORD로 한다면 Name을 PASSWORD로 바꾸고 yml파일도 key를 password로 바꾼다.
접속하는데 키나 패스워드를 사용하지 않는다면 지워도 된다.
그리고 KEY를 사용한다면 secret값에 BEGIN OPENSSH ...부터 END OPENSSH... 까지 전부 넣어야 한다. (파일 열고 전체 복사를 하자.)
모두 설정했다면 적당히 커밋하고 푸시해보자.
그럼 action탭에서 무언가 돌아가기 시작한다.
초록불이 들어오면 성공이다.
이제 서버로 가서 확인을 하면?
대박
따로 pull을 안해줘도 자동으로 github actions에서 pull 해준 것을 알 수 있다.
이 정도 작업만 도와줘도 굉장히 편리하다.
좀 길어지니 다음편에서 실제 python파일을 수정해서 배포해보자.
'프로그래밍 > DevOps' 카테고리의 다른 글
[DevOps] React, gh-pages를 통해 웹 페이지를 배포해보자! (2) (0) | 2023.02.16 |
---|---|
[DevOps] React, gh-pages를 통해 웹 페이지를 배포해보자! (1) (0) | 2023.02.16 |
[DevOps] github actions을 사용해서 CI/CD를 해보자! (4) (0) | 2023.02.15 |
[DevOps] github actions을 사용해서 CI/CD를 해보자! (3) (0) | 2023.02.12 |
[DevOps] github actions을 사용해서 CI/CD를 해보자! (2) (2) | 2023.02.12 |