Repository navigation
Expand file tree
/
Copy pathdispatch.sh
More file actions
executable file
·64 lines (56 loc) · 2.34 KB
/
Copy pathdispatch.sh
File metadata and controls
executable file
·64 lines (56 loc) · 2.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/env bash
# Dispatcher central appelé par le listener webhook.
# Rôle : résoudre le dossier du projet à partir du nom du repo GitHub,
# mettre le code à jour (git), puis lancer le contrat ./deploy.sh du projet.
#
# IMPORTANT : on lance le déploiement en arrière-plan et on rend la main
# immédiatement — GitHub coupe la livraison du webhook après ~10s, or un
# build Docker dure plus longtemps. Le vrai déploiement continue, loggé.
set -euo pipefail
REPO="${1:-}" # ex: "thibault/hush" (repository.full_name)
CONF="/deploy/projects.conf"
LOGDIR="/deploy/logs"
mkdir -p "$LOGDIR"
if [ -z "$REPO" ]; then
echo "dispatch: aucun repo fourni" >&2
exit 2
fi
# Résolution du dossier : 1) table explicite projects.conf, 2) fallback /srv/<repo>
DIR=""
if [ -f "$CONF" ]; then
DIR="$(grep -vE '^\s*#' "$CONF" | awk -F'=' -v r="$REPO" '
{ gsub(/[[:space:]]/, "", $1); gsub(/[[:space:]]/, "", $2) }
tolower($1) == tolower(r) { print $2; exit }')"
fi
[ -z "$DIR" ] && DIR="/srv/$(basename "$REPO")"
if [ ! -d "$DIR/.git" ]; then
echo "dispatch: $DIR n'est pas un clone git (repo $REPO)" >&2
exit 3
fi
LOG="$LOGDIR/$(basename "$REPO").log"
# Clé de déploiement LECTURE SEULE, dédiée à CE repo (une clé par projet, montées
# dans /keys). Compromission du webhook => lecture d'un seul repo, pas d'écriture.
KEYNAME="$(basename "$REPO" | tr '[:upper:]' '[:lower:]')"
KEYFILE="/keys/${KEYNAME}.key"
if [ ! -f "$KEYFILE" ]; then
echo "dispatch: aucune clé de déploiement pour $REPO (attendu $KEYFILE)" >&2
exit 4
fi
export GIT_SSH_COMMAND="ssh -i $KEYFILE -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new"
# Déploiement détaché (survit à la fin de la requête webhook)
setsid bash -c '
set -euo pipefail
cd "'"$DIR"'"
echo "===== $(date "+%F %T") deploy '"$REPO"' -> '"$DIR"' ====="
# Les clones /srv appartiennent à deploy ; git tourne en root dans le conteneur
git config --global --add safe.directory "'"$DIR"'"
git fetch --prune origin
git reset --hard origin/main
# Le conteneur tourne en root : on remet les fichiers au propriétaire humain
# unique (thibault, UID 1000) pour éviter tout mélange root/deploy.
chown -R 1000:1000 "'"$DIR"'"
chmod +x ./deploy.sh
./deploy.sh
echo "===== $(date "+%F %T") done ====="
' >>"$LOG" 2>&1 < /dev/null &
echo "deploy de $REPO mis en file (voir $LOG)"