Comprometerse en particular con la API de Jenkins

Quiero poder pedirle a Jenkins que haga una compilation en un compromiso particular a través de la API.

El mejor enfoque que puedo encontrar hasta ahora sería utilizar una twig de "api-build" y forzar el push deseado allí, y luego activar una compilation de la manera típica. Me sorprendería que no haya algo mejor, pero hasta ahora no he podido encontrarlo. ¿Cuál es la forma "correcta" de hacer esto (si hay uno)?

Puedes usar git hooks junto con versiones remotas de Jenkins para lograr esto.

Uso el gancho post-recepción para este tipo de cosas.

En el código del gancho (es un guión del intérprete de commands, pero puede hacer que incluya algo más, como un guión de Python ), puede examinar el último compromiso (tenga en count las fusiones , en cuyo caso tendría que retroceder) hasta el último compromiso no fusionado para encontrar el último compromiso real) para ver si es el tipo de compromiso en el que desea desencadenar una compilation (es decir, contiene cambios dentro de un subdirectory particular).

El set de cambios se puede get a través de las herramientas de command-line estándar de git , y luego se usan expresiones regulares para ver si el set de cambios contiene alguna ruta de interés.

Una vez que se determina que una compilation se debe desencadenar, puede realizar un curling para acceder a la URL necesaria para desencadenar la compilation remota de Jenkins (las comstackciones desencadenadas remotamente deben habilitarse en el trabajo y, opcionalmente, un set de tokens ).

Para get más información sobre comstackciones remotas, consulte: https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API

Edite en respuesta al comentario de OP:

Si usa el enganche posterior a la recepción , creo que funcionará independientemente de la twig o el compromiso (aunque personalmente solo lo he hecho pensando en el maestro ). Es específico para * git r * epo *, ya que el código de anzuelo post-recepción vive dentro de ese repository. Puede controlar, a través del código que contiene el gancho, cómo determina si desea activar una creación en function de lo que ha cambiado. Este código de enlace se ejecutará con cada inserción de git .

Edite en respuesta al comentario de seguimiento de OP:

No creo que esto se desencadene cuando no hay cambios, ya que en realidad, git no presionaría en ese caso. Si quieres desencadenar una compilation cuando no hay ningún cambio, entonces un rizo a través de la API como mencioné anteriormente funcionaría: una compilation siempre se puede activar en cualquier momento independientemente de los cambios a través de un command curl si las comstackciones remotas están habilitadas en el trabajo.

En términos de decirle a Jenkins qué build, eso lo hace el command de compilation Build> Execute , donde puede especificar la acción de compilation, como ejecutar un script de shell particular, o un command ant , etc.

No creo que quieras crear nuevos trabajos a través del anzuelo (de improviso, no creo que eso sea realmente algo que puedas hacer a través de la API, funciona con trabajos existentes, IIRC).

Edita con alguna información adicional:

En términos de especificar qué twig build, eso es algo que no creo que pueda ser especificado arbitrariamente, incluso a través de un git hook. Sin embargo, puede especificar múltiples twigs para build en la sección SCM de la configuration en el trabajo Jenkins .

Por lo tanto, si tuviera un set de twigs que desea build en cada confirmación, podría definir múltiples twigs en esa sección, y luego se basaría en cada una de ellas (aunque cuando se desencadenó una compilation dada, presumiblemente solo una twig tendría ese compromiso).

Puede ser más práctico clonar un puñado en trabajos de Jenkins , uno para cada sucursal, que buildía solo esa twig, y ​​luego el git hook puede enfocarse solo en ese trabajo según la twig del compromiso, en lugar de build a través de un grupo de twigs, la mayoría de los cuales no se aplicaría el compromiso.

Aunque eso no te lleva a twigs arbitrarias, sería una forma de hacer un puñado de ellas, digamos, master , dev , test o algo similar (o tal vez un puñado de versiones de lanzamiento).

Si realmente necesita sucursales arbitrarias, puede utilizar el complemento DSL de Job ( https://wiki.jenkins-ci.org/display/JENKINS/Job+DSL+Plugin ), que se supone permite un control muy específico del trabajo. creación. Eso podría hacerse desde dentro del git hook invocando otro script (el DSL usa Groovy ).

No he probado este plugin, pero parece prometedor. También facilita el uso de templates, que luego se pueden especificar, que también suena como que podría ser bueno para su caso, donde la twig, por ejemplo, podría variar, pero gran parte del rest del contenido sería bastante estático.