Programming/Python

[Python] 파이썬 Fast API 개발 환경 설정 및 Docker와 Github Action으로 CI/CD 구현하기

빙기때침식곡 2024. 12. 2. 00:10
반응형

이번 포스팅에서는 제가 최근에 진행한 Python 개발 환경 설정과 Docker를 이용한 CI/CD 구축 과정에 대해 공유하려고 합니다.

개인적으로 진행하는 프로젝트가 파이썬의 FastAPI를 사용하고 있어서 파이썬을 선택하게 되었습니다.

 

macOS와 VSCode를 사용하고 있으며, 각 패키지를 Homebrew로 설치했습니다. 배포 환경은 AWS가 아닌 Oracle 인스턴스로, GitHub Actions를 사용하여 배포할 예정입니다.

 

 

 

1. Python 개발 환경 설정

먼저 파이썬 개발 환경을 세팅하기 위해 pyenv, poetry, ruff, 그리고 mypy를 사용하였습니다. 이 과정에서 사용된 설정 방법을 공유하겠습니다.

1.1 pyenv로 Python 버전 관리하기

pyenv는 여러 파이썬 버전을 쉽게 설치하고 관리해주는 툴입니다. 도커를 안정적으로 운영하기 위해 Python 버전을 3.10으로 설정했습니다.

 

설치 명령어:

brew update
brew install pyenv

 

설치 후, pyenv를 터미널에서 사용하려면 환경 설정을 해줘야 하는데, 아래 명령어를 ~/.zshrc 또는 ~/.bashrc에 추가하고 파일을 로드해 줍니다.

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init --path)"' >> ~/.zshrc
source ~/.zshrc

 

Python 버전 설치:

pyenv install 3.10.12 
pyenv global 3.10.12

 

가상환경 접근

 

1.2 Poetry로 의존성 관리하기

Poetry는 파이썬의 의존성 관리를 도와주는 도구로, 프로젝트에서 사용되는 패키지를 쉽게 관리할 수 있습니다. 설치 후, 프로젝트를 생성하고 필요한 패키지를 추가했습니다.

 

설치 명령어:

curl -sSL https://install.python-poetry.org | python3 -

 

 

export PATH="$HOME/.local/bin:$PATH"
source ~/.zshrc

 

 

프로젝트 생성:

poetry new my_project 
cd my_project

 

 

 

여기에 편의상 하위에 추가로 생긴 my_project를 app으로 이름을 바꿔주겠습니다.

 

 

패키지 설치:

poetry add fastapi uvicorn

 

 

1.3 Ruff와 mypy 설정하기

 

Ruff: Python 코드 스타일을 체크해주는 도구로, 빠른 분석 속도가 특징입니다.

설치 명령어:

poetry add --dev ruff

 

mypy: 타입 힌트를 통해 정적 타입 검사를 수행하는 도구입니다.

설치 명령어:

poetry add --dev mypy

 

VSCode 설정:

mkdir .vscode
touch .vscode/settings.json

 

.vscode/settings.json 파일을 생성하고 다음과 같이 설정합니다.

{
    "editor.formatOnSave": true,
    "python.analysis.typeCheckingMode": "off",
    "ruff.importStrategy": "fromEnvironment",
    "mypy-type-checker.importStrategy": "fromEnvironment"
}

 

 

VSCode 확장 프로그램 설치:

 - VSCode에서 Python Extension을 설치해 Python 개발에 필요한 기본 기능을 제공합니다.

 - Ruffmypy에 대한 플러그인도 설치하여 코드 스타일 검사와 타입 검사를 쉽게 할 수 있도록 합니다.

 

 

 

간단한 FastAPI 코드 작성 및 테스트:

 

main.py 를 추가해줍니다.

touch app/main.py

현재 디렉터리

 

main.py 파일 내용:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "Hello, FastAPI!"}

 

먼저 Hello, FastAPI가 잘 작동하는지 간단하게 코드를 작성해줍니다.

 

from fastapi에서 import 경고 메시지가 뜬다면, pyproject.toml에 다음 설정을 추가합니다:

[tool.mypy]
ignore_missing_imports = true

 

이유: mypy가 외부 라이브러리에 대한 타입 힌트를 찾지 못할 때 발생하는 경고를 무시하도록 설정하는 것입니다. 이 설정을 통해 외부 패키지의 타입 검사를 피할 수 있습니다.

 

2. Docker를 이용한 CI/CD 구현

이제 Python 개발 환경이 설정되었으니, Docker를 이용해 CI/CD 파이프라인을 구축해보겠습니다.

GitHub Actions를 통해 Oracle 서버에 배포하는 과정을 설명드리겠습니다.

 

touch Dockerfile

2.1 Dockerfile 작성

먼저, Python 애플리케이션을 컨테이너화하기 위해 Dockerfile을 작성했습니다.

FROM python:3.10-slim

WORKDIR /app

RUN apt-get update && apt-get install -y build-essential

RUN pip install poetry

COPY pyproject.toml poetry.lock /app/

RUN poetry config virtualenvs.create false \
    && poetry install --no-interaction --no-ansi

COPY . /app

EXPOSE 3002

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "3002"]

 

 

