问题描述
在使用 Jenkins 时遇到一个问题:他有一个全局 Jenkins 凭据,以及一个包含以下代码行的配置脚本:
API_TOKEN = "Token XXX"
由于安全原因,他们不能将令牌存储在脚本本身中(脚本位于版本控制中)。用户想知道是否有一种方法可以从 Jenkins 将凭据传递给 Python 配置脚本。
解决方案
请注意以下操作可能因 Jenkins 版本和插件不同而有所差异,做好备份工作。
使用 Jenkins Credentials 插件
对于凭据,CloudBees 推荐使用 Credentials 插件,该插件将凭据注入到调用的脚本可用的环境中。根据 在 Jenkins 构建任务中注入 Secrets 文章:
- Credentials 插件:为您的 Jenkins 实例、插件和构建任务定义凭据的集中方式。
- Credentials Binding 插件:允许您配置构建任务以将凭据作为环境变量注入。
- Plain Credentials 插件:Credentials Binding 插件所需的插件依赖。
在您的脚本中,您可以从脚本的环境中获取变量:
import os
API_TOKEN = os.getenv('API_TOKEN')
使用类似的方法,您还可以传递任意变量(除了凭据),使用 EnvInject 插件(请注意其中的警告)。
另一种可能的方法是配置 Jenkins 以将值作为参数传递给您的脚本。在脚本中,您可以使用您首选的方法来处理脚本参数。
使用 Jenkins Pipeline 的 withCredentials
如果您在使用 Pipeline(例如 Jenkinsfile),可以使用 withCredentials。以下是一个简单的示例:
withCredentials([
usernamePassword(credentialsId: 'my-credentials', usernameVariable: 'user', passwordVariable: 'pw')
]) {
sh("./my-python-script.py --user \${user} --password \${pw}")
}
您的凭据将自动从控制台输出中隐藏,以防止敏感信息泄漏。
请注意,凭据插件仅在 Jenkins 控制台中隐藏敏感信息。如果 Python 脚本创建日志并将凭据存储在其中,它将无法被掩码。目前,我还不知道有效地清理日志文件的方法。
这些解决方案提供了多种方式来处理将 Jenkins 全局凭据传递给 Python 脚本的问题。您可以根据您的需求和环境选择最合适的方法。
正文完