Skip to content

Commit

Permalink
Merge pull request #534 from cloud-pi-native/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
this-is-tobi committed Aug 1, 2023
2 parents 131481a + 88906b2 commit 5a0a733
Show file tree
Hide file tree
Showing 121 changed files with 4,538 additions and 1,973 deletions.
52 changes: 52 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,32 @@ jobs:
steps:
- name: Checks-out repository
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: "${{ env.NODE_VERSION }}"
check-latest: true
- name: Install pnpm
uses: pnpm/action-setup@v2
id: pnpm-install
with:
version: 7
run_install: false
- name: Get pnpm store directory
id: pnpm-cache
run: |
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_ENV
- name: Setup pnpm cache
uses: actions/cache@v3
with:
path: |
${{ env.STORE_PATH }}
/home/runner/.cache/Cypress
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Run component tests
run: |
./ci/scripts/init-env.sh
Expand All @@ -156,6 +182,32 @@ jobs:
steps:
- name: Checks-out repository
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: "${{ env.NODE_VERSION }}"
check-latest: true
- name: Install pnpm
uses: pnpm/action-setup@v2
id: pnpm-install
with:
version: 7
run_install: false
- name: Get pnpm store directory
id: pnpm-cache
run: |
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_ENV
- name: Setup pnpm cache
uses: actions/cache@v3
with:
path: |
${{ env.STORE_PATH }}
/home/runner/.cache/Cypress
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Run e2e tests
run: |
./ci/scripts/init-env.sh
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,6 @@ build

# plugins
apps/server/src/plugins/external

# integration helm values
env/dso-values-int.yaml
2 changes: 2 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,7 @@
"redhat.vscode-yaml",
// Makdown
"yzhang.markdown-all-in-one",
// Kubernetes
"ms-kubernetes-tools.vscode-kubernetes-tools",
]
}
191 changes: 125 additions & 66 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
# Console Cloud π Native

## Prérequis
La console Cloud π Native est une application web ayant pour but de piloter des services web dans un cluster Kubernetes afin de fournir une platefome cloud lors du développement de produits numériques.

Liste des outils utilisés par le projet à installer sur son ordinateur :

