如何从位于不同 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()
所以我有一个名为“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()