Skip to content

Instantly share code, notes, and snippets.

@stoerr
Created February 2, 2024 11:28
Show Gist options
  • Save stoerr/e641ff8bbbeab27691ce3a75a4c1c69c to your computer and use it in GitHub Desktop.
Save stoerr/e641ff8bbbeab27691ce3a75a4c1c69c to your computer and use it in GitHub Desktop.
Script zum leichteren Aufrufen von Deployment-Kommandos - vergleiche https://youtu.be/CMB1HEr5MnM
#!/usr/bin/env bash
# Demoscript erzeugt mit Github Copilot, vergleiche https://youtu.be/CMB1HEr5MnM
# Ist auch durchaus verwendbar. :-)
function usage() {
cat <<EOF
Verwendung: $0 [-h] [-l] [-v] [tag]
Führt einen Build / ein Deployment mit einem für das aktuelle Verzeichnis konfigurierten Befehle aus.
Der Script sucht nach einer Konfigurationsdatei mit dem Namen .deploycmds im aktuellen Verzeichnis
und den übergeordneten Verzeichnissen bis zu $HOME.
Diese Dateien enthalten eine Liste von Befehlen für verschiedene Bereitstellungstypen enthalten. Vorangestellt
ist ein Tag, der das Kommando kennzeichnet. Beispiel für eine .deploycmds-Datei:
local mvn -P local clean install # Bereitstellung auf lokaler Maschine
test mvn -P test clean install # Bereitstellung auf Testserver
Das Tag (hier local und test) kann verwendet werden, um das Kommando auszuwählen.
Wenn kein Tag angegeben wird, wird das erste Kommando ausgeführt.
Die .deploycmds-Datei im aktuellen Verzeichnis hat Vorrang vor den Dateien in den übergeordneten Verzeichnissen.
Optionen:
-h gibt diese Hilfenachricht aus
-l listet die verfügbaren Bereitstellungstypen auf
-v gibt alle für das aktuelle Verzeichnis relevanten .deploycmds-Dateien und die Befehle, die sie enthalten, aus
EOF
exit 1
}
# Parsen der Kommandozeilenoptionen
while getopts ":hlv" opt; do
case $opt in
h)
usage
;;
l)
list=true
;;
v)
verbose=true
;;
\?)
echo "Ungültige Option: -$OPTARG" >&2
usage
;;
esac
done
# Verschieben der Kommandozeilenoptionen
shift $((OPTIND-1))
# Speichern der Kommandos in einem assoziativen Array
declare -A cmds
# Suchen nach einer .deploycmds-Datei im aktuellen Verzeichnis und den übergeordneten Verzeichnissen
# bis zum Home-Verzeichnis
dir=$(pwd)
while [[ $dir != $HOME ]]; do
if [[ -f $dir/.deploycmds ]]; then
# Einlesen der .deploycmds-Datei
while read line; do
# Entfernen von Kommentaren
line=${line%%#*}
# Entfernen von Leerzeichen am Anfang und Ende
line=${line## }
line=${line%% }
# Überspringen leerer Zeilen
if [[ -z $line ]]; then
continue
fi
# Aufteilen in Tag und Kommando
tag=${line%% *}
cmd=${line#* }
# Speichern des Kommandos im assoziativen Array falls es noch nicht definiert wurde
if [[ -z ${cmds[$tag]} ]]; then
cmds[$tag]=$cmd
fi
# Speichern des ersten Kommandos falls noch keines definiert wurde
if [[ -z $first ]]; then
first=$cmd
fi
done < $dir/.deploycmds
fi
dir=$(dirname $dir)
done
# Ausgabe der verfügbaren Tags
if [[ $list ]]; then
for tag in "${!cmds[@]}"; do
echo -n $tag ""
done
echo
exit 0
fi
# Ausgabe der für das aktuelle Verzeichnis relevanten .deploycmds-Dateien und der Befehle, die sie enthalten
if [[ $verbose ]]; then
echo "Für das aktuelle Verzeichnis relevant:"
for tag in "${!cmds[@]}"; do
echo "$tag: ${cmds[$tag]}"
done
exit 0
fi
# Ausführen des Kommandos mit dem angegebenen Tag oder dem ersten Kommando, falls kein Tag angegeben wurde
if [[ -z $1 ]]; then
cmd=$first
else
cmd=${cmds[$1]}
fi
if [[ -z $cmd ]]; then
echo "Kein Kommando für Tag $1 gefunden" >&2
exit 1
fi
eval $cmd
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment