【问题标题】:Is it possible to have 'build now' and 'build with parameters' coexisting in Jenkins pipeline?Jenkins管道中是否可以同时存在“立即构建”和“使用参数构建”?
【发布时间】:2019-01-20 06:38:42
【问题描述】:

我正在尝试通过 jenkinsfile 配置 Jenkins 管道以进行参数化构建(例如,目的是在某些标志设置为“on”时运行测试套件的子集)。

我看到了下面关于“参数化 Jenkins 管道”的文章,它说通过添加“属性”步骤,我可以实现我所需要的。

https://st-g.de/2016/12/parametrized-jenkins-pipelines

但是从现在开始,“立即构建”按钮将变为“使用参数构建”按钮,并且每次启动管道时,用户都需要手动输入参数值才能开始构建。

properties([
  parameters([
    string(name: 'DEPLOY_ENV', defaultValue: 'TESTING', description: 'The target environment', )
   ])
])

但是,如果我的 Jenkins 构建触发了代码更改,这也很糟糕,是吗?因为每次代码更改提交触发构建时,用户必须手动输入参数才能开始构建。

有没有办法保留两个按钮,或者类似的方法来使自动构建在代码提交触发时使用默认的“属性”值,而用户有时可以通过在 Jenkins 中输入“属性”值来手动触发构建界面?

【问题讨论】:

  • 我认为最好的办法是为参数提供默认值,以便人们“使用参数构建”,然后立即开始构建...
  • 同意 Rich。偶然发现有人阅读我的文章很有趣:-)
  • @RichDuncan 谢谢,Rich,请原谅我的英语水平,但你所说的“这样人们和'使用参数构建'然后立即开始构建'是什么意思?

标签: jenkins parameters jenkins-pipeline


【解决方案1】:

构建仍将由 Webhook 在提交/公关更改等时触发。作业将使用默认值启动(对于列表,这意味着列表中的第一项)。他们基本上绕过了参数页面。

实例化分支的第一次构建可能会失败,因为 Jenkins 尚不知道参数(参数是后处理的,因此需要构建才能知道它们存在才能填充)

如果您想为人工构建和自动构建设置一组不同的“默认值”,您可以在管道中添加代码以区分“自动”启动(网络挂钩)和“人工”启动。

我们通过在我们的共享库中使用以下函数来检查它是用户启动还是自动启动

/**
 * Checks if job causes contain Non-automated causes
 * Either
 *** Run by a User
 *** Rebuilt by a User
 *** Replayed by a User
 * Return true if  non automated cause found
 *
 * @return boolean
 */
boolean hasNonAutomatedCauses() {

    List nonAutomatedCauses = ['UserIdCause', 'ReplayCause']

    List intersection = []
    intersection = nonAutomatedCauses.intersect(getCauses())
    // if no user triggered causes are found means intersection is empty and then return false
    return !intersection.isEmpty()
}

然后您可以更改自动原因的属性:

/**
 * Change param value during build
 *
 * @param paramName new or existing param name
 * @param paramValue param value
 * @return nothing
 */
def setParam(String paramName, String paramValue) {
    List<ParameterValue> newParams = new ArrayList<>();
    newParams.add(new StringParameterValue(paramName, paramValue))
    try {
        $build().addOrReplaceAction($build().getAction(ParametersAction.class).createUpdated(newParams))
    } catch (err) {
        $build().addOrReplaceAction(new ParametersAction(newParams))
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    相关资源
    最近更新 更多