Git & Jenkins: รับสีเขียวล่าสุดในสาขา


10

เราเพิ่งเริ่มที่จะผลักดันให้ CI-CD และเป็นขั้นตอนทารกเราจะลองอัปเดตสแต็คที่มีการพัฒนาสีเขียวล่าสุดทุกๆสองชั่วโมง ฉันค่อนข้างใหม่สำหรับ Git / Bitbucket และไม่สามารถหาวิธีการตรวจสอบให้แน่ใจว่าการชำระเงินที่ Jenkins ทำให้ได้รับการยืนยันครั้งล่าสุดจะถูกทำเครื่องหมายสีเขียวโดย Jenkins มากกว่าเพียงแค่ "การกระทำครั้งสุดท้าย" เป็นคำสั่งแบบครอบคลุม

เราได้ติดตั้งปลั๊กอินตัวแจ้งสถานะการสร้างสถานะของ Bitbucket ดังนั้น Bitbucket จะติดตามว่าการกระทำใดเป็นสีเขียวหลังจากที่หน่วยทดสอบของเราทำงาน มีวิธีที่จะใช้ประโยชน์จากข้อมูลนี้เพื่อให้แน่ใจว่าได้เลือกการกระทำที่ถูกต้องหรือไม่?

คำตอบ:


6

คุณไม่ได้พูดถึงภาษาสคริปต์ที่คุณต้องการใช้ดังนั้นฉันจะพูดเฉพาะเกี่ยวกับคำขอ HTTP ไปยัง BitBucket API:

สมมติฐาน

หากคุณมีที่เก็บ BitBucketที่มีสามคอมมิทในคอมมิชชันแรกและอันสุดท้ายที่ไม่สามารถสร้างบิวด์กลางจะผ่าน:

  • 4768815 ❌
  • 49d7110 ✅
  • 42d357f ❌

รับรายการคอมมิท

คุณสามารถรับรายการการกระทำได้โดยการเรียกวิธีการ API ต่อไปนี้

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เป็นดัชนีคือ0, 1หรือ2ในตัวอย่างข้างต้น หากคุณต้องสร้างสิ่งนี้ตั้งแต่เริ่มต้นมันจะอยู่ในรูปแบบต่อไปนี้

รับรายการสถานะจากการส่ง

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

  • owner: RichardSlater
  • repo_slug: greencommitproofofconcept
  • 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

อีกครั้งที่nเป็นstatus- อาจจะมีคนอีกจำนวนมากถ้ามีใครกระทำส่งผลให้ในหลายสร้าง

หากรัฐสำหรับการสร้างที่คุณดูแลเกี่ยวกับการเป็นSUCCESSFULแล้วคุณมีคำตอบของคุณและทันทีที่คุณสามารถกลับมาshaสำหรับการกระทำ

ห่วงมากกว่าทุกกระทำจากขั้นตอนแรกถ้าคุณหมดกระทำตามnextหน้าที่รวมอยู่ในการเรียกร้องให้link/commits

แผนภาพการไหลที่สมบูรณ์

ในระดับสูงการไหลจะเป็นดังนี้:

แผนภาพการไหล

อย่าลืมว่านี่คือHypermedia APIดังนั้นหากเป็นไปได้ให้โค้ดของคุณตามลิงก์ใน API แทนที่จะพยายาม "เดาพวกเขา"


1
ใช่มันอาจเป็นคำตอบที่ยาวที่สุดของฉันใน SE เลยทีเดียว
Richard Slater

ฉันขอขอบคุณเวลาที่คุณอธิบายเรื่องนี้แม้ว่าคุณจะคิดว่าฉันเป็นบ้าเพราะต้องการ ยอมรับแล้ว
Alex

ไม่บ้าอย่างสมบูรณ์เพียงทำตามขั้นตอนแรกของคุณ - คำนึงถึงคำตอบอื่น ๆ ของฉันเมื่อคุณกำลังคิดเกี่ยวกับสถาปัตยกรรม CI / CD
Richard Slater

3

ในขั้นตอนการจัดส่ง / การปรับใช้โดยทั่วไปอย่างต่อเนื่องคุณจะมีสิ่งต่อไปนี้เกิดขึ้น:

  1. นักพัฒนาผลักหนึ่งหรือมากกว่าหนึ่งคอมมิชชันหรือคำขอดึงถูกผสาน
  2. Jenkins สร้างและดำเนินการทดสอบโดยอัตโนมัติ
  3. หากสำเร็จเจนกินส์เผยแพร่แพคเกจการปรับใช้ไปยังที่เก็บ Artefact; หากความล้มเหลวเผยแพร่อะไรและแจ้งให้นักพัฒนา
  4. การปรับใช้แบบอัตโนมัติใช้แพคเกจจากที่เก็บ Artefact และปรับใช้พวกเขา

Simple CI / CD Pipeline

เป้าหมายคือเพื่อหลีกเลี่ยงการสร้างโซลูชันจากแหล่งที่มาสองครั้งคุณสร้างครั้งเดียวและปรับใช้หลายครั้ง คุณสามารถใช้การอนุมัติในSonartype Nexusเพื่อกำหนดกระบวนการอนุมัติสภาพแวดล้อมเช่น Dev →ทดสอบ→ UAT →ขั้นตอน→การผลิต

ที่กล่าวว่า ...หากคุณอ่านก่อนหน้านี้ทั้งหมดและยังต้องการรับบิลด์สีเขียวล่าสุดจากแหล่งควบคุมคุณสามารถใช้หนึ่งในสองเทคนิคนี้:

  1. ให้เจนกินส์แท็กสาขาด้วยแท็กที่มีชื่ออย่างเหมาะสมmaster-greenแล้วใช้มันแทนที่จะเป็นmasterเมื่อคุณต้องการบิลด์สีเขียวล่าสุด
  2. ใช้ BitBucket กระทำเพื่อรับรายการการกระทำและยอมรับ/ {sha} / สถานะเหนือแต่ละรายการเพื่อค้นหาการกระทำด้วยสถานะสีเขียว ฉันมีการขยายตัวในการแก้ปัญหานี้ในคำตอบอื่น

อย่าลังเลที่จะโพสต์คำถามติดตามหากคุณต้องการรายละเอียดเฉพาะเกี่ยวกับวิธีการใช้วิธีการข้างต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.