- Install [Docker](https://docs.docker.com/get-docker/)
- Install [Docker Compose Plugin](https://docs.docker.com/compose/install/)
- Install [Nodejs](https://nodejs.org/en/download/)
- Install [Pnpm](https://pnpm.io/installation)

## Architecture

Ce projet est construit avec [NodeJS](https://nodejs.org/), [VueJS](https://vuejs.org/), [Postgres](https://www.postgresql.org/) et construit sous forme d'images [Docker](https://www.docker.com/).
Ce projet est construit avec [NodeJS](https://nodejs.org/), [VueJS](https://vuejs.org/), [Postgres](https://www.postgresql.org/) et construit sous forme d'images [Docker](https://www.docker.com/) pour être déployé via [Helm](https://helm.sh/) dans [Kubernetes](https://kubernetes.io/).

### Liste des services docker
### Liste des services kubernetes

| Nom du service | Github project | Role | Utilisé en production |
| -------------- | ------------------------------------------------------------------------------- | ----------------------------------------- | --------------------- |
Expand All @@ -22,102 +16,138 @@ Ce projet est construit avec [NodeJS](https://nodejs.org/), [VueJS](https://vuej
| __server__ | [NodeJS](https://github.com/nodejs/node) | API de l'application | Oui |
| __client__ | [VueJS](https://github.com/vuejs/vue) / [Nginx](https://github.com/nginx/nginx) | Interface graphique de l'application | Oui |
| __keycloak__ | [Keycloak](https://github.com/keycloak/keycloak) | Gestionnaire d'authentification / d'accès | - |
| __cypress__ | [Cypress](https://github.com/cypress-io/cypress) | Tests de bout en bout | - |

### Architecture du dépôt
### API

La gestion des dépendances est effectuée à l'aide de [pnpm](https://pnpm.io/) selon la structure de dossiers suivante :
Le serveur est construit selon une architecture __core / plugins__ pour favoriser l'évolutivité et l'ajout de nouvelles fonctionnalités / la gestion de nouveaux services. Pour ce faire, les plugins s'enregistrent auprès de différents `hooks` (qui suivent le cycle de vie d'un projet au sein de l'application), ces derniers seront déclenchés par les contrôleurs de l'application.

- Les différentes briques applicatives se trouvent dans le dossier `apps/`
- Les bibliothèques additionnelles se trouvent dans le dossier `packages/`
Plusieurs plugins sont nativement enregistrés auprès du serveur pour assurer le bon fonctionnement de la plateforme, à savoir :
- [Argocd](https://argo-cd.readthedocs.io/en/stable/)
- [Gitlab](https://about.gitlab.com/)
- [Harbor](https://goharbor.io/)
- [Keycloak](https://www.keycloak.org/)
- [Kubernetes](https://kubernetes.io/)
- [Nexus](https://www.sonatype.com/products/sonatype-nexus-repository)
- [Sonarqube](https://www.sonarsource.com/products/sonarqube/)
- [Vault](https://www.vaultproject.io/)

*Schema de l'architecture du monorepo :*

```shell
├── apps
│ ├── client/
│ └── server/
├── packages
│ ├── test-utils/
│ ├── tsconfig/
│ └── shared/
├── node_modules/
├── package.json
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
├── turbo.json
├── README.md
...
```
> *Plus d'informations sur le développement d'un plugin [ici](./misc/plugins.md).*
## Développement

Le développement s'effectue directement dans un cluster Kubernetes à l'aide de Kind, un outil permettant de créer des noeuds Kubernetes dans des conteneurs Docker.

### Prérequis

Liste des outils utilisés par le projet à installer sur son ordinateur :

- [Docker](https://docs.docker.com/get-docker/) *- moteur d'exécution de conteneur*
- [Kind](https://kind.sigs.k8s.io/docs/user/quick-start/#installation) *- kubernetes dans Docker*
- [Kubectl](https://kubernetes.io/fr/docs/tasks/tools/install-kubectl/) *- interface en ligne de commande pour kubernetes*
- [Helm](https://helm.sh/docs/intro/install/) *- gestionnaire de paquets kubernetes*
- [Nodejs](https://nodejs.org/en/download/) *- environnement d'exécution javascript*
- [Pnpm](https://pnpm.io/installation) *- gestionnaire de paquets pour javascript*

> *Pour la gestion des versions de Nodejs, il est recommandé d'utiliser [Volta](https://volta.sh/).*
### Lancer l'application

Lancez les commandes suivantes dans votre terminal :

```shell
# Cloner le projet
git clone https://github.com/cloud-pi-native/console.git

# Se rendre dans le dossier du projet
cd dso-console
cd console

# Installer les dépendances du projet
pnpm install

# Copier les fichiers d'exemples
# Copier les fichiers d'environnement exemples
./ci/scripts/init-env.sh

# Construire les images docker
pnpm run dev:build
# Initialiser Kind (ajoute des noms de domaines dans /etc/hosts, le mot de passe sera demandé)
pnpm run kube:init

# Lancer l'application en mode développement
pnpm run dev
```

De nombreuses commandes sont disponible dans le fichier `package.json` à la racine du projet, vous pouvez lancer ces dernières à l'aide de la commande `pnpm run <le_nom_du_script>`.
Les commandes de test de l'application :

Pour faciliter les opérations de migrations de base de données via [Prisma](https://www.prisma.io/), un script est disponible :
```shell
# Lancer la vérification syntaxique
pnpm run lint

```sh
# Lancer le script
pnpm --filter server run db:wrapper
# Lancer les tests unitaires
pnpm run test

# Voir l'aide du script
pnpm --filter server run db:wrapper -h
# Lancer les tests de composants
pnpm run test:ct

# Lancer les tests de bout en bout
pnpm run test:e2e
```

### Accès aux services
Les commandes de suppression des ressources :

```shell
# Supprimer les ressources applicatives sans supprimer le cluster Kind
pnpm run kube:clean

# Supprimer entièrement le cluster et ses ressources
pnpm run kube:delete
```

Interface graphique (Client): <http://localhost:8080>
L'intégralité des commandes est disponibles dans le fichier [package.json](./package.json) à la racine du projet, vous pouvez lancer ces dernières à l'aide de la commande `pnpm run <le_nom_du_script>`.

Serveur (API) <http://localhost:4000>
### Accès aux services

Les services sont disponibles via des nom de domaines ajouté dans le fichier `/etc/hosts` de votre système, l'ajout des domaines ce fait automatiquement lors de la commande `pnpm run kube:init`.

Interface d'administration de base de données: <http://localhost:8081>
| Service | Url |
| ---------------------------------------------- | ----------------------- |
| Interface graphique *- (client)* | <http://dso.local> |
| Serveur *- (api)* | <http://dso.local/api> |
| Interface d'administration de base de données | <http://pgadmin.local> |
| Interface d'administration du serveur keycloak | <http://keycloak.local> |

Interface d'administration du serveur keycloak: <http://localhost:8090>
*__Notes:__ :warning: Il est possible que le navigateur utilisé (particulière Brave ou Firefox) bloque les cookies utilisés entre le frontend et keycloak, il est nécessaire de désactiver les protection de ce type dans votre navigateur (ex: Brave Shield).*

### Variables d'environnements

Plusieurs dossiers de variables d'environnements sont utilisés, à savoir :
- Le dossier `env/` continent les variables partagées entre différents conteneurs
- Le dossier `apps/server/env/` continent les variables de l'api
- Le dossier `apps/client/env/` continent les variables du client
Un chart Helm utilitaire est installé pour déployer les services qui ne sont pas inclus dans le chart de la console :
- Keycloak
- Pgadmin

> *Ces services sont personnalisables [ici](./ci/helm/utils/values.yaml).*
Chacun de ces dossiers comprend lui même différents fichiers, à savoir :
- Le fichier `.env` contient les variables pour le développement
- Le fichier `.env.ci` contient les variables pour la CI/CD
- Le fichier `.env.int` contient les variables pour l'intégration
Différents fichiers de `values.yml` sont disponibles pour personnaliser le déploiement de l'application dans le cluster Kind:
- Le fichier [env/dso-values-dev.yaml](./env/dso-values-dev.yaml) contient les variables de l'application pour le mode développement.
- Le fichier [env/dso-values.yaml](./env/dso-values.yaml) contient les variables de l'application pour le mode production.
- Le fichier [env/dso-values-int-example.yaml](./env/dso-values-int-example.yaml) contient les variables de l'application pour le mode intégration.

## Gestion des conteneurs docker
*__Notes:__ Un fichier d'environnement `./env/.env` est disponible pour fournir le chemin d'accès vers la `kubeconfig` du cluster d'intégration.*

Ce dépôt utilise des fichiers docker-compose, ils sont listés dans le dossier `./docker/` en tant que `docker-compose.*.yml` :
### Base de données

- [docker-compose.dev.yml](./ci/docker/docker-compose.dev.yml) pour le mode développement
- [docker-compose.ct.yml](./ci/docker/docker-compose.ct.yml) pour les tests de composant sans interface graphique
- [docker-compose.e2e.yml](./ci/docker/docker-compose.e2e.yml) pour les tests e2e avec interface graphique
- [docker-compose.ci.yml](./ci/docker/docker-compose.ci.yml) pour les tests e2e sans interface graphique
- [docker-compose.int.yml](./ci/docker/docker-compose.int.yml) pour les tests d'intégration dans un cluster kubernetes provisionné des services annexes à la console
- [docker-compose.prod.yml](./ci/docker/docker-compose.prod.yml) pour la construction des images docker
Pour faciliter les opérations de migrations de base de données via [Prisma](https://www.prisma.io/), un script est disponible :

```shell
# Lancer le script
pnpm --filter server run db:wrapper

# Voir l'aide du script
pnpm --filter server run db:wrapper -h
```

### Construction des images

Ce dépôt utilise des fichiers docker-compose pour construire les images docker:

- [docker-compose.dev.yml](./ci/docker/docker-compose.dev.yml) pour la construction des images docker du mode développement.
- [docker-compose.prod.yml](./ci/docker/docker-compose.prod.yml) pour la construction des images docker du mode production.

## Configuration du Keycloak

Expand All @@ -143,15 +173,44 @@ Les utilisateurs faisant parti du group `admin` ont également accès à l'inter
| **ArgoCD** | | | (infra) Secret, AppProject, Application | |
| **Gitlab** | Group | | Repository (Dépôt) | User |
| **Harbor** | Project | | Repository [1] | |
| **Ldap** | Group | | | User / memberof |
| **Keycloak** | | Group | | User / member |
| **Sonar** | User | | | |
| **Nexus** | Repositories, role, user ... | | | |

[1] N'est pas crée par la console mais par le produit de la CI

## Architecture du dépôt

La gestion des dépendances est effectuée à l'aide de [pnpm](https://pnpm.io/) selon la structure de dossiers suivante :

- Les différentes briques applicatives se trouvent dans le dossier `apps/`
- Les bibliothèques additionnelles se trouvent dans le dossier `packages/`

*Schema de l'architecture du monorepo :*

```shell
├── apps
│ ├── client/
│ └── server/
├── packages
│ ├── test-utils/
│ ├── tsconfig/
│ └── shared/
├── node_modules/
├── package.json
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
├── turbo.json
├── README.md
...
```

## Conventions

Cf. [Conventions - MIOM Fabrique Numérique](https://projets-ts-fabnum.netlify.app/conventions/nommage.html).

## Contributions

Les commits doivent suivre la spécification des [Commits Conventionnels](https://www.conventionalcommits.org/en/v1.0.0/), il est possible d'ajouter l'[extension VSCode](https://github.com/vivaxy/vscode-conventional-commits) pour faciliter la création des commits.

Une PR doit être faite avec une branche à jour avec la branche develop en rebase (et sans merge) avant demande de fusion, et la fusion doit être demandée dans develop.
Une PR doit être faite avec une branche à jour avec la branche `develop` en rebase (et sans merge) avant demande de fusion, et la fusion doit être demandée dans `develop`.
4 changes: 1 addition & 3 deletions apps/client/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Base stage
FROM docker.io/node:18.16.1-bullseye-slim AS base

RUN npm install --location=global pnpm
RUN npm install --location=global pnpm@8.6.10
WORKDIR /app
RUN chown node:node /app
COPY --chown=node:node pnpm-workspace.yaml pnpm-lock.yaml .npmrc ./
Expand Down Expand Up @@ -34,9 +34,7 @@ RUN pnpm --filter client run build
FROM docker.io/bitnami/nginx:1.24.0 AS prod

USER 0
RUN apt update && apt install -y gettext-base
COPY --chown=1001:0 --chmod=770 --from=build /app/apps/client/dist /opt/bitnami/nginx/html/
COPY --chown=1001:0 --chmod=660 ./apps/client/nginx/default.conf.tpl /default.conf.tpl
COPY --chown=1001:0 --chmod=660 ./apps/client/nginx/default.conf /opt/bitnami/nginx/conf/server_blocks/default.conf
COPY --chown=1001:0 ./apps/client/nginx/entrypoint.sh /docker-entrypoint-initdb.d/load-env.sh
USER 1001
Expand Down
3 changes: 0 additions & 3 deletions apps/client/cypress.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,6 @@ export default defineConfig({
chromeWebSecurity: false,
experimentalModifyObstructiveThirdPartyCode: false,
experimentalWebKitSupport: false,
// setupNodeEvents (on) {
// on('file:preprocessor', vitePreprocessor(fileURLToPath(import.meta.url)))
// },
env: {
argocdUrl,
gitlabUrl,
Expand Down
Loading

0 comments on commit 5a0a733

Please sign in to comment.