一千萬個為什麽

搜索

Git&Jenkins:在分支上獲得最新的綠色提交



我們剛剛開始推行CI-CD,並且作為一個寶貝,我們將嘗試每隔幾個小時更新一次最新的綠色開發。我對Git/Bitbucket相當陌生,並且無法弄清楚如何確保Jenkins使最後一次承諾被Jenkins標記為綠色,而不僅僅是“最後一次承諾”作為一攬子聲明。

我們有 Bitbucket Build Status Notifier 插件安裝,所以Bitbucket確實跟蹤我們的單元測試運行後哪些提交是綠色的。有沒有辦法利用這些信息來確保正確的提交被選中?

轉載註明原文: Git&Jenkins:在分支上獲得最新的綠色提交

一共有 2 個回答:

您沒有提及您要使用的腳本語言,因此我會專門討論BitBucket API的HTTP請求:

假設

如果您有一個 BitBucket存儲庫,其中有三個提交,第一個和最後一個都沒有通過構建,中間傳遞:

  • 4768815 ❌
  • 49d7110 ✅
  • 42d357f ❌

獲取提交列表

You can 獲取提交列表 by calling the following API method:

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

  • owner: RichardSlater
  • repo_slug: greencommitproofofconcept

響應如下所示:

{
  "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: RichardSlater
  • repo_slug: greencommitproofofconcept
  • sha: 4768815fdc27abf4be17096e7c460f7f68f5d39b

Note: this is a Hypermedia API which means the urls could change so I would recommend using the links from the previous response rather than trying to generate them from scratch.

來自上述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
}

從這個響應中,您可以使用以下命令提取狀態

values[n].state

再次, nstatus - 如果一次提交導致許多構建,則可能會有很多這樣的情況。

如果你關心的構建的狀態是 SUCCESSFUL 那麽你有你的答案,你可以立即返回提交的 sha

在第一階段的所有提交中循環,如果用戶提交的內容超出 next 頁面 link 中包含在/commits 代碼>。

完整的流程圖

在高層次上,流程如下所示:

Flow Diagram

不要忘記這是一個超媒體API ,以便盡可能使您的代碼遵循API中的鏈接,而不是試圖”猜測它們“。

在典型的持續交付/部署管道中,您將會發生以下情況:

  1. 開發人員推送一個或多個提交,或者合並拉取請求。
  2. Jenkins自動構建並執行測試。
  3. 如果Jenkins成功發布部署包到Artefact存儲庫,如果失敗則不會發布並通知開發人員。
  4. 部署自動化使用Artefact存儲庫中的包並部署它們。

Simple CI/CD Pipeline

我們的目標是避免從源構建解決方案兩次,您只構建一次並多次部署它。您可以在 Sonartype Nexus 中實施審批,以定義環境審批流程,即Dev→Test →UAT→舞臺→制作。

That said... if you have read all of the previous and still want to get the latest green build from source control then you can use one of two techniques:

  1. 讓Jenkins用適當命名的標記(即 master-green )標記分支,然後在需要最新的綠色版本時使用該標記代替 master
  2. 使用BitBucket 提交獲取提交列表和 commit/{sha} /狀態,以查找具有綠色狀態的提交。我在另一個答案中擴展了此解決方案。

如果您想了解如何使用上述方法的具體細節,請隨時發布後續問題。