共享jenkinsfile的多个项目

时间:2017-06-13 21:44:23

标签: jenkins parameter-passing jenkins-plugins jenkins-pipeline

我有多个具有类似构建步骤的项目,我正在考虑在这些项目中重用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: '*', )
   ])
])

3 个答案:

答案 0 :(得分:1)

Jenkins具有共享库概念,允许多个构建共享公共管道指令而无需复制代码。详情请见https://jenkins.io/doc/book/pipeline/shared-libraries/

此时尚不清楚的是,每次重新加载Jenkinsfile时,如何允许参数覆盖持续存在。看起来像一个奇怪的设计选择。

更新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.