我可以“导入”Jenkins 声明式管道中的阶段吗

Nat*_*han 6 jenkins jenkins-pipeline

我有几个管道作业,它们的配置非常相似。它们都具有相同的阶段(其中大约有 10 个)。

我现在正在考虑转向声明式管道(https://jenkins.io/blog/2016/09/19/blueocean-beta-declarative-pipeline-pipeline-editor/)。

但我不想在每个管道中定义 ~10 个阶段。我想在一个地方定义它们,并以某种方式“导入”它们。

声明式管道是否可以做到这一点?我看到有库,但似乎我不能使用它们来包含阶段定义。

Tec*_*ext 2

您必须创建一个共享库来实现我将要建议的内容。对于共享库的实现,您可以查看以下帖子:

\n\n

在 Jenkins 声明式管道中使用构建块

\n\n

将 Jenkins 输入步骤中的文件上传到工作区(主要用于图像,以便可以轻松弄清楚事情)

\n\n

现在,如果您想使用可以在多个项目(作业)中重用的Jenkinsfile(一种模板) ,那么这确实是可能的。

\n\n

创建包含目录的共享库存储库后vars,您只需在目录中创建一个 Groovy 文件(比方说,commonPipeline.groovy)vars

\n\n

这是一个有效的示例,因为我之前在多个工作中使用过它。

\n\n
\n\n
$ cat shared-lib/vars/commonPipeline.groovy\n\n// You can create function(s) as shown below, if required\ndef someFunctionA() {\n    // Your code\n}\n\n// This is where you will define all the stages that you want\n// to run as a whole in multiple projects (jobs)\ndef call(Map config) {\n    pipeline {\n        agent {\n            node { label \'slaveA || slaveB\' }\n        }\n\n        environment {\n            myvar_Y = \'apple\'\n            myvar_Z = \'orange\'\n        }\n\n        stages {\n            stage(\'Checkout\') {\n                steps {\n                    deleteDir()\n                    checkout scm\n                }\n            }\n\n            stage (\'Build\') {\n                steps {\n                    script {\n                        check_something = someFunctionA()\n\n                        if (check_something) {\n                            echo "Build!"\n                            # your_build_code\n                        } else {\n                            error "Something bad happened! Exiting..."\n                        }\n                    }\n                }\n            }\n\n            stage (\'Test\') {\n                steps {\n                    echo "Running tests..."\n                    // your_test_code\n                }\n            }\n\n            stage (\'Deploy\') {\n                steps {\n                    script {\n                        sh \'\'\'\n                            # your_deploy_code\n                        \'\'\'\n                    }\n                }\n            }\n        }\n        post {\n            failure {\n                sh \'\'\'\n                    # anything_you_need_to_perform_in_failure_step\n                \'\'\' \n            }\n\n            success {\n                sh \'\'\'\n                    # anything_you_need_to_perform_in_success_step\n                \'\'\'\n            }\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的 Groovy 文件就位后,您现在要做的就是在各个 Jenkins 项目中调用它。由于您的 Jenkins 项目中可能已经有一个现有的 Jenkinsfile(如果没有,请创建它),因此您只需将该文件的现有内容替换为以下内容:

\n\n
$ cat Jenkinsfile\n// Assuming you have named your shared-library as `my-shared-lib` & `Default version` to `master` branch in \n// `Manage Jenkins` \xc2\xbb `Configure System` \xc2\xbb `Global Pipeline Libraries` section\n@Library(\'my-shared-lib@master\')_\n\ndef params = [:]\n\nparams=[\n    jenkins_var: "${env.JOB_BASE_NAME}",\n]\n\ncommonPipeline params\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:正如你在上面看到的,我正在调用commonPipeline.groovyfile. 因此,所有庞大的 Jenkinsfile 将减少到只有五六行代码,而这几行代码也将在所有这些项目中通用。另请注意,我在上面使用过jenkins_var。它可以是任何名称。它实际上并未使用,但是管道运行所必需的一些 Groovy 专家可以澄清这一部分。

\n\n

参考:https: //www.jenkins.io/blog/2017/10/02/pipeline-templates-with-shared-libraries/

\n