## Formation python
### Ou comment créer un projet from scratch
## Sommaire
* Création d'un projet
* Ajouter une dépendance
* Containerisation + makefile
* ajout de tests
* CI
* Déploiement
## Pré-requis
* Vs Code
* python3 + poetry
* Docker + docker-compose
* Un compte Github + setup des clefs ssh
* Ajout de tests
* CI
* Déploiement
## Install Docker
```sh
# Install docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
# Install compose switch
curl -fsSL https://raw.githubusercontent.com/docker/compose-switch/master/install_on_linux.sh | sh
```
## Install Poetry
```sh
curl -sSL https://install.python-poetry.org | python3 -
```
## Vs Code plugins
* Dev Containers
* GitLens
* GitGraph
* Local History
## Créer un projet python en utilisant Poetry
https://python-poetry.org/
```sh
# See all commands
poetry
# See help
poetry help
# Ajouter une dépendance
poetry add --dev pytest
```
## Builder un projet
```sh
# Builder
poetry build
# Le publier sur Pypi
poetry publish
```
## Utiliser VsCode pour créer un dev container
## Utiliser VsCode pour créer un dev container depuis un dockerfile
```Dockerfile
FROM nexus.anotherbrain.lan/base/ubuntu20.04:2.0-python3.8
ENV REQUESTS_CA_BUNDLE /etc/ssl/certs/ca-certificates.crt
ENV POETRY_HOME /etc/poetry
RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=${POETRY_HOME} python3 - --version 1.3.2
# Make poetry available in PATH
ENV PATH "/etc/poetry/bin:$PATH"
# For VsCode
# https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user
ARG USERNAME=bhousin
ARG USER_UID=3029
ARG USER_GID=2012
# Create the user
# Also, install docker, and some tools, nano and openssh-client are required for git usage
RUN groupadd --gid $USER_GID $USERNAME \
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
&& apt-get update \
&& apt-get install --no-install-recommends -y \
git \
bash-completion \
sudo \
nano \
openssh-client \
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
&& chmod 0440 /etc/sudoers.d/$USERNAME \
&& apt-get autoremove -y\
&& apt-get clean \
&& rm -rf /var/lib/apt-get/lists/*
USER ${USERNAME}
WORKDIR /test_proj
ENV SHELL /bin/bash
```
## Créer un serveur de notebook avec un docker-compose
cf https://github.com/Hartorn/formation-python/tree/correction
pour comprendre ou rechercher en ligne
## Utiliser VsCode pour créer un dev container depuis docker-compose
## Ecrire un ou deux tests pythons + intégration VSCode (venv)
## Entrainement d'un modèle
* Récupérer et faire tourner le notebook d'entrainement
* Vérifier que le modèle a bien été save ainsi que la donnée
* (optionnel) Remettre les fonctions dans le projet en cleanant le notebook
## Mettre en place un serveur d'inférence
* Récupérer et faire tourner le notebook d'inference
* Préparer une fonction et tester sa stabilité pour un modèle donné (non regression)
* Créer une API REST en utilisant Fast et l'exposer
* L'appeler pour en faire un service supplémentaire
## Faire une CI
- Activer la CI avec CircleCI sur github (ou Github Actions)
- Mettre en place la validation de PR via la CI
- (Optionnel) Changer la gestion des droits, protéger la branche main, forcer le rebase + forcer la validation CI
## Avoir une image de production
- Construire une image de prod contenant le serveur d'inférence + le modèle
- La push sur le registry docker Github (ou Dockerhub ou autre)
- Creer une CI sur main buildant cette image et la pushant
## Héberger l'image en ligne
- Créer un service avec Heroku et l'héberger
- Regarder la doc Kubernetes et créer une YAML du déploiement (+ secret docker registry)
## Créer une infra + déployer
- Créer un compte GCP gratuit
- Utiliser Terraform pour créer un cluster gratuit sur GCP (!ne pas push les secrets ou le state)
- Déployer l'application
- Scale le nombre de replicas (puis unscale)
- "Acheter" un domain gratuit
- Comprendre la notion d'ingress, de zone dns, et de certificat (let's encrypt et cert manager)
- Essayer d'intégrer le maximum (pas forcément en Terraform)
- Quand le déploiement fonctionne, regarder la notion de HPA en Kubernetes et de node scaling