我想创建一个 Jenkins 管道,每 5 分钟运行一次 GIT 克隆健全性。如果 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"
现在我有了命令输出,这是 cat 的 stdout 被 stderr 替换,作为“结果”值。返回代码免费提供$?
。
为了比较成功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。
评论中的链接显示了一些关于失踪的投诉具体的git 的错误代码。我认为这是一个双重误解,因为(瓷器)git 命令是为了交互式使用而设计的,而(bash)shell 有它自己的关于输入和输出的概念。
在我的示例中,我不应该抱怨 cat 的统一错误代码“1”,或者尝试捕获并解析 a 中的消息复杂的脚本(这与简单的程序)。我应该先检查一切是否准备就绪,并在必要时告诉用户(错误或警告)。
我想知道您从 中得到什么样的错误代码git clone
。 git 的手册页对返回码非常沉默。就像 vi 的例子一样。mount
与“代码可以进行或运算” 非常不同。
给定“不安全”命令,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
否则$?
不够新鲜。对真/假的测试也是明确的。