-
Notifications
You must be signed in to change notification settings - Fork 0
148 lines (129 loc) · 5.17 KB
/
Copy pathci-cd.yml
File metadata and controls
148 lines (129 loc) · 5.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# =============================================================================
# GitHub Actions - Pipeline CI/CD pour OC Lettings
# =============================================================================
# Ce workflow s'exécute automatiquement à chaque push et pull request.
# Il comprend 3 jobs principaux :
# 1. test : Exécute les tests et le linting
# 2. build : Construit et pousse l'image Docker sur Docker Hub
# 3. deploy : Déploie l'application sur Render (uniquement sur master)
# =============================================================================
name: CI/CD Pipeline
# Déclencheurs du workflow
on:
push:
branches:
- master # Déclenche sur push vers master
pull_request:
branches:
- master # Déclenche sur PR vers master
# Variables d'environnement globales
env:
DOCKER_IMAGE: ${{ secrets.DOCKER_USERNAME }}/oc-lettings
POETRY_VERSION: "1.8.4"
jobs:
# ===========================================================================
# JOB 1: Tests et Linting
# ===========================================================================
# Ce job vérifie la qualité du code avant de procéder au build
test:
name: Tests & Linting
runs-on: ubuntu-latest
steps:
# Étape 1: Récupérer le code source
- name: Checkout code
uses: actions/checkout@v4
# Étape 2: Configurer Python
- name: Set up Python 3.13
uses: actions/setup-python@v5
with:
python-version: '3.13'
# Étape 3: Installer Poetry
- name: Install Poetry
uses: snok/install-poetry@v1
with:
version: ${{ env.POETRY_VERSION }}
virtualenvs-create: true
virtualenvs-in-project: true
# Étape 4: Charger le cache des dépendances
- name: Load cached venv
id: cached-poetry-dependencies
uses: actions/cache@v4
with:
path: .venv
key: venv-${{ runner.os }}-${{ hashFiles('**/poetry.lock') }}
# Étape 5: Installer les dépendances (si pas en cache)
- name: Install dependencies
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'
run: poetry install --no-interaction --no-root
# Étape 6: Linting avec flake8
# Vérifie le style de code et les erreurs potentielles
- name: Run flake8 linting
run: |
poetry run python -m flake8
# Étape 7: Exécuter les tests avec couverture
- name: Run tests with coverage
env:
SECRET_KEY: test-secret-key-for-ci
DEBUG: 'True'
run: |
poetry run python -m pytest --cov --cov-fail-under=99
# ===========================================================================
# JOB 2: Build et Push Docker Image
# ===========================================================================
# Ce job construit l'image Docker et la pousse sur Docker Hub
# Ne s'exécute que si les tests passent ET uniquement sur la branche master
build:
name: Build & Push Docker Image
runs-on: ubuntu-latest
needs: test # Attend que les tests passent
if: github.ref == 'refs/heads/master' && github.event_name == 'push'
steps:
# Étape 1: Récupérer le code source
- name: Checkout code
uses: actions/checkout@v4
# Étape 2: Configurer Docker Buildx (pour le build multi-plateforme)
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# Étape 3: Se connecter à Docker Hub
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# Étape 4: Extraire les métadonnées pour les tags
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.DOCKER_IMAGE }}
tags: |
# Tag avec le SHA court du commit (ex: abc1234)
type=sha,prefix=
# Tag 'latest' pour la branche master
type=raw,value=latest,enable={{is_default_branch}}
# Étape 5: Build et Push de l'image Docker
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
# Cache des layers Docker pour accélérer les builds
cache-from: type=gha
cache-to: type=gha,mode=max
# ===========================================================================
# JOB 3: Déploiement sur Render
# ===========================================================================
# Ce job déclenche le déploiement sur Render via un webhook
# Ne s'exécute que si le build Docker réussit
deploy:
name: Deploy to Render
runs-on: ubuntu-latest
needs: build # Attend que le build Docker soit terminé
if: github.ref == 'refs/heads/master' && github.event_name == 'push'
steps:
# Déclencher le déploiement via le webhook Render
- name: Deploy to Render
run: |
curl -X POST "${{ secrets.RENDER_DEPLOY_HOOK_URL }}"