Jenkinsfile 语法 - 是否有共享 python 构建步骤的 DRY 示例?

Jenkinsfile syntax - is there a DRY-example of shared python build steps?

我有一个回购 "A" 共享 python 构建脚本,我今天 运行 在 Jenkins 的各种 "Execute shell" 构建步骤中。我从 job-dsl groovy 代码中播种了这个 steps/scripts。

在 repo "B"(我的应用程序源代码所在的位置)中使用较新的 Jenkins 2 Pipeline 概念,我在这个 repo 中的 Jenkinsfile 必须是什么样子才能保持干燥并重用我现有的 python 构建脚本?

我已经研究了插件 'workflow-cps-global-lib' 并且我尝试在我的 Jenkins master 上设置 "Pipeline Libraries" 但是因为这个设置面向 groovy 它不只是感觉是正确的方式去或我只是不明白正确的语法。我找不到关于此特定用例的任何示例。

基本上我只想在我的 Jenkinsfile 中这样做:

  1. 为我的应用程序克隆我的源代码库 ('B')
  2. 使我共享的 python 从我的存储库 "A" 构建脚本可用
  3. 从各种 "execute shell" 步骤执行 python 构建脚本
  4. 等等...

workflow-cps-global-lib 是要走的路。在“管理 Jenkins -> 配置系统 -> 全局管道库”中安装并设置它以使用你的存储库。

如果您决定使用 python 脚本而不是 groovy,请将所有 python 脚本放在 (root)/resources 目录中。

在您的 Jenkinsfile 中 - 使用 libraryResource

加载脚本
script = libraryResource 'my_script.py'

并使用它

sh script

(没有足够的声誉向上面接受的答案添加评论)

给定 /resources/myscript.py 中的 python 脚本,如下所示:

#!/usr/bin/env python3
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--echo")
args = parser.parse_args()
print(args.echo)

像这样使用 Jenkins 函数:

def runPy(String scriptPath, def args) {
    String script = libraryResource(scriptPath)
    String argsString = args.join(' ')
    sh "python3 -c '${script}' ${argsString}"
}
runPy('myscript.py', ['--echo', 'foo'])