Jak*_*obb 6 github jenkins jenkins-job-dsl
我正在私有 GitHub 存储库和 Jenkins 构建之间设置 webhook 集成。我专门使用 Job DSL groovy 脚本配置作业(我愿意切换到另一种编程作业配置机制,但我不会接受任何要求我手动配置作业的答案)。II 想设置一个提交状态上下文和一组基于构建状态的自定义消息。
Jenkins 中嵌入的Job DSL API 文档没有帮助,只给了我这个签名:githubPullRequest(Closure closure),但没有告诉我如何构建合适的闭包。
以下是我的工作 DSL 的相关部分:
triggers {
githubPush()
githubPullRequest {
useGitHubHooks()
buildStatus {
completedStatus('SUCCESS', 'Build succeeded!')
completedStatus('FAILURE', 'Build failed. ')
completedStatus('ERROR', 'Build errored. This is probably a problem with Jenkins or related infrastructure and not an issue with your code changes.')
}
}
}
(...)
scm {
git {
remote {
github('privateorg/myrepo', 'ssh')
credentials('my-credential-id')
refspec('+refs/pull/*:refs/remotes/origin/pr/*')
}
branch('${sha1}')
}
}
Run Code Online (Sandbox Code Playgroud)
这个错误如下:
ERROR: (build.groovy, line 8) No signature of method: javaposse.jobdsl.dsl.helpers.triggers.TriggerContext.buildStatus() is applicable for argument types:
(build$_run_closure1$_closure2$_closure10$_closure11) values:
[build$_run_closure1$_closure2$_closure10$_closure11@602572cb]
Run Code Online (Sandbox Code Playgroud)
第8行是:
buildStatus {
Run Code Online (Sandbox Code Playgroud)
如果我删除整个buildStatus块,那么 Jenkins 会接受脚本并成功创建作业。我的推送钩子工作,但我的拉取请求钩子没有。
我不是 Groovy 程序员,也不熟悉 Jenkins 的任何方面。我知道没有与我编写的 DSL 兼容的方法,但我不知道在哪里可以找到有效的方法签名。我不明白 DSL 如何很好地映射到方法调用以找到甚至识别合适的方法并构建兼容的 DSL。
谷歌搜索错误信息让我找到了一些在 2016-2017 年遇到类似问题的人:1 , 2 , 3。他们的问题似乎源于Github Pull Request Builder 插件作为核心、捆绑插件的弃用,以及相应的语法变化。这让我发现了一种新的语法,这里给出:
triggers {
githubPush()
githubPullRequest {
useGitHubHooks()
extensions {
'org.jenkinsci.plugins.ghprb.extensions.status.GhprbSimpleStatus' {
buildStatus {
'org.jenkinsci.plugins.ghprb.extensions.comments.GhprbBuildResultMessage' {
message 'Build in progress...'
result 'PENDING'
}
'org.jenkinsci.plugins.ghprb.extensions.comments.GhprbBuildResultMessage' {
message 'Build succeeded! It is safe to merge ${ghprbSourceBranch} into ${ghprbTargetBranch}.'
result 'SUCCESS'
}
'org.jenkinsci.plugins.ghprb.extensions.comments.GhprbBuildResultMessage' {
message 'Build failed.'
result 'FAILURE'
}
'org.jenkinsci.plugins.ghprb.extensions.comments.GhprbBuildResultMessage' {
message 'Build errored. This is probably a problem with Jenkins or related infrastructure and not an issue with your code changes.'
result 'ERROR'
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这也无济于事。失败本质上是一样的:
ERROR: (build.groovy, line 9) No signature of method: javaposse.jobdsl.dsl.helpers.triggers.TriggerContext.org.jenkinsci.plugins.ghprb.extensions.status.GhprbSimpleStatus() is applicable for argument types:
(build$_run_closure1$_closure2$_closure10$_closure11$_closure12) values:
[build$_run_closure1$_closure2$_closure10$_closure11$_closure12@707221f0]
Run Code Online (Sandbox Code Playgroud)
第 9 行是:
'org.jenkinsci.plugins.ghprb.extensions.status.GhprbSimpleStatus' {
Run Code Online (Sandbox Code Playgroud)
在所有这些中,我正在努力理解 buildStatus、commitStatus、completedStatus 等之间的差异。这些是什么意思?
同时,我将 DSL 恢复到没有任何版本的版本,buildStatus并尝试创建一个 PR 以查看它是否会触发构建。它没。我检查了“GitHub挂钩日志”:
Started on Aug 4, 2020 6:16:47 PM
Started by event from 10.101.32.177 ? https://my-jenkins-host.com/github-webhook/ on Tue Aug 04 18:16:47 UTC 2020
Using strategy: Default
[poll] Last Built Revision: Revision 91170fb44c40737a6410acfba820d6555a0475bb (refs/remotes/origin/dev)
using credential my-credential-id
> git --version # timeout=10
using GIT_ASKPASS to set credentials
> git ls-remote -h -- git@github.com:privateorg/myrepo.git # timeout=10
Found 64 remote heads on git@github.com:privateorg/myrepo.git
Ignoring refs/heads/branch1 as it doesn't match any of the configured refspecs
Ignoring refs/heads/branch2 as it doesn't match any of the configured refspecs
...
Ignoring refs/heads/branch64 as it doesn't match any of the configured refspecs
Done. Took 0.71 sec
No changes
Run Code Online (Sandbox Code Playgroud)
也许 Hook Log 不是查看的正确位置,但是-h在调用中使用git ls-remote导致它只列出分支——而不是 PR。如果我在本地使用相同的命令但不使用-h,则会列出我确信与我的 refspec 匹配的 PR。
我最初使用 CloudBees Core Client Master 版本 2.204.3.7,修订版 3 遇到这些问题。升级到最新版本 (2.235.2.3) 没有帮助。
使用的插件版本:
如果这里还有其他相关的插件,请告诉我,我会添加它们。
我的问题总结:
明白了。有几个问题,但问题的关键是身份验证:各种插件和组件接受并需要不同类型的凭据。我现在使用的设置使用个人访问令牌和 SSH 密钥对的组合来对 GitHub 进行身份验证。
设置身份验证的方法如下:
Settings -> SSH and GPG keys。(注意:这是用户的设置,而不是存储库的设置)Settings -> Developer settings -> Personal access tokensManage Jenkins -> Manage Credentials.Manage Jenkins -> Configure System -> GitHub Pull Request Builder -> Credentials,选择您在步骤 9 中创建的基于令牌的凭据。这是使用该插件为 PR 工作的 Job DSL jenkins-ghprb:
scm {
git {
remote {
github('privateorg/myrepo', 'ssh')
credentials('ssh-credential-id')
refspec('+refs/pull/*:refs/remotes/origin/pr/*')
}
branch('${sha1}')
}
}
triggers {
githubPullRequest {
useGitHubHooks()
orgWhitelist('privateorg')
allowMembersOfWhitelistedOrgsAsAdmin()
extensions {
commitStatus {
context('Jenkins')
completedStatus('SUCCESS', 'Build succeeded!')
completedStatus('FAILURE', 'Build failed. ')
completedStatus('ERROR', 'Build errored. This is probably a problem with Jenkins or related infrastructure and not an issue with your code changes.')
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
笔记:
笔记:
https://your-jenkins-host/ghprbhook/
Manage Jenkins -> Configure System -> GitHub Pull Request Builder -> Jenkins URL override。application/json.Manage Jenkins -> Configure System -> GitHub Pull Request Builder -> Shared secret。这用于推送:
scm {
git {
remote {
github('privateorg/myrepo', 'ssh')
credentials('ssh-credential-id')
}
branch('refs/heads/*')
}
}
triggers {
githubPush()
}
Run Code Online (Sandbox Code Playgroud)
笔记:
https://your-jenkins-host/github-webhook/
application/x-www-form-urlencoded.branch说明符即可。branch由于和params的差异,我无法拥有一个同时处理 PR 和推送的工作refspec。我发现一些证据表明 Git 支持多个 refspec,并且能够在 CLI 上使用该功能git,但在我尝试配置 Jenkins 执行相同操作时没有成功。我没有创建一个对两者都有效的分支说明符。我也许能够设置一个单一的参数化构建,然后使用这些触发器进行迷你作业,然后调用参数化构建,但目前我认为不值得添加另一个作业。顺便说一句,我还设置了第三项工作,每晚针对我们的主要开发分支运行。我们将为该构建构建一个广泛的(长期运行的)测试套件,同时保持 PR 和推送构建器的快速运行。
至于我应该在哪里寻找文档:我在谷歌上搜索了一遍,并通过反复试验将其拼凑在一起,并在几十个地方找到了提示和配置的碎片。我在阅读 Job DSL 插件的 API 文档方面有了一些进步,但这本身还不够。同样有用的是:对于推送触发的作业,可以在 Jenkins 作业摘要页面上找到 GitHub Hook 日志。对于 PR 触发的作业,可从 获取 Jenkins 系统日志Manage Jenkins -> System Log。
| 归档时间: |
|
| 查看次数: |
1246 次 |
| 最近记录: |