2016-09-13 5 views
1

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

Он содержит блок, который проверяет уже установленные переменные и выполняет некоторую настройку.

# part of setup.sh 
for LIBRARY in "${LIBRARIES_WE_NEED[@]}" 
do 
    echo $LD_LIBRARY_PATH | \grep $LIBRARY > /dev/null 
    if [ $? -ne 0 ] 
    then 
    echo Adding $LIBRARY 
    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIBRARY 
    else 
    echo Not adding $LIBRARY 
    fi 
done 

т.е. он проверяет, если путь к библиотеке уже в $LD_LIBRARY_PATH и если нет, то добавляет его. (Справедливости ради, это можно было бы написать по-другому (like here), но предположим, что сценарий должен достичь чего-то, что очень сложно сделать, не вызывая программу, проверяя $?, а затем либо делайте одно, либо делаете другое).

.gitlab-ci.yml затем содержит

before_script: 
    - yum install -y <various packages> 
    - source setup.sh 

но бегун решает остановить до сценария в тот самый момент $? ненулевой, то есть, когда Условный оператор решает добавить путь к $LD_LIBRARY_PATH. Теперь приятно, что бегун gitlab проверяет $? после каждой строки моего скрипта, но здесь было бы здорово, если бы строки в .gitlab-ci.yml считались атомарными.

Есть ли способ избежать промежуточных проверок $? в сценарии, который получен в .gitlab-ci.yml?

ответ

4

Используйте command_that_might_fail || true для маскировки статуса выхода указанной команды.

Также обратите внимание, что вы можете использовать grep -q, чтобы предотвратить выход:

echo "$LD_LIBRARY_PATH" | grep -q "$LIBRARY" || true 

Это, однако, также маскировать $?, которые вы не могли бы хотеть. Если вы хотите проверить, если команда выходит правильно, вы могли бы использовать:

if echo "$LD_LIBRARY_PATH" | grep -q "$LIBRARY"; then 
    echo "Adding $LIBRARY" 
else 
    ... 
fi 

Я подозреваю, что gitlab-ci наборы -e которые можно выключить с помощью set +e:

set +e # Disable exit on error 
for library in "${LIBRARIES_WE_NEED[@]}"; do 
    ... 
done 
set -e # Enable exit on error 

будущее чтение: Why double quotes matter и Pitfalls with set -e

 Смежные вопросы

  • Нет связанных вопросов^_^