diff --git a/dk b/dk index ed8e49f..299a6e6 100755 --- a/dk +++ b/dk @@ -206,8 +206,7 @@ COMMANDES 70300 pour PHP 7.3 Si la valeur n'est pas spécifiée ou vaut 'none', elle est ignorée. * COMPOSER_IMAGE -- Image utilisée pour lancer composer. La valeur par - défaut est: - $DEFAULT_COMPOSER_IMAGE + défaut est $DEFAULT_COMPOSER_IMAGE Spécifier 'none' pour lancer directement composer sans passer par une image docker. L'image spécifiée doit disposer de la commande 'su-exec' afin de @@ -235,6 +234,41 @@ COMMANDES peuvent être utilisés pour redéfinir les variables COMPOSER_*, e.g $scriptname composer COMPOSER_IMAGE=none install + maven|mvn [args...] + Frontend pour lancer maven à l'intérieur d'un container. S'il existe un + fichier .maven.conf dans le répertoire du projet, il est sourcé. Ce + fichier définit des variables qui indiquent comment la commande mvn est + lancée. Les variables suivantes peuvent être définies: + * MAVEN_JAVA -- Version de java à sélectionner à l'intérieur de + l'image. Spécifier 'any' ou 'force' pour prendre la valeur par + défaut. Spécifier 'none' pour ne pas utiliser l'image + * MAVEN_IMAGE -- Image utilisée pour lancer mvn. La valeur par défaut + est $DEFAULT_MAVEN_IMAGE + Spécifier 'none' pour lancer directement mvn sans passer par une image + docker. + L'image spécifiée doit disposer de la commande 'su-exec' afin de + pouvoir lancer la commande avec l'utilisateur courant. Le répertoire + \$HOME est monté à l'intérieur du container + * MAVEN_MACHINE -- Nom de la docker machine sur laquelle se connecter + pour lancer l'image docker. La valeur par défaut est -u, ce qui force + l'utilisation de l'instance docker locale. + * MAVEN_CMD -- Chemin vers l'exécutable mvn. Par défaut, utiliser la + commande trouvée dans le PATH + * MAVEN_SETUP -- Liste de commandes à lancer pour configurer le + container. Dans ce cas, un container ayant pour base \$MAVEN_IMAGE + et nommé d'après le nom du projet est préparé et les commandes + spécifiées y sont lancées. Ce container est réutilisé à chaque fois. + Ce paramétrage est utilisé pour par exemple installer certains + packages nécessaire au projet. + La commande 'rshell' est une extension qui lance un shell bash au lieu + de lancer la commande mvn, ce qui permet de faire des opérations + plus complexes si le besoin s'en fait sentir. NB: le shell est lancé + avec l'utilisateur root. La commande alternative 'shell' lance le shell + avec le compte utilisateur. + Pour faciliter l'utilisation dans un script, les premiers arguments + peuvent être utilisés pour redéfinir les variables MAVEN_*, e.g + $scriptname maven MAVEN_IMAGE=none clean package + OPTIONS générales (ces options sont communes à toutes les commandes) -d, --chdir PROJDIR @@ -309,6 +343,13 @@ OPTIONS build COMPOSER_IMAGE= COMPOSER_CMD= COMPOSER_SETUP= + ## valeurs par défaut pour les projets maven + MAVEN_ACTION= # action projet maven (package|none) + MAVEN_ARGS=() # arguments de mvn + MAVEN_JAVA= + MAVEN_IMAGE= + MAVEN_CMD= + MAVEN_SETUP= ## pour chaque application définie dans APPS {app}_URL= # url du dépôt {app}_DEVEL_SRCDIR= # répertoire source du dépôt en mode devel @@ -322,7 +363,10 @@ OPTIONS build {app}_BRANCH= # branche à sélectionner pour le checkout {app}_ORIGIN= # origine de la branche à sélectionner {app}_TYPE= # type de projet (composer|none) - {app}_AFTER_UPDATE=() # liste de commandes à lancer après le checkout + {app}_BEFORE_BUILD=() # liste de commandes à lancer après le + # checkout et avant le build du projet (pour + # les types de projets supportés) + {app}_AFTER_UPDATE=() # liste de commandes à lancer après le build # valeurs pour les projets composer. ces valeurs remplacent le cas # échéant celles définies dans le fichier .composer.conf du projet {app}_COMPOSER_ACTION= @@ -332,6 +376,12 @@ OPTIONS build {app}_COMPOSER_IMAGE= {app}_COMPOSER_CMD= {app}_COMPOSER_SETUP= + {app}_MAVEN_ACTION= + {app}_MAVEN_ARGS=() + {app}_MAVEN_JAVA= + {app}_MAVEN_IMAGE= + {app}_MAVEN_CMD= + {app}_MAVEN_SETUP= Certaines valeurs peuvent être valuées selon le profil {profile}_CLEAN= {profile}_APPS=() @@ -351,6 +401,12 @@ OPTIONS build {app}_{profile}_COMPOSER_IMAGE= {app}_{profile}_COMPOSER_CMD= {app}_{profile}_COMPOSER_SETUP= + {app}_{profile}_MAVEN_ACTION= + {app}_{profile}_MAVEN_ARGS=() + {app}_{profile}_MAVEN_JAVA= + {app}_{profile}_MAVEN_IMAGE= + {app}_{profile}_MAVEN_CMD= + {app}_{profile}_MAVEN_SETUP= -u, --uu, --update-apps-only Ne faire que la mise à jour depuis les dépôts dépendants. -w, --ww, --update-apps-devel @@ -384,8 +440,10 @@ VARIABLES de update-apps.conf Pour toutes les variables de type BRANCH, utiliser la syntaxe ^COMMIT pour ignorer ORIGIN et sélectionner un commit en particulier TYPE - vaut 'composer' par défaut si le fichier composer.json existe à la - racine du projet. sinon vaut 'none' par défaut + la valeur par défaut dépend des fichiers présents à la racine du projet + - si un fichier composer.json existe, vaut 'composer' par défaut + - si un fichier pom.xml existe, vaut 'maven' par défaut + - sinon vaut 'none' par défaut AFTER_UPDATE Cette variable est une liste de commandes à lancer après la maj du dépôt - si le chemin est absolu ou relatif, lancer la commande telle quelle @@ -789,7 +847,8 @@ function build_update_apps() { fi etitle "Mise à jour des dépendances" - local app var URL SRC DEVEL_SRCDIR DEST NAME have_RSYNC_OPTS RSYNC_OPTS ORIGIN BRANCH TYPE after_update after_updates + local app var URL SRC DEVEL_SRCDIR DEST NAME have_RSYNC_OPTS RSYNC_OPTS ORIGIN BRANCH TYPE + local before_build before_builds after_update after_updates for app in "${APPS[@]}"; do etitle "$app" @@ -848,6 +907,7 @@ function build_update_apps() { # possible de détecter le type quand on a le projet # en cas de maj ici, mettre à jour aussi le code ci-dessous if [ -f "$DEST/composer.json" ]; then TYPE=composer + elif [ -f "$DEST/pom.xml" ]; then TYPE=maven else TYPE=none fi fi @@ -899,6 +959,7 @@ function build_update_apps() { # possible de détecter le type quand on a le projet # en cas de maj ici, mettre à jour aussi le code ci-dessus et ci-dessous if [ -f "$DEST/composer.json" ]; then TYPE=composer + elif [ -f "$DEST/pom.xml" ]; then TYPE=maven else TYPE=none fi fi @@ -949,6 +1010,7 @@ function build_update_apps() { # possible de détecter le type quand on a le projet # en cas de maj ici, mettre à jour aussi le code ci-dessus if [ -f "$DEST/composer.json" ]; then TYPE=composer + elif [ -f "$DEST/pom.xml" ]; then TYPE=maven else TYPE=none fi fi @@ -958,14 +1020,30 @@ function build_update_apps() { die "ni URL ni SRC ne sont définis" fi - after_updates="${var}_AFTER_UPDATE" - if is_defined "$after_updates"; then - after_updates="$after_updates[@]"; after_updates=("${!after_updates}") - elif [ "$TYPE" == composer ]; then - after_updates=(sqlmig) + before_builds="${var}_BEFORE_BUILD" + if is_defined "$before_builds"; then + before_builds="$before_builds[@]"; before_builds=("${!before_builds}") else - after_updates=() + before_builds=() fi + for before_build in "${before_builds[@]}"; do + if [ "${before_build#/}" != "$before_build" ]; then + # commande absolue, la lancer telle quelle + etitle "$before_build" + eval "$before_build" || { eend; eend; return 1; } + eend + elif [ "${before_build#./}" != "$before_build" ]; then + # commande relative, la lancer telle quelle + etitle "$before_build" + eval "$before_build" || { eend; eend; return 1; } + eend + else + # c'est une fonction update_apps_func_* + etitle "$before_build" + eval "update_apps_func_$before_build" || { eend; eend; return 1; } + eend + fi + done estep "Type de dépôt: $TYPE" if [ "$TYPE" == composer ]; then @@ -1007,8 +1085,56 @@ function build_update_apps() { cd "$cwd" fi fi + elif [ "$TYPE" == maven ]; then + local cvname cvvalue + local maven_java maven_image maven_cmd maven_setup maven_action + local -a maven_vars maven_args + + for cvname in maven_java maven_image maven_cmd maven_setup; do + cvvalue="${var}_${PROFILE}_${cvname^^}"; cvvalue="${!cvvalue}" + [ -n "$cvvalue" ] || { cvvalue="${var}_${cvname^^}"; cvvalue="${!cvvalue}"; } + [ -n "$cvvalue" ] || { cvvalue="${PROFILE}_${cvname^^}"; cvvalue="${!cvvalue}"; } + [ -n "$cvvalue" ] || { cvvalue="${cvname^^}"; cvvalue="${!cvvalue}"; } + [ -n "$cvvalue" ] && maven_vars+=("${cvname^^}=$cvvalue") + done + + maven_action="${var}_${PROFILE}_MAVEN_ACTION"; maven_action="${!maven_action}" + [ -n "$maven_action" ] || { maven_action="${var}_MAVEN_ACTION"; maven_action="${!maven_action}"; } + [ -n "$maven_action" ] || { maven_action="${PROFILE}_MAVEN_ACTION"; maven_action="${!maven_action}"; } + [ -n "$maven_action" ] || maven_action="$MAVEN_ACTION" + + maven_args="${var}_${PROFILE}_MAVEN_ARGS" + is_defined "$maven_args" || maven_args="${var}_MAVEN_ARGS" + is_defined "$maven_args" || maven_args="${PROFILE}_MAVEN_ARGS" + is_defined "$maven_args" || maven_args="MAVEN_ARGS" + maven_args="${maven_args}[@]"; maven_args=("${!maven_args}") + + if [ -z "$BUILD_UPDATE_DEVEL" ]; then + case "${maven_action:-p}" in + c|clean) maven_action=clean;; + po|package_only) maven_action=package;; + p|package) maven_action="clean package";; + none|nop) maven_action=;; + *) ewarn "$maven_action: action invalide"; maven_action=;; + esac + if [ -n "$maven_action" ]; then + setx cwd=pwd + cd "$DEST" + estep "Compilation du projet maven" + auto_maven "${maven_vars[@]}" $maven_action "${maven_args[@]}" || { eend; return 1; } + cd "$cwd" + fi + fi fi + after_updates="${var}_AFTER_UPDATE" + if is_defined "$after_updates"; then + after_updates="$after_updates[@]"; after_updates=("${!after_updates}") + elif [ "$TYPE" == composer ]; then + after_updates=(sqlmig) + else + after_updates=() + fi for after_update in "${after_updates[@]}"; do if [ "${after_update#/}" != "$after_update" ]; then # commande absolue, la lancer telle quelle @@ -1940,6 +2066,166 @@ exit((PHP_VERSION_ID < $version)? 0: 1); fi } +function default_local_maven() { + # lancement direct + case "$1" in + rootshell|rshell|rootbash|rbash) + shift + # ewarn parce qu'on est pas root dans ce shell contrairement à ce qui est demandé + ewarn "Lancement d'un shell utilisateur alors qu'un shell root est demandé" + bash "$@" + ;; + usershell|shell|userbash|bash) + shift + estep "Lancement d'un shell utilisateur" + bash "$@" + ;; + *) + [ -n "$MAVEN_CMD" ] || MAVEN_CMD=mvn + "$MAVEN_CMD" "$@" + ;; + esac +} +function default_docker_maven() { + # lancement dans un container + local user group projdir actualcmd args + setx user=id -un; setx user=getent passwd "$user" + setx group=id -gn; setx group=getent group "$group" + setx projdir=pwd + case "$1" in + rootshell|rshell|rootbash|rbash) + shift + actualcmd='eval "bash $args"' + ;; + usershell|shell|userbash|bash) + shift + actualcmd='eval "su-exec \"$user\" bash $args"' + ;; + *) + actualcmd='eval "su-exec \"$user\" \"$maven\" $args"' + ;; + esac + setx args=qvals "$@" + + local -a basecmd cmd setupscript runscript + basecmd=( + -e user="$user" + -e group="$group" + -e projdir="$projdir" + -e setup="$MAVEN_SETUP" + -e maven="$MAVEN_CMD" + -e args="$args" + ${MAVEN_JAVA:+-e JAVA="$MAVEN_JAVA"} + -v "$HOME:$HOME" + ) + if [ "${projdir#$HOME/}" == "$projdir" ]; then + # si le répertoire de projet ne se trouve pas dans $HOME, le monter aussi + cmd+=(-v "$projdir:$projdir") + fi + setupscript='eval "$setup"' + runscript=' +echo "$user" >>/etc/passwd; user="${user%%:*}" +echo "$group" >>/etc/group; group="${group%%:*}" + +[ -n "$maven" ] || maven=mvn + +cd "$projdir" +'"$actualcmd" + + if [ -n "$MAVEN_SETUP" ]; then + # lancement dans un container docker à préparer + local NAME project_name container_name dkid + if [ -f docker-compose.yml ]; then + compose_set_project_name set_container_name + else + NAME="$(basename -- "$(pwd)")" + docker_check_name set_container_name + fi + container_name="dk_maven_${container_name}" + + # vérifier l'existence de l'image + setx dkid=docker image ls --format '{{.ID}}' "${container_name}_image" + + # créer le container le cas échéant + if [ -z "$dkid" ]; then + estep "Création du container $container_name avec l'image $MAVEN_IMAGE" + cmd=( + "$DOCKER" create -it --name "${container_name}_ct" + "${basecmd[@]}" + "$MAVEN_IMAGE" + bash -c "$setupscript" + ) + setx dkid="${cmd[@]}" || return 1 + "$DOCKER" container start -ai "$dkid" || return 1 + "$DOCKER" container commit "$dkid" "${container_name}_image" || return 1 + "$DOCKER" container rm "$dkid" || return 1 + fi + + # prendre comme image le container créé + MAVEN_IMAGE="${container_name}_image" + fi + + cmd=( + "$DOCKER" run -it --rm + "${basecmd[@]}" + "$MAVEN_IMAGE" + bash -c "$runscript" + ) + "${cmd[@]}" +} +function local_maven() { default_local_maven "$@"; } +function docker_maven() { default_docker_maven "$@"; } +function auto_maven() { + local MAVEN_JAVA= + local MAVEN_IMAGE="$DEFAULT_MAVEN_IMAGE" + local MAVEN_MACHINE=-u + local MAVEN_CMD= + local MAVEN_SETUP= + [ -f .maven.conf ] && source ./.maven.conf + # les premiers arguments peuvent servir à redéfinir les variables + while [ $# -gt 0 ]; do + case "$1" in + MAVEN_JAVA=*) setv "$1"; shift;; + MAVEN_IMAGE=*) setv "$1"; shift;; + MAVEN_MACHINE=*) setv "$1"; shift;; + MAVEN_CMD=*) setv "$1"; shift;; + MAVEN_SETUP=*) setv "$1"; shift;; + *) break;; + esac + done + + local use_image + if [ "$MAVEN_JAVA" == force -o "$MAVEN_JAVA" == any ]; then + MAVEN_JAVA= + use_image=1 + elif [ "$MAVEN_JAVA" == none ]; then + MAVEN_JAVA= + use_image= + else + use_image=1 + fi + if [ -n "$use_image" ]; then + [ "$MAVEN_IMAGE" != none ] || die "Vous devez spécifier l'image à utiliser pour maven" + + local PREVIOUS_DOCKER_MACHINE_NAME="$DOCKER_MACHINE_NAME" + if [ -n "$MAVEN_MACHINE" -a "$DOCKER_MACHINE_NAME" != "$MAVEN_MACHINE" ]; then + local -x DOCKER_TLS_VERIFY= DOCKER_HOST= DOCKER_CERT_PATH= DOCKER_MACHINE_NAME= + if [ "$MAVEN_MACHINE" != -u ]; then + local env + setx env=docker-machine env "$MAVEN_MACHINE" 2>/dev/null || { + eerror "$MAVEN_MACHINE: une erreur s'est produite lors de la sélection du noeud avec docker-machine" + return 1 + } + eval "$env" + fi + fi + + docker_maven "$@" + else + local_maven "$@" + fi +} + ################################################################################ function resolve_dm_alias() { @@ -2013,8 +2299,8 @@ else DOCKER=docker fi DEFAULT_PROFILE=devel -# pour le moment ne pas lancer composer dans un container par défaut -DEFAULT_COMPOSER_IMAGE=none #docker.univ-reunion.fr/image/phpbuilder +DEFAULT_COMPOSER_IMAGE=docker.univ-reunion.fr/image/phpbuilder +DEFAULT_MAVEN_IMAGE=docker.univ-reunion.fr/image/javabuilder PROFILE= DM_ALIASES=() DM_PROFILES=() @@ -2545,6 +2831,16 @@ NR == 1 { print; next } done auto_composer "${args[@]}" ;; + maven|mvn) + build_set_options "$update_apps_mode" "$update_apps_origin" "$update_apps_branch" + [ -f .build.scripts.sh ] && source ./.build.scripts.sh + [ -f build.scripts.sh ] && source ./build.scripts.sh + args=() + while [ $# -gt 0 -a "$1" != -- ]; do + args+=("$1"); shift + done + auto_maven "${args[@]}" + ;; _*|*_) # transmettre directement à docker cmd="${cmd#_}"