Application install from git repo

Request description

Boujour,

Suite à l’installation de simplicité 5 via docker-compose en local sur mon poste, je cherche à déployer différents modules applicatifs dont les sources sont disponibles dans différents repo git.

Steps to reproduce

This request concerns an up-to-date Simplicité instance
and these are the steps to reproduce it:

J’ai :
1/ git pull les différents repo sur mon poste
2/ j’ai ensuite essayé de les prendre en compte via l’import XML du fichier xml (pas le pom.xml, le fichier de description simplicite) à la racine des modules

L’import du module de base à fini en erreur (bien que les logs ne montrent rien d’anormal)

Technical information

flow_20221125_170222.log (1.0 MB)

Merci
Cordialement

Il y a de nombreuses manières de packager/déployer un ou plusieurs modules.

Au niveau packaging, pour simplifier, il y a 2 formats de package pour un module:

  • Soit un fichier unique XML ou JSON contenant tout le paramétrage et le code et les ressources inlinés (en texte brut ou en base64) à l’intérieur, c’est un format parfois pratique car mono-fichier mais c’est pas très exploitable humainement et ça aboutit parfois à de très gros volumes car base64 est verbeux.

  • Soit une arborescence de fichiers avec un fichier XML ou JSON à la racine contenant le paramétrage et référençant des chemins relatifs vers les fichiers du code et des ressources. Ceux-ci étant éclatés dans une arborescence humainement exploitable (i.e. structuré en projet Maven) => c’est ce format qui est utilisé dans les exports ZIP/tar.gz et dans les repos Git

Pour importer un module dans le second format il ne suffit pas d’importer le XML/JSON à la racine car il va lui manquer le reste. Il faut donc importer un ZIP contenant l’ensemble de l’arborescence (i.e. la même chose qu’un export ZIP) ou passer par les mécanismes Git qui gèrent l’intégralité de l’arborescence du repo (l’idéal quand on parle de repo Git sur GitHub c’est de fonctionner - comme c’est le cas sur l’instance de dev - avec des URL et une clé SSH associé à ton compte GitHub, sinon c’est aussi possible d’utiliser une URL HTTPS et un user token GitHub)

Pour ce qui est de l’import d’une application complète = d’une “grappe” de modules, le bon outil pour automatiser dans un contexte Docker est l’ “importspec”. cf. Simplicité® documentation/90-operation/docker-tutorial

Ca permet de livrer un container qui embarque ou référence les modules à importer au démarrage. Pour que ça marche il faut une gestion rigoureuse des numéros de version car c’est là dessus que ce base l’algo de l’importspec pour savoir s’il a besoin ou pas d’importer les modules

Typiquement dans le cas qui nous intéresse le descripteur de l’importspec ressemblera à ça:

modules:
  - name: TdfInfra
    version: "<la version du module>"
    git:
      uri: "git@github.com:simplicitesoftware-projects/module-tdfinfra.git"
  - name: TdfInfraAnomalies <===== ZZZ à voir pour celui là ZZZ
    version: "<la version du module>"
    git:
      uri: "git@github.com:simplicitesoftware-projects/module-tdfinfra-anomalies.git"
  - name: TdfInfraFrontend
    version: "<la version du module>"
    git:
      uri: "git@github.com:simplicitesoftware-projects/module-tdfinfra-frontend.git"
  - name: TdfInfraHELIOS
    version: "<la version du module>"
    git:
      uri: "git@github.com:simplicitesoftware-projects/module-tdfinfra-helios.git"
  - name: TdfInfraREFACCES
    version: "<la version du module>"
    git:
      uri: "git@github.com:simplicitesoftware-projects/module-tdfinfra-refacces.git"

Sinon il faut à minima les importer (manuellement ou via appels curl sur I/O cf. Simplicité® documentation/02-integration/io-commandline) dans le bon ordre pour respecter les dépendances entre modules.

PS:

