Gitlab CI/CD создание и использование пользовательских функций
Я пробовал создать такую функцию в моем конфигурационном файле gitlab:
deploy:
stage: dev
services:
- docker:dind
script:
- myFunction () { api_pl_tmp=$(curl -s --header "PRIVATE-TOKEN: $TOKEN_VAR" "https://git.example.ru/api/v4/projects/1/pipelines/latest" | jq .) }
- while myFunction; do
- if [ $(echo $api_pl_tmp | jq -r .status) = "success" ]
- then
- export PROJECT_CURRENT=$($api_pl_tmp | jq -r '{id:.id,sha:.sha[0:8]}' | base64)
- break
- fi
- if [ $(echo $api_pl_tmp | jq -r .status) = "failed" ]
- then
- echo "Error: Frontend can't be deployed!"
- exit 1
- fi
- if [ $(echo $api_pl_tmp | jq -r .status) = "running" ]
- then
- echo "Wait 5 sec... Frontend deploying!"
- sleep 5
- else
- echo Unknow status $(echo $api_pl_tmp | jq -r .status)
- exit 1
- fi
- done
Но это не работает, и gitlab возвращает мне ошибку с сообщением:
Эта конфигурация GitLab CI недействительна: jobs:deploy-to-dev: конфигурация скрипта должна быть строкой или вложенным массивом строк глубиной до 10 уровней.
Как я могу исправить эту проблему или, может быть, у меня есть ошибка в моей пользовательской функции?
1 ответ
-
разделяет команды командами между ними. Поместите свои команды как одну команду, а не несколько. Помните, что они соединены с пробелами.
Проблема с вашим скриптом - двоеточие - см. Https://gitlab.com/gitlab-org/gitlab-foss/-/issues/30097 .
deploy:
stage: dev
services:
- docker:dind
script:
- "colon=:"
- myFunction () {
api_pl_tmp=$(curl -s --header "PRIVATE-TOKEN$colon $TOKEN_VAR" \
"https$colon//git.example.ru/api/v4/projects/1/pipelines/latest" | jq .);
}
- while myFunction; do
if [ $(echo $api_pl_tmp | jq -r .status) = "success" ]; then
export PROJECT_CURRENT=$($api_pl_tmp | jq -r '{id:.id,sha:.sha[0:8]}' | base64);
break;
fi;
if [ $(echo $api_pl_tmp | jq -r .status) = "failed" ]; then
echo "Error$colon Frontend cant be deployed";
exit 1;
fi;
if [ $(echo $api_pl_tmp | jq -r .status) = "running" ]; then
echo "Wait 5 sec... Frontend deploying!";
sleep 5;
else
echo Unknow status $(echo $api_pl_tmp | jq -r .status);
exit 1;
fi;
done
Также
jq .) }
отсутствует
;
. Сначала по одному проверяйте свои сценарии в собственной оболочке. Проверьте свои скрипты на https://shellcheck.net .
Также
$($api_pl_tmp
отсутствует эхо, и есть много проблем с цитированием. Используйте последовательные отступы и постарайтесь написать читаемый код, чтобы минимизировать количество опечаток.