5분마다 GIT 클론 상태를 실행하는 Jenkins 파이프라인을 만들고 싶습니다. GIT 복제 명령이 작동하지 않거나 실패하거나 통과하는 경우 오류/문제를 어떻게 포착합니까?
답변1
일반적인 접근 방식은
if command; then
# Every went OK
else
# Something failed
fi
적용 대상 git
:
if git clone ...; then
# The repo was cloned correctly
else
# Something failed
fi
git clone
첫 번째 분기는 명령이 상태 0(성공을 나타냄)으로 종료되는 경우에만 수행됩니다. 다른 모든 종료 상태는 실패로 간주되어 두 번째 분기가 수행됩니다.
답변2
존재하지 않는 파일의 경우 a
다음 과 같은 cat
경우 :git
]# e=$(cat a 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=1 out="cat: a: No such file or directory"
이제 명령이 생겼습니다산출, 이는 "결과" 값으로 stderr로 대체된 cat의 stdout입니다. 반환 코드는 무료로 제공됩니다 $?
.
성공적으로 비교하려면 다음을 수행하십시오 cat
.
]# e=$(cat atext 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=0 out=""
-> 성공 시 null로 리디렉션됩니다. 빈 오류 메시지입니다.
]# e=$(cat atext)
]# echo ret=$? out=\"$e\"
ret=0 out="First line of a"
-> 성공했으므로 "$e"는 데이터를 저장합니다.
]# e=$(cat xxx 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=1 out="cat: xxx: Is a directory"
-> 메시지는 장황하지만 종료 코드는 일관되게 유지됩니다.
예, 디렉토리가 있습니다 xxx
. git clone .git xxx
특정 오류를 발생시키려고 할 때 디렉토리가 만들어졌습니다.
(그래서 나는 로 바꿨다 cat
)
]# e=$(cat -M 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=1 out="cat: invalid option -- 'M' Try 'cat --help' for more information."
]#
여전히 ret=1입니다.
댓글 링크에 실종자에 대한 불만이 표시되어 있습니다.특정한자식 오류 코드. (porcelain) git 명령은 대화형 사용을 위해 설계된 반면 (bash) 셸에는 입력 및 출력에 대한 자체 개념이 있기 때문에 이것이 이중 오해라고 생각합니다.
내 예에서는 cat의 통합 오류 코드 "1"에 대해 불평하거나 메시지를 캡처하고 구문 분석하려고 시도해서는 안 됩니다.복잡한 스크립트(이것은 다음과 같다.간단한 절차). 먼저 모든 것이 준비되었는지 확인하고 필요한 경우(오류 또는 경고) 사용자에게 알려야 합니다.
어떤 종류의 오류 코드가 표시되는지 궁금합니다 git clone
. git의 매뉴얼 페이지는 반환 코드에 대해 매우 조용합니다. vi 예제와 같습니다. mount
"코드는 OR될 수 있다"와는 매우 다릅니다.
"안전하지 않은" 명령이 주어지면 git clone $d
오류 코드와 소스 코드를 메시지에 추가할 수 있습니다. 다음은 대화형 단일 라이너입니다.
]# d='xxx'; git clone $d || echo "g. cl. failed with $?"
fatal: destination path 'xxx' already exists and is not an empty directory.
g. cl. failed with 128
스크립트로서 이것은 그렇게 명확하지 않습니다.
]# . gc.sh
fatal: destination path 'xxx' already exists and is not an empty directory.
g. cl. failed with 128
그리고 cat gc.sh
:
d='xxx'
git clone $d; ret=$?
if (( $ret > 0 ))
then echo "g. cl. failed with $ret"
fi
그렇지 않으면 $?
충분히 신선하지 않습니다. 참/거짓에 대한 테스트도 명확합니다.