Dans le cas présent il va y avoir un besoin de customisation de l’image Docker standard car il va falloir ajouter les datasources supplémentaires qui pointent vers les bases externes : HELIOS, REFACCES et autres (?)

Pour ça il faudra un Dockerfile du genre:

FROM registry.simplicite.io/platform:5-latest
COPY datasources.xml /tmp/
RUN sed -i '/extraresources/r /tmp/datasources.xml' /usr/local/tomcat/webapps/ROOT/META-INF/context.xml && \
    rm -f /tmp/datasources.xml

Avec datasources.xmldu genre:

        <!-- datasource HELIOS -->
        <Resource
                name="HELIOS"
                type="javax.sql.DataSource"
                auth="Container"
                driverClassName="oracle.jdbc.driver.OracleDriver"
                url="jdbc:oracle:thin:@<host>:<port>:<sid>"
                username="<user>"
                password="<password>">
        </Resource>

        <!-- datasource REFACCES -->
        <Resource
                name="REFACCES"
                type="javax.sql.DataSource"
                auth="Container"
                driverClassName="oracle.jdbc.driver.OracleDriver"
                url="jdbc:oracle:thin:@<host>:<port>:<sid>"
                username="<user>"
                password="<password>">
        </Resource>

NB: Par défaut on embarque un driver Oracle à jour (actuellement 21.7.0.0) dans nos images Docker (dans /usr/local/tomcat/lib), si ça ne convient pas pour les bases en question (je ne vois pas de raison à priori, mais on ne sait jamais) il faudra aussi mettre en place le remplacement de ce driver par celui qui va bien dans la customisation de l’image ci-dessus.

Bonjour David,

J’ai donc ajouté ce bloc module dans mes variables d’env pour le service simplicite du docker-compose, j’ai ajouté les volumes me permettant de faire du git clone dans le conteneur (clef privée, know_host, etc…)
Au lancement j’ai curieusement des erreurs de git checkout master sur les 5 modules

Caused by: org.eclipse.jgit.api.errors.RefNotFoundException: Ref master cannot be resolved
at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:223)
at com.simplicite.util.tools.GitTool.checkout(GitTool.java:883)
… 46 more

2022-11-29 20:36:04,174|SIMPLICITE|ERROR|Error during module TdfInfra import
2022-11-29 20:36:04,247|SIMPLICITE|ERROR|Error during module TdfInfraAnomalies import
2022-11-29 20:36:04,324|SIMPLICITE|ERROR|Error during module TdfInfraFrontend import
2022-11-29 20:36:04,380|SIMPLICITE|ERROR|Error during module TdfInfraHELIOS import
2022-11-29 20:36:04,437|SIMPLICITE|ERROR|Error during module TdfInfraREFACCES import

J’imagine que l’outil git utilisé dans la JVM ne voit pas la conf ssh du conteneur hôte.
Y a t-il une manière de configurer les modules dans le docker-compose pour faire référence à la conf ssh du conteneur hôte de la JVM ?

Autre question, je vois bien l’usage de cette configuration pour une plateforme d’intégration/recette
Par contre sur un environnement de dèv, comment les modifications faites par les développeurs sont elles repoussées dans les différentes modules git ? c’est prise en charge par l’IHM d’admin simplicité ?

Merci
Stéphane

Il est possible de monter un volume sur le .ssh, cf. Simplicité® documentation/90-operation/docker

Sur l’autre question il faut voir avec les devs comment ils se sont organisés pour travailler sur les différents modules, sachant que pour le moment j’ai gardé la main sur TdfInfraHELIOS et TdfInfraREFACCES

Désolé mais j’ai toujours mon problème de git :frowning:
J’ai fait le montage comme précisé dans la doc

volumes:
  - .ssh:/usr/local/tomcat/.ssh:ro

et ajouté la var d’env

  SSH_KNOWN_HOSTS: "github.com"

