(CI/CD)

CI/CD är en process för att automatisera bygg, test och leverans av mjukvara. Det hjälper till att snabbt och pålitligt leverera nya funktioner. Här går vi igenom hur du ställer in en CI/CD-pipeline med GitHub Actions för att automatisera testning och deployment av en enkel Python-applikation.
Vad är CI/CD?
- Continuous Integration (CI): Automatiskt testa och bygga kod vid varje commit för att identifiera buggar tidigt.
- Continuous Deployment (CD): Automatisera leveransen av nya versioner till produktion.
| Komponent | Beskrivning |
|---|---|
| CI | Automatiserar testning och byggprocesser. |
| CD | Distribuerar byggda applikationer till användarna. |
Steg 1: Förbered din applikation
Filstruktur
En enkel Python-applikation kan se ut så här:
ci_cd_app/
├── app.py # Applikationens huvudfil
├── test_app.py # Testfall
├── requirements.txt # Lista över beroenden
└── .github/
└── workflows/
└── ci_cd.yml # GitHub Actions konfiguration
Flask-app: app.py
from flask import Flaskapp = Flask(__name__)@app.route('/')def home(): return "Hello, CI/CD!"if __name__ == '__main__': app.run()Code language: JavaScript (javascript) Steg 2: Testa applikationen lokalt
Testfall: test_app.py
import unittestfrom app import appclass TestApp(unittest.TestCase): def test_home(self): tester = app.test_client() response = tester.get('/') self.assertEqual(response.status_code, 200) self.assertEqual(response.data.decode('utf-8'), "Hello, CI/CD!")if __name__ == '__main__': unittest.main() Kör testet:
python -m unittest test_app.pyCode language: CSS (css) Output:
plaintext
———————————————————————-
Ran 1 test in 0.001s
OK
Steg 3: Skapa en GitHub Actions-konfiguration
Skapa filen .github/workflows/ci_cd.yml:
yaml
name: CI/CD Pipeline
on:
push:
branches:
– main
pull_request:
branches:
– main
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
– name: Checkout code
uses: actions/checkout@v3
– name: Set up Python
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
run: |
python -m unittest discover
deploy:
runs-on: ubuntu-latest
needs: build-and-test
steps:
– name: Deploy to server
env:
SERVER: ${{ secrets.SERVER }}
USER: ${{ secrets.USER }}
PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
run: |
ssh -i $PRIVATE_KEY $USER@$SERVER “cd /path/to/app && git pull && systemctl restart app”
Steg 4: Lägg till requirements.txt
Lista dina beroenden:
flask unittest Steg 5: Konfigurera GitHub Secrets
- Gå till ditt GitHub-repository.
- Navigera till Settings > Secrets and variables > Actions.
- Lägg till följande hemligheter:
- SERVER: Din servers IP eller domän.
- USER: Användarnamn för servern.
- PRIVATE_KEY: Din SSH-nyckel.
Steg 6: Push och verifiera CI/CD
Lägg till och committa dina ändringar:
sh
git add . git commit -m "Set up CI/CD pipeline"Code language: JavaScript (javascript) git push origin main Navigera till Actions-fliken på GitHub för att se din pipeline köras.
Sammanfattande kod
Flask-app: app.py
from flask import Flaskapp = Flask(__name__)@app.route('/')def home(): return "Hello, CI/CD!"if __name__ == '__main__': app.run()Code language: JavaScript (javascript) Testfall: test_app.py
import unittestfrom app import appclass TestApp(unittest.TestCase): def test_home(self): tester = app.test_client() response = tester.get('/') self.assertEqual(response.status_code, 200) self.assertEqual(response.data.decode('utf-8'), "Hello, CI/CD!")if __name__ == '__main__': unittest.main() GitHub Actions-konfiguration: .github/workflows/ci_cd.yml
yaml
name: CI/CD Pipeline
on:
push:
branches:
– main
pull_request:
branches:
– main
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
– name: Checkout code
uses: actions/checkout@v3
– name: Set up Python
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
run: |
python -m unittest discover
deploy:
runs-on: ubuntu-latest
needs: build-and-test
steps:
– name: Deploy to server
env:
SERVER: ${{ secrets.SERVER }}
USER: ${{ secrets.USER }}
PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
run: |
ssh -i $PRIVATE_KEY $USER@$SERVER “cd /path/to/app && git pull && systemctl restart app”
Tips och vanliga fallgropar
Tips
- Håll testfall enkla och omfattande.
- Använd GitHub Secrets för att hantera känsliga data.
- Testa pipelines lokalt innan du deployar.
Vanliga fallgropar
- Fel i test: Kontrollera att alla testfall körs korrekt innan push.
- Beroenden saknas: Säkerställ att alla beroenden finns i
requirements.txt. - Felaktig serverkonfiguration: Verifiera att servern har korrekt SSH-åtkomst och rättigheter.
Andra säkerhetsåtgärder
- HTTPS: Använd Flask-SSLify eller annan metod för att tvinga HTTPS.
- Säkerhetsuppdateringar: Håll dina Python-paket uppdaterade för att undvika sårbarheter.
- Felhantering: Implementera en central felhanterare för att fånga upp och logga alla oväntade fel.
Sammanfattning
Den här guiden visar hur du kan ställa in en CI/CD-pipeline för en Flask-app med GitHub Actions. Pipelines automatiserar testning och deployment, vilket sparar tid och minskar risken för fel. Börja smått och bygg gradvis mer robusta pipelines för att hantera komplexare projekt.

