Jenkins Выполнить оболочку, если затем оператор терпит неудачу с «Плохой заменой»

Мне нужен оператор if в Jenkins Execute Shell, но он всегда терпит неудачу в одной и той же строке, независимо от того, что там есть. Я пытаюсь сделать что-то вроде этого:

if [ " ${BuildVariants[*]} " =~ " VariantA " ]; then
    # fails on this line even this line is just a comment
    variant_config = ""
fi

он терпит неудачу, когда я пытаюсь назначить переменную там, терпит неудачу, когда я пытаюсь echo "anything", терпит неудачу даже в комментарии (как пример выше)

Причина: Bad substitution

Примечание. В «Настроить систему» ​​указано что-либо, поэтому следует использовать Bash по умолчанию.

В чем может быть проблема?

Помимо правильного ответа, данного Джо Касадонте, я бы запустил код с включенным set -x, чтобы увидеть, что происходит, и сделал echo $BASH_VERSION в вашем скрипте, чтобы убедиться, что вы действительно используете bash. Далее, вы уверены, что действительно хотите искать подстроку Вариант А, в окружении пространств?, Также вы убедились, что BuildVariants является массивом? Я не понимаю, как вы инициализируете эту переменную. Наконец, я не думаю, что вы публикуете сообщение об ошибке полный.

user1934428 05.04.2022 16:46

Затем вы запускаете сценарии оболочки в конвейере jenkins, он все еще использует синтаксис groovy. Предположим, вам нужно использовать «\» для отображения специальных символов.

Dmitriy Tarasevich 05.04.2022 16:57

@user1934428 user1934428 да, именно в этом и была проблема - я предполагал, что Дженкинс давал мне массив, но он давал строку. Благодарю вас! Он инициализируется расширенным параметром выбора с несколькими вариантами выбора.

Oleksandra 05.04.2022 18:01

Я не думаю, что Дженкинс технически могу передает вам массив. Ваш сценарий запускается как дочерний процесс, и нет общего механизма для передачи массивов в качестве параметров процессам.

user1934428 06.04.2022 08:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
35
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не думаю, что =~ работает внутри [ ... ] — вместо этого используйте [[ ... ]].

Шеллчек — отличный инструмент для поиска таких вещей; это покажет, что вы нажали SC2074.

повторно:

fails on this line even this line is just a comment

У вас не может быть «пустого» блока then. Вы можете использовать только : в качестве кода для выполнения:

if [[ "$foo" == "bar" ]]; then
:
fi

Следующая идея: заставить ваш код запускаться в сценарии оболочки, а затем поместить код в Jenkins. Для этого вам, вероятно, потребуется смоделировать часть входных данных, предоставленных Дженкинсом, но это уберет еще одну движущуюся часть уравнения. Если код запускается из командной строки, а не в Jenkins, то вам нужно начать искать причины, характерные для Jenkins, например, возможно, он запускается в csh вместо Bash (я вижу, вы уже упоминали об этой конкретной возможности, но, может быть, есть что-то еще подобное - я не знаю Дженкинса, извините).

Я пробовал [[ ... ]] тоже самое. Должен был упомянуть об этом

Oleksandra 05.04.2022 16:35

Спасибо за Ваш ответ! Проблема была именно в том, что я пытался запустить команду в онлайн-инструменте bash и издевался над некоторыми входными данными :sweat_smile: там мой скрипт работал, но не в Jenkins. Я предполагал, что Дженкинс давал мне массив, но он давал строку. Итак, теперь я получаю [[: not found ошибку, но, по крайней мере, эта Bad substitution исправлена, ха-ха, еще раз спасибо за помощь!

Oleksandra 05.04.2022 16:56

Ошибка [[: not found предполагает, что она работает в оболочке, отличной от bash (вероятно, dash).

Gordon Davisson 05.04.2022 19:11

@GordonDavisson [[: not found это было исправлено после того, как я добавил #!/bin/bash в начале командного окна (не уверен, что это подтверждает ваше предложение). Спасибо в любом случае!

Oleksandra 05.04.2022 20:01
Ответ принят как подходящий

Итак, проблема была в том, что я предполагал, что Дженкинс дает мне массив, но он дает мне строку. (Я использовал с Расширенный параметр выбора, с несколькими вариантами).

Так что условие должно было быть [[ "$BuildVariants" == *"VariantA"* ]].

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