我有多个具有类似构建步骤的项目,我正在考虑在这些项目中重用Jenkinsfile管道。我很难找到如何实现这样一个标准(我认为)设置的文档。
以下是我的要求:
1)Jenkinsfile存储在repo中,在多个项目中共享
2)每个项目都有自己的参数:仓库中的项目位置。
3)至少从用户的角度来看,每个项目都应该在Jenkins中独立,这意味着例如Jenkins中每个项目的条目中都有执行和日志
我怎样才能做到这一点?基于How do pipeline parameters and jenkins GUI parameters work together?我明白我可以使用自由式作业但是这个选项不能直接使用日志。我还被建议在每个独立的工作中使用Jenkinsfile,但我认为听起来有太多不必要的配置。
我最初想过复制我的管道工作(意思是复制工作,包括参数定义,存储库和凭证以及jenkinfile位置定义),我对这个想法的问题是每次我运行工作,管道正在删除参数默认值
e.g。在Jenkins文件中使用NO默认值定义projectSvnPath
属性将清除Jenkins中的作业参数projectSvnPath
值。出于这个原因,我无法使用此选项。
properties([
parameters([
string(name: 'projectSvnPath', description: '*', )
])
])
答案 0 :(得分:1)
Jenkins具有共享库概念,允许多个构建共享公共管道指令而无需复制代码。详情请见https://jenkins.io/doc/book/pipeline/shared-libraries/。
更新07/13/17 我的所有参数都在我的管道中定义,以避免参数问题。我更喜欢在我的代码库中定义参数,但我可以预见这种情况不实用的情况。
更新04/18 我放弃了使用共享库 - 原因是它无法测试。它不会在开发环境(比如你的PC)上运行,所以任何开发都需要推送到你的repo基本上执行任何测试。对于任何类型的软件开发,这都不是一种可持续的方法。目前我的jenkins文件是重复的,因为我发现使用jenkins没有解决方法。
答案 1 :(得分:1)
我正在同一个pb上工作: 在许多项目之间共享管道
我正在使用jenkinsFile.properties(每个项目都有其自己的) 我将我的具体数据放在哪里:
apiName=test
host.Dev=localhost
然后我使用
访问jenkinsFile中的数据props = readProperties file: 'jenkinsFile.properties'
targetHost = props["host.${devHost}"]
apiName = props["apiName"]
然后我可以使用它们并以一种非常粗糙的方式工作:
sh '''
git clone ...
mvn -X clean install
'''
答案 2 :(得分:0)
I had the same answer to a different thread but the question was another one. It's up to moderators to decide if its a duplicate question and if not this answer is valid as it will be found with search more easily.
You can use the Pipeline Shared Groovy Library plugin to have a library that all your projects share in a git repository. In the documentation you can read about it in detail.
If you have a lot of Pipelines that are mostly similar, the global variable mechanism provides a handy tool to build a higher-level DSL that captures the similarity. For example, all Jenkins plugins are built and tested in the same way, so we might write a step named 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: "..."
}
}
Assuming the script has either been loaded as a Global Shared Library or as a Folder-level Shared Library the resulting Jenkinsfile will be dramatically simpler:
Jenkinsfile (Scripted Pipeline)
buildPlugin {
name = 'git'
}
The example shows how a jenkinsfile passes name = git to the library. I currently use a similar setup and am very happy with it.