如何通过 Gitlab 推送在 Jenkins 中使用参数进行构建?

Mar*_*son 4 webhooks jenkins gitlab jenkins-pipeline

我让 GitLab Community Edition 8.15.2 使用 webhook 成功触发 Jenkins 2.32.1 中的管道项目。我希望 gitlab 推送触发带有参数的构建,但当它通过时参数值为空,因此构建失败。

gitlab webhook 如下所示:

http://jenkins.server:8080/project/project-a/buildWithParameters?MYPARAM=foo

在我的管道项目中,我回显参数值

echo "MYPARAM: ${MYPARAM}"

并且它没有设置任何内容。关于我哪里出错了有什么想法吗?

更新

我在管道中使用的实际代码是:

node {
    try {
        echo "VM_HOST: ${VM_HOST}"
        echo "VM_NAME: ${VM_NAME}"
        stage('checkout') {

            deleteDir()
            git 'http://git-server/project/automated-build.git'
        }
        stage('build') {

            bat 'powershell -nologo -file Remove-MyVM.ps1 -VMHostName %VM_HOST% -VMName "%VM_NAME%" -Verbose'
        }
        ...
    }
}     
Run Code Online (Sandbox Code Playgroud)

该参数VM_HOST有默认值,但VM_NAME没有。在 Jenkins 的控制台输出中我可以看到:

[Pipeline] echo
VM_HOST: HyperVHost
[Pipeline] echo
VM_NAME: 
Run Code Online (Sandbox Code Playgroud)

vri*_*ker 5

我已经为此苦苦挣扎了好几个星期。我曾经让它工作过一次,但直到今天我才让它再次工作。当然,解决方案是显而易见的……

对于每个管道作业,我自动勾选了以下框:

当更改推送到 GitLab 时进行构建。GitLab CI 服务网址: http://jenkins.dev:8080/project /MyProject

然后我从 GitLab 使用 webhook 来触发上述内容。像你一样,我尝试添加/buildWithParameters并尝试了许多其他不起作用的事情。

问题是,我勾选了错误的复选框!由于我从 GitLab webhook 触发构建,因此根本不需要选中上面的复选框(当 a... 时构建)。需要检查的是:

触发器远程构建(例如,从脚本)

该复选框为您提供了一个新的 URL:

使用以下 URL 远程触发构建:JENKINS_URL/job/MyProject/build?token=TOKEN_NAME 或 /buildWithParameters?token=TOKEN_NAME

就像我附带的所有文档一样,正如您所看到的,URL 现在不再以 开头/project,而是/job以!

因此,请勾选该框并相应地更改您的 URL:

http://jenkins.server:8080/**job**/project-a/buildWithParameters?token=TOKEN_NAME&MYPARAM=foo

我至少想提一下令牌:在 GitLab webhook 中,有一个单独的“令牌”字段,其中指出:

使用此令牌来验证收到的有效负载。它将与 X-Gitlab-Token HTTP 标头中的请求一起发送。

因此,此处提供的令牌将作为 HTTP 标头随请求一起发送。这是可以在 Jenkins 设置中全局提供的令牌。勾选该框时必须在 Jenkins 作业中提供的令牌Use the following URL to trigger build remotely必须作为 GET 参数在 URL 中发送,就像示例所示。

最后一点:就我个人而言,我从来没有完全做到这一点,因为我没有摆脱 Jenkins CSRF 保护。禁用它会给我另一个错误。但是,希望上述内容能够解决您和其他人的问题。