로컬 환경에서 Docker 설치 확인: Docker가 설치되어 있지 않다면 Homebrew를 사용해 설치합니다.

brew install --cask docker

 

 

 

Docker 이미지 빌드 및 컨테이너 실행: 

이미지 빌드:

docker build -t my-project:python3.10 .

 

이미지 확인:

docker images

 

my-project의 이미지 이름이 있으면 됩니다.

 

컨테이너 실행:

docker run -d -p 3002:3002 --name my-project-container my-project:python3.10

 

컨테이너 확인:

docker ps

 

 

 

curl을 이용한 테스트:

Hello, FastAPI! 메시지가 출력되면 성공적으로 컨테이너가 실행된 것입니다.

curl localhost:3002
{"message":"Hello, FastAPI!"}

 

 

 

2.2 GitHub Actions 설정

 

해당 디렉터리와 파일을 추가해주면 됩니다.

.github/workflows/deploy.yml

 

 

GitHub Actions를 이용하여 코드가 main 브랜치에 푸시될 때마다 자동으로 배포되도록 설정했습니다. 다음은 deploy.yml 파일의 주요 내용입니다.

name: Deploy to Oracle Server

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      # 1. 리포지토리 체크아웃
      - name: Check out the repository
        uses: actions/checkout@v3

      # 2. Docker 로그인을 위한 GitHub Secrets 사용	
      - name: Log in to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      # 3. Docker 이미지 빌드 및 푸시
      - name: Build and push Docker image
        run: |
          docker build -t ${{ secrets.DOCKER_USERNAME }}/my-project:latest .
          docker push ${{ secrets.DOCKER_USERNAME }}/my-project:latest

      # 4. Oracle 서버로 SSH를 사용해 배포
      - name: Deploy to Oracle Server
        uses: appleboy/ssh-action@v0.1.8
        with:
          host: ${{ secrets.ORACLE_SERVER_IP }}
          username: ${{ secrets.ORACLE_SERVER_USER }}
          key: ${{ secrets.ORACLE_SERVER_SSH_KEY }}
          script: |
            docker pull ${{ secrets.DOCKER_USERNAME }}/my-project:latest
            docker stop my-project-container || true
            docker rm my-project-container || true
            docker run -d -p 3002:3002 --name my-project-container ${{ secrets.DOCKER_USERNAME }}/my-project:latest
  • GitHub Secrets 설정:
    • GitHub Repository > Settings > Secrets에서 DOCKER_USERNAME, DOCKER_PASSWORD, ORACLE_SERVER_IP, ORACLE_SERVER_USER, ORACLE_SERVER_SSH_KEY와 같은 변수를 설정합니다. 이를 통해 민감한 정보를 코드에 직접 노출하지 않고 관리할 수 있습니다.

GitHub 리포지토리 페이지에서 Settings > Secrets and variables > Actions로 이동한 후 위의 정보를 New repository secret으로 추가합니다.

 

 

 

3. Oracle 서버에서 준비 작업

Oracle 서버에서 GitHub Actions가 Docker를 통해 배포할 수 있도록 필요한 준비 작업을 수행해야 합니다.

 

3.0 Docker 설치 및 설정

Oracle 서버에서 해당 github 리포지토리를 관리할 수 있는 세팅을 합니다.

 

3.1 Docker 설치 및 설정

이미 Oracle 서버에 Docker가 설치되어 있는 상태여야 합니다. 추가로, Docker가 제대로 작동하기 위해 다음 설정을 확인하세요:

 

Docker가 실행 중인지 확인:

sudo systemctl start docker

 

 

현재 사용자(ubuntu 등)를 Docker 그룹에 추가하여 Docker 명령어를 비밀번호 없이 실행할 수 있도록 설정:

sudo usermod -aG docker $USER

 

설정을 반영하기 위해 서버를 재부팅하거나, 현재 터미널 세션을 재시작합니다.

 
 

 

3.2 Docker Hub에 로그인

docker login
  • Username: Docker Hub 사용자 이름을 입력하세요.
  • Password: Docker Hub 비밀번호 또는 Personal Access Token을 입력합니다.

 

4. 테스트 및 직접 배포

 

4.1 GitHub Actions 로그 확인

깃허브에서 Actions 탭에 가보면 CI/CD에 대한 로그를 확인할 수 있습니다.

 

 

또는, VSCode GitHub Actions 라는 익스텐션을 다운로드 받으면

 

VSCode에서도 로그를 직접 확인 할 수 있습니다.

 

 

마무리

이번 포스팅에서는 Python 개발 환경을 설정하고 Docker를 사용해 CI/CD를 구축하는 과정을 공유했습니다. 특히 pyenv, poetry, ruff, mypy를 이용한 개발 환경 설정부터 GitHub ActionsDocker를 통한 자동 배포까지 큰 흐름을 다뤘습니다. 분명히 제가 놓친 부분도 있을 것이고 많은 부분이 생략되기도 했습니다. 비슷한 상황에서 도움이 되면 좋겠습니다.

설정 과정에서 겪으신 이슈나 더 궁금한 점 있다면 댓글로 남겨주세요.

반응형