我有几个使用Jenkinsfile的项目,这实际上是相同的。唯一的区别是它必须签出的 git 项目。这迫使我每个项目都有一个 Jenkinsfile,尽管它们可以共享同一个:
node{
def mvnHome = tool 'M3'
def artifactId
def pomVersion
stage('Commit Stage'){
echo 'Downloading from Git...'
git branch: 'develop', credentialsId: 'xxx', url: 'https://bitbucket.org/xxx/yyy.git'
echo 'Building project and generating Docker image...'
sh "${mvnHome}/bin/mvn clean install docker:build -DskipTests"
...
有没有办法在创建作业期间将 git 位置预配置为变量,以便我可以重用相同的 Jenkinsfile?
...
stage('Commit Stage'){
echo 'Downloading from Git...'
git branch: 'develop', credentialsId: 'xxx', url: env.GIT_REPO_LOCATION
...
我知道我可以这样设置它:
此项目参数化 -> 字符串参数 -> GIT_REPO_LOCATION,默认 = http://xxxx,并使用 env 访问它。GIT_REPO_LOCATION。
缺点是用户被提议使用默认值开始构建或更改它。我需要它对用户是透明的。有没有办法做到这一点?
您可以使用 Pipeline Shared Groovy Library 插件拥有一个所有项目在 git 存储库中共享的库。在文档中,您可以详细阅读有关它的信息。
如果你有很多管道大多相似,全局变量机制提供了一个方便的工具,用于构建捕获相似性的更高级别的DSL。例如,所有 Jenkins 插件都以相同的方式构建和测试,因此我们可以编写一个名为 buildPlugin 的步骤:
// vars/buildPlugin.groovy
def call(body) {
// evaluate the body block, and collect configuration into the object
def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
body()
// now build, based on the configuration provided
node {
git url: "https://github.com/jenkinsci/${config.name}-plugin.git"
sh "mvn install"
mail to: "...", subject: "${config.name} plugin build", body: "..."
}
}
假设脚本已作为全局共享库加载 或作为文件夹级共享库,生成的 Jenkinsfile 将是 简单得多:
Jenkinsfile (Scripted Pipeline(
buildPlugin {
name = 'git'
}
该示例显示了 jenkinsfile 如何将 name = git 传递给库。我目前使用类似的设置,并且对此非常满意。
不如拥有一个额外的 git 存储库,从中获取通用的 Jenkinsfile - 这在使用管道类型作业并从 SCM 中选择管道脚本选项时有效。这样,Jenkins 在签出用户存储库之前会签出您拥有公共 Jenkinsfile 的存储库。
如果作业可以自动触发,您可以在每个 git 存储库中创建一个接收后钩子,该钩子以存储库作为参数调用 Jenkins 管道,这样用户就不必手动运行将存储库作为参数输入的作业 (GIT_REPO_LOCATION(。
如果作业无法自动触发,我能想到的最不烦人的方法是使用带有存储库列表的 Choice 参数而不是 String 参数。