Lorsque lance le conteneur le répertoire .ssh est bien présent à la fois dans tomcat et dans /root
Si je fais un git clone ça marche bien
Par contre dans les logs de l’appli

Caused by: org.eclipse.jgit.api.errors.RefNotFoundException: Ref master cannot be resolved
at org.eclipse.jgit.api.CheckoutCommand.call(CheckoutCommand.java:223)
at com.simplicite.util.tools.GitTool.checkout(GitTool.java:883)
… 46 more

J’ai bien vu le thread https://community.simplicite.io/t/probleme-connexion-gitlab/2986/2
J’ai essayé de convertir ma clef OPENSSH en RSA et ça ne fonctionne pas mieux

Je vois bien les répertoires créés

./webapps/ROOT/WEB-INF/git/TdfInfra
./webapps/ROOT/WEB-INF/git/TdfInfraREFACCES
./webapps/ROOT/WEB-INF/git/TdfInfraFrontend
./webapps/ROOT/WEB-INF/git/TdfInfraHELIOS
./webapps/ROOT/WEB-INF/git/TdfInfraAnomalies

Il y a bien un répertoire .git dedans mais c’est tout

docker-compose.yaml (1.8 KB)

“Si je fais un git clone ça marche bien” => tu veux dire un git clone manuel en ligne de commande dans le container ? sinon quelle est la manip que tu fais ?

Alternativement il est aussi possible d’utiliser une URI GitHub en https:// et une authent/ident via un personal access token GitHub plutôt que via clé SSH, il faut changer les settings en :

{
  "type": "git",
  "origin": {
    "uri": "https://github.com/simplicitesoftware-projects/module-tdfinfra.git",
    "username": "<my usename>",
    "password": "<my user token>",
  }
}

Sinon il reste toujours possible de faire les imports autrement que via Git depuis GitHub = via des fichiers ZIP par exemple.

Le mieux serait qu’on regarde ça en live lors du call de demain matin 9:45

Oui un git clone dans le conteneur justement pour vérifier que le conf ssh est bonne dans le conteneur

J’ai bien essayé de faire avec username et mot de passe mais github ne m’autorise pas ce type de clone (règle de sécu interne visiblement)

Ok pour le debug inline demain

Il faut obligatoirement utiliser un personal access token à la place du mot de passe pour les URI GitHub en https://, cf. Creating a personal access token - GitHub Docs

Sinon il faut peut être forcer la suppression du répertoire clone dans le répertoire git dans le container (ex: s’il reste des choses de manips précédentes)

J’ai fait pas mal de docker-compose down -v pour repartir à blanc
J’avais pas vu le personal access token, je vais regarder

Ce qui est bizarre c’est que si ça clone en ligne de commande dans le container ça devrait aussi marcher au niveau de la lib jGit dans Simplicité sauf si le format de la clé SSH n’est pas gérée par jGit ou autre subtilité qui m’échappe.

Perso, avec GitHub j’utilise des clés au format Ed25519 (générées via ssh-keygen -t ed25519) plutôt que RSA.

Bon je viens de retester avec un clef RSA

-----BEGIN RSA PRIVATE KEY-----
MIIG5QIBAAKCAYEA4a0dM+E5jDFQlh2dvBLnGPpar1WV9Ue9iTXsuCZKDX2lexI8
ohqS5DRWUrr+X80pW9xRQvGxPzAcli8bijlKjZxz4A3gM8dUL4WAYWF2ijm52HIm
H2mRSAxjgf2zAEgPxeKZKyQFA72DVeT/AcZRCpjUiPREH1RbVBmqka6WSnRrc6yc

→ KO

Et un clef Ed25519
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACBXPq5WhXsoGJ4RlZ0KYTWZtQJDxg/o0QVkpI2tuZ2aXwAAAJhVFPeHVRT3

→ KO

:frowning:

Je fais des tests et je te dis

