Se puede leer un buen caso de uso en este blog de cloudbees, empecemos a configurarlo para ver la problemática de este caso. Para activar la promoción se debe de activar la casilla "Promote builds when..."
En este ejemplo una vez que se ejecute el job de jenkins la promoción manual solo pintará en el log "despliegue" y solo lo podrá aprobar el usuario admin.
se puede ver el botón approve para el usuario admin y la salida sería:
Started by user admin Building in workspace /var/lib/jenkins/workspace/test-approve Promoting test-approve #1 [test-approve] $ /bin/sh -xe /tmp/jenkins552387212222026236.sh + echo despliegue despliegue build hudson.tasks.Shell@38223f2c SUCCESS Finished: SUCCESS
Este plugin no dispone de una manaera de hacer que esta lista sea dinámica mediante variables del tipo $APPROVERS_LIST en el campo de Approvers por lo que tenemos que modificar el job cada que se nos pida un nuevo approver.
Para solucionar esta deficioencia podemos agregar approvers de forma manual agregando el plugin Environment injector plugin y activar la promoción automática con un script de groovy.
Activaremos la casilla "Prepare an environment for the run" y agregaremos la variable de ambiente APPROVERS, o como es mi caso agregué un archivo properties con la configuración de la variable.
/var/lib/jenkins/secrets/approvers.properties
APPROVERS=admin,operator,approver1
En nuestra configuración de promoción agregaremos el siguiente script de groovy, el cuál lo que hace es modificar los approvers injectando la lista que se encuentre en APPROVERS
Y lo más importante es activar "Promote immediately once the build is complete" para que se ejecute el archivo de groovy una vez que nuestro job a sido costruido.
Ahora una vez que se construye el proyecto la lista de approvers debe de cambiar:
Dependiendo de la versión de jenkins tendrán que aprobar el uso del script de groovy, se hace en <jenkins_url>/scriptApproval/
Por alguna razón siempre hay que borrar la opción de classpath del plugin de groovy, sino jenkins se enojará mucho y nos lanzará una exception.
Dejo un caso de ejemplo en este repo, ansible-test-kitchen bastaría con ejecutarlo asi:
(master *)$ bundle exec kitchen converge default-ubuntu-promoted-builds-jenkins
Y un pequeño video sobre este tema: