Git & Jenkins: nhận cam kết xanh mới nhất trên chi nhánh


10

Chúng tôi mới bắt đầu thúc đẩy CI-CD và khi còn nhỏ, chúng tôi sẽ thử cập nhật một ngăn xếp với sự phát triển xanh mới nhất cứ sau vài giờ. Tôi còn khá mới với Git / Bitbucket và không thể tìm ra cách đảm bảo thanh toán mà Jenkins đưa ra để cam kết cuối cùng được Jenkins đánh dấu màu xanh lá cây, thay vì chỉ là "cam kết cuối cùng" như một tuyên bố về chăn.

Chúng tôi đã cài đặt plugin Trình thông báo trạng thái bản dựng Bitbucket , vì vậy Bitbucket sẽ theo dõi các cam kết nào có màu xanh sau khi các bài kiểm tra đơn vị của chúng tôi chạy. Có cách nào để tận dụng thông tin này để đảm bảo cam kết đúng được chọn không?

Câu trả lời:


6

Bạn không đề cập đến ngôn ngữ kịch bản mà bạn muốn sử dụng, vì vậy tôi sẽ nói cụ thể về các yêu cầu HTTP đối với API BitBucket:

Giả định

Nếu bạn có Kho lưu trữ BitBucket có ba lần xác nhận trong đó lần đầu tiên và lần cuối cùng không thực hiện được quá trình xây dựng, phần giữa sẽ vượt qua:

  • 4768815
  • 49d7110
  • 42d357f

Lấy danh sách các cam kết

Bạn có thể nhận danh sách các cam kết bằng cách gọi phương thức API sau:

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

  • owner: RichardSater
  • repo_slug: greencommitproofofconcept

Phản hồi trông như thế này:

{
  "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",
      ...
    }
  ]
}

Nếu bạn phân tích cú pháp JSON và lặp lại các câu trả lời, bạn có thể trích xuất các trạng thái từ:

values[n].links.statuses.href

Đâu nlà chỉ số, nghĩa là 0, 1hoặc 2trong ví dụ trên. Nếu bạn xây dựng nó từ đầu thì nó sẽ ở định dạng sau.

Lấy danh sách các trạng thái từ cam kết

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

  • owner: RichardSater
  • repo_slug: greencommitproofofconcept
  • sha: 4768815fdc27abf4be17096e7c460f7f68f5d39b

Lưu ý: đây là API Hypermedia có nghĩa là các url có thể thay đổi, vì vậy tôi khuyên bạn nên sử dụng các liên kết từ phản hồi trước đó thay vì cố gắng tạo chúng từ đầu.

Phản hồi từ yêu cầu HTTP ở trên sẽ giống như:

{
  "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
}

Từ phản hồi này, bạn có thể trích xuất statebằng cách sử dụng:

values[n].state

Một lần nữa, đâu nstatus- có thể có nhiều trong số chúng nếu một cam kết dẫn đến nhiều bản dựng.

Nếu trạng thái của bản dựng mà bạn quan tâm là SUCCESSFULthì bạn có câu trả lời của mình và bạn có thể trả lại ngay shacho cam kết.

Lặp lại tất cả các cam kết từ giai đoạn đầu tiên, nếu bạn hết các cam kết, hãy theo dõi nexttrang linkđược bao gồm trong lệnh gọi đến /commits.

Sơ đồ dòng hoàn chỉnh

Ở mức cao, dòng chảy sẽ như thế này:

Sơ đồ dòng chảy

Đừng quên đây là API Hypermedia vì vậy bất cứ khi nào có thể, mã của bạn sẽ theo các liên kết trong API thay vì cố gắng "đoán chúng".


1
Đúng vậy, đây có lẽ là câu trả lời dài nhất của tôi về SE.
Richard Slater

Tôi đánh giá cao thời gian bạn dành để giải thích điều này ngay cả khi bạn nghĩ rằng tôi hoàn toàn điên rồ vì muốn nó. Được chấp nhận
Alex

Không hoàn toàn điên rồ, chỉ cần thực hiện vài bước đầu tiên của bạn - hãy ghi nhớ câu trả lời khác của tôi khi bạn đang nghĩ về kiến ​​trúc CI / CD.
Richard Slater

3

Trong một đường ống triển khai / phân phối liên tục điển hình, bạn sẽ có những điều sau đây xảy ra:

  1. Nhà phát triển đẩy một hoặc nhiều cam kết hoặc yêu cầu kéo được hợp nhất.
  2. Jenkins tự động xây dựng và thực hiện các bài kiểm tra.
  3. Nếu Jenkins thành công sẽ xuất bản gói triển khai lên Kho lưu trữ Artefact; nếu thất bại không công bố gì và thông báo cho các nhà phát triển.
  4. Tự động hóa triển khai sử dụng các gói từ Kho lưu trữ Artefact và triển khai chúng.

Đường ống CI / CD đơn giản

Mục tiêu là để tránh xây dựng giải pháp từ nguồn hai lần, bạn xây dựng nó một lần và triển khai nó nhiều lần. Bạn có thể triển khai phê duyệt trong Sonartype Nexus để xác định quy trình phê duyệt môi trường, tức là Dev → Kiểm tra → UAT → Giai đoạn → Sản xuất.

Điều đó nói rằng ... nếu bạn đã đọc tất cả các phần trước và vẫn muốn có bản dựng xanh mới nhất từ ​​kiểm soát nguồn thì bạn có thể sử dụng một trong hai kỹ thuật:

  1. Yêu cầu Jenkins gắn thẻ chi nhánh với một thẻ có tên phù hợp, tức là master-greensử dụng nó thay vì masterkhi bạn muốn bản dựng xanh mới nhất.
  2. Sử dụng các cam kết BitBucket để nhận danh sách các cam kết và cam kết / {sha} / trạng thái trên mỗi trạng thái để tìm cam kết với trạng thái Xanh lục. Tôi đã mở rộng về giải pháp này trong một câu trả lời khác .

Vui lòng gửi câu hỏi tiếp theo nếu bạn muốn biết chi tiết cụ thể về cách sử dụng các phương pháp trên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.