Xay dung quy trinh CI/CD tuyet voi cho du an web Python co ket noi database voi GitHub Actions
Trong mo hinh phat trien phan mem hien dai, viec tu dong hoa quy trinh xac thuc va loai bo loai no so khong phai la tuy chon ma la yeu to sinh ton. Mo ta mot hinh anh thuc te ma nhieu sysadmin hay developer gap phai: ban co mot du an web Python duoc deploi len server, nhung moi lan thay doi code (commit) lai co nhuoc dieu la phai dang nhap vao server, chay tay lenh update code, chay chay lai test, va co khi phai chay lai cac dieu chinh database. Nhat la khi co loi loi, viec khach lai (rollback) cung nhu mot co ban vo thuong. Do do, bai viet nay se huong dan ban xay dung mot day quy trinh Continuous Integration va Continuous Deployment (CI/CD) toan dien cho mot du an web Python sủ dung GitHub Actions, bo goc mot cach tu dong tat ca cac cong viec boi moi khi ban push code len branch.
Thiet ke kienh truc CI/CD co ban va mot van de quan trong
Truoc khi nhay vao viec viet code cho file config, ban can hieu ro kienh truc ma chung ta se xay dung. Mot quy trinh CI/CD co ban thuong gom 3 goc do chinh: xac thuc (Build/Test), tao san pham (Build Artifact), va tri khai (Deploy). Tuong ung voi mot du an Python, day se la: chay unit test, chay kiem tra chat luong code (linting), va cuoi cung la tri khai len mot server thuc te. Nhung goc do khac nhau trong quy trinh nay la viec xu ly voi database. Mot loi thuong gap la co loi khi chay test do database chua duoc chua hoac loi do xung dot ket noi. Do do, bai huong dan nay se dam bao cho ban hieu cach ket noi vao moi truong test (ma co the la docker) hoac cach config de test chay toi da toa toa trong moi truong CI.
Chung ta se su dung GitHub Actions lam nhat cho toan bo quy trinh. Nhat duoc biet den la mot nen phan phat trien toan dien, cho phep ban viet nhung "workflow" de phat hien tat ca loi loi troi trong code truong hop. Quy trinh se boi moi khi ban push vao branch main, va se bao gom cac buoc sau: doi doi moi code, cai dat thu vien Python, chay test, va tri khai len server thuc te (co the la server VPS hoac cloud).
Thiet lap moi truong dev va cau hinh ban dau cho du an
Dung vi du co thuc, chung ta se mo mot du an web Python nho dung Django hoac Flask. Giu cho don gian va toa toa, chung ta se lam vi du voi Flask, vi no nhu de hieu va de tri khai. Truoc het, ban can tao mot folder moi, va tao cac file can thiet nhu app.py, requirements.txt, va .gitignore. Vi du, file app.py se la mot app Flask nho voi mot endpoint test. Sau do, ban can tao file requirements.txt de danh gia thuat toan thu vien can thiet nhu flask, pytest, va sqlalchemy. Viec nay se giup GitHub Actions biet can cai dat gi de chay test.
Viec quan trong nhat tie theo la cau hinh git. Ban can tao mot repository tren GitHub, va init git vao folder cua ban. Sau do push code len GitHub de bat dau quy trinh. Ban can dam bao da boi .gitignore de khong push cac file .pyc, __pycache__, hoac cac file config bi mat nhu .env vao repository. Viec nay la bien phap boi moi de dam bao bảo mat cho du lieu va khoi tranh xung dot khi co nguoi khac lay code ve chay.
Viet file workflow cho GitHub Actions - Goc do quan trong nhat
Day la tinh huan cua bai viet. Ban can tao mot folder git/.github/workflows/ trong root cua du an, va trong do tao mot file co ten la ci.yml. File nay se chua toan bo logic cho quy trinh CI/CD. Ban se viêt theo cau truc yaml. Trong file nay, ban se dinh nghia mot workflow ten la "CI/CD for Python App". Workflow se boi moi khi co push vao branch main hoac pull request. Sau do, ban se dinh nghia mot job ten la "build" chay tren runner ubuntu-latest. Trong job nay, ban se co cac steps: checkout code, cai dat Python (chon ban phien ban can thiet, vi du 3.9), cai dat cac thu vien tu requirements.txt, va cuoi cung la chay cac test.
Mot diem quan trong trong file workflow nay la viec su dung cac cach chuan hoa. Ban nen su dung cac action co sady tren GitHub Marketplace vi no duoc duoi bang boi co dong cong doi rong lon va duoc cap nhat thuong xuyen. Vi du, de checkout code, ban su dung action actions/checkout v3. De cai dat Python, ban su dung actions/setup-python v4, va dinh nghia ban phien ban trong input. De chay test, ban co the su dung lenh chay tay trong step de chay pytest hoac su dung mot action chuan. Viec su dung chuan hoa giup ban giam thoi gian cau hinh va tang do tin cay cho quy trinh.
name: CI/CD for Python App
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python 3.9
uses: actions/setup-python@v4
with:
python-version: '3.9'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests with pytest
run: |
pytest --cov=app --cov-report=xml
- name: Upload coverage reports
uses: codecov/codecov-action@v3
Xu ly van de database trong moi truong CI va test
Mot van de rat thuc te ma nhieu nguoi gap phai la lam the nao de test duoc mot app co ket noi database trong moi truong CI? Trong moi truong ci, ban khong the ket noi vao database san xuat. Do do, giai phap tot nhat la su dung Docker de chay mot instance database tam thoi cho viec test. Hoac, neu ban muon don gian hon, ban co the su dung SQLite, mot database file co the chay toan bo trong moi truong file, va khong can mot server database rieng. Ban co the cau hinh app cua ban de trong moi truong test, no se su dung file SQLite, va trong moi truong san xuat, no se chuy sang su dung PostgreSQL hoac MySQL. Viec nay giup ban co the chay test toi da toa toa trong CI ma khong can lo ve ket noi database.
Neu ban muon thach thuc hon, ban co the thiet lap mot service cho database trong file workflow. GitHub Actions cho phep ban chon service cho docker. Ban co the cau hinh de khi job bat dau, GitHub Actions se chay mot container postgres, va cung cap mot bi mat (secret) cho ban de ket noi vao container do. Cach nay giup ban test duoc mot app co su dung SQL toan dien trong moi truong test. Tu do, ban co the viêt test de kiem tra logic cua app voi database thuc te, va dam bao khong co loi loi troi.
Tri khai tu dong len server VPS (Continuous Deployment)
Sau khi da co quy trinh test thanh cong, buoc tie theo la tri khai tu dong. Ban co the them mot job moi vao file workflow, ten la "deploy", va cau hinh de no chi chay khi job "build" thanh cong, va chi khi push vao branch main. Trong job nay, ban se cau hinh de no co the ket noi vao server VPS cua ban. Cach hay nhat la su dung SSH key de ket noi. Ban can tao mot cap key SSH, va luu key ca (private key) vao GitHub Secrets. Sau do, trong file workflow, ban se lay key ca do, va su dung lenh ssh de ket noi vao server, chay cac lenh nhu git pull, chay docker compose up -d, hoac chay lenh cap nhat code.
Vi du, neu ban de tri khai len server, ban co the su dung docker. Ban co the cau hinh job deploy de no chay tren server thuc te, hoac co the su dung mot action thoi gian de chay lenh tri khai. Tu do, ban se co mot quy trinh toa toa: khi ban push code, test se chay, va neu test thanh cong, code se duoc tri khai tu dong len server. Viec nay giup ban giam thoi gian va tang do tin cay cho quy trinh phat trien.
name: Deploy to VPS
on:
push:
branches: [ main ]
jobs:
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup SSH key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts
- name: Deploy to server
run: |
ssh -o StrictHostKeyChecking=no ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "
cd /var/www/myapp
git pull origin main
docker-compose up -d --build
"
Cac bien phap an toan va bat loi trong quy trinh
Mot quy trinh CI/CD hay khong chi la tri khai nhanh, ma con la bat loi tot va an toan. Ban nen cau hinh file workflow de no co the bat loi khi co loi loi troi trong test, va tri khai chi khi test thanh cong. Ban cung nen su dung cac secret de luu cac thong tin bi mat nhu API keys, database credentials, hay SSH keys. Khong bao gio git cac thong tin nay vao file workflow. GitHub Secrets cho phep ban luu cac thong tin nay mot cach an toan, va co the su dung trong workflow. Viec nay giup ban dam bao bảo mat cho du lieu va khoi tranh xung dot khi co nguoi khac lay code ve chay.
Boi cuoi cung, mot quy trinh CI/CD toa toa se giup ban giam thoi gian, tang chat luong, va tang so san pham phat trien. Ban se co the tri khai nhanh hon, va dam bao khong co loi loi troi trong san pham. Hy vong bai viet nay se giup ban hieu ro cach xay dung quy trinh CI/CD cho du an Python cua ban. Ban co the tham khao them cac tai lieu chinh thuc cua GitHub Actions de mo rong va thuc hien them cac chuc nang cho quy trinh cua ban.