Juste pour être sûr, on est bien d’accord que ta clé SSH n’a pas de passphrase ?

A noter que dans ce cas là le 1er message est du type “Given passphrase cannot decrypt identity /root/.ssh/id_rsa”

OK j’ai compris !

C’est un pb de known host que jGit (ou la lib SSH sous jacente = jSch) vérifie (mais que le CLI git ne doit sans doute pas vérifier).

Si on monte le répertoire .ssh en readonly (:ro) la mécanique liée à la variable d’environnement SSH_KNOWN_HOSTS ne peut pas marcher car elle ne peut pas écrire le fichier known_hosts dans le répertoire .ssh.

Donc 2 solutions:

  1. avoir déjà github.com dans le fichier known_hosts dans le répertoire .ssh hôte qui pourra alors effectivement être monté en read only (un simple ssh github.com sur l’hôte permet de l’ajouter)

  2. monter le répertoire .ssh avec les droits d’écriture et la variable d’environnement SSH_KNOWN_HOSTS positionée (à github.com)

J’ai testé 1) ça marche, 2) j’ai pas testé mais ça devrait le faire aussi (mais j’aime moins l’idée d’un montage pas en read only)

On va préciser/corriger ça dans la doc

Mmm pourtant j’ai bien github dans mon known_hosts
Je vais refaire des tests ce soir…

Oui à la réflexion je suis aussi un peu perplexe car je crois me rappeler qu’on avait fait en sorte de recopier le .ssh depuis son point de montage justement pour rendre la création/modification du known_hosts possible. Comme j’ai aussi fait des manips dans le container j’ai peut être faussé le test.

Je vais regarder ça de plus près, en tout cas c’est forcément cette histoire de check du known hosts qui diffère entre jGit et le CLI git : Il y a peut être un truc à la noix lié au mécanisme (qui a été ajouté récemment) qui permet d’exécuter Tomcat soit en root (mode par défaut historique) soit avec un user “normal” (simplicite)

Je te tiens au courant

Bonjour

Nous sommes en train de revoir la manière dont on gère les clés SSH dans nos images Docker. Il y a une combinatoire de cas d’usage assez important qu’on ne doit pas faire régresser, donc ça ne sera pas poussé tout de suite.

Dans le cas qui nous intéresse il faudra faire un truc du genre:

  simplicite:
    image: registry.simplicite.io/platform:5-latest
    environment:
(...)
      SSH_KNOWN_HOSTS: "github.com"
    volumes:
(...)
      - ./.ssh/id_ed25519:/usr/local/tomcat/.ssh/id_ed25519:ro

J’ai testé avec ce type de config en mode “manuel” (= création du module via la UI + clone/pull Git + import) et ça fonctionne avec les URI en mode SSH (la clé SSH en question est connue au niveau de mon compte GitHub).

Je testerai le cas du mode “automatisé” via l’importspec un peu plus tard mais ça repose sur les mêmes mécanismes sous jacents.

Il y a de toute façon encore quelques petites coquilles de paramétrage dans les modules de nature à faire planter l’import, je corrige quand j’en vois passer, à date il n’y en a plus mais mais le dev continue donc ça peut revenir.

Sinon je suis aussi en train de préparer ce qu’il faut pour builder l’image avec les datasources additionnels vers les bases externes. Je compéterai ce post quand ce sera au point.

Bonjour David,

J’ai refait une installation locale avec la dernière image et pullé les repo distants par création des modules manuellement et saisie d’un setting type
TdfInfra
{
“type”: “git”,
“origin”: { “uri”: “git@github.com:simplicitesoftware-projects/module-tdfinfra.git” }
}

Une fois tous les modules chargés (a priori correctement, les logs semblent ok) je ne vois pas de menu vision360, y a t-il quelque chose d’autre à faire ?

image

Merci
Stéphane

Après installation de modules il faut faire un clear cache global (gros bouton rouge):