我正在尝试通过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中输入“属性”值来手动触发构建用户界面?
答案 0 :(得分:1)
构建仍将由Webhooks在提交/更改更改时触发。作业将仅使用默认值启动(对于列表,这意味着列表中的第一项)。他们本质上绕过了params页面。
实例化分支的第一个构建可能会因为Jenkins尚未知道参数而失败(Params是经过后处理的,因此需要构建甚至知道它们已经存在)
如果您要为人工构建版本和自动构建版本使用不同的“默认值”集,则可以在管道中添加代码,以区分“自动”启动(网络挂接)和“人类”启动。
我们通过在共享库中使用以下功能来检查它是用户启动还是自动启动
/**
* 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))
}
}