dk: début support projets maven

This commit is contained in:
Jephté Clain 2021-01-29 12:10:15 +04:00
parent ad44a1c2e5
commit f1a9c7a5e5
1 changed files with 310 additions and 14 deletions

324
dk
View File

@ -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#_}"