如何从位于不同 git 仓库中的 Jenkinsfile 中的 git 仓库加载 Groovy 脚本

How to load a Groovy script from a git repo in a Jenkinsfile that is in a different git repo

所以我有一个名为“deployer.groovy”的 groovy 脚本,它位于名为“jenkins-pipeline-library”的 git 存储库中。 (https://github.com/xyzDev/jenkins-pipeline-library) 这个存储库中没有其他东西,只有主分支中的这个 groovy 文件。

另外,我有一个位于不同 git 存储库中的 Jenkinsfile。我不能将这两个文件放在同一个 Git 存储库中。

(因为我不允许,这个想法是能够 运行 这个 deployer.groovy 通过使用 Jenkinsfile 这样人们就看不到 deployer.groovy 但能够使用它)

我正在尝试将此 deployer.groovy 加载到我的 Jenkinsfile 中,然后 运行 它。

有什么办法吗?如有任何建议,我们将不胜感激。

有几种方法可以实现这一点。

Git 子模块

您的 jenkins-pipeline-library 可能在其他存储库中 git-submodule。

 git submodule add -b master https://github.com/xyzDev/jenkins-pipeline-library jenkins-pipeline-library

Jenkins:全球管道库

Manage Jenkins -> Configure System -> Global Pipeline Libraries 下的 Jenkins-Server 上,您可以添加您的存储库。

之后在任何 jenkinsfile 中你都可以像这样使用它

import JenkinsPipelineLibrary // Name depends on the actual name of the file

这是我制作的管道脚本的示例:

 import utils.build.PipelineUtil
 
 PIPELINE_UTIL = new PipelineUtil()
 
 properties(
     [
         [
             $class: 'BuildDiscarderProperty',
             strategy: [$class: 'LogRotator', numToKeepStr: '25']
         ],
         PIPELINE_UTIL.getReleaseTrigger('xxxxx')
     ]
 )

注意:PipelineUtil 位于 utils/build/PipelineUtil.groovy.

下的存储库中

官方文档

Extending with Shared Libraries 是我推荐的文档,可帮助您理解和实现您的需求。

说明

Jenkins 配置: 转到 jenkins-url/configure -> Global Pipeline Libraries 在本节中您可以设置库:using libraries, retrieval method

库存储库: 共享库存储库应具有特定文件夹结构中的 .groovy 文件,对于您的用例,您需要这样:

(root)
+- vars
|   +- foo.groovy               # for global 'foo' variable
|   +- MyDeclarativePipeline.groovy  # for global 'MyDeclarativePipeline' variable

vars/foo.groovy

#!/usr/bin/env groovy

def test() {
  // define logic here
}
def deployInternal() {
  // define logic here
}

vars/MyDeclarativePipeline.groovy

#!/usr/bin/env groovy

def call() {
    /* insert your pipeline here */
    pipeline {
        agent any
        stages {
            stage('Test') {
                steps {
                    // input the logic here or
                    foo.test()
                }
            }
            stage('Deploy Internal') {
                steps {
                    // input the logic here or
                    foo.deployInternal()
                }
            }
        }
    }
}

詹金斯文件:

@Library('my-shared-library') _

MyDeclarativePipeline()

注意:您可以插入在 MyDeclarativePipeline.groovy

中定义的 pipeline {...} 块,而不是 MyDeclarativePipeline()