integrar - ¿Cómo puedo activar otro trabajo desde una tubería jenkins(jenkinsfile) con GitHub Org Plugin?
jenkins tutorial (5)
Además de las respuestas mencionadas anteriormente: quería comenzar un trabajo con un parámetro simple pasado a una segunda tubería y encontré la respuesta en https://dzone.com/refcardz/continuous-delivery-with-jenkins-workflow .
Entonces usé:
stage (''Starting ART job'') {
build job: ''RunArtInTest'', parameters: [[$class: ''StringParameterValue'', name: ''systemname'', value: systemname]]
}
¿Cómo puedo activar la creación de otro trabajo desde el
Jenkinsfile
?
Supongo que este trabajo es otro repositorio bajo la misma organización github , uno que ya tiene su propio archivo Jenkins.
También quiero hacer esto solo si el nombre de la sucursal es maestro, ya que no tiene sentido desencadenar compilaciones posteriores de cualquier sucursal local.
Actualizar:
stage ''test-downstream''
node {
def job = build job: ''some-downtream-job-name''
}
Aún así, cuando se ejecuta me sale un error
No se encontró ningún trabajo parametrizado llamado some-downtream-job-name
Estoy seguro de que este trabajo existe en jenkins y está en la misma carpeta de organización que el actual.
Es otro trabajo que tiene su propio
Jenkinsfile
.
Tenga en cuenta que esta pregunta es específica del complemento de organización de GitHub que crea y mantiene automáticamente trabajos para cada repositorio y sucursal de su organización de GitHub.
El comando
build
in pipeline está ahí para activar otros trabajos en jenkins.
El trabajo debe existir en Jenkins y puede parametrizarse. En cuanto a la rama, supongo que puedes leerla desde git
En primer lugar, es un desperdicio de un espacio de ejecución para ajustar el paso de
build
en el
node
.
Su ejecutor corriente arriba estará inactivo sin ninguna razón.
En segundo lugar, desde un proyecto de
BRANCH_NAME
, puede usar la variable de entorno
BRANCH_NAME
para hacer que la lógica sea condicional en la rama actual.
Tercero, el parámetro del
job
toma un nombre de trabajo absoluto o relativo.
Si da un nombre sin ninguna calificación de ruta, eso se referiría a otro trabajo en la misma carpeta, lo que en el caso de un proyecto de varias ramas significaría otra rama del mismo repositorio.
Por lo tanto, lo que querías escribir es probablemente
if (env.BRANCH_NAME == ''master'') {
build ''../other-repo/master''
}
Puede agregar variedad de lógica a su ejecución, como opciones y pasos paralelos, de nodo y agentes para activar trabajos externos. Le di un ejemplo de libro de cocina fácil de leer para eso.
1.ejemplo para activar un trabajo externo desde un archivo jenkins con un ejemplo condicional:
stage (''Trigger Builds In Parallel'') {
steps {
// Freestyle build trigger calls a list of jobs
// Pipeline build() step only calls one job
// To run all three jobs in parallel, we use "parallel" step
// https://jenkins.io/doc/pipeline/examples/#jobs-in-parallel
parallel (
linux: {
build job: ''full-build-linux'', parameters: [string(name: ''GIT_BRANCH_NAME'', value: env.BRANCH_NAME)]
},
mac: {
build job: ''full-build-mac'', parameters: [string(name: ''GIT_BRANCH_NAME'', value: env.BRANCH_NAME)]
},
windows: {
build job: ''full-build-windows'', parameters: [string(name: ''GIT_BRANCH_NAME'', value: env.BRANCH_NAME)]
},
failFast: false)
}
}
2.ejemplo que desencadena múltiples trabajos desde el archivo jenkins con ejemplos condicionales:
stage(''Build A and B'') {
failFast true
parallel {
stage(''Build A'') {
steps {
build job: "/project/A/${env.BRANCH}", wait: true
}
}
stage(''Build B'') {
steps {
build job: "/project/B/${env.BRANCH}", wait: true
}
}
}
}
Puede utilizar el paso de
build job
de
Jenkins Pipeline
(requisito mínimo de Jenkins: 2.130).
Aquí está la API completa para el paso de
build
:
https://jenkins.io/doc/pipeline/steps/pipeline-build-step/
Cómo usar
build
:
-
job
: Nombre de un trabajo posterior para construir. Puede ser otro trabajo de Pipeline, pero más comúnmente un estilo libre u otro proyecto.- Utilice un nombre simple si el trabajo está en la misma carpeta que este trabajo de canalización ascendente;
-
En su lugar, puede usar
rutas relativas
como
../sister-folder/downstream
-
O puede usar
rutas absolutas
como
/top-level-folder/nested-folder/downstream
Activa otro trabajo usando una rama como parámetro
En mi empresa, muchas de nuestras sucursales incluyen "/". Debe reemplazar cualquier instancia de "/" con "% 2F" (como aparece en la URL del trabajo).
En este ejemplo estamos usando rutas relativas
if (env.BRANCH_NAME == ''master'') {
build job:''exactJobName'' , parameters:[
string(name: ''keyNameOfParam1'',value: ''valueOfParam1'')
booleanParam(name: ''keyNameOfParam2'',value:''valueOfParam2'')
]
}
Activa otro trabajo usando el número de compilación como parámetro
def jobs =[
''job1Title''{
if (env.BRANCH_NAME == ''master'') {
build job:''exactJobName'' , parameters:[
string(name: ''keyNameOfParam1'',value: ''valueNameOfParam1'')
booleanParam(name: ''keyNameOfParam2'',value:''valueNameOfParam2'')
]
}
},
''job2Title''{
if (env.GIT_COMMIT == ''someCommitHashToPerformAdditionalTest'') {
build job:''exactJobName'' , parameters:[
string(name: ''keyNameOfParam3'',value: ''valueOfParam3'')
booleanParam(name: ''keyNameOfParam4'',value:''valueNameOfParam4'')
booleanParam(name: ''keyNameOfParam5'',value:''valueNameOfParam5'')
]
}
}
Desencadenar muchos trabajos en paralelo
Fuente: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/
Más información sobre Paralelo aquí: https://jenkins.io/doc/book/pipeline/syntax/#parallel
stage(''Trigger Branch Build'') {
steps {
script {
echo "Triggering job for branch ${env.BRANCH_NAME}"
BRANCH_TO_TAG=env.BRANCH_NAME.replace("/","%2F")
build job: "../my-relative-job/${BRANCH_TO_TAG}", wait: false
}
}
}
O alternativamente:
build job: ''your-job-name'',
parameters: [
string(name: ''passed_build_number_param'', value: String.valueOf(BUILD_NUMBER)),
string(name: ''complex_param'', value: ''prefix-'' + String.valueOf(BUILD_NUMBER))
]