Created
February 2, 2024 11:28
-
-
Save stoerr/e641ff8bbbeab27691ce3a75a4c1c69c to your computer and use it in GitHub Desktop.
Script zum leichteren Aufrufen von Deployment-Kommandos - vergleiche https://youtu.be/CMB1HEr5MnM
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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