如何使git功能分支与jenkins工作流配合?

5
我正在尝试设置jenkins-workflow来进行我们的集成测试。我们的集成测试如下所示:
某人在git的功能分支中更改LibraryA。我们希望jenkins对功能分支中的代码运行单元测试,然后将此功能分支的代码安装到client1和client2(它们是LibraryA的用户)并运行其测试。
我能够设置工作流来完成所有操作,除了获取LibraryA功能分支的正确提交。相反,我的设置只会从LibraryA的某个(看似随机的)分支中拉取提交。
由于我们有很多功能分支,因此在工作流设置中硬编码特定分支似乎不合适。似乎应该有一种方法可以获取触发工作流作业的提交哈希(即使使用SCM轮询)。
我的设置如下:
currentBuild.setDisplayName("#" + env.BUILD_NUMBER)

node {
  git credentialsId: '033df7f1-7752-46bd-903d-8a70e613eed0', url: 'git@github.com:mycompany/myrepo.git'
  sh '''
echo `git rev-parse HEAD` > libraryA_version.txt
sudo docker run --rm=true -e LANG=en_US.UTF-8 -a stdout -i -t mycompany/libraryA run_tests
'''
  archive 'libraryA_version.txt'
}

def integration_jobs = [:]

integration_jobs[0]={
  node{
    ws {
      unarchive mapping: ['libraryA_version.txt':'.']
      sh 'sudo docker run -t --rm mycompany/client1:v1 bash run_tests.sh "`cat libraryA_version.txt`"'
    }
  }
}

integration_jobs[1] = {
  node{
    ws {
      unarchive mapping: ['libraryA_version.txt' : '.']
      sh 'sudo docker run -t --rm mycompany/client2 run_tests.sh "`cat libraryA_version.txt`" '
    }
  }
}

parallel integration_jobs

因此,我的当前问题是如何设置git repo/polling以获取正确的提交版本在第一个测试中运行,该版本将在后续测试中用于libraryA_version.txt?

或者,我应该完全以不同的方式进行这个过程吗?

2个回答

4
正如 @maybeg 暗示的那样,您最有可能正在寻找的是多分支项目,需要安装 Pipeline: Multibranch。这使您可以在一个 Jenkinsfile 中定义脚本,在构建中一次或多次调用 checkout scm,避免了使用 libraryA_version.txt 的必要性。
同时,我对您的项目设置感到困惑。您的 git 步骤使用默认值 branch:'master',这意味着它应该只在 master 分支上轮询,并且只检出此分支。Git 插件相当复杂,所以也许出了些问题。在正式支持多分支之前,您可以始终使用带有通配符分支规范的 GitSCM checkout 步骤,这种情况下将选择未先前构建的任意分支头进行检出,而您的 git-rev-parse 技巧(我猜您独立发现了 JENKINS-26100 的解决方法)应该可以正常工作。

好的,回顾一下,在工作流程作业中,配置SCM轮询以在提交时触发作业,然后使用带通配符分支(**)的“checkout”步骤。它将选择一个尚未构建的头部分支,理想情况下是触发作业的提交所在的分支? - Robert
没错,选择的头提交可能不是触发原因,但很有可能。如果在一个轮询会话中发现了多个符合条件的头,则不确定会发生什么情况——可能会触发多个构建,但无论何时使用SCM轮询(包括/git/notifyCommit webhook),最好将@daily/@hourly添加到计划中以捕获任何杂散提交。同样,使用即将推出的多分支工作流程,所有这些都变得更加容易:每个分支都有自己的子项目,并且可以使用符号“checkout scm”≥1次来获取匹配的检出。 - Jesse Glick
我能够在Jenkins ver. 1.634下使用新的Pipeline作业插件中的branch: "production"命名法。 - MarkHu

0

您正在寻找的功能是分支构建,我认为应该通过适用于此目的的插件来实现。

  • 分支是在git中完成的。

  • Jenkins必须将构建或构建流程作业复制到适合的分支,并能够构建和测试该分支。

  • 重新集成后,git必须通知Jenkins,Jenkins必须关闭作业。

我找到了这个插件:

https://wiki.jenkins-ci.org/display/JENKINS/Multi-Branch+Project+Plugin

还有这个插件/教程:

http://entagen.github.io/jenkins-build-per-branch/

实现强烈依赖于您的场景,因此我无法更具体。我只能说挑战包括:

  • 构建可以并发和独立运行的Jenkins作业。

  • 使用Jenkins作业模板。

  • 处理Jenkins和git之间的事件。

在您的情况下:

  • 将整个过程作为交付流水线从前到后构建。

  • 如果有人分支了一个步骤并实现了一个功能,则复制整个流水线并运行整个流水线。

  • 使其正常工作,然后进行改进。


这就是我担心的事情。这就是我们开始的方式。我们有一个多工具链,它可以工作,但它有不良品质。它不能随着我们的代码库扩展而扩展,因为我们有太多的任务需要管理。失败通知和罪犯跟踪效果不佳。跨任务的设置很笨重。这就是为什么jenkins-workflow插件很好 - 整个集成链的设置在一个相当紧凑的任务中完成。 - Robert
那么让我们回答你最初的问题,这里是Jenkins作业环境变量列表:https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project。在你的情况下,GIT_COMMIT和GIT_BRANCH应该是构建工作流程中你要查找的信息。 - blacklabelops
我在作业的顶部打印出我的环境变量,但这些变量不可用。显然,Jenkins工作流作业没有设置那些GIT变量。以下变量目前在工作流脚本中不可用:EXECUTOR_NUMBER NODE_NAME NODE_LABELS WORKSPACE SCM特定变量,如SVN_REVISION - Robert
看起来我们被卡在了jenkins-workflow上。另一个可能的解决方案是远离git/分支/提交,转而查看构件库。不应该每次发生提交就进行检出和构建,而是每当ci作业部署带有标签“xy”的构件时,它应该被放入容器中并进行测试。请看这里:https://wiki.jenkins-ci.org/display/JENKINS/FSTrigger+Plugin - blacklabelops

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接