diff --git a/dk b/dk index 8d1e22c..95fd031 100755 --- a/dk +++ b/dk @@ -45,14 +45,36 @@ COMMANDES prune Supprimer les containers et les images inutilisées -OPTIONS +OPTIONS générales + (ces options sont communes à toutes les commandes) -d, --chdir PROJDIR -p, --profile PROFILE -P, --prod -T, --test -n, --fake -j, --no-cache - -h, --host HOST" + -h, --host HOST + +OPTIONS build + (ces options ne sont valides que pour les commandes build, brd, bs) + -g, --ug, --no-update-apps + ne pas mettre à jour les dépôts dépendants. ces dépôts sont + définis dans le fichier update-apps.conf qui a le format + suivant: + DEFAULT_BRANCH= + APPS=() + app_URL= + app_DEST= + app_ORIGIN= + app_BRANCH= + app_TYPE= + app_AFTER_UPDATE=() + -u, --uu, --update-apps-only + Ne faire que la mise à jour depuis les dépôts dépendants. + --uo, --update-apps-origin ORIGIN + Spécifier l'origine par défaut pour update-apps + --ub, --update-apps-branch BRANCH + Spécifier la branche par défaut pour update-apps" } function get_version() { @@ -187,6 +209,145 @@ function local_run() { runscript_as_root "$script" "$@" } +BUILD_UPDATE_APPS= +BUILD_BUILD= +UPDATE_APPS_ORIGIN= +UPDATE_APPS_BRANCH= +function build_set_options() { + case "$1" in + u) BUILD_UPDATE_APPS=1; BUILD_BUILD=;; + b) BUILD_UPDATE_APPS=; BUILD_BUILD=1;; + *) BUILD_UPDATE_APPS=1; BUILD_BUILD=1;; + esac + UPDATE_APPS_ORIGIN="$2" + UPDATE_APPS_BRANCH="$3" +} + +function update_apps_func_sqlmig() { + local destdir="$1" srcdir="$2" + [ -n "$destdir" ] || destdir=db + [ "${destdir%/config/mariadb/sqlmig}" != "$destdir" ] || destdir="$destdir/config/mariadb/sqlmig" + + [ -n "$srcdir" ] || srcdir="$dest" + [ "${srcdir%/config/sqlmig}" != "$srcdir" ] || srcdir="$srcdir/config/sqlmig" + + [ -d "$srcdir" ] || return 0 + + local -a sqlmigs; local sqlmig name + array_lsall sqlmigs "$srcdir" + mkdir -p "$destdir" || return 1 + for sqlmig in "${sqlmigs[@]}"; do + if [ -d "$sqlmig" ]; then + setx name=basename -- "$sqlmig" + rsync -av --delete-after "$sqlmig/" "$destdir/$name" + else + rsync -av "$sqlmig" "$destdir" + fi + done + return 0 +} + +function build_update_apps() { + [ -n "$BUILD_UPDATE_APPS" ] || return 0 + [ -f update-apps.conf ] || return 0 + + # charger le fichier de configuration + local DEFAULT_ORIGIN DEFAULT_BRANCH APPS + DEFAULT_ORIGIN="$UPDATE_APPS_ORIGIN" + [ -z "$DEFAULT_ORIGIN" ] && DEFAULT_ORIGIN=origin + DEFAULT_BRANCH="$UPDATE_APPS_BRANCH" + #XXX à terme, on déploiera la branche master en prod + [ -z "$DEFAULT_BRANCH" -a "$PROFILE" == prod ] && DEFAULT_BRANCH=develop #master + [ -z "$DEFAULT_BRANCH" ] && DEFAULT_BRANCH=develop + APPS=() + [ -f update-apps.conf ] && source ./update-apps.conf + [ ${#APPS[*]} -gt 0 ] || return 0 + + local PRODUCTION DEVELOPMENT + case "$PROFILE" in + prod) PRODUCTION=1; DEVELOPMENT=;; + test) PRODUCTION=1; DEVELOPMENT=1;; + devel) PRODUCTION=; DEVELOPMENT=;; + esac + + etitle "Mise à jour des dépendances" + local app type url dest branch after_update after_updates + for app in "${APPS[@]}"; do + etitle "$app" + url="${app}_URL"; url="${!url}" + dest="${app}_DEST"; dest="${!dest}" + origin="${app}_ORIGIN"; origin="${!origin}" + branch="${app}_BRANCH"; branch="${!branch}" + type="${app}_TYPE"; type="${!type}" + after_updates="${app}_AFTER_UPDATE" + if is_defined "$after_updates"; then + after_updates="$after_updates[@]"; after_updates="${!after_updates}" + else + # script par défaut après update-apps + after_updates=(sqlmig) + fi + + [ -n "$url" ] || { + ewarn "$app: vous devez définir l'url" + eend; return 1 + } + [ -n "$dest" ] || dest="$app" + mkdir -p "$dest" || { eend; return 1; } + [ -n "$origin" ] || origin="$DEFAULT_ORIGIN" + [ -n "$branch" ] || branch="$DEFAULT_BRANCH" + + dest="$dest/$app" + if [ ! -d "$dest" ]; then + # clonage initial + estep "Clonage $url:$branch --> $dest" + git clone -o "$origin" -b "$branch" "$url" "$dest" || { eend; return 1; } + else + # mise à jour + estep "Maj dépôt $url:$branch --> $dest" + setx cwd=pwd + cd "$dest" + git fetch --all -p -f || { eend; return 1; } + git reset --hard "$origin/$branch" || { eend; return 1; } + cd "$cwd" + fi + + if [ -z "$type" ]; then + if [ -f "$dest/composer.json" ]; then + type=composer + else + type=inconnu + fi + fi + estep "Type de dépôt: $type" + if [ "$type" == composer ]; then + composer=/usr/bin/composer + [ -x "$dest/composer.phar" ] && composer="$dest/composer.phar" + + estep "Installation des dépendances composer" + "$composer" -d"$dest" install ${PRODUCTION:+--no-dev -o} || { eend; return 1; } + fi + + for after_update in "${after_updates[@]}"; do + if [ "${after_update#/}" != "$after_update" ]; then + # commande absolue, la lancer telle quelle + estep "$after_update" + eval "$after_update" || { eend; return 1; } + elif [ "${after_update#./}" != "$after_update" ]; then + # commande relative, la lancer telle quelle + estep "$after_update" + eval "$after_update" || { eend; return 1; } + else + # c'est une fonction update_apps_func_* + estep "$after_update" + eval "update_apps_func_$after_update" || { eend; return 1; } + fi + done + + eend + done + eend +} + function initialize_build_env() { CTXDIR=. NAME= @@ -218,8 +379,14 @@ function default_docker_build() { "${replace_build_args[@]}" "${build_args[@]}" \ "$@" "$CTXDIR" } -function compose_build() { default_compose_build "$@"; } -function docker_build() { default_docker_build "$@"; } +function compose_build() { + [ -n "$BUILD_BUILD" ] || return 0 + default_compose_build "$@" +} +function docker_build() { + [ -n "$BUILD_BUILD" ] || return 0 + default_docker_build "$@" +} function auto_build() { local -a replace_env_args env_args local -a replace_build_args build_args @@ -227,12 +394,14 @@ function auto_build() { if [ -f docker-compose.yml ]; then compose_set_env_args update_build_env + build_update_apps || return 1 compose_build else docker_parse_env_args docker_check_name docker_add_build_arg build_date "$(date +%y%m%d)" update_build_env + build_update_apps || return 1 docker_build fi } @@ -517,6 +686,9 @@ chdir= FAKE= NO_CACHE= HOST= +update_apps_mode=ub +update_apps_origin= +update_apps_branch= args=( --help '$exit_with display_help' -d:,--chdir: chdir= @@ -526,6 +698,10 @@ args=( -n,--fake FAKE=1 -j,--no-cache NO_CACHE=1 -h:,--host: HOST= + -g,--ug,--no-update-apps update_apps_mode=b + -u,--uu,--update-apps-only update_apps_mode=u + --uo:,--update-apps-origin: update_apps_origin= + --ub:,--update-apps-branch: update_apps_branch= ) parse_args "$@"; set -- "${args[@]}" @@ -540,6 +716,7 @@ while [ $# -gt 0 ]; do cmd="$1"; shift case "$cmd" in b|build) + 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=() @@ -606,6 +783,7 @@ while [ $# -gt 0 ]; do } trap auto_down_trap 1 3 15 EXIT + 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=() @@ -620,6 +798,7 @@ while [ $# -gt 0 ]; do fi ;; bs) + 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=()