我有一组使用以下groovy脚本生成的多分支管道作业:
[
'repo1',
'repo2',
].each { service ->
multibranchPipelineJob(service) {
displayName(service)
branchSources {
git {
remote("git@gitlab.com:whatever/${service}.git")
credentialsId('gitlab-ssh-key')
}
}
orphanedItemStrategy {
discardOldItems {
daysToKeep(0)
numToKeep(30)
}
}
triggers {
periodic(5)
}
}
}
,在每个存储库中,一个Jenkinsfile
如下所示:
#!/usr/bin/env groovy
properties([
gitLabConnection('ci@gitlab.com'),
pipelineTriggers([
[
$class : 'GitLabPushTrigger',
triggerOnPush : true,
triggerOnMergeRequest: true,
]
]),
disableConcurrentBuilds(),
overrideIndexTriggers(false)
])
node {
def sbtHome = tool name: 'sbt-0.13.15', type: 'org.jvnet.hudson.plugins.SbtPluginBuilder\$SbtInstallation'
stage('Checkout') {
checkout scm
}
stage('Build') {
sh "'${sbtHome}/bin/sbt' clean compile"
}
stage('Test') {
sh "'${sbtHome}/bin/sbt' test"
}
if (env.BRANCH_NAME == 'develop' || env.BRANCH_NAME == 'master') {
stage('Publish') {
sh "'${sbtHome}/bin/sbt' publish"
}
}
}
一切正常。 seeder 项目从第一个脚本生成所有文件夹,并且正确构建了给定回购的所有分支。
不幸的是,在对gitlab进行提交+推送之后,我无法触发任何分支的构建。
我已经正确配置了jenkins-我的意思是gitlab插件,存在连接,并且一切正常。
我还在gitlab端添加了一个webhook,它也可以正常运行。发送测试推送后,我从jenkins收到200 OK
,并且在日志中确实看到扫描分支已开始并正确检测到更改。不幸的是,更改后的分支的构建无法启动。这是分支扫描日志的摘录:
Checking branch ci
‘Jenkinsfile’ found
Met criteria
Changes detected: ci (a7b9ae2f930b0b10d52bb42f1ecf96a68bba4a30 → 39a4c1a65051d5e90079feec14ad22455a77c58e)
Did not schedule build for branch: ci
我100%确信这不是我的jenkins实例与gitlab帐户之间的通信问题。我看到推送到gitlab后触发了Webhook,看到请求正在发送并且分支扫描正在运行。还可以检测到更改,但是为什么地球上的作业还没有开始??我还仔细阅读了docs,并正确配置了所有内容。
Jenkins version: 2.150.3
Gitlab version: 11.8.1-ee
编辑
似乎在将jenkins升级到v.2.164.1之后,它们都开始正常工作。
答案 0 :(得分:3)
我发现这非常有用Setup Example(Continuous Integration with Jenkins and GitLab)。尤其是源代码管理部分:
我们需要将名称指定为“ origin”,其他部分将使用该名称。对于Refspec,我们需要输入:
+refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*
还有:
分支说明符,我们需要
origin/${gitlabSourceBranch}
,它将根据我们接下来要设置的网络挂钩进行填充。
编辑1
您可以对一个多分支管道尝试以下操作:
ci
ci
Edit2
我找不到合适的git项目来运行并尝试重现此行为。因此,如果有人知道类似项目并可以分享,请发表评论,我可以进行更多测试。
对于 Gitlab (要求试用密钥,otherwise it will be a GitLab Community Edition):
sudo docker run --detach --hostname gitlab.example.com --publish 443:443 --publish 80:80 --publish 22:22 --name gitlab --restart always --volume /srv/gitlab/config:/etc/gitlab --volume /srv/gitlab/logs:/var/log/gitlab --volume /srv/gitlab/data:/var/opt/gitlab gitlab/gitlab-ee:11.8.1-ee.0
对于 Jenkins :
sudo docker run -u root --rm -d -p 8080:8080 -p 50000:50000 -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:2.150.3
然后在Gitlab中“ 集成” —>“ Jenkins CI ”,如下图所示:
希望这可以为您提供帮助!
答案 1 :(得分:3)
我相信您需要使用includes()
来指定用于标识将包括哪些分支的模式:
branchSources {
git {
remote("git@gitlab.com:whatever/${service}.git")
credentialsId('gitlab-ssh-key')
includes('ci')
}
}
您可以指定许多模式,其中可以包含通配符。例如:
includes("master release/* feature/* bugfix/*")
还有一个excludes()
用于更细粒度的控制。
答案 2 :(得分:3)
可能您已将Basic Branch Build Strategies配置为仅包括特定分支,例如使用确切名称:master
,这将跳过示例中的分支ci
。
确保您的Jenkins分支构建配置涵盖了要测试的分支。另外,请确保未设置Suppress automatic SCM triggering选项。
请注意,“组织”或“文件夹”级别的设置会影响特定的“项目”和“作业”设置,除非它们在较低级别上被特别覆盖。
答案 3 :(得分:1)
我们在gitlab和Jenkins上遇到了类似(不同)的问题,并且该问题与凭据有关。
在Jenkins中,我们为GitLab创建了一个新的全局访问令牌(Jenkins配置->凭据->系统->新的全局访问->定义gitlab令牌)。生成一个令牌,我们将其添加到Webhook中,现在该钩子类似于:
http://[Gitlab User]:[token ID]@Jenkins Address
我希望对您有帮助