NOTRE JOB, VOUS AIDER À CHOISIR LE VÔTRE
A presentation at Meetup Python Rennes in November 2023 in Rennes, France by Jean-Luc Tromparent
NOTRE JOB, VOUS AIDER À CHOISIR LE VÔTRE
GitLab CI/CD sur un projet python microservice Retour sur 5 ans d’évolutions Jean-Luc Tromparent Antoine Coeur-Quetin
GitLab (des débuts à nos jours) 2011 2012 Dmitriy Zaporozhets lance Sytse Sijbrandij rejoint le un projet de partage de projet code Dmitriy créé la première 2014 2015 Gitlab Inc. GitLab 8.0 version de GitLab CI https://handbook.gitlab.com/handbook/company/history/ 2018 Microsoft rachete GitHub 2023 GitLab 16.4
Un projet Python (de la préhistoire à nos jours) TARS : Totally Awesome Recommendation System 2014 2015 2017 svn > git premier algo de migration azure portage en python hellowork.com monorepo redmine > gitlab recommandation lambda architecture microservice poetry réduction de la dette infogérance stack: c#, mongodb, redis stack: eventhub, stack: python, k8s v6 des sites emploi régionsjob stack tracking: nodejs, mongodb hdfs/spark 2018 2022 2023
Get started fichier .gitlab-ci.yml configuration d’un pipeline de CI séquence de stages et de jobs https://docs.gitlab.com/ee/ci/quick_start/
Un job de test test-job: stage: test script: - poetry install - poetry run python -m pytest -v coverage: ‘/^TOTAL.\s+(\d+%)\s$/’ artifacts: paths: - htmlcov/ coverage 77.00% —cov-report html:htmlcov —cov-fail-under $COVERAGE_MINIMUM_THRESHOLD_PERCENT
Architecture type de nos projets data un sous-projet librairie métier périmètre datascientist tests fonctionnels un sous-projet API (ou worker) périmetre data-ingé gestion des erreurs scalabilité containerization
Les livrables de notre projet de recommandation → des librairies Python publish-job: stage: release script: - poetry version $CI_COMMIT_TAG - poetry publish -r papaye —build only: - tags
Les livrables de notre projet de recommandation → des images Docker publish-job: stage: release script: - docker login ${NEXUS_URI} -u ${NEXUS_USER} -p ${NEXUS_PWD} - docker pull “${CI_PROJECT_NAME}:latest” || true - docker tag “${CI_PROJECT_NAME}:latest” “${NEXUS_URI}/${CI_PROJECT_NAME}:${CI_COMMIT_TAG}” - docker push “${NEXUS_URI}/${CI_PROJECT_NAME}:${CI_COMMIT_TAG}” only: - tags
Multi-project pipelines mylib/.gitlab-ci.yml trigger-job: myapi/.gitlab-ci.yml update_lib_version: stage: .post variables: LIB_VERSION: ${CI_COMMIT_TAG} stage: .pre script: - echo “Switch to lib version $LIB_VERSION” trigger: project: DataScience/myProject/myApi
Versioning release-job: stage: release script: # bumps the patch number of the semantic version of the project - poetry version patch - export NEW_VERSION=$(poetry version —short) 🔖
Architecture du projet REKO
Déploiement environnement de production image: infra k8s dispatch: 1.3.31 packaging: 1.3.38 template helm jadexplorer: 1.0.6 déploiement depuis gitlab offer2offer: 1.3.40 offer2user: 1.3.59 user2offer: 1.3.23 distributor: 1.3.15 feedcool: 1.3.8 feedcroo: 1.3.1 feedlsq: 1.3.12 reporter: 1.3.35 shipper: 1.3.32 watchdog: 1.3.5 feedjade: 1.3.31 upgradejade: 1.3.5 newusers: 1.3.15 refreshcache: 1.3.14 batchupjade: 1.3.11 keepintouch: 1.0.22 regurgitor: 0.0.12
Bilan 2018 - 2022 🍏 Le projet scale bien 🍏 Projet modulaire 🍎 MR portant sur plusieurs projets 🍎 Onboarding compliqué 🍎 Le déploiement n’est pas vraiment continuous
Gitlab CI/CD Migration vers un monorepo Pourquoi ?
Pourquoi un monorepo 40 projets Gitlab Duplication CI Beaucoup de trigger Pas de tag commun sur plusieurs projets Pourquoi maintenant Dette technique (Python 3.7) Projets transverses en étude : Log JSON, Lint, Sonarqube Migration Poetry Impose : modifications de la CI Permet : Imports relatifs dans la codebase
Le monorepo avec python Gerben Oostra (Gitlab) https://gitlab.com/gerbenoostra/poetry-monorepo David Vujic (Poetry) https://github.com/DavidVujic/pythonpolylith
Procédure de migration 1. Récupération de la codebase avec l’historique 2. Migration Poetry 3. Variables de CI 4. Template Helm (kubernetes) 5. Déploiement en preprod 6. Mise en production
Structure du repository TARS/ ├─ common/ ├─ k8s/ ├─ worker/ │ │ │ ├─ jade/ │ ├─ app/ │ ├─ core/ │ │ │ │ ├─ README.md │ └─ pyproject.toml └─ watchdog/ ├─ .gitlab-ci.yml ├─ pyproject.toml └─ README.md [tool.poetry] name = “jade” version = “1.5.0” readme = “README.md” packages = [ { include = “jade”, from = “core/” }, ] [tool.poetry.dependencies] python = “~3.10” requests = “2.25.1” workerrq = {path=”../../common/workerrq”}
pyproject.toml root Contient le paramétrage du formatter/LINT Permet de consolider les versions de dépendance Ne permet pas d’installer tous les projets [tool.poetry.group.worker.dependencies] jade = {path=”worker/jade”} watchdog = {path=”worker/watchdog”} [tool.poetry.group.api.dependencies] dispatch = {path=”api/dispatch”} packaging = {path=”api/packaging”} [tool.poetry.group.cronjob.dependencies] refreshcache = {path=”cronjob/refreshcache”} [tool.poetry.group.dev.dependencies] isort = “5.11.5” yapf = “^0.40.1” ruff = “^0.0.275” [tool.isort] line_length = 120 multi_line_output = 5 balanced_wrapping = false 😢
Gitlab CI/CD Migration vers un monorepo Le gitlab-ci.yml
🧪 🎨 👷 - deploy preprod 🏗️ - release 🔖 stages: - test - check - build
Difficultés 😭 Bien passé 😁 Fusion des projets Bonne généricité Alignement des versions de lib Fonctionnement ISO multi-repo Montée de version Python 3.8 globale Dé-duplication Mise en place de la CI RAF Revoir la fusion de certains projets Manque les projets de la datascience De la CI Des charts Des dockerfiles Merci les tests Poetry (Imports relatif, Bump2version, Tests …) Repo light (15 Mo) 15 projets déployables facilement
Merci Des questions ?
NOTRE JOB S’ARRÊTE LÀ OÙ COMMENCE LE VÔTRE