example - Crear script de canalización de jenkins resusable
jenkinsfile (3)
Aquí está la solución que estamos usando actualmente para reutilizar el código de Jenkinsfile:
node {
curl_cmd = "curl -H ''Accept: application/vnd.github.v3.raw'' -H ''Authorization: token ${env.GITHUB_TOKEN}'' https://raw.githubusercontent.com/example/foobar/master/shared/Jenkinsfile > Jenkinsfile.t
sh "${curl_cmd}"
load ''Jenkinsfile.tmp''
}
Podría ser un poco feo, pero funciona de manera realista y, además de eso, también nos permite insertar algún código específico del repositorio antes o después del código compartido.
Estoy pensando en utilizar el guión de Jenkins Pipeline recientemente, una pregunta es que no creo una forma inteligente de crear código de utilidades reutilizables internas, imagino, tengo una función común helloworld
que será utilizada por muchos trabajos en oleoductos, por lo que Espero crear un utils.jar
puede inyectarlo en el classpath de trabajo.
Noté que Jenkins tiene un concepto similar con la biblioteca global , pero mi preocupación con respecto a este complemento:
Como es un complemento, necesitamos instalarlo / actualizarlo a través del administrador de complementos de jenkins, entonces puede ser necesario reiniciarlo para aplicar el cambio, esto no es lo que quiero ver ya que los programas pueden cambiar, agregar siempre, esperamos que pueda ser disponible inmediatamente.
En segundo lugar, es jenkins shared lib compartido, no quiero (o no nos aplicarán) poner código privado en jenkins repo.
¿Alguna buena idea?
Dependiendo de la frecuencia con la que planee reutilizar su código, también podría cargar una función (o un conjunto de funciones) como parte de otra interconexión.
{
// ...your pipeline code...
git ''http://urlToYourGit/projectContainingYourScript''
pipeline = load ''global-functions.groovy''
pipeline.helloworld() // Call one of your defined function
// ...some other pipeline code...
}
Esta solución puede parecer un poco engorrosa en comparación con la de StephenKing, pero lo que me gusta de esta solución es que mis funciones globales están todas comprometidas con Git y cualquiera puede modificarlas fácilmente sin (casi) ningún conocimiento de Jenkins, solo conceptos básicos de Groovy.
En el script de Groovy que está load
, asegúrese de agregarlo al final. Esto te permitirá hacer llamadas más tarde. De lo contrario, cuando configure pipeline = load global-functions.groovy
, la variable se establecerá en null
.
Las bibliotecas compartidas ( docs ) le permiten hacer que su código sea accesible para todos sus scripts de canalización. No tiene que crear un complemento para eso y no tiene que reiniciar Jenkins.
Por ejemplo, esta es mi biblioteca y este es un Jenkinsfile que llama a esta función común.
EDITAR (Feb 2017): Se puede acceder a la biblioteca a través del servidor Git interno de Jenkins, o implementarla por otros medios (por ejemplo, a través de Chef) en el directorio (aún posible, pero muy descuidado). workflow-lib/
dentro del directorio de inicio del usuario jenkins .
La biblioteca global se puede configurar a través de los siguientes medios:
- una
@Library(''github.com/...'')
enJenkinsfile
apunta a la URL del repositorio de la biblioteca compartida. - configurado en el nivel de carpeta de trabajos de Jenkins.
- configurado en la configuración de Jenkins como biblioteca global, con la ventaja de que el código es confiable , es decir, no está sujeto a la seguridad del script.
Una mezcla del primer y el último método sería una biblioteca compartida no cargada explícitamente que luego se solicita solo con su nombre en Jenkinsfile
: @Library(''mysharedlib'')
.