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отсутствует эхо, и есть много проблем с цитированием. Используйте последовательные отступы и постарайтесь написать читаемый код, чтобы минимизировать количество опечаток.

Другие вопросы по тегам