Inzwischen wurde durch GitLab die Parent-Child Pipeline als Feature hinzugefügt. Die nach und nach einige Teilfeatures dazu erhalten hat. Funktionsweise ist, dass eine Pipeline (Parent) eine Sub-Pipeline anstößt, welche nun als eigenständige Pipeline (Child) läuft. Wie im ersten Absatz erwähnt werden Konfigurationen außerhalb des Pipeline-Steps immer am Start einer Pipeline genutzt. Vortreffliche Chance, hier eine Lücke für unseren Feature-Wunsch zu finden, und tatsächlich besteht inzwischen die Möglichkeit, eine Pipeline-Definition in der Parent-Pipeline zu erzeugen und in der Child-Pipeline zu nutzen. Somit kann man Variablen abhängig von Steps machen, solange die nutzenden Steps allesamt in einer Child-Pipeline verpackt sind.
Im konkreten Fall nutzen wir dies nun um ein Deployment zeitgesteuert von Automatisch auf Manuell zu stellen.
Das Script für den Step in der Parent-Pipeline:
generate:deployment:
script:
- git clone git@ssh.git.xx:pipeline/defintion --branch main ./${STAGE} && cd ./${STAGE}/steps
- DAY_OF_THE_WEEK=$(TZ=":Europe/Berlin" date +%u)
- HOUR_OF_THE_DAY=$(TZ=":Europe/Berlin" date +%-H)
- |
if [ $DAY_OF_THE_WEEK -gt 4 ]; then
echo "Deployment is not allowed between Friday and Sunday."
sed "s|###VERSION###|${IMAGE_VERSION}|g ; s|###IDENTIFIER###|${PIPELINE_PROCESS_IDENTIFIER}|g ; s|\s\s//to-sed| - when: manual|g" deployment.yaml >> deploy.yaml
exit 0
fi
Das eigentliche Template, welches per ‘sed’ manipuliert wird:
deploy:
stage: Deployment
environment:
name: $NAMESPACE
url: $ENV_URL
variables:
IMAGE_VERSION: ###VERSION###
PIPELINE_PROCESS_IDENTIFIER: ###IDENTIFIER###
needs:
- project: $PARENT
job: $JOB
ref: $REF
artifacts: true
rules:
//to-sed
script:
- do-some-deployment-things.sh
Als letztes müssen wir die eben erzeugte Pipeline nur noch triggern:
deploy:trigger:
stage: Deployment
variables:
PARENT: $CI_PROJECT_PATH
JOB: generate:deployment
REF: $CI_COMMIT_REF_NAME
needs: ["generate:deployment"]
trigger:
include:
- artifact: deploy.yaml
job: generate:deployment
strategy: depend
Als Tipp möchte ich noch mitgeben, besonderes Augenmerk auf evtl. genutzte Caches der Steps zu legen. Hier kann es schnell passieren, dass durch überlappende Pipelines die erzeugten Child-Pipeline-Yamls überschrieben werden und es schnell zu äußerst kuriosen Fehlern führt, welche nicht gleich darauf zurückzuführen sind.