2016-09-13 3 views
1

우리 프로젝트에는 후속 빌드 프로세스를 위해 환경 변수를 설정하거나 빌드 된 응용 프로그램을 실행하기 위해 소스가되는 쉘 스크립트가 있습니다.

이미 설정된 변수를 확인하고 약간 조정하는 블록이 있습니다. 라이브러리에 경로 $LD_LIBRARY_PATH 이미 아닌 경우를 추가하면

# 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 

즉 그것을 체크한다. (공평하게 말하자면, 이것은 (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을 사용하여 상기 명령의 종료 상태를 마스킹하십시오.

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

이 그러나 또한 당신이 원하는하지 않을 수 있습니다 $? 마스크됩니다

은 또한 출력을 방지하기 위해 grep -q를 사용할 수 있습니다. 명령 종료가 해결되었는지 확인하려면 다음을 사용할 수 있습니다

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 matterPitfalls with set -e

관련 문제