diff --git a/CHANGES.md b/CHANGES.md index 591adeb..ee9a90d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,25 @@ +## Version 11.1.0 du 01/02/2024-20:59 + +* `8570d12` pff: les répertoires liés peuvent contenir des fichiers +* `5d6c6b4` synchroniser pff et nulib/pff +* `90bda71` pff: support des répertoires liés +* `7d7b88a` autoriser les feature branches qui commencent par wip/ +* `5cc1826` dk et dkbuild: support .composer.yaml et setup_image +* `0bf0f48` dk: support ~/.dkbuild.env +* `b818e11` dkbuild: ajout de --plain +* `ad14de3` dkbuild: configuration profil prod par défaut +* `54a5b54` Sscreen: support des cas où screen n'est pas dans le PATH +* `5a06851` dkbuild: support profil par défaut +* `a855b04` dkbuild: les versions de profil sont ordonnées comme les versions de distribution +* `e531553` dkbuild: sans --all-profiles, ne build que dans le profil par défaut +* `db1467b` bug +* `3123d8e` dkbuild: mappings par défaut +* `d9b1485` charnière entre java 8 et java 11 +* `744a3fa` dkbuild: indiquer si la version de Java demandée n'est pas trouvée +* `2803868` dkbuild: marquer plus d'action comme étant du build +* `4f7bc3f` dkbuild: bug avec -u seul +* `8cdc3cb` modifs.mineures sans commentaires + ## Version 11.0.0 du 05/09/2023-14:29 * `ddfbc00` maj des images par défaut dk et dkbuild diff --git a/Sscreen b/Sscreen index d3c8833..d31359e 100755 --- a/Sscreen +++ b/Sscreen @@ -18,15 +18,25 @@ function __ask() { } function __auto_screen() { + # Si on est déjà dans screen, ne rien faire + [ -z "$STY" ] || return + # Si screen pas installé, ne rien faire - if [ -z "$(which screen 2>/dev/null)" ]; then + local dir screen="$(which screen 2>/dev/null)" + if [ -z "$screen" ]; then + for dir in /usr/local/bin /opt/bin /usr/bin /bin; do + if [ -x "$dir/screen" ]; then + screen="$dir/screen" + PATH="$PATH:$dir" + break + fi + done + fi + if [ -z "$screen" ]; then echo "${COULEUR_JAUNE}WARNING${COULEUR_NORMALE} screen introuvable. une session bash classique sera lancée" exec /bin/bash -l fi - # Si on est déjà dans screen, ne rien faire - [ -z "$STY" ] || return - # corriger TERM pour les vieilles versions de Linux case "$TERM" in xterm*) TERM=xterm;; diff --git a/VERSION.txt b/VERSION.txt index 275283a..68d8f15 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -11.0.0 +11.1.0 diff --git a/dk b/dk index c072cf8..781dc9b 100755 --- a/dk +++ b/dk @@ -230,6 +230,7 @@ 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. + * COMPOSER_SETUP_IMAGE -- nom final de l'image pour COMPOSER_SETUP La commande 'rshell' est une extension qui lance un shell bash au lieu de lancer la commande composer, ce qui permet de faire des opérations plus complexes si le besoin s'en fait sentir. NB: le shell est lancé @@ -267,6 +268,7 @@ 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. + * MAVEN_SETUP_IMAGE -- nom final de l'image pour MAVEN_SETUP 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é @@ -1083,10 +1085,10 @@ function build_update_apps() { estep "Type de dépôt: $TYPE" if [ "$TYPE" == composer ]; then local cvname cvvalue - local composer_php composer_php_max composer_image composer_cmd composer_setup composer_action + local composer_php composer_php_max composer_image composer_cmd composer_setup composer_setup_image composer_action local -a composer_vars composer_args - for cvname in composer_php composer_php_max composer_image composer_cmd composer_setup; do + for cvname in composer_php composer_php_max composer_image composer_cmd composer_setup composer_setup_image; do cvvalue="${var}_${PROFILE}_${cvname^^}"; cvvalue="${!cvvalue}" [ -n "$cvvalue" ] || { cvvalue="${var}_${cvname^^}"; cvvalue="${!cvvalue}"; } [ -n "$cvvalue" ] || { cvvalue="${PROFILE}_${cvname^^}"; cvvalue="${!cvvalue}"; } @@ -1122,10 +1124,10 @@ function build_update_apps() { fi elif [ "$TYPE" == maven ]; then local cvname cvvalue - local maven_java maven_image maven_cmd maven_setup maven_action + local maven_java maven_image maven_cmd maven_setup maven_setup_image maven_action local -a maven_vars maven_args - for cvname in maven_java maven_image maven_cmd maven_setup; do + for cvname in maven_java maven_image maven_cmd maven_setup maven_setup_image; do cvvalue="${var}_${PROFILE}_${cvname^^}"; cvvalue="${!cvvalue}" [ -n "$cvvalue" ] || { cvvalue="${var}_${cvname^^}"; cvvalue="${!cvvalue}"; } [ -n "$cvvalue" ] || { cvvalue="${PROFILE}_${cvname^^}"; cvvalue="${!cvvalue}"; } @@ -1979,6 +1981,7 @@ function default_docker_composer() { -e group="$group" -e projdir="$projdir" -e setup="$COMPOSER_SETUP" + -e setup_image="$COMPOSER_SETUP_IMAGE" -e composer="$COMPOSER_CMD" -e args="$args" ) @@ -2008,35 +2011,36 @@ fi if [ -n "$COMPOSER_SETUP" ]; then # lancement dans un container docker à préparer - local NAME project_name container_name dkid + local NAME setup_image 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_composer_${container_name}" + setup_image="$COMPOSER_SETUP_IMAGE" + [ -n "$setup_image" ] || setup_image="dk_composer_${container_name}_image" # vérifier l'existence de l'image - setx dkid=docker image ls --format '{{.ID}}' "${container_name}_image" + setx dkid=docker image ls --format '{{.ID}}' "$setup_image" # créer le container le cas échéant if [ -z "$dkid" ]; then - estep "Création du container $container_name avec l'image $COMPOSER_IMAGE" + estep "Création de l'image $setup_image à partir de $COMPOSER_IMAGE" cmd=( - "$DOCKER" create -it --name "${container_name}_ct" + "$DOCKER" create -it --name "${setup_image}_tmpct" "${basecmd[@]}" "$COMPOSER_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 commit "$dkid" "$setup_image" || return 1 "$DOCKER" container rm "$dkid" || return 1 fi # prendre comme image le container créé - COMPOSER_IMAGE="${container_name}_image" + COMPOSER_IMAGE="$setup_image" fi cmd=( @@ -2062,7 +2066,19 @@ function auto_composer() { local COMPOSER_MACHINE=-u local COMPOSER_CMD= local COMPOSER_SETUP= - [ -f .composer.conf ] && source ./.composer.conf + local COMPOSER_SETUP_IMAGE= + if [ -f .composer.yaml ]; then + local registry + eval "$(<.composer.yaml grep ^composer_ | + sed 's/^composer_php_min: /COMPOSER_PHP=/ + s/^composer_php_max: /COMPOSER_PHP_MAX=/ + s/^composer_registry: /registry=/ + s/^composer_image: \(.*\)/COMPOSER_IMAGE="${registry:-$REGISTRY}\/\1"/ + s/^composer_setup: /COMPOSER_SETUP=/ + s/^composer_setup_image: /COMPOSER_SETUP_IMAGE=/')" + elif [ -f .composer.conf ]; then + source ./.composer.conf + fi # les premiers arguments peuvent servir à redéfinir les variables while [ $# -gt 0 ]; do case "$1" in @@ -2204,6 +2220,7 @@ function default_docker_maven() { -e group="$group" -e projdir="$projdir" -e setup="$MAVEN_SETUP" + -e setup_image="$MAVEN_SETUP_IMAGE" -e maven="$MAVEN_CMD" -e args="$args" ${MAVEN_JAVA:+-e JAVA="$MAVEN_JAVA"} @@ -2228,35 +2245,36 @@ cd "$projdir" if [ -n "$MAVEN_SETUP" ]; then # lancement dans un container docker à préparer - local NAME project_name container_name dkid + local NAME setup_image 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}" + setup_image="$MAVEN_SETUP_IMAGE" + [ -n "$setup_image" ] || setup_image="dk_maven_${container_name}_image" # vérifier l'existence de l'image - setx dkid=docker image ls --format '{{.ID}}' "${container_name}_image" + setx dkid=docker image ls --format '{{.ID}}' "$setup_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" + estep "Création de l'image $setup_image à partir de $MAVEN_IMAGE" cmd=( - "$DOCKER" create -it --name "${container_name}_ct" + "$DOCKER" create -it --name "${setup_image}_tmpct" "${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 commit "$dkid" "$setup_image" || return 1 "$DOCKER" container rm "$dkid" || return 1 fi # prendre comme image le container créé - MAVEN_IMAGE="${container_name}_image" + MAVEN_IMAGE="$setup_image" fi cmd=( @@ -2281,6 +2299,7 @@ function auto_maven() { local MAVEN_MACHINE=-u local MAVEN_CMD= local MAVEN_SETUP= + local MAVEN_SETUP_IMAGE= [ -f .maven.conf ] && source ./.maven.conf # les premiers arguments peuvent servir à redéfinir les variables while [ $# -gt 0 ]; do @@ -2413,21 +2432,6 @@ fi [ -n "$COMPOSE_V1" ] && DOCKER_COMPOSE=(docker-compose) || DOCKER_COMPOSE=(docker compose) -DEFAULT_PROFILE=devel -case "$PROFILE" in -jclain) - REGISTRY=docker.jclain.fr - PRIVAREG=docker.jclain.fr - ;; -devel) - REGISTRY=docker.devel.self - PRIVAREG=docker.devel.self - ;; -prod|test|*) - REGISTRY=pubdocker.univ-reunion.fr - PRIVAREG=pridocker.univ-reunion.fr - ;; -esac PROFILE= DM_ALIASES=() DM_PROFILES=() @@ -2435,20 +2439,55 @@ CLUSTERDIRS=() DEFAULT_DEVEL_SRCDIR="$HOME/wop" COMPOSER_DEVEL_SRCDIR="$HOME/wop/php" MAVEN_DEVEL_SRCDIR="$HOME/wop/sn" -DEFAULT_COMPOSER_IMAGE="$REGISTRY/image/phpbuilder:d11" -DEFAULT_MAVEN_IMAGE="$REGISTRY/image/javabuilder:d11" +DEFAULT_COMPOSER_IMAGE= +DEFAULT_MAVEN_IMAGE= DEFAULT_HOST_MAPPINGS=() -prod_HOST_MAPPINGS=( - pridocker.univ-reunion.fr:10.85.1.56 - pubdocker.univ-reunion.fr:10.85.1.57 - repos.univ-reunion.fr:10.85.1.57 - git.univ-reunion.fr:10.85.1.55 -) -test_HOST_MAPPINGS=("${prod_HOST_MAPPINGS[@]}") set_defaults dk export PROFILE +DEFAULT_PROFILE=devel +REGISTRY= HOST_MAPPINGS=() +if [ -f ~/.dkbuild.env ]; then + function default_profile() { + DEFAULT_PROFILE="$1" + } + function profile() { + local profile + for profile in "$@"; do + [ "$profile" == "$DEFAULT_PROFILE" ] && return 0 + done + return 1 + } + function setenv() { + eval "export $1" + } + function default() { + local command="$1"; shift + local nv n v + case "$command" in + docker) + for nv in "$@"; do + [[ "$nv" == *=* ]] || continue + n="${nv%%=*}" + v="${nv#*=}" + case "$n" in + host-mappings) + read -a nv <<<"$v" + for v in "${ns[@]}"; do + HOST_MAPPINGS+=("$v") + done + ;; + esac + done + ;; + esac + } + source ~/.dkbuild.env +fi +[ -n "$REGISTRY" ] || REGISTRY=pubdocker.univ-reunion.fr +[ -n "$DEFAULT_COMPOSER_IMAGE" ] || DEFAULT_COMPOSER_IMAGE="$REGISTRY/image/php:d11" +[ -n "$DEFAULT_MAVEN_IMAGE" ] || DEFAULT_MAVEN_IMAGE="$REGISTRY/image/javabuilder:d11" chdir= CONFIG= diff --git a/dkbuild b/dkbuild index 43e6e5d..20df4db 100755 --- a/dkbuild +++ b/dkbuild @@ -103,6 +103,8 @@ $scriptname build [OPTIONS] [BUILDVARS...] -E, --dtest --devel Spécifier le profil dans lequel construire l'image + --all-profiles + Construire l'image dans tous les profils définis -e, --env VAR=VALUE Spécifier la valeur d'une variable d'environnement. Cette valeur @@ -142,6 +144,8 @@ $scriptname build [OPTIONS] [BUILDVARS...] Construire les images --no-cache Ne pas utiliser le cache lors du build + --plain-output + Afficher la sortie complète des containers lors du build -U, --pull-image Essayer de récupérer une version plus récente de l'image source -p, --push-image @@ -178,8 +182,9 @@ $scriptname mvn DESTDIR [ACTION [PARAMS] [ARGS]] $scriptname dump [OPTIONS] afficher les valeurs des variables - Les options --machine, --projdir, --config, --dist, --profile, --env et - --arg ont la même signification que pour l'action build" + Les options suivantes ont la même signification que pour l'action build: + --machine, --projdir, --config, --dist, --profile, --all-profiles, --env, + --arg" } function display_help_dkbuild() { @@ -257,6 +262,11 @@ Si le profil sélectionné par l'utilisateur n'est pas dans la liste fournie, le script s'arrête avec une erreur. Le premier profil listé est spécial: c'est le profil par défaut. +La commande 'default_profile' permet de spécifier un profil par défaut à +utiliser, exactement comme s'il avait été spécifié avec l'option --profile. +Cette commande est particulièrement appropriée pour le fichier ~/.dkbuild.env +s'il s'agit de définir le profil à utiliser sur un hôte. + La commande 'profile' permet de tester si le profil spécifié en argument a été sélectionné par l'utilisateur. L'argument 'DEFAULT' permet de tester le profil par défaut. @@ -286,8 +296,8 @@ la plus récente. Si les distributions sont utilisées avec des versions, alors c'est une erreur de spécifier une version dans le profil -Note: 'setprofiles' ne doit être utilisé qu'une seule fois. Les invocations -suivantes sont ignorées. +Note: 'setprofiles' et 'default_profile' ne peuvent être utilisés qu'une seule +fois. Les invocations suivantes sont ignorées. ## Versions #################################################################### @@ -507,6 +517,8 @@ USAGE: ## setprofiles -- spécifier les profils valides +## default_profile -- spécifier le profil à utiliser si aucun profil n'est sélectionné + ## profile -- vérifier le profil courant ## setversion -- spécifier la version par défaut @@ -774,18 +786,29 @@ Les paramètres optionnels sont commandes spécifiées y sont lancées. Ce container est réutilisé à chaque fois. Ce paramétrage est utilisé par exemple pour installer certains packages nécessaire au projet. +* setup-image=SETUP_IMAGE + forcer le nom de l'image pour setup= (la valeur de project-name= est ignorée) * project-name=PROJECT_NAME si setup= est défini, nommer l'image sur la base de ce nom. par défaut, le nom est calculé automatiquement -Si un fichier .composer.conf existe dans le répertoire du projet, il est sourcé -pour obtenir les valeurs par défaut des paramètres: +Si un fichier .composer.yaml existe dans le répertoire du projet, il est analysé +pour obtenir les valeurs par défaut des paramètres suivants: +* composer_php_min: valeur par défaut de php= +* composer_php_max: valeur par défaut de php-max= +* composer_registry: ET composer_image: valeur par défaut de image= +* composer_setup: valeur par défaut de setup= +* composer_setup_image: valeur par défaut de setup-image= + +Sinon, si un fichier .composer.conf existe dans le répertoire du projet, il est +sourcé pour obtenir les valeurs par défaut des paramètres: * COMPOSER_PHP -- valeur par défaut de php= * COMPOSER_PHP_MAX -- valeur par défaut de php-max= * COMPOSER_IMAGE -- valeur par défaut de image= * COMPOSER_MACHINE -- valeur par défaut de machine= * COMPOSER_CMD -- valeur par défaut de composer= * COMPOSER_SETUP -- valeur par défaut de setup= +* COMPOSER_SETUP_IMAGE -- valeur par défaut de setup-image= ## mvn -- construire projet maven @@ -847,6 +870,8 @@ Les paramètres optionnels sont commandes spécifiées y sont lancées. Ce container est réutilisé à chaque fois. Ce paramétrage est utilisé par exemple pour installer certains packages nécessaire au projet. +* setup-image=SETUP_IMAGE + forcer le nom de l'image pour setup= (la valeur de project-name= est ignorée) * project-name=PROJECT_NAME si setup= est défini, nommer l'image sur la base de ce nom. par défaut, le nom est calculé automatiquement @@ -858,6 +883,7 @@ pour obtenir les valeurs par défaut des paramètres: * MAVEN_MACHINE -- valeur par défaut de machine= * MAVEN_CMD -- valeur par défaut de mvn= * MAVEN_SETUP -- valeur par défaut de setup= +* MAVEN_SETUP_IMAGE -- valeur par défaut de setup-image= ## run -- lancer des commandes @@ -889,6 +915,7 @@ declare -A PROTECTED_VARS=( [SETDISTS]=1 [SETPROFILES_DONE]=1 [SETPROFILES]=1 + [DEFAULT_PROFILE]=1 [SETVERSION_DONE]=1 [SETVERSION]=1 [AUTOBUILD]=1 @@ -906,7 +933,7 @@ SHARED_ARGS1=( -c:,--config: CONFIG= ) -SHARED_LOCALS2="local DIST PROFILE; local -a TMPENVIRON TMPARGS" +SHARED_LOCALS2="local DIST PROFILE ALL_PROFILES; local -a TMPENVIRON TMPARGS" SHARED_ARGS2=( -d:,--dist: DIST= -9,--d9 DIST=d9 @@ -923,6 +950,7 @@ SHARED_ARGS2=( -E,--dtest PROFILE=dtest -J,--jclain PROFILE=jclain --devel PROFILE=devel + --all-profiles ALL_PROFILES=1 -e:,--env: '$TMPENVIRON+=("$value_")' --arg: '$TMPARGS+=("$value_")' @@ -933,6 +961,7 @@ TFUNCTIONS=( section note info debug setdists dist setprofiles profile + default_profile setversion version setenv resetenv setarg resetarg @@ -1269,14 +1298,37 @@ function define_functions_env() { return 1 } function profile() { - local profile version + local profile version default for profile in "$@"; do - [ "$profile" == DEFAULT ] && profile="${SETPROFILES[0]}" + if [ "$profile" == DEFAULT ]; then + default=1 + continue + fi parse_profile "$profile" profile version [ "$profile" == "$PROFILE" ] || continue [ -z "$version" -o "$version" == "$PVERSION" ] || continue return 0 done + if [ -n "$default" ]; then + # trouver la dernière occurence du premier profil mentionné. en + # effet, les versions doivent être ordonnées de la plus ancienne à + # la plus récente. + local first_profile last_version + for profile in "${SETPROFILES[@]}"; do + parse_profile "$profile" profile version + if [ -z "$first_profile" ]; then + first_profile="$profile" + last_version="$version" + elif [ "$profile" == "$first_profile" ]; then + last_version="$version" + fi + done + if [ "$first_profile" == "$PROFILE" ]; then + if [ -z "$last_version" -o "$last_version" == "$PVERSION" ]; then + return 0 + fi + fi + fi return 1 } declare -g -A ENVIRON @@ -1405,6 +1457,7 @@ function resolve_dists_profiles() { SETDISTS=() SETPROFILES_DONE= SETPROFILES=() + DEFAULT_PROFILE= SETVERSION_DONE= SETVERSION= AUTOBUILD=1 @@ -1419,6 +1472,9 @@ function resolve_dists_profiles() { SETPROFILES=("$@") SETPROFILES_DONE=1 } + function default_profile() { + [ -n "$DEFAULT_PROFILE" ] || DEFAULT_PROFILE="$1" + } function build() { AUTOBUILD= } @@ -1427,6 +1483,10 @@ function resolve_dists_profiles() { } load_dkbuild + if [ -z "$PROFILE" -a -z "$ALL_PROFILES" -a -n "$DEFAULT_PROFILE" ]; then + enote "Auto-sélection du profil $DEFAULT_PROFILE" + PROFILE="$DEFAULT_PROFILE" + fi local MANUAL_SETPROFILES= if [ -z "$SETPROFILES_DONE" -a -n "$PROFILE" ]; then # Si l'utilisateur spécifie un profil mais qu'aucun profil n'a été @@ -1486,7 +1546,7 @@ function resolve_dists_profiles() { fi parse_profile "$profile" if [ "$profile" == "$PROFILE" ]; then - # ou matcher uniquement la distribution + # ou matcher uniquement le profil found=1 break fi @@ -1495,8 +1555,16 @@ function resolve_dists_profiles() { [ -n "$found" ] || die "$PROFILE: profil invalide" # forcer à ne construire que cette distribution PROFILES=("$PROFILE") + elif [ -n "$ALL_PROFILES" ]; then + # prendre tous les profils comme indiqué + for profile in "${SETPROFILES[@]}"; do + parse_profile "$profile" + PROFILES+=("$profile") + done else - PROFILES=("${SETPROFILES[@]}") + # prendre le profil par défaut + parse_profile "${SETPROFILES[0]}" + PROFILES=("$profile") fi } load_dkbuild @@ -1834,6 +1902,7 @@ function define_functions_cmd() { shift done + [ -n "${DEFAULTS[build_build]-1}" ] || return 0 [ -n "$output" ] || die "genfile: Vous devez spécifier le fichier en sortie" if [ -n "$context" ]; then mkdir -p "$context" || die @@ -1869,6 +1938,7 @@ function define_functions_cmd() { shift done + [ -n "${DEFAULTS[build_build]-1}" ] || return 0 [ -n "$DOCKERFILE" ] || DOCKERFILE=Dockerfile DOCKERCONTEXT=. if [ -n "$context" ]; then @@ -1892,6 +1962,7 @@ function define_functions_cmd() { function add2dockerfile() { edebug "$(qvals "$@")" + [ -n "${DEFAULTS[build_build]-1}" ] || return 0 [ -n "$DOCKERFILE" ] || return echo "$*" >>"$DOCKERFILE" } @@ -2002,6 +2073,7 @@ function define_functions_cmd() { local avar local -a args; args=( ${no_cache:+--no-cache} + ${progress:+--progress "$progress"} ${pull:+--pull} ) eval "host_mappings=($host_mappings)" @@ -2039,6 +2111,7 @@ function define_functions_cmd() { function cbuild() { edebug "cbuild $(qvals "$@")" + local build="${DEFAULTS[build_build]-1}" local files="${DEFAULTS[cbuild_files]}" local project_name="${DEFAULTS[cbuild_project-name]}" local no_cache="${DEFAULTS[cbuild_no-cache]}" @@ -2057,6 +2130,7 @@ function define_functions_cmd() { shift done + [ -n "$build" ] || return if [ -n "$files" ]; then eval "files=($files)" else @@ -2083,6 +2157,7 @@ function define_functions_cmd() { local avar evar; local -a bargs bargs=( ${no_cache:+--no-cache} + ${progress:+--progress "$progress"} ${pull:+--pull} ) for avar in "${!ARGS[@]}"; do @@ -2153,6 +2228,7 @@ function define_functions_cmd() { -e group="$group" -e projdir="$projdir" -e setup="$setup" + -e setup_image="$setup_image" -e composer="$composer" -e args="$args" ) @@ -2182,32 +2258,33 @@ fi if [ -n "$setup" ]; then local project_name container_name ctid + local setup_image="$setup_image" # lancement dans un container docker à préparer [ -n "$project_name" ] || setx project_name=get_project_name setx container_name=get_container_name "$project_name" - container_name="dkbuild_composer_${container_name}" + [ -n "$setup_image" ] || setup_image="dkbuild_composer_${container_name}_image" # vérifier l'existence de l'image - setx ctid=docker image ls --format '{{.ID}}' "${container_name}_image" + setx ctid=docker image ls --format '{{.ID}}' "$setup_image" # créer le container le cas échéant if [ -z "$ctid" ]; then - estep "Création du container $container_name à partir de l'image $image" + estep "Création de l'image $setup_image à partir de $image" cmd=( - docker create -it --name "${container_name}_ct" + docker create -it --name "${setup_image}_tmpct" "${basecmd[@]}" "$image" bash -c "$setupscript" ) setx ctid="${cmd[@]}" && docker container start -ai "$ctid" && - docker container commit "$ctid" "${container_name}_image" && + docker container commit "$ctid" "$setup_image" && docker container rm "$ctid" || die fi # prendre comme image le container créé - image="${container_name}_image" + image="$setup_image" fi case "$action" in @@ -2256,8 +2333,29 @@ fi [ "$host_mappings" == __UNDEFINED__ ] && host_mappings="${DEFAULTS[docker_host-mappings]}" local composer="${DEFAULTS[composer_composer]}" local setup="${DEFAULTS[composer_setup]}" + local setup_image="${DEFAULTS[composer_setup-image]}" local project_name="${DEFAULTS[composer_project-name]}" - if [ -f "$destdir/.composer.conf" ]; then + if [ -f "$destdir/.composer.yaml" ]; then + eval "$( + COMPOSER_PHP= + COMPOSER_PHP_MAX= + COMPOSER_IMAGE="$COMPOSER_IMAGE" + COMPOSER_SETUP= + COMPOSER_SETUP_IMAGE= + eval "$(<"$destdir/.composer.yaml" grep ^composer_ | + sed 's/^composer_php_min: /COMPOSER_PHP=/ + s/^composer_php_max: /COMPOSER_PHP_MAX=/ + s/^composer_registry: /registry=/ + s/^composer_image: \(.*\)/COMPOSER_IMAGE="${registry:-$REGISTRY}\/\1"/ + s/^composer_setup: /COMPOSER_SETUP=/ + s/^composer_setup_image: /COMPOSER_SETUP_IMAGE=/')" + [ -z "$php" ] && echo_setv php="$COMPOSER_PHP" + [ -z "$php_max" ] && echo_setv php_max="$COMPOSER_PHP_MAX" + [ -z "$image" ] && echo_setv image="$COMPOSER_IMAGE" + [ -z "$setup" ] && echo_setv setup="$COMPOSER_SETUP" + [ -z "$setup_image" ] && echo_setv setup_image="$COMPOSER_SETUP_IMAGE" + )" + elif [ -f "$destdir/.composer.conf" ]; then eval "$( COMPOSER_PHP= COMPOSER_PHP_MAX= @@ -2265,6 +2363,7 @@ fi COMPOSER_MACHINE=-u COMPOSER_CMD= COMPOSER_SETUP= + COMPOSER_SETUP_IMAGE= source "$destdir/.composer.conf" [ -z "$php" ] && echo_setv php="$COMPOSER_PHP" [ -z "$php_max" ] && echo_setv php_max="$COMPOSER_PHP_MAX" @@ -2272,6 +2371,7 @@ fi [ -z "$machine" ] && echo_setv machine="$COMPOSER_MACHINE" [ -z "$composer" ] && echo_setv composer="$COMPOSER_CMD" [ -z "$setup" ] && echo_setv setup="$COMPOSER_SETUP" + [ -z "$setup_image" ] && echo_setv setup_image="$COMPOSER_SETUP_IMAGE" )" fi @@ -2287,6 +2387,7 @@ fi host-mappings=*) host_mappings="${1#host-mappings=}";; composer=*) composer="${1#composer=}";; setup=*) setup="${1#setup=}";; + setup-image=*) setup_image="${1#setup-image=}";; project-name=*) project_name="${1#project-name=}";; *=*) ewarn "composer: $1: argument ignoré";; *) break;; @@ -2375,7 +2476,7 @@ exit((PHP_VERSION_ID < $version)? 0: 1); function _local_mvn() { if [ -n "$java" ]; then urequire java - select_java_exact "$java" || die + select_java_exact "$java" || die "mvn: Java $java introuvable" export MVN_JAVA_VERSION="$java" fi @@ -2452,6 +2553,7 @@ exit((PHP_VERSION_ID < $version)? 0: 1); -e group="$group" -e projdir="$projdir" -e setup="$setup" + -e setup_image="$setup_image" -e mvn="$mvn" -e args="$args" ${java:+-e JAVA="$java"} @@ -2477,32 +2579,33 @@ cd "$projdir" if [ -n "$setup" ]; then local project_name container_name ctid + local setup_image="$setup_image" # lancement dans un container docker à préparer [ -n "$project_name" ] || setx project_name=get_project_name setx container_name=get_container_name "$project_name" - container_name="dkbuild_maven_${container_name}" + [ -n "$setup_image" ] || setup_image="dkbuild_maven_${container_name}_image" # vérifier l'existence de l'image - setx ctid=docker image ls --format '{{.ID}}' "${container_name}_image" + setx ctid=docker image ls --format '{{.ID}}' "$setup_image" # créer le container le cas échéant if [ -z "$ctid" ]; then - estep "Création du container $container_name à partir de l'image $image" + estep "Création de l'image $setup_image à partir de $image" cmd=( - docker create -it --name "${container_name}_ct" + docker create -it --name "${setup_image}_tmpct" "${basecmd[@]}" "$image" bash -c "$setupscript" ) setx ctid="${cmd[@]}" && docker container start -ai "$ctid" && - docker container commit "$ctid" "${container_name}_image" && + docker container commit "$ctid" "$setup_image" && docker container rm "$ctid" || die fi # prendre comme image le container créé - image="${container_name}_image" + image="$setup_image" fi case "$action" in @@ -2547,6 +2650,7 @@ cd "$projdir" [ "$host_mappings" == __UNDEFINED__ ] && host_mappings="${DEFAULTS[docker_host-mappings]}" local mvn="${DEFAULTS[mvn_mvn]}" local setup="${DEFAULTS[mvn_setup]}" + local setup_image="${DEFAULTS[mvn_setup-image]}" local project_name="${DEFAULTS[mvn_project-name]}" if [ -f "$destdir/.maven.conf" ]; then eval "$( @@ -2555,12 +2659,14 @@ cd "$projdir" MAVEN_MACHINE=-u MAVEN_CMD= MAVEN_SETUP= + MAVEN_SETUP_IMAGE= source "$destdir/.maven.conf" [ -z "$java" ] && echo_setv java="$MAVEN_JAVA" [ -z "$image" ] && echo_setv image="$MAVEN_IMAGE" [ -z "$machine" ] && echo_setv machine="$MAVEN_MACHINE" [ -z "$mvn" ] && echo_setv mvn="$MAVEN_CMD" [ -z "$setup" ] && echo_setv setup="$MAVEN_SETUP" + [ -z "$setup_image" ] && echo_setv setup_image="$MAVEN_SETUP_IMAGE" )" fi @@ -2575,6 +2681,7 @@ cd "$projdir" host-mappings=*) host_mappings="${1#host-mappings=}";; mvn=*) mvn="${1#mvn=}";; setup=*) setup="${1#setup=}";; + setup-image=*) setup_image="${1#setup-image=}";; project-name=*) project_name="${1#project-name=}";; *=*) ewarn "mvn: $1: argument ignoré";; *) break;; @@ -2656,9 +2763,10 @@ cd "$projdir" } function runb() { local build="${DEFAULTS[build_build]-1}" - if [ -n "$build" ]; then - run "$@" + if [ -z "$build" ]; then + [ $# -eq 0 ] && return 1 || return 0 fi + run "$@" } function call() { edebug "call $(qvals "$@")" @@ -2668,9 +2776,10 @@ cd "$projdir" } function callb() { local build="${DEFAULTS[build_build]-1}" - if [ -n "$build" ]; then - call "$@" + if [ -z "$build" ]; then + [ $# -eq 0 ] && return 1 || return 0 fi + call "$@" } function dkbuild() { edebug "dkbuild $(qvals "$@")" @@ -2788,7 +2897,7 @@ function build_action() { local machine local clean_update clean_opt=-X local clone_src_only update_src_only update_src sync_src - local build no_cache pull_image + local build no_cache progress pull_image local push_image local -a args; args=( "${SHARED_ARGS1[@]}" "${SHARED_ARGS2[@]}" @@ -2805,6 +2914,7 @@ function build_action() { --no-sync-src sync_src=no -b,--build build=1 --no-cache no_cache=1 + --plain-output progress=plain -U,--pull-image pull_image=1 -p,--push-image push_image=1 ) @@ -2816,12 +2926,16 @@ function build_action() { action=update_src else action=build - [ -n "$update_src" ] || update_src=1 - [ "$update_src" == no ] && update_src= if [ -z "$clean_update" -a -z "$sync_src" -a -z "$build" -a -z "$push_image" ]; then sync_src=1 build=1 fi + if [ -n "$build" ]; then + [ -n "$update_src" ] || update_src=1 + [ "$update_src" == no ] && update_src= + else + update_src= + fi [ "$sync_src" == no ] && sync_src= fi diff --git a/lib/default/dk b/lib/default/dk index d39ef14..afb878e 100644 --- a/lib/default/dk +++ b/lib/default/dk @@ -20,27 +20,5 @@ #MAVEN_DEVEL_SRCDIR="$HOME/wop/sn" # Image à utiliser pour les builds -#DEFAULT_COMPOSER_IMAGE=pubdocker.univ-reunion.fr/image/phpbuilder:d11 +#DEFAULT_COMPOSER_IMAGE=pubdocker.univ-reunion.fr/image/php:d11 #DEFAULT_MAVEN_IMAGE=pubdocker.univ-reunion.fr/image/javabuilder:d11 - -# Mappings d'hôtes à activer pour les builds à base d'image -#DEFAULT_HOST_MAPPINGS=() -#prod_HOST_MAPPINGS=(pridocker.univ-reunion.fr:10.85.1.56 pubdocker.univ-reunion.fr:10.85.1.57 repos.univ-reunion.fr:10.85.1.57 git.univ-reunion.fr:10.85.1.55) -#test_HOST_MAPPINGS=("${prod_HOST_MAPPINGS}") - -#case "$PROFILE" in -#jclain) -# REGISTRY=docker.jclain.fr -# PRIVAREG=docker.jclain.fr -# ;; -#devel) -# REGISTRY=docker.devel.self -# PRIVAREG=docker.devel.self -# ;; -#prod|test|*) -# REGISTRY=pubdocker.univ-reunion.fr -# PRIVAREG=pridocker.univ-reunion.fr -# ;; -#esac -#: ${DEFAULT_COMPOSER_IMAGE:=$REGISTRY/image/phpbuilder:d11} -#: ${DEFAULT_MAVEN_IMAGE:=$REGISTRY/image/javabuilder:d11} diff --git a/lib/dkbuild/dot-dkbuild.env b/lib/dkbuild/dot-dkbuild.env index 3ee2788..7dee890 100644 --- a/lib/dkbuild/dot-dkbuild.env +++ b/lib/dkbuild/dot-dkbuild.env @@ -1,11 +1,20 @@ # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +default_profile "${DKBUILD_PROFILE:-prod}" + if profile jclain; then setenv REGISTRY=docker.jclain.fr setenv PRIVAREG=docker.jclain.fr elif profile prod test; then setenv REGISTRY=pubdocker.univ-reunion.fr setenv PRIVAREG=pridocker.univ-reunion.fr -else + host_mappings=( + pridocker.univ-reunion.fr:10.85.1.56 + pubdocker.univ-reunion.fr:10.85.1.57 + repos.univ-reunion.fr:10.85.1.57 + git.univ-reunion.fr:10.85.1.55 + ) + default docker host-mappings="${host_mappings[*]}" +elif profile devel; then setenv REGISTRY=docker.devel.self setenv PRIVAREG=docker.devel.self fi diff --git a/lib/dkbuild/tests/README.md b/lib/dkbuild/tests/README.md new file mode 100644 index 0000000..da22bc9 --- /dev/null +++ b/lib/dkbuild/tests/README.md @@ -0,0 +1,8 @@ +# tests + +Lancer un test de cette façon +~~~sh +../../../dkbuild -j test-xxx +~~~ + +-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary \ No newline at end of file diff --git a/lib/dkbuild/tests/registry.env b/lib/dkbuild/tests/registry.env index 9228c2e..ada48d6 100644 --- a/lib/dkbuild/tests/registry.env +++ b/lib/dkbuild/tests/registry.env @@ -1,2 +1,2 @@ # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 -setenv REGISTRY=jclain.fr +setenv REGISTRY=docker.jclain.fr diff --git a/lib/dkbuild/tests/test-distprofiles b/lib/dkbuild/tests/test-ls-distprofiles similarity index 100% rename from lib/dkbuild/tests/test-distprofiles rename to lib/dkbuild/tests/test-ls-distprofiles diff --git a/lib/dkbuild/tests/test-ls-distversions b/lib/dkbuild/tests/test-ls-distversions new file mode 100644 index 0000000..7a04477 --- /dev/null +++ b/lib/dkbuild/tests/test-ls-distversions @@ -0,0 +1,10 @@ +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +setdists v1-d11 v2-d11 v1-d10 + +if dist LATEST; then + info "$DIST est la distribution la plus récente" +fi +info "version=$VERSION" + +# pas de build automatique +AUTOBUILD= diff --git a/lib/dkbuild/tests/test-ls-profileversions b/lib/dkbuild/tests/test-ls-profileversions new file mode 100644 index 0000000..51915cc --- /dev/null +++ b/lib/dkbuild/tests/test-ls-profileversions @@ -0,0 +1,10 @@ +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +setprofiles v1-prod v2-prod test + +if profile DEFAULT; then + info "$PROFILE est le profil par défaut" +fi +info "version=$VERSION" + +# pas de build automatique +AUTOBUILD= diff --git a/lib/uinst/conf b/lib/uinst/conf index 16c0e43..bd9ce5b 100644 --- a/lib/uinst/conf +++ b/lib/uinst/conf @@ -68,6 +68,9 @@ if [ "$UINST_LOCAL_PROFILES" != auto ]; then export UTOOLS_LOCAL_PROFILES=$(qvalr "$UINST_LOCAL_PROFILES")" ~/.nutoolsrc fi +# copier .dkbuild.env +[ -f ~/.dkbuild.env ] || cp lib/dkbuild/dot-dkbuild.env ~/.dkbuild.env + # identification du système echo "##@before *" >lib/profile.d/0nutools echo_setv UNAME_SYSTEM "$UNAME_SYSTEM" >>lib/profile.d/0nutools diff --git a/lib/ulib/java b/lib/ulib/java index 89df1b6..8213d01 100644 --- a/lib/ulib/java +++ b/lib/ulib/java @@ -500,37 +500,37 @@ function select_java() { case "$1" in 1.3|1.3+) - for v in 1_3 1_4 5 6 7 8 11; do + for v in 1_3 1_4 5 6 7 8; do __java_select "$v" "$2" && return 0 done ;; 1.4|1.4+) - for v in 1_4 5 6 7 8 11; do + for v in 1_4 5 6 7 8; do __java_select "$v" "$2" && return 0 done ;; 1.5|1.5+|5|5+) - for v in 5 6 7 8 11; do + for v in 5 6 7 8; do __java_select "$v" "$2" && return 0 done ;; 1.6|1.6+|6|6+) - for v in 6 7 8 11; do + for v in 6 7 8; do __java_select "$v" "$2" && return 0 done ;; 1.7|1.7+|7|7+) - for v in 7 8 11; do + for v in 7 8; do __java_select "$v" "$2" && return 0 done ;; 1.8|1.8+|8|8+) - for v in 8 11; do + for v in 8; do __java_select "$v" "$2" && return 0 done ;; 11|11+) - for v in 11; do + for v in 11 17; do __java_select "$v" "$2" && return 0 done ;; @@ -556,7 +556,7 @@ function select_java_exact() { __java_select 1_3 && return 0 ;; 1.3+) - for v in 1_3 1_4 5 6 7 8 11; do + for v in 1_3 1_4 5 6 7 8; do __java_select "$v" "$2" && return 0 done ;; @@ -564,7 +564,7 @@ function select_java_exact() { __java_select 1_4 && return 0 ;; 1.4+) - for v in 1_4 5 6 7 8 11; do + for v in 1_4 5 6 7 8; do __java_select "$v" "$2" && return 0 done ;; @@ -572,7 +572,7 @@ function select_java_exact() { __java_select 5 "$2" && return 0 ;; 1.5+|5+) - for v in 5 6 7 8 11; do + for v in 5 6 7 8; do __java_select "$v" "$2" && return 0 done ;; @@ -580,7 +580,7 @@ function select_java_exact() { __java_select 6 "$2" && return 0 ;; 1.6+|6+) - for v in 6 7 8 11; do + for v in 6 7 8; do __java_select "$v" "$2" && return 0 done ;; @@ -588,7 +588,7 @@ function select_java_exact() { __java_select 7 "$2" && return 0 ;; 1.7+|7+) - for v in 7 8 11; do + for v in 7 8; do __java_select "$v" "$2" && return 0 done ;; @@ -596,7 +596,7 @@ function select_java_exact() { __java_select 8 "$2" && return 0 ;; 1.8+|8+) - for v in 8 11; do + for v in 8; do __java_select "$v" "$2" && return 0 done ;; @@ -604,7 +604,7 @@ function select_java_exact() { __java_select 11 "$2" && return 0 ;; 11+) - for v in 11; do + for v in 11 17; do __java_select "$v" "$2" && return 0 done ;; diff --git a/lib/ulib/pff b/lib/ulib/pff index 9a71572..cd942ef 100644 --- a/lib/ulib/pff +++ b/lib/ulib/pff @@ -117,8 +117,21 @@ function pff_get_first_profile() { function pff_get_local_files() { # afficher tous les fichiers locaux exprimés relativement au répertoire du # projet pff $1 - local pffdir="$1" - find "$pffdir/pff/Base" -type f | sed "s|^$pffdir/pff/Base/||" | grep -v '__pv-.*__$' + local pffdir="$1" files file dirs dir isald + files="$(find "$pffdir/pff/Base" -type f | sed "s|^$pffdir/pff/Base/||" | grep -v '/__pv-[^/_]*__[^/]*$')" + dirs="$(echo "$files" | grep '/\.pffdir$' | sed 's/\.pffdir$//')" + setx -a files=echo "$files" + setx -a dirs=echo "$dirs" + for file in "${files[@]}"; do + isald= + for dir in "${dirs[@]}"; do + if [ "${file#$dir}" != "$file" ]; then + isald=1 + break + fi + done + [ -z "$isald" -o "$file" == "${dir}.pffdir" ] && echo "$file" + done } function pff_get_rfile() { @@ -253,7 +266,18 @@ function pff_select_profile() { setx -a lfiles=pff_get_local_files "$pffdir" for lfile in "${lfiles[@]}"; do src="$pffdir/pff/Current/$lfile" - if [ -f "$pffdir/pff/$profile/$lfile" ]; then + if [[ "$lfile" == */.pffdir ]]; then + # répertoires entiers + lfile="${lfile%/.pffdir}" + src="${src%/.pffdir}" + if [ -d "$pffdir/pff/$profile/$lfile" ]; then + dest="$profile/$lfile" + elif [ "$profile" != Common -a -d "$pffdir/pff/Common/$lfile" ]; then + dest="Common/$lfile" + else + dest="Base/$lfile" + fi + elif [ -f "$pffdir/pff/$profile/$lfile" ]; then dest="$profile/$lfile" elif [ "$profile" != Common -a -f "$pffdir/pff/Common/$lfile" ]; then dest="Common/$lfile" diff --git a/lib/ulib/ptools b/lib/ulib/ptools index 4f9d74b..f589de8 100644 --- a/lib/ulib/ptools +++ b/lib/ulib/ptools @@ -18,11 +18,11 @@ function is_any_branch() { case "$spec" in m|master) [ -n "$r" ] || r=1 - [ "$branch" == "master" ] && return 0 + [ "$branch" == master ] && return 0 ;; d|develop) [ -n "$r" ] || r=1 - [ "$branch" == "develop" ] && return 0 + [ "$branch" == develop ] && return 0 ;; r|release) [ -n "$r" ] || r=1 @@ -34,20 +34,21 @@ function is_any_branch() { ;; f|feature|t|topic) [ -n "$r" ] || r=1 - [ "$branch" == "master" ] && continue - [ "$branch" == "develop" ] && continue + [ "$branch" == master ] && continue + [ "$branch" == develop ] && continue [[ "$branch" == release-* ]] && continue [[ "$branch" == hotfix-* ]] && continue [ -n "$annex" -a "$branch" == "git-annex" ] && continue + [[ "$branch" == wip/* ]] && return 0 [[ "$branch" == */* ]] && continue return 0 ;; -m|-master) [ -n "$r" ] || r=0 - [ "$branch" == "master" ] && return 1;; + [ "$branch" == master ] && return 1;; -d|-develop) [ -n "$r" ] || r=0 - [ "$branch" == "develop" ] && return 1;; + [ "$branch" == develop ] && return 1;; -r|-release) [ -n "$r" ] || r=0 [[ "$branch" == release-* ]] && return 1;; @@ -56,11 +57,12 @@ function is_any_branch() { [[ "$branch" == hotfix-* ]] && return 1;; -f|-feature|-t|-topic) [ -n "$r" ] || r=0 - [ "$branch" == "master" ] && continue - [ "$branch" == "develop" ] && continue + [ "$branch" == master ] && continue + [ "$branch" == develop ] && continue [[ "$branch" == release-* ]] && continue [[ "$branch" == hotfix-* ]] && continue [ -n "$annex" -a "$branch" == "git-annex" ] && continue + [[ "$branch" == wip/* ]] && return 1 [[ "$branch" == */* ]] && continue return 1 ;; @@ -89,7 +91,7 @@ function list_feature_branches() { grep -vF develop | grep -v '^release-' | grep -v '^hotfix-' | - grep -v '/' | + grep -Pv '(?