스크립트를 종료하기 전에 xtrace를 비활성화하는 좋은 방법을 찾으려고 노력 중입니다. 이는 지속적인 통합 및 배포 SaaS Wercker에 의해 수행됩니다.
이전 스크립트 중 하나가 xtrace를 활성화한 상태에서 실행되었습니다.
+ echo 7ad27e6b-75d9-4e72-a9a7-8b0d6796bd75 0
source "/pipeline/maven-9ea06b71-4392-4fec-ab5a-db7389b49cf2/run.sh" < /dev/null
+ source /pipeline/maven-9ea06b71-4392-4fec-ab5a-db7389b49cf2/run.sh
++ set +o xtrace ## disabling here to keep other area's quiet
...
++ '[' -e settings.xml ']'
++ SETTINGS=--settings=settings.xml
++ mvn --update-snapshots --batch-mode -Dmaven.repo.local=/pipeline/cache --settings=settings.xml deploy
...
+ echo f5b142ac-a369-4166-967e-688d46c642c8 0
이것은내 실제 코드
if [ -n "$WERCKER_MAVEN_DEBUG" ]; then
set -o xtrace
case "$WERCKER_MAVEN_DEBUG" in
[1-2]) env;;
[1-3]) DEBUG="--debug";;
esac
fi
if [ -e "$WERCKER_MAVEN_SETTINGS" ]; then
SETTINGS="--settings=${WERCKER_MAVEN_SETTINGS}"
fi
mvn --update-snapshots \
--batch-mode \
-Dmaven.repo.local=${WERCKER_CACHE_DIR} \
${SETTINGS} ${DEBUG} \
${WERCKER_MAVEN_GOALS}
set +o xtrace
파일 하단에서 xtrace를 비활성화 하려고 할 때 반환 값을 항상 0으로 변경하면 maven이 실패하더라도 ci는 실패하지 않습니다. 그런 다음 Maven 반환을 캡처하여 호출하려고 시도했지만 exit ${STATUS}
이로 인해 Maven이 상태 0으로 성공했음에도 불구하고 실패하게 되었습니다. 내 생각에 이것은 코드를 캡처하는 방식이 아니라 종료를 호출하는 것과 관련이 있는 것 같습니다.
실행 후 비활성화 xtrace
하고 호출자 스크립트의 Maven 반환 상태를 유지하는 방법은 무엇입니까?mvn
답변1
코드를 함수로 리팩토링했는데, 이 경우 중요한 함수는 disable_xtrace_and_return_status
Maven 실행에서 캡처된 상태를 반환하는 방법입니다. 이것이 효과적이라고 스스로 속이곤 했지만...
function disable_xtrace_and_return_status() {
set +o xtrace
return $1
}
function run() {
if [ -n "$WERCKER_MAVEN_DEBUG" ]; then
if [ "$WERCKER_MAVEN_DEBUG" -ge "1" ]; then
set -o xtrace
if [ "$WERCKER_MAVEN_DEBUG" -ge "2" ]; then
env
if [ "$WERCKER_MAVEN_DEBUG" -ge "3" ]; then
local debug="--debug"
fi
fi
fi
fi
if [ -e "$WERCKER_MAVEN_SETTINGS" ]; then
local settings="--settings=${WERCKER_MAVEN_SETTINGS}"
fi
mvn --update-snapshots \
--batch-mode \
-Dmaven.repo.local=${WERCKER_CACHE_DIR} \
${settings} ${debug} \
${WERCKER_MAVEN_GOALS}
disable_xtrace_and_return_status $?
}
run;
답변2
set -o xtrace
서브셸 환경 내에서만 영향을 받도록 함수를 서브셸로 래핑할 수 있습니다 .
run() (
if [ -n "$WERCKER_MAVEN_DEBUG" ]; then
set -o xtrace
case "$WERCKER_MAVEN_DEBUG" in
[1-2]) env;;
[1-3]) DEBUG="--debug";;
esac
fi
if [ -e "$WERCKER_MAVEN_SETTINGS" ]; then
SETTINGS="--settings=${WERCKER_MAVEN_SETTINGS}"
fi
mvn --update-snapshots \
--batch-mode \
-Dmaven.repo.local=${WERCKER_CACHE_DIR} \
${SETTINGS} ${DEBUG} \
${WERCKER_MAVEN_GOALS}
)
run
printf '%s\n' "$?"
간단한 테스트:
$ cat test.sh
#!/bin/sh
run() (
set -o xtrace
return 1
)
run
printf '%s\n' "$?"
달리다:
$ ./test.sh
+ return 1
1