Git y Jenkins: obtenga la última confirmación verde en la sucursal

10

Estamos empezando a presionar por CI-CD y, como un pequeño paso, intentaremos actualizar una pila con el último desarrollo verde una vez cada dos horas. Soy bastante nuevo en Git / Bitbucket, y no puedo encontrar la manera de asegurar que el pago que realiza Jenkins obtenga el último compromiso marcado por Jenkins en verde, en lugar de solo "el último compromiso" como una declaración general.

Tenemos instalado el complemento Notificador de estado de compilación de Bitbucket , por lo que Bitbucket rastrea qué confirmaciones son verdes después de que se ejecutan nuestras pruebas unitarias. ¿Hay alguna manera de aprovechar esta información para asegurarse de que se selecciona la confirmación correcta?

Alex
fuente

Respuestas:

6

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 nestá el índice, es decir 0, 1o 2en 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 stateuso:

values[n].state

De nuevo, ¿dónde nestá 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 SUCCESSFULsu respuesta, puede devolverla inmediatamente shapara la confirmación.

Recorra todas las confirmaciones de la primera fase, si se queda sin confirmaciones, siga la nextpágina linkque se incluye en la llamada a /commits.

Diagrama de flujo completo

A un nivel alto, el flujo se verá así:

Diagrama de flujo

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".

Richard Slater
fuente
1
Sí, es probablemente mi respuesta más larga en SE.
Richard Slater
Aprecio el tiempo que te tomaste para explicar esto, incluso si crees que estoy completamente loco por quererlo. Aceptado
Alex
No es completamente una locura, solo da tus primeros pasos: ten en cuenta mi otra respuesta cuando estés pensando en arquitecturas de CI / CD.
Richard Slater
3

En una canalización típica de entrega / implementación continua, sucedería lo siguiente:

  1. El desarrollador empuja una o más confirmaciones o una solicitud de extracción se fusiona.
  2. Jenkins construye y ejecuta automáticamente pruebas.
  3. Si tiene éxito, Jenkins publica un paquete de implementación en un Repositorio de Artefactos; Si la falla no publica nada y notifique a los desarrolladores.
  4. La automatización de implementación utiliza paquetes del Repositorio de Artefact y los implementa.

Canalización simple de CI / CD

El objetivo es evitar la construcción de la solución de la fuente en dos ocasiones, a construir una vez y desplegar muchas veces. Puede implementar aprobaciones en Sonartype Nexus para definir el proceso de aprobación del entorno, es decir, Dev → Prueba → UAT → Etapa → Producción.

Dicho esto ... si ha leído todo lo anterior y aún desea obtener la última versión verde del control de código fuente, entonces puede usar una de dos técnicas:

  1. Haga que Jenkins etiquete la rama con una etiqueta con el nombre adecuado, es decir, úsela en master-greenlugar de mastercuando desee la última versión verde.
  2. Use los commits de BitBucket para obtener una lista de commits y commit / {sha} / status sobre cada uno para encontrar el commit con un estado Verde. He ampliado esta solución en otra respuesta .

Siéntase libre de publicar una pregunta de seguimiento si desea obtener detalles específicos sobre cómo utilizar los enfoques anteriores.

Richard Slater
fuente