Git&Jenkins:在分支上获取最新的绿色提交


10

我们刚刚开始争取使用CI-CD,作为一个小小的步骤,我们将尝试每隔几个小时使用最新的绿色开发更新堆栈。我对Git / Bitbucket相当陌生,无法弄清楚如何确保Jenkins进行的结帐将最后一次提交由Jenkins标记为绿色,而不仅仅是“最后一次提交”作为笼统的声明。

我们已经安装了Bitbucket Build Status Notifier插件,因此Bitbucket会在运行单元测试后跟踪哪些提交是绿色的。有没有办法利用此信息来确保选择正确的提交?

Answers:


6

您没有提及要使用的脚本语言,因此我将专门讨论对BitBucket API的HTTP请求:

假设条件

如果您有一个其中包含三个提交的BitBucket存储库,则第一个和最后一个使构建失败,则中间正在通过:

  • 4768815❌
  • 49d7110✅
  • 42d357f❌

获取提交列表

您可以通过调用以下API方法获取提交列表:

https://api.bitbucket.org/2.0/repositories/{{owner}}/{{repo_slug}}/commits

  • owner:理查德·斯莱特
  • repo_slug:绿色commitproofofconcept

响应如下所示:

{
  "pagelen": 30,
  "values": [
    {
      "hash": "4768815fdc27abf4be17096e7c460f7f68f5d39b",
      "repository": { ... },
      "links": {
        ...
        "statuses": {
          "href": "https://api.bitbucket.org/2.0/repositories/RichardSlater/greencommitproofofconcept/commit/4768815fdc27abf4be17096e7c460f7f68f5d39b/statuses"
        }
      },
      "author": { ... },
      "parents": [ ... ],
      "date": "2017-04-10T11:38:18+00:00",
      "message": "README.md edited online with Bitbucket",
      "type": "commit"
    },
    {
      "hash": "49d7110b98616358d16055960a4abdf2926b890d",
      ...
    },
    {
      "hash": "42d357f1df7a7d7bcf1f10a9f3a5a40d85d5b11c",
      ...
    }
  ]
}

如果您解析JSON并遍历响应,则可以从以下位置提取状态:

values[n].links.statuses.href

n索引在哪里,即012在以上示例中。如果要从头开始构建此文件,它将采用以下格式。

从提交中获取状态列表

https://api.bitbucket.org/2.0/repositories/{{owner}}/{{repo_slug}}/commit/{{sha}}/statuses"

  • owner:理查德·斯莱特
  • repo_slug:绿色commitproofofconcept
  • sha:4768815fdc27abf4be17096e7c460f7f68f5d39b

注意:这是一个Hypermedia API,这意味着URL 可能会更改,因此我建议使用上一个响应中的链接,而不是尝试从头开始生成它们。

来自上述HTTP请求的响应将类似于:

{
  "pagelen": 10,
  "values": [
    {
      "key": "POC-01",
      "name": "Build #1",
      "repository": { ... },
      "url": "http://devops.stackexchange.com/q/809/397",
      "links": { ... },
      "refname": null,
      "state": "FAILED",
      "created_on": "2017-04-10T13:04:28.261734+00:00",
      "updated_on": "2017-04-10T13:04:28.261759+00:00",
      "type": "build",
      "description": "Changes by Richard Slater"
    }
  ],
  "page": 1,
  "size": 1
}

从此响应中,您可以提取出以下state用法:

values[n].state

又哪里nstatus-可能有很多人,如果一个提交导致许多版本。

如果您关心的构建状态是,SUCCESSFUL则您有答案,可以立即返回sha提交。

循环从第一阶段开始的所有提交,如果用尽了所有提交,请遵循对的调用中包含的next页面。link/commits

完整流程图

从高层次看,流程如下所示:

流程图

不要忘记这是一个Hypermedia API,因此您的代码应尽可能遵循API中的链接,而不要尝试“猜测”它们。


1
是的,这确实是我对SE的最长回答。
理查德·斯莱特

即使您认为我完全想要它,我也很感谢您花时间来解释这一点。接受
Alex

只是迈出最初的几步,这并不完全是疯狂的-在考虑CI / CD体系结构时,请记住我的其他答案。
理查德·斯莱特

3

在典型的持续交付/部署管道中,将发生以下情况:

  1. 开发人员推送一个或多个提交,或者合并一个合并请求。
  2. 詹金斯会自动构建并执行测试。
  3. 如果成功,詹金斯(Jenkins)会将部署包发布到Artefact信息库;如果失败则什么也没有发布,并通知开发人员。
  4. 部署自动化使用Artefact信息库中的软件包并进行部署。

简单的CI / CD管道

目的是避免从源代码构建解决方案两次,而要构建一次,然后多次部署。您可以在Sonartype Nexus中实施批准以定义环境批准过程,即Dev→Test→UAT→Stage→Production。

就是说...如果您已经阅读了之前的所有文章,但仍想从源代码管理中获取最新的绿色版本,则可以使用以下两种方法之一:

  1. 让詹金斯(Jenkins)用适当命名的标签为分支添加标签,即在不需要最新的绿色版本时master-green使用该标签master
  2. 使用BitBucket 提交来获取提交列表,并在每个列表上提交/提交/状态,以查找具有绿色状态的提交。我在另一个答案中扩展了此解决方案。

如果您想了解有关如何使用上述方法的具体细节,请随时发表后续问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.