如何在Jenkins流水线加载credentials.json?解决文件找不到报错
针对你的两个问题的解决方案
问题1:Google Directory API脚本找不到credentials.json的错误
首先明确:不需要把credentials.json存入Credential Manager,这个错误的核心原因是脚本运行时的工作目录和文件实际所在路径不匹配,导致脚本找不到它。
具体排查和解决步骤:
- 先看Jenkins
Check activity阶段里sh 'pwd'的输出,确认执行脚本时的当前工作目录是什么。比如如果输出是项目根目录,而你的credentials.json放在it/google-users/文件夹下,那脚本里写的相对路径credentials.json就会去根目录找,自然找不到。 - 解决方法:
- 修改Python脚本里的路径,用相对脚本所在位置的路径,比如如果脚本在
it/google-users/,文件在根目录,就写成../credentials.json; - 或者在Groovy脚本里执行Python脚本前,先cd到脚本所在目录:
cd ./it/google-users/ && ${my_pip_env} run -v python3 google_user.py ... - 最稳妥的是用绝对路径,可以在Groovy里通过
realpath获取文件的绝对路径,然后传给Python脚本(或者在Python脚本里用os.path.dirname(__file__)来获取脚本所在目录,再拼接文件路径)。
- 修改Python脚本里的路径,用相对脚本所在位置的路径,比如如果脚本在
问题2:Groovy脚本是否需要定义环境变量
答案是需要按需定义,你的现有脚本已经处理了部分变量,但还有可以优化的地方:
现有脚本的问题和优化建议:
- 关于
VERSION、DRY_RUN、EXCLUDED_TYPES:
这些变量在脚本里被引用,但如果它们是Jenkins的构建参数或者全局变量,最好在Groovy的environment块里明确声明,避免出现未定义的错误。比如:stage('Check activity') { environment { // 如果是参数化构建,就用params.VERSION VERSION = params.VERSION ?: 'default-version' DRY_RUN = params.DRY_RUN ?: 'false' EXCLUDED_TYPES = params.EXCLUDED_TYPES ?: '' } steps { // 你的现有sh脚本内容 } } - 关于
PYTHONPATH和PIPENV_PIPFILE:
你已经在bash脚本里设置了这两个变量,没问题,但可以把它们移到Groovy的environment块里,让代码更清晰:environment { PYTHONPATH = "${pwd()}:${env.PYTHONPATH}" PIPENV_PIPFILE = "${pwd()}/Pipfile" } - 关于pipenv的路径:
脚本里手动指定/home/${USER}/.local/bin/pipenv有点冗余,在Jenkins环境里运行用户通常是jenkins,可以直接写成/home/jenkins/.local/bin/pipenv,或者更简单的是把~/.local/bin加到PATH里,这样就不用手动找路径了:
把这行加到bash脚本的开头,之后直接用export PATH="$HOME/.local/bin:$PATH"pipenv命令就行,不用再处理my_pip_env变量,简化代码。
内容的提问来源于stack exchange,提问作者bizimunda
相关产品推荐
相关产品推荐

