由Jenkins运行的Shell脚本创建了非终止进程

问题描述 投票:0回答:3

我正在尝试使用Jenkins创建一个特殊的git存储库。我创建了一个只执行shell脚本的自由风格项目。当我手动执行这个脚本,没有Jenkins时,它运行得很好。然而,从詹金斯来看,它的表现完全不同。

# this will remove all subtrees
git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort | uniq | xargs -I {} bash -c 'if [ -d $(git rev-parse --show-toplevel)/{} ] ; then rm -rf {}; fi'

rm -rf .git

如果这部分由Jenkins执行,在控制台输出中我会看到这种错误:

rm: cannot remove '.git/objects/pack/pack-022eb85d38a41e66ad3f43a5f28809a5a3ee4a0f.pack': Device or resource busy
rm: cannot remove '.git/objects/pack/pack-05630eb059838f149ad30483bd48d37f9a629c70.pack': Device or resource busy
rm: cannot remove '.git/objects/pack/pack-26f510b5a2d15ba9372cf0a89628d743811e3bb2.pack': Device or resource busy
rm: cannot remove '.git/objects/pack/pack-33d276d82226c201eedd419e5fd24b6b906d4c03.pack': Device or resource busy

我修改了这部分脚本,如下所示:

while true
do
    if rm -rf .git ; then
        break
    else
        continue
    fi
done

但这没有用。在任务管理器中,我看到一个不会终止的git进程。我通过大量的谷歌搜索来形容这个剧本,我不太了解发生了什么。

Jenkins在IIS后面的Windows Server 2012上运行; shell脚本由git随Windows附带的bash执行。

bash git jenkins
3个回答
0
投票

1 /确保您的路径正确,并且在jenkins工作开始的过程中不会出现报价/双引号转义。

2 /您的命令行有点太方便,无法正确和安全地评估。将命令放在常规脚本中,从#!/bin/bash开始,而不是通过命令行。

xargs -I {} bash -c 'if [ -d $(git rev-parse --show-toplevel)/{} ] ; then rm -rf {}; fi'

becames

xargs -I {} /path/myscript.sh {}

#!/bin/bash

rev-parse="$(git rev-parse --show-toplevel)"
wait

if [ -d ${rev-parse}/${1} ] ; then 
   rm -rf ${1}
fi

请注意你的脚本真的不安全,因为你rm -rf参数甚至没有评估它......!

3 /你可以在waitgit之间添加一个rm来等待git进程的结束

4 /使用重定向>> /tmp/git-jenkins-log将git命令记录到日志文件中

5 /将所有这些命令放在脚本中(参见#2)


0
投票

如果rm -rf失败,以下是无限循环

while true
do
    if rm -rf .git ; then
        break
    else
        continue
    fi
done

确实qazxsw poi可用于qazxsw poi或qazxsw poi循环以获得下一个条目,但在此while循环中它将永远运行相同的continue命令。


0
投票

嗯,通过运行来自不同用户的脚本,我能够解决我的问题。默认情况下,Windows Jenkins从用户SYSTEM执行所有作业。我不知道为什么它会影响我的脚本的行为,但是使用for从专门创建的用户帐户运行它。

如果有人有兴趣,我做了这样的事情:

while
© www.soinside.com 2019 - 2024. All rights reserved.