استفاده از یک برنامه FastAPI با خط لوله CI/CD: HNG Task 2

در این مقاله ، من شما را از طریق نحوه استقرار یک برنامه FastAPI با ادغام مداوم (CI) و استقرار مداوم (CD) پیاده می کنم.
الزام
- پیتون
- برنامه Fastapi
- اسکله
- اسرار اقدامات GitHub
- سرور لینوکس AWS
مرحله 1: مخزن را کلون کنید
اولین قدم این است که repo را چنگ بزنید و مخزن را به دستگاه محلی خود کلون کنیدgit clone https://github.com/hng12-devbotops/fastapi-book-project.git
cd fastapi-book-project/
مرحله 2: تنظیم یک محیط مجازی
من قبل از استقرار برنامه را به صورت محلی آزمایش می کنم ، استفاده از یک محیط مجازی بهترین روش برای مدیریت وابستگی های پایتون شما است. برای انجام این کار باید یک محیط مجازی ایجاد و فعال کنید.python3 -m venv hng
source hng/bin/activate
- وابستگی لازم را با استفاده از این دستور نصب کنید
pip install -r requirements.txt
مرحله 3: اجرای نقطه پایانی گمشده
API ما در حال حاضر با استفاده از شناسه خود قادر به واکشی یک کتاب واحد نیست. در این مرحله ، من یک نقطه پایانی جدید را به روتر FastAPI اضافه کردم که درخواست دریافت یک کتاب را بر اساس شناسه ارائه شده خود می دهد.
@router.get("/{book_id}", response_model=Book, status_code=status.HTTP_200_OK) # New endpoint
async def get_book(book_id: int):
book = db.books.get(book_id)
if not book:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Book not found"
)
return book
- از وارد کردن httpexception از fastapi اطمینان حاصل کنید
مرحله 4: آزمایش نقطه پایانی
پس از اجرای نقطه پایانی ، مهم است که آن را آزمایش کنید تا اطمینان حاصل شود که همانطور که انتظار می رود رفتار کند ، من این کار را با اجرای این دستور انجام دادمpytest
- سپس برنامه FastAPI را با استفاده از UVicorn شروع کردم
uvicorn main:app --reload
- به نظر می رسد برنامه های کاربردی در LocalHost ### مرحله 5 خوب اجرا می شوند: dockerizing برنامه ما یک dockerfile را در فهرست پروژه ایجاد کنید
# Use an official lightweight Python image
FROM python:3.9-slim
# Set work directory
WORKDIR /app
# Install dependencies
COPY requirements.txt .
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
# Copy project files
COPY . .
# Expose the port FastAPI runs on
EXPOSE 8000
# Run the FastAPI application using Uvicorn
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
مرحله ششم: ادغام nginx به عنوان یک پروکسی معکوس
برای آسانتر کردن کارها برای من ، من از docker-compose.yml
پرونده برای پیکربندی nginx به عنوان یک پروکسی معکوس. برای انجام این کار من ایجاد کردم nginx.conf
پرونده با تنظیمات برنامه من. هدف از این پیکربندی این است که NGINX در پورت 80 گوش دهید و درخواست های HTTP ورودی را به برنامه FastAPI که در پورت 8000 در داخل ظرف خود اجرا می شود ، گوش دهید.
nginx.conf
server {
listen 80;
server_name your_domain_or_IP;
location / {
proxy_pass http://app:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
- گوش دادن 80: NGINX برای درخواست های HTTP ورودی در بندر 80 گوش می دهد.
- server_name: با دامنه یا آدرس IP خود جایگزین کنید.
- Proxy_Pass: ترافیک را به برنامه نامگذاری شده سرویس (تعریف شده در پرونده docker-compose) در پورت 8000 هدایت می کند. docker-compose.yml
version: '3.8'
services:
app:
build: .
container_name: fastapi-app
ports:
- "8000:8000"
nginx:
image: nginx:latest
container_name: fastapi-nginx
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- "80:80"
depends_on:
- app
- همانطور که مشاهده می کنید ، ظروف ما در حال کار هستند و در حال اجرا هستند و Nginx با موفقیت در حال مسیریابی ترافیک ورودی به برنامه FastAPI ما است.
مرحله 7: یک سرور لینوکس ایجاد کنید
برای میزبانی و استقرار برنامه FastAPI ما ، یک سرور لینوکس را در AWS تنظیم کردم. این سرور به عنوان ستون فقرات محیط استقرار ما عمل می کند ، جایی که برنامه dockerized ما اجرا می شود و در دسترس کاربران قرار می گیرد.
مرحله 8: خط لوله CI را تنظیم کنید
من برای این مرحله یک فایل گردش کار Actions GitHub ایجاد کردم تا به طور خودکار آزمایشات را در هر درخواست کشش هدف قرار دهد که شعبه اصلی را هدف قرار دهد. این تضمین می کند که هرگونه تغییر جدید قبل از ادغام آنها تأیید شود.mkdir -p .github/workflows/
cd .github/workflows/
touch ci.yml
name: ci pipeline
on:
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.9'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: pytest
- تغییرات خود را به GitHub فشار داده و وضعیت خط لوله خود را بررسی کنید
مرحله 9: خط لوله استقرار را تنظیم کنید
برای استقرار مداوم ، من یک پرونده گردش کار Actions Action GitHub را ایجاد کردم به نام deploy.yml
بشر این خط لوله استقرار هر زمان که تغییرات به شعبه اصلی منتقل شود ، انجام می شود و روند به روزرسانی برنامه زنده را خودکار می کند.touch deploy.yml
name: CD Pipeline
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Deploy via SSH
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
# Update package index and install dependencies
sudo apt-get update -y
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# Add Docker's official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# Install Docker
sudo apt-get update -y
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# Add the SSH user to the Docker group
sudo usermod -aG docker ${{ secrets.SSH_USERNAME }}
# Install Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# Verify installations
docker --version
docker-compose --version
# Navigate to the project directory and deploy
cd /home/ubuntu/
git clone
cd fastapi-book-project/
git pull
docker-compose up -d --build
- اطمینان حاصل کنید که اسرار خود را ذخیره کنید: مطمئن شوید
SSH_HOST
باSSH_USERNAME
وتSSH_PRIVATE_KEY
به اسرار مخزن GitHub شما اضافه می شوند. - تغییرات خود را به GitHub فشار داده و وضعیت خط لوله خود را بررسی کنید.
- تأیید پس از استقرار: پس از اتمام خط لوله ، تأیید کنید که برنامه شما مطابق انتظار اجرا می شود.
مرحله 10: نیاز به دسترسی مخزن
قبل از ارسال ، ما قرار است دعوت کنیم hng12-devbotops
به حساب GitHub ما به عنوان همکار در مخزن ما. برای انجام این کار
- مخزن را که می خواهید یک همکار اضافه کنید باز کنید
- بر روی برگه تنظیمات کلیک کنید ، که معمولاً در سمت راست منوی مخزن قرار دارد.
- در نوار کناری سمت چپ ، تحت Access ، همکاران را انتخاب کنید.
- روی افزودن مردم کلیک کنید ، اضافه کنید
hng12-devbotops
با تشکر از خواندن ، فراموش نکنید که مانند و اظهار نظر کنید 😄😄