No mencionas el lenguaje de secuencias de comandos que quieres usar, por lo que hablaré específicamente sobre las solicitudes HTTP a la API de BitBucket:
Supuestos
Si tiene un repositorio de BitBucket que tiene tres confirmaciones, el primero y el último fallan en la compilación, el medio está pasando:
- 4768815 ❌
- 49d7110 ✅
- 42d357f ❌
Obtenga la lista de confirmaciones
Puede obtener la lista de confirmaciones llamando al siguiente método de API:
https://api.bitbucket.org/2.0/repositories/{{owner}}/{{repo_slug}}/commits
owner
: RichardSlater
repo_slug
: greencommitproofofconcept
La respuesta se ve así:
{
"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",
...
}
]
}
Si analiza el JSON y recorre las respuestas, puede extraer los estados de:
values[n].links.statuses.href
Dónde n
está el índice, es decir 0
, 1
o 2
en el ejemplo anterior. Si tuviera que construir esto desde cero, estaría en el siguiente formato.
Obtenga la lista de estados del commit
https://api.bitbucket.org/2.0/repositories/{{owner}}/{{repo_slug}}/commit/{{sha}}/statuses"
owner
: RichardSlater
repo_slug
: greencommitproofofconcept
sha
: 4768815fdc27abf4be17096e7c460f7f68f5d39b
Nota: esta es una API de Hypermedia, lo que significa que las URL podrían cambiar, por lo que recomendaría usar los enlaces de la respuesta anterior en lugar de intentar generarlos desde cero.
La respuesta de la solicitud HTTP anterior será algo así 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
}
De esta respuesta puede extraer el state
uso:
values[n].state
De nuevo, ¿dónde n
está status
? Podría haber muchos de ellos si una confirmación resultara en muchas compilaciones.
Si el estado de la compilación que le interesa es SUCCESSFUL
su respuesta, puede devolverla inmediatamente sha
para la confirmación.
Recorra todas las confirmaciones de la primera fase, si se queda sin confirmaciones, siga la next
página link
que se incluye en la llamada a /commits
.
Diagrama de flujo completo
A un nivel alto, el flujo se verá así:
No olvide que esta es una API de Hypermedia, así que siempre que sea posible haga que su código siga los enlaces en la API en lugar de intentar "adivinarlos".