FastAPI CI/CD (EC2 + Jenkins)

형석이의 성장일기·2023년 10월 9일
0

이제 AI 서버인 FastAPI를 배포해보자

젠킨스 FastAPI용 pipeline

pipeline {
    agent any
    stages {
        stage('github clone') {
            steps {
                git branch: '배포할 브랜치명', credentialsId: 'jenkins_token', url: '깃 래포 https 주소'
            }
        }
        stage('Deployment') {
            steps {
                sshagent(credentials: ['ssh_key']) {
                    sh '''
                        ssh -o StrictHostKeyChecking=no ubuntu@ec2_public_ip
                        scp -r /var/jenkins_home/workspace/배포하는_젠킨스_item_이름/FastAPI_프로젝트_폴더명/ ubuntu@ec2_public_ip:/home/ubuntu/Ai/
                        ssh -t ubuntu@ec2_public_ip ./deploy_ai.sh
                    '''
                }
            }
        }
    }
}

/home/ubuntu 에서

mkdir Ai

폴더 만든 다음에

/home/ubuntu/deploy_ai.sh

cd Ai
sudo docker compose down
sudo docker compose up -d --build
yes | sudo docker system prune

생성한 뒤

sudo chmod -R 755 deploy_ai.sh

권한부여 하고,

/home/ubuntu/Ai/Dockerfile

FROM python:3.9

COPY ./requirements.txt /fastApiProject/requirements.txt

COPY ./.env /fastApiProject/.env

RUN pip install --no-cache-dir --upgrade -r /fastApiProject/requirements.txt

RUN cd /fastApiProject

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

/home/ubuntu/Ai/docker-compose.yml

version: "3"

services:
        web:
                build:
                        context: .
                        dockerfile: Dockerfile
                image: mt-ai
                container_name: mt-ai
                ports:
                        - "8000:8000"

/home/ubuntu/Ai/requirements.txt

fastapi
uvicorn
openai
clarifai
nbformat
nbclient
nbconvert

이건 Dockerfile에서 프로젝트 빌드하면서 필요한 라이브러리 설치할 수 있도록 적어둔거다.

...

**COPY ./requirements.txt /fastApiProject/requirements.txt**

**RUN pip install --no-cache-dir --upgrade -r /fastApiProject/requirements.txt**

...

이 부분임!

/home/ubuntu/Ai/.env

CLARIFAI_API_KEY=
CHATGPT_API_KEY=

이건 환경변수 파일.

gitignore되어있어서 안올라가있으니까 서버에만 올려둔거임

일단 젠킨스는 잘 된다.

저 fastApiProject가 우리 깃 레포에 올라와있는 디렉토리 명이다.

디렉토리 안에 있는 코드들도 다 잘 가져와지는데..

main을 찾을 수 없다는건가..

아마 Dockerfile의

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

이 쪽 문제인 것 같은디..

main.py 권한 부여 문제인가 싶어서 Dockerfile에 권한부여 코드를 추가해주니까

#8 [web 4/5] RUN cd /fastApiProject
#8 CACHED

#9 [web 5/5] RUN chmod +x /main.py
#9 0.189 chmod: cannot access '/main.py': No such file or directory

그냥 저 main.py 파일을 찾을 수 없다고 한다..

함 해결해 봅시다. 다 함께. 잇쇼니


하 해결 완료

#10 [web 6/7] RUN pwd
#10 0.176 /fastApiProject
#10 DONE 0.2s

#11 [web 7/7] RUN ls -al
#11 0.271 total 16
#11 0.271 drwxr-xr-x 1 root root 4096 Sep 14 15:28 .
#11 0.271 drwxr-xr-x 1 root root 4096 Sep 14 15:42 ..
#11 0.271 -rw-r--r-- 1 root root  122 Sep 14 15:26 .env
#11 0.271 -rw-r--r-- 1 root root   32 Sep 14 13:54 requirements.txt
#11 DONE 0.3s

이건 젠킨스에서 배포할 때 Dockerfile에서 내가 띄운 로그인데, 보면 위치는 fastApiProject가 맞는데, 안에 아무런 코드가 없다.

보니까 내가 젠킨스에서 모든 코드들을 복사해서 안가져왔다..

그래서 Dockerfile에 복붙하는 코드를 추가해주면 해결

FROM python:3.8

COPY ./requirements.txt /fastApiProject/requirements.txt

COPY ./.env /fastApiProject/.env

WORKDIR /fastApiProject

RUN pip install --no-cache-dir --upgrade -r /fastApiProject/requirements.txt

# 이 코드
COPY ./fastApiProject /fastApiProject

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

굳굳

profile
이사중 .. -> https://gudtjr2949.tistory.com/

0개의 댓글