tutorial steps example español jenkins jenkins-pipeline

steps - jenkins pipeline tutorial español



Jenkins Pipeline: ejecutor de bloques de pasos de "entrada" (3)

Debe usar el paso de entrada fuera de cualquier bloque de nodo, para que no contenga ningún ejecutor:

stage ''Build'' node(''build-node'') { sh ''call you build tool'' stash includes: ''target/my-output-artifact.whatever'', name: ''built'' } input ''Continue to deploy stage?'' stage ''Deploy'' node(''deploy-node'') { unstash ''built'' sh ''scp target/my-output-artifact.whatever user@deploy-server:/deploy'' }

Y puede bloquear la etapa de implementación si solo desea una implementación a la vez:

lock (''deploy-server'') { stage ''Deploy'' node(''deploy-node'') { unstash ''built'' sh ''scp target/my-output-artifact.whatever user@deploy-server:/deploy'' } }

Tenga en cuenta que la parte clave aquí es el paso de stash ya que puede mover artefactos de un nodo a otro (podría compartir el mismo nodo para ambas acciones pero no se permite que el área de trabajo permanezca intacta entre las dos llamadas de nodo, especialmente si pasa algún tiempo) esperando input ).

Después de Jenkinsfile documentación de Jenkinsfile y la Jenkinsfile , estoy un poco confundido sobre cómo crear una etapa -> canalización de producción .

Una forma es usar el paso de input como

node() { stage ''Build to Stage'' sh ''# ...'' input ''Deploy to Production'' stage ''Build to Production'' sh ''# ...'' }

Esto parece un poco torpe, ya que esto bloqueará a un ejecutor todo el tiempo hasta que desee implementarlo en producción. ¿Hay alguna forma alternativa de poder implementar en la producción, de Jenkins.


EDITAR (octubre de 2016): consulte mi otra respuesta, "Usar hito y bloqueo" a continuación, que incluye las características recientemente introducidas.

Usar el timeout Paso

Como primera opción, puede ajustar su paso sh en un paso de timeout .

node() { stage ''Build to Stage'' { sh ''# ...'' } stage ''Promotion'' { timeout(time: 1, unit: ''HOURS'') { input ''Deploy to Production?'' } } stage ''Deploy to Production'' { sh ''# ...'' } }

Esto detiene la construcción después del tiempo de espera.

Mover la input Paso a Flyweight Executor

Otra opción es no asignar un ejecutor de peso pesado para el paso de input . Puede hacerlo utilizando el paso de input fuera del bloque de node , como este:

stage ''Build to Stage'' { node { sh "echo building" stash ''complete-workspace'' } } stage ''Promotion'' { input ''Deploy to Production?'' } stage ''Deploy to Production'' { node { unstash ''complete-workspace'' sh "echo deploying" } }

Esta es probablemente la forma más elegante, pero aún se puede combinar con el paso de timeout .

EDITAR: Tal como lo señala @amuniz, debe esconder / desempaquetar el contenido del área de trabajo, ya que se pueden asignar diferentes nodos, respectivamente, directorios del espacio de trabajo para los dos pasos del node .


Teniendo en cuenta los avances recientes de las tuberías de Jenkins, la mejor forma posible sería la siguiente (fuente: jenkins.io/blog ):

Usar milestone y lock

  • El paso de lock (del complemento de lockable-resources ) permite bloquear algunos recursos especificados de modo que solo una única ejecución de canalización puede ingresar a esta etapa simultáneamente (no desea ejecutar dos implementaciones simultáneamente, ¿no es así?)
  • El paso de milestone (del complemento pipeline-milestone-step ) cancelará cualquier ejecución de canalización anterior, si una confirmación más reciente ya alcanzó el hito (no desea permitir que una confirmación más antigua que cuelga más tiempo en CI sobrescriba la implementación de un compromiso más nuevo, ¿no?).

stage(''Deploy'') { input "Deploy?" milestone() lock(''Deployment'') { node { echo "Deploying" } } }

La etapa de implementación no limita la concurrencia, pero requiere la entrada manual de un usuario. Varias compilaciones pueden llegar a este paso en espera de entrada. Cuando un usuario promueve una compilación específica, todas las compilaciones anteriores se cancelan, asegurando que el último código siempre se implemente.

Recomiendo leer jenkins.io/blog , que incluye más información útil.

Los créditos van a @amuniz , quien mantiene estos complementos.