权限被拒绝:在Jenkins作业中从Python调用shell脚本

eaf3rand  于 2023-02-11  发布在  Jenkins
关注(0)|答案(1)|浏览(192)

这里尽量提供最少的必要信息,所以我遗漏了很多。周围有很多类似的问题,但最常见的答案(使用chmod +x)对我不起作用。
我有一个Python脚本和一个shell脚本,它们位于GitHub Enterprise存储库中:

接下来,在Jenkins中,我 checkout 这个存储库中的代码。Jenkins文件中的两个关键步骤如下:

dir ("$WORK/python")
{           
    sh "chmod +x test.sh"
    sh "python3 foo.py -t '${AUTH}'"
}

在这里,$WORK是Jenkins节点上代码 checkout 的位置,python(是的,名字很糟糕)是Python和shell脚本所在的存储库中的文件夹。现在,foo.py以这种方式调用shell脚本:

try:
    cmd = f'test.sh {repo_name}'
    subprocess.Popen(cmd.split())

except Exception as e:
    print(f'Error during repository scan: {e}')

在这里,repo_name只是我在上面定义的一个参数,我要求shell脚本处理它,当我在Jenkins中运行这个作业时,从技术上讲,它执行无误,但上面的异常分支确实运行了:

11:37:24  Error during repository scan - [Errno 13] Permission denied: 'test.sh'

我想确认Jenkinsfile中的chmod正在运行,所以我打开了代码 checkout 到的计算机的终端,发现执行权限确实设置正确:

-rw-r--r-- 1 adm domain users   4106 Feb  6 14:24 foo.py
-rwxr-xr-x 1 adm domain users    619 Feb  6 14:37 test.sh

我一整天都在忙这个。到底怎么回事?

eoigrqb6

eoigrqb61#

执行此操作可修复此问题:

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

cmd = f'{BASE_DIR}/test.sh {repo_name}'
Popen(cmd.split())

为什么呢?由于我对获取别人代码的无知,我忽略了在调用shell脚本之前隐藏在更上面的内容,我们将其更改为下一级的文件夹:

os.chdir('repo_content')

当然,shell脚本并不在那里,所以不指定路径就调用它是行不通的,我不知道为什么会得到[Errno 13] Permission denied: 'test.sh',因为这意味着shell脚本已经找到了,但是如上所述完全限定路径正是我所希望的。

相关问题