¿Cómo puedo probar un cambio realizado en Jenkinsfile localmente?
Al escribir canalizaciones de jenkins, parece muy inconveniente confirmar cada nuevo cambio para ver si funciona.
¿Hay alguna manera de ejecutarlos localmente sin confirmar el código?
No puede ejecutar un script de Pipeline localmente, ya que su único propósito es crear un script para Jenkins. (Esta es una de las razones por las que es mejor mantener un Jenkinsfile
código breve y limitado que realmente trate con las características de Jenkins; su lógica de compilación real debe manejarse con procesos externos o herramientas de compilación que invoque mediante una línea sh
o bat
un paso).
Si desea probar un cambio en Jenkinsfile
vivo pero sin confirmarlo , use la función Repetir agregada en 1.14.
JENKINS-33925 rastrea la solicitud de funciones para un marco de prueba automatizado.
Tengo una solución que funciona bien para mí. Consiste en un jenkins local que se ejecuta en la ventana acoplable y un gancho web de git para activar la canalización en el jenkins local en cada confirmación. Ya no necesita acceder a su repositorio de github o bitbucket para probar la canalización.
Esto sólo ha sido probado en un entorno Linux.
Es bastante sencillo hacer que esto funcione, aunque estas instrucciones son un poco largas. La mayoría de los pasos están ahí.
Esto es lo que necesitas
- Docker instalado y funcionando. Esto no es parte de esta instrucción.
- Un Jenkins ejecutándose en la ventana acoplable localmente. Explica cómo a continuación.
- Los derechos adecuados (clave de acceso ssh) para que su usuario local de la ventana acoplable Jenkins los extraiga de su repositorio de git local. Explica cómo a continuación.
- Un proyecto de canalización de Jenkins que se extrae de su repositorio git local. Explicado a continuación.
- Un usuario de git en su Jenkins local con derechos mínimos. Explicado a continuación.
- Un proyecto git con un webhook posterior a la confirmación que activa el proyecto de canalización. Explicado a continuación.
Así es como lo haces
Jenkins Docker
Cree un archivo llamado Dockerfile en el lugar que elija. Lo estoy colocando y /opt/docker/jenkins/Dockerfile
rellénalo con esto:
FROM jenkins/jenkins:lts
USER root
RUN apt-get -y update && apt-get -y upgrade
# Your needed installations goes here
USER jenkins
Construya la imagen local_jenkins
Esto deberá hacerlo solo una vez o después de haber agregado algo al Dockerfile.
$ docker build -t local_jenkins /opt/docker/jenkins/
Iniciar y reiniciar local_jenkins
De vez en cuando desea iniciar y reiniciar jenkins fácilmente. Por ejemplo, después de reiniciar su máquina. Para esto creé un alias que puse en .bash_aliases
mi carpeta de inicio.
$ echo "alias localjenkinsrestart='docker stop jenkins;docker rm jenkins;docker run --name jenkins -i -d -p 8787:8080 -p 50000:50000 -v /opt/docker/jenkins/jenkins_home:/var/jenkins_home:rw local_jenkins'" >> ~/.bash_aliases
$ source .bash_aliases # To make it work
Asegúrese de que la /opt/docker/jenkins/jenkins_home
carpeta exista y de que tenga derechos de lectura y escritura de usuario.
Para iniciar o reiniciar tu jenkins simplemente escribe:
$ localjenkinsrestart
Todo lo que haga en su jenkins local se almacenará en la carpeta /opt/docker/jenkins/jenkins_home y se conservará entre reinicios.
Crea una clave de acceso ssh en tu Docker Jenkins
Esta es una parte muy importante para que esto funcione. Primero iniciamos el contenedor acoplable y le creamos un shell bash:
$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash
Ahora ha ingresado al contenedor de la ventana acoplable, esto lo puede ver en algo así como jenkins@e7b23bad10aa:/$
en su terminal. El hash después de @ seguramente será diferente.
Crea la clave
jenkins@e7b23bad10aa:/$ ssh-keygen
Presione Intro en todas las preguntas hasta que reciba el mensaje.
Copie la clave a su computadora. Desde dentro del contenedor acoplable, su computadora es 172.17.0.1 si se lo pregunta.
jenkins@e7b23bad10aa:/$ ssh-copy-id [email protected]
usuario = su nombre de usuario y 172.17.0.1 es la dirección IP de su computadora desde el contenedor de la ventana acoplable.
Tendrás que escribir tu contraseña en este punto.
Ahora intentemos completar el ciclo enviando ssh a su computadora desde el contenedor de la ventana acoplable.
jenkins@e7b23bad10aa:/$ ssh [email protected]
Esta vez no debería necesitar ingresar su contraseña. Si lo haces, algo salió mal y tendrás que volver a intentarlo.
Ahora estará en la carpeta de inicio de su computadora. Prueba ls
y echa un vistazo.
No te detengas aquí ya que tenemos una cadena de shells ssh de los que debemos salir.
$ exit
jenkins@e7b23bad10aa:/$ exit
¡Bien! Ahora estamos de regreso y listos para continuar.
Instala tu Jenkins
Encontrará su Jenkins local en su navegador en http://localhost:8787 .
La primera vez que dirija su navegador a su Jenkins local, recibirá un asistente de instalación. Los valores predeterminados están bien, pero asegúrese de instalar el complemento de canalización durante la configuración.
Configura tus jenkins
Es muy importante que active la seguridad basada en matriz en http://localhost:8787/configureSecurity y se otorgue todos los derechos agregándose a la matriz y marcando todas las casillas. (Hay un icono de marcar todas las casillas en el extremo derecho)
- Seleccionar
Jenkins’ own user database
como ámbito de seguridad - Seleccione
Matrix-based security
en la sección Autorización - Escribe tu nombre de usuario en el campo
User/group to add:
y haz clic en el[ Add ]
botón - En la tabla de arriba, su nombre de usuario debería aparecer con un ícono de persona al lado. Si está tachado, escribiste tu nombre de usuario incorrectamente.
- Vaya al extremo derecho de la tabla y haga clic en el botón de marcar todo o marque manualmente todas las casillas de su fila.
- Verifique que la casilla de verificación
Prevent Cross Site Request Forgery exploits
no esté marcada. (Dado que solo se puede acceder a Jenkins desde su computadora, esto no es gran cosa) - Haga clic
[ Save ]
y cierre sesión en Jenkins y vuelva a iniciarla solo para asegurarse de que funciona. Si no es así, tienes que empezar de nuevo desde el principio y vaciar la/opt/docker/jenkins/jenkins_home
carpeta antes de reiniciar.
Agrega el usuario de git
Necesitamos permitir que nuestro git hook inicie sesión en nuestro Jenkins local con derechos mínimos. Basta con ver y crear puestos de trabajo. Por lo tanto creamos un usuario llamado git
con contraseña login
.
Dirija su navegador a http://localhost:8787/securityRealm/addUser y agréguelo git
como nombre de usuario y login
contraseña. Haga clic en [ Create User ]
.
Agregue los derechos al usuario de git
Vaya a la página http://localhost:8787/configureSecurity en su navegador. Agregue el usuario de git a la matriz:
- Escribe
git
en el campoUser/group to add:
y haz clic en[ Add ]
Ahora es el momento de marcar las casillas de derechos mínimos para el usuario de git. Sólo se necesitan estos:
- general: leer
- trabajo: construir
- trabajo: descubrir
- trabajo: leer
Asegúrese de que la Prevent Cross Site Request Forgery exploits
casilla de verificación no esté marcada y haga clic en[ Save ]
Crear el proyecto de canalización
Suponemos que tenemos el nombre de usuario user
y nuestro proyecto habilitado para git con el nombre Jenkinsfile
en él se llama project
y está ubicado en/home/user/projects/project
En su http://localhost:8787 Jenkins agregue un nuevo proyecto de canalización. Lo llamé hookpipeline como referencia.
- Haga clic en
New Item
en el menú de Jenkins - Nombra el proyecto
hookpipeline
- Haga clic en Tubería
- Hacer clic
[ OK ]
- Marque la casilla de verificación
Poll SCM
en la sección Activadores de compilación. Deje el Horario vacío. - En la sección Tubería:
- seleccionar
Pipeline script from SCM
- en el
Repository URL
campo ingresa[email protected]:projects/project/.git
- en el
Script Path
campo ingresaJenkinsfile
- seleccionar
- Guarde el proyecto del hookpipeline
- Construya el canal de enlace manualmente una vez; esto es necesario para que Poll SCM comience a funcionar.
Crea el gancho de git
Vaya a la /home/user/projects/project/.git/hooks
carpeta y cree un archivo llamado post-commit
que contenga esto:
#!/bin/sh
BRANCHNAME=$(git rev-parse --abbrev-ref HEAD)
MASTERBRANCH='master'
curl -XPOST -u git:login http://localhost:8787/job/hookpipeline/build
echo "Build triggered successfully on branch: $BRANCHNAME"
Haga este archivo ejecutable:
$ chmod +x /home/user/projects/project/.git/hooks/post-commit
Pruebe el gancho posterior a la confirmación:
$ /home/user/projects/project/.git/hooks/post-commit
Verifique en Jenkins si se activó su proyecto de hookpipeline.
Finalmente, realice algún cambio arbitrario en su proyecto, agregue los cambios y realice una confirmación. Esto ahora activará la canalización en su Jenkins local.
¡Días felices!
TL;DR
- Marco de prueba de Jenkins Pipeline Unit
- Corredor de archivos Jenkins
La versión larga
de las pruebas de Jenkins Pipeline se vuelve cada vez más dolorosa. A diferencia del enfoque clásico de configuración de trabajos declarativos, donde el usuario estaba limitado a lo que la interfaz de usuario exponía, el nuevo Jenkins Pipeline es un lenguaje de programación completo para el proceso de compilación en el que se mezcla la parte declarativa con su propio código. Como buenos desarrolladores también queremos tener algunas pruebas unitarias para este tipo de código.
Hay tres pasos que debe seguir al desarrollar Jenkins Pipelines. El paso 1. debería cubrir el 80% de los casos de uso.
- Haga todo lo posible en los scripts de compilación (por ejemplo, Maven, Gradle, Gulp, etc.). Luego, en los scripts de su canalización, simplemente llama a las tareas de compilación en el orden correcto. La canalización de compilación simplemente organiza y ejecuta las tareas de compilación, pero no tiene ninguna lógica importante que requiera pruebas especiales.
- Si la regla anterior no se puede aplicar por completo, pase a las bibliotecas compartidas de Pipeline , donde puede desarrollar y probar lógica personalizada por sí sola e integrarla en la canalización.
- Si todo lo anterior falla, puede probar una de esas bibliotecas que aparecieron recientemente (marzo de 2017). Marco de prueba de Jenkins Pipeline Unit o pipelineUnit (ejemplos). Desde 2018 también existe Jenkinsfile Runner , un paquete para ejecutar canalizaciones de Jenkins desde una herramienta de línea de comandos.
Ejemplos
El repositorio de PipelineUnit en GitHub contiene algunos ejemplos de Spock sobre cómo utilizar el marco de pruebas de Jenkins Pipeline Unit.