nulib/runphp/build

193 lines
5.9 KiB
Bash
Executable File

#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
MYDIR="$(cd "$(dirname -- "$0")"; pwd)"
RUNPHP="$MYDIR/runphp"
"$RUNPHP" --bs --ue --ci || exit 1
PROJDIR=; COMPOSERDIR=; COMPOSERPHAR=; VENDORDIR=; BUILDENV0=; BUILDENV=
BUILD_IMAGES=(php-apache mariadb10); export BUILD_FLAVOUR=; DIST=; IMAGENAME=
source "$RUNPHP" || exit 1
source "$PROJDIR/$VENDORDIR/nulib/php/load.sh" || exit 1
require: template
BUILD_ARGS=(
DIST NDIST
REGISTRY
APT_PROXY
APT_MIRROR
SEC_MIRROR
TIMEZONE
)
function dklsnet() {
docker network ls --no-trunc --format '{{.Name}}' -f name="$1" 2>/dev/null
}
function dklsimg() {
local image="$1" version="$2"
docker image ls --no-trunc --format '{{.Repository}}:{{.Tag}}' "$image${version:+:$version}" 2>/dev/null
}
function dklsct() {
# afficher le container dont l'image correspondante est $1
docker ps --no-trunc --format '{{.Image}} {{.Names}}' | awk -v image="$1" '$1 == image { print $2 }'
}
function dkrunning() {
# vérifier si le container d'image $1 tourne
[ -n "$(dklsct "$@")" ]
}
function dclsct() {
# afficher les containers correspondant à $1(=docker-compose.yml)
docker compose ${1:+-f "$1"} ps -q
}
function dcrunning() {
# vérifier si les containers correspondant à $1(=docker-compose.yml) tournent
# si $2 est spécifié, c'est le nombre de service qui doit tourner
if [ -n "$2" ]; then
[ "$(dclsct "${@:1:1}" | wc -l)" -eq "$2" ]
else
[ -n "$(dclsct "${@:1:1}")" ]
fi
}
function build_check_env() {
eval "$(template_locals)"
template_copy_missing "$PROJDIR/$BUILDENV0" && updated=1
template_process_userfiles
if [ -n "$updated" ]; then
if [ $(id -u) -ne 0 ]; then
setx userent=getent passwd "$(id -un)"
setx userent=qval "$userent"
setx groupent=getent group "$(id -gn)"
setx groupent=qval "$groupent"
sed -i "
/^#DEVUSER_.*=/s/^#//
/^DEVUSER_USERENT=/s/=.*/=${userent//\//\\\/}/
/^DEVUSER_GROUPENT=/s/=.*/=${groupent//\//\\\/}/
" "$PROJDIR/$BUILDENV"
fi
enote "IMPORTANT: Veuillez faire le paramétrage en éditant le fichier $BUILDENV
${EDITOR:-nano} $BUILDENV
ENSUITE, vous pourrez relancer la commande"
return 1
fi
}
function _build() {
local dockerfile image="${PRIVAREG:+$PRIVAREG/}${IMAGENAME%/*}/$1"
if [ -n "$ForceBuild" -o -z "$(dklsimg "$image")" ]; then
estep "Construction de $image"
dockerfiles=(
"$MYDIR/Dockerfile.$1.local"
"$MYDIR/Dockerfile.$1$BUILD_FLAVOUR"
"$PROJDIR/$VENDORDIR/nulib/php/dockerfiles/Dockerfile.$1$BUILD_FLAVOUR"
"$MYDIR/Dockerfile.$1"
"$PROJDIR/$VENDORDIR/nulib/php/dockerfiles/Dockerfile.$1"
)
for dockerfile in "${dockerfiles[@]}"; do
[ -f "$dockerfile" ] && break
done
args=(
-f "$dockerfile"
${Pull:+--pull}
${NoCache:+--no-cache}
${PlainOutput:+--progress plain}
-t "$image"
)
for arg in "${BUILD_ARGS[@]}"; do
args+=(--build-arg "$arg=${!arg}")
done
for arg in "${!PROXY_VARS[@]}"; do
args+=(--build-arg "$arg=${PROXY_VARS[$arg]}")
done
for host in "${HOST_MAPPINGS[@]}"; do
args+=(--add-host "$host")
done
docker build "${args[@]}" "$PROJDIR" || die
if [ -n "$Push" ]; then
if [ -n "$PRIVAREG" ]; then
estep "Poussement de $image"
docker push "$image" || die
else
ewarn "PRIVAREG non défini: impossible de pousser l'image"
fi
fi
fi
}
function build_images() {
local image sourced
[ $# -gt 0 ] || set -- runphp "${BUILD_IMAGES[@]}"
for image in "$@"; do
case "$image" in
runphp)
[ ${#Configs[*]} -gt 0 ] && export RUNPHP_FORCE_BUILDENVS="${Configs[*]}"
local -a args=(--bootstrap)
[ "$ForceBuild" != all ] && args+=(--unless-exists)
[ -n "$Pull" ] && args+=(--pull)
[ -n "$NoCache" ] && args+=(--no-cache)
"$RUNPHP" "${args[@]}" || die
;;
*)
if [ -z "$sourced" ]; then
[ ${#Configs[*]} -gt 0 ] || Configs=("$PROJDIR/$BUILDENV")
for config in "${Configs[@]}"; do
source "$config"
done
after_source_buildenv
read -a HOST_MAPPINGS <<<"${HOST_MAPPINGS//
/ }"
sourced=1
fi
_build "$image"
;;
esac
done
}
action=build
Configs=()
ForceBuild=
Pull=
NoCache=
PlainOutput=
Push=
args=(
"Construire les images pour le projet"
#"usage"
--check-only action=none "++Ne faire que la vérification de l'environnement"
-c:,--config:BUILDENV Configs "Spécifier un fichier d'environnement pour le build"
-r,--rebuild ForceBuild=1 "Forcer la (re)construction des images"
-R,--rebuild-all ForceBuild=all "++Comme --rebuild, mais reconstruire aussi runphp"
-U,--pull Pull=1 "++Forcer le re-téléchargement des images dépendantes"
-j,--no-cache NoCache=1 "++Construire l'image en invalidant le cache"
-D,--plain-output PlainOutput=1 "++Afficher le détail du build"
-p,--push Push=1 "Pousser les images vers le registry après construction"
)
parse_args "$@"; set -- "${args[@]}"
if [ ${#Configs[*]} -gt 0 ]; then
aconfigs=()
for config in "${Configs[@]}"; do
setx config=abspath "$config"
aconfigs+=("$config")
done
Configs=("${aconfigs[@]}")
# pas de vérification d'environnement si on spécifie Configs
# ne pas oublier d'implémenter un traitement spécifique si build_check_env()
# contient d'autres vérifications
else
build_check_env || die
fi
[ "$action" == none ] && exit 0
case "$action" in
build) build_images "$@";;
*) die "$action: action non implémentée";;
esac