Sie erwähnen nicht die Skriptsprache, die Sie verwenden möchten, daher werde ich speziell auf die HTTP-Anforderungen an die BitBucket-API eingehen:
Annahmen
Wenn Sie ein BitBucket-Repository haben , in dem drei Commits enthalten sind, schlagen der erste und der letzte den Build fehl, die Mitte wird übergeben:
- 4768815 ❌
- 49d7110 ✅
- 42d357f ❌
Holen Sie sich die Liste der Commits
Sie können die Liste der Commits abrufen, indem Sie die folgende API-Methode aufrufen:
https://api.bitbucket.org/2.0/repositories/{{owner}}/{{repo_slug}}/commits
owner
: RichardSlater
repo_slug
: greencommitproofofconcept
Die Antwort sieht folgendermaßen aus:
{
"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",
...
}
]
}
Wenn Sie den JSON analysieren und die Antworten durchlaufen, können Sie die Status extrahieren aus:
values[n].links.statuses.href
Wo n
ist der Index, das heißt 0
, 1
oder 2
in dem obigen Beispiel. Wenn Sie dies von Grund auf neu erstellen würden, hätte es das folgende Format.
Rufen Sie die Liste der Status aus dem Commit ab
https://api.bitbucket.org/2.0/repositories/{{owner}}/{{repo_slug}}/commit/{{sha}}/statuses"
owner
: RichardSlater
repo_slug
: greencommitproofofconcept
sha
: 4768815fdc27abf4be17096e7c460f7f68f5d39b
Hinweis: Dies ist ein Hypermedia - API , die die Urls bedeutet , könnte ändern , damit ich die Links von der vorherigen Antwort verwenden würde empfehlen , anstatt zu versuchen , sie von Grund auf neu zu generieren.
Die Antwort von der obigen HTTP-Anfrage lautet wie folgt:
{
"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
}
Aus dieser Antwort können Sie Folgendes extrahieren state
:
values[n].state
Wieder wo n
ist das status
- es könnte viele von ihnen geben, wenn ein Commit zu vielen Builds führen würde.
Wenn der Status für den Build, den Sie interessieren, lautet SUCCESSFUL
, haben Sie Ihre Antwort und können diese sofort sha
für das Commit zurückgeben.
Durchlaufen Sie alle Commits aus der ersten Phase. Wenn Ihnen die Commits ausgehen, folgen Sie der next
Seite link
, die im Aufruf von enthalten ist /commits
.
Komplettes Flussdiagramm
Auf hohem Niveau sieht der Fluss folgendermaßen aus:
Vergessen Sie nicht, dass dies eine Hypermedia-API ist. Lassen Sie Ihren Code also nach Möglichkeit den Links in der API folgen, anstatt zu versuchen, sie zu "erraten".