diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 07d7668..592b6d6 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -238,6 +238,22 @@ fetch_asset () { || die "somme de contrôle incorrecte après téléchargement : ${NAME}" } +# Une unit déjà installée dans la bonne version n'a rien à faire dans le cache +# versionné : ni téléchargement, ni réinstallation. C'est le cas courant à +# l'upgrade — les units bougent rarement d'une release à l'autre, alors que +# /opt/two//units/ est vide par construction. Le fichier installé +# est le seul qui persiste d'un tag au suivant, donc le seul à interroger. +# +# install_units rejoue ce même test : les deux décisions découlent du manifeste, +# aucun état n'est partagé entre les deux fonctions. +unit_up_to_date () { + local MANIFEST="${1}" + local UNIT="${2}" + + [[ -n "${MANIFEST}" ]] || return 1 + sum_matches "${MANIFEST}" "${UNIT}" "${UNIT_DIR}/${UNIT}" +} + fetch_assets () { local DRY_RUN="${1}" local PROFILE="${2}" @@ -253,6 +269,11 @@ fetch_assets () { for unit in $(profile_units "${PROFILE}") do + if unit_up_to_date "${MANIFEST}" "${unit}" + then + info " ${unit} déjà installée en bonne version — téléchargement évité" + continue + fi fetch_asset "${DRY_RUN}" "${MANIFEST}" "${ASSETS}" "${unit}" "${UNIT_PATH}${unit}" done @@ -268,23 +289,34 @@ fetch_assets () { install_units () { local DRY_RUN="${1}" local PROFILE="${2}" - local UNITS unit + local MANIFEST="${3}" + local UNITS unit CHANGED UNITS=$(profile_units "${PROFILE}") || die "profil inconnu : ${PROFILE}" [[ -n "${UNITS}" ]] || { info "units : aucune pour le profil ${PROFILE}"; return 0; } info "units du profil ${PROFILE}" + CHANGED=0 for unit in ${UNITS} do + # Même test que fetch_assets : rien n'a été téléchargé pour cette unit, + # il n'y a donc rien à installer depuis le cache versionné. + if unit_up_to_date "${MANIFEST}" "${unit}" + then + info " ${unit} inchangée — installation évitée" + continue + fi if [[ ${DRY_RUN} -ne ${FLAGS_TRUE} ]] && [[ ! -f "${UNIT_PATH}${unit}" ]] then die "unit absente des assets de la release ${TAG} : ${unit}" fi run "${DRY_RUN}" "install -m 0644 '${UNIT_PATH}${unit}' '${UNIT_DIR}/${unit}'" + CHANGED=1 done - run "${DRY_RUN}" "systemctl daemon-reload" + # daemon-reload seulement si une unit a bougé. + [[ ${CHANGED} -eq 1 ]] && run "${DRY_RUN}" "systemctl daemon-reload" for unit in ${UNITS} do @@ -383,7 +415,7 @@ main () { fetch_assets "${FLAGS_dryrun}" "${FLAGS_profile}" "${ASSETS}" "${MANIFEST}" - install_units "${FLAGS_dryrun}" "${FLAGS_profile}" + install_units "${FLAGS_dryrun}" "${FLAGS_profile}" "${MANIFEST}" switch_binaries "${FLAGS_dryrun}" "${FLAGS_profile}" "${ASSETS}" }