Você não menciona a linguagem de script que deseja usar, portanto, falarei especificamente sobre as solicitações HTTP para a API do BitBucket:
Premissas
Se você tem um Repositório BitBucket que possui três confirmações, a primeira e a última estão com falha na compilação, o meio está passando:
- 4768815 ❌
- 49d7110 ✅
- 42d357f ❌
Obter a lista de confirmações
Você pode obter a lista de confirmações chamando o seguinte método de API:
https://api.bitbucket.org/2.0/repositories/{{owner}}/{{repo_slug}}/commits
owner
: RichardSlater
repo_slug
: greencommitproofofconcept
A resposta é assim:
{
"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",
...
}
]
}
Se você analisar o JSON e repetir as respostas, poderá extrair os status de:
values[n].links.statuses.href
Onde n
é o índice, isto é 0
, 1
ou 2
no exemplo acima. Se você fosse construir isso do zero, seria no seguinte formato.
Obtenha a lista de status da confirmação
https://api.bitbucket.org/2.0/repositories/{{owner}}/{{repo_slug}}/commit/{{sha}}/statuses"
owner
: RichardSlater
repo_slug
: greencommitproofofconcept
sha
: 4768815fdc27abf4be17096e7c460f7f68f5d39b
Nota: esta é uma API Hypermedia, o que significa que os URLs podem mudar, por isso recomendo usar os links da resposta anterior em vez de tentar gerá-los do zero.
A resposta da solicitação HTTP acima será algo como:
{
"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
}
A partir desta resposta, você pode extrair o state
uso:
values[n].state
Novamente, onde n
está o status
- poderia haver muitos deles se um commit resultasse em muitas compilações.
Se o estado da construção com o qual você se importa for SUCCESSFUL
, você terá sua resposta e poderá retornar imediatamente sha
a confirmação.
Faça um loop sobre todas as confirmações desde a primeira fase, se você ficar sem confirmações, siga a next
página link
incluída na chamada para /commits
.
Diagrama de fluxo completo
Em um nível alto, o fluxo ficará assim:
Não se esqueça que esta é uma API Hypermedia, portanto, sempre que possível, faça com que seu código siga os links da API em vez de tentar "adivinhar".