El servidor de entrega e integración continua de Jenkins disponible en Docker Hub.
Este es un servidor Jenkins completamente funcional. https://jenkins.io/.
docker run -p 8080:8080 -p 50000:50000 --restart=on-failure jenkins/jenkins:lts-jdk17
NOTA: lea la sección Conexión de agentes a continuación para conocer la función de asignación del puerto 50000
. NOTA: lea la sección Configuración de DNS en caso de que vea el mensaje "Esta instancia de Jenkins parece estar fuera de línea".
Esto almacenará el espacio de trabajo en /var/jenkins_home
. Todos los datos de Jenkins residen allí, incluidos los complementos y la configuración. Probablemente desee convertirlo en un volumen explícito para poder administrarlo y adjuntarlo a otro contenedor para realizar actualizaciones:
docker run -p 8080:8080 -p 50000:50000 --restart=on-failure -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk17
Esto creará automáticamente un volumen acoplable 'jenkins_home' en la máquina host. Los volúmenes Docker conservan su contenido incluso cuando el contenedor se detiene, inicia o elimina.
NOTA: Evite utilizar un montaje de enlace desde una carpeta en la máquina host a /var/jenkins_home
, ya que esto podría generar problemas de permisos de archivos (el usuario utilizado dentro del contenedor podría no tener derechos sobre la carpeta en la máquina host). Si realmente necesita vincular el montaje jenkins_home, asegúrese de que el usuario de jenkins dentro del contenedor pueda acceder al directorio en el host (usuario de jenkins - uid 1000) o use el parámetro -u some_other_user
con docker run
.
docker run -d -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --restart=on-failure jenkins/jenkins:lts-jdk17
Esto ejecutará Jenkins en modo independiente con reenvío de puertos y volumen agregado. Puede acceder a los registros con el comando 'docker logs CONTAINER_ID' para verificar el primer token de inicio de sesión. El ID del contenedor se devolverá a partir del resultado del comando anterior.
Si vincula el montaje en un volumen, simplemente puede hacer una copia de seguridad de ese directorio (que es jenkins_home) en cualquier momento.
No se recomienda el uso de un montaje vinculado ya que puede generar problemas de permisos. Trate el directorio jenkins_home como lo haría con una base de datos: en Docker generalmente colocaría una base de datos en un volumen.
Si su volumen está dentro de un contenedor, puede usar el comando docker cp $ID:/var/jenkins_home
para extraer los datos u otras opciones para encontrar dónde están los datos del volumen. Tenga en cuenta que algunos enlaces simbólicos en algunos sistemas operativos pueden convertirse en copias (esto puede confundir a jenkins con los enlaces de lastStableBuild, etc.)
Para obtener más información, consulte la sección de documentos de Docker sobre Usar volúmenes.
Puede definir la cantidad de ejecutores en el nodo integrado de Jenkins utilizando un script maravilloso. De forma predeterminada, está configurado en 2 ejecutores, pero puede extender la imagen y cambiarla al número deseado de ejecutores (se recomienda 0 ejecutores en el nodo integrado):
executors.groovy
import jenkins.model.* Jenkins.instance.setNumExecutors(0) // Recommended to not run builds on the built-in node
y Dockerfile
FROM jenkins/jenkins:lts COPY --chown=jenkins:jenkins executors.groovy /usr/share/jenkins/ref/init.groovy.d/executors.groovy
Puede ejecutar compilaciones en el controlador desde el primer momento. El proyecto Jenkins recomienda que no se habiliten ejecutores en el controlador.
Para conectar agentes a través de una conexión TCP entrante , asigne el puerto: -p 50000:50000
. Ese puerto se utilizará cuando conecte agentes al controlador.
Si solo utiliza agentes de compilación SSH (salientes), este puerto no es necesario, ya que las conexiones se establecen desde el controlador. Si conecta agentes mediante sockets web (desde Jenkins 2.217), el puerto del agente TCP tampoco se utiliza.
Es posible que necesite personalizar la JVM que ejecuta Jenkins, normalmente para ajustar las propiedades del sistema o modificar la configuración de la memoria dinámica. Utilice las variables de entorno JAVA_OPTS
o JENKINS_JAVA_OPTS
para este propósito:
docker run --name myjenkins -p 8080:8080 -p 50000:50000 --restart=on-failure --env JAVA_OPTS=-Dhudson.footerURL=http://mycompany.com jenkins/jenkins:lts-jdk17
Las opciones de JVM específicamente para el controlador Jenkins deben configurarse a través de JENKINS_JAVA_OPTS
, ya que otras herramientas también pueden responder a la variable de entorno JAVA_OPTS
.
El registro de Jenkins se puede configurar a través de un archivo de propiedades y la propiedad Java java.util.logging.config.file
. Por ejemplo:
mkdir data cat > data/log.properties <<EOF handlers=java.util.logging.ConsoleHandler jenkins.level=FINEST java.util.logging.ConsoleHandler.level=FINEST EOF docker run --name myjenkins -p 8080:8080 -p 50000:50000 --restart=on-failure --env JAVA_OPTS="-Djava.util.logging.config.file=/var/jenkins_home/log.properties" -v `pwd`/data:/var/jenkins_home jenkins/jenkins:lts-jdk17
Si desea instalar Jenkins detrás de un proxy inverso con un prefijo, por ejemplo: mysite.com/jenkins, debe agregar la variable de entorno JENKINS_OPTS="--prefix=/jenkins"
y luego seguir los procedimientos siguientes para configurar su proxy inverso. lo cual dependerá si tienes Apache o Nginx:
apache
nginx
Si aparece el mensaje "Esta instancia de Jenkins parece estar fuera de línea". aparece en el primer inicio y los registros del contenedor muestran líneas como java.net.UnknownHostException: updates.jenkins.io
, su contenedor puede tener problemas para resolver nombres DNS.
Para resolver potencialmente el problema, inicie el contenedor especificando un servidor DNS (por ejemplo, 1.1.1.1 de Cloudflare o 8.8.8.8 de Google, o cualquier otro servidor DNS):
docker run -p 8080:8080 -p 50000:50000 --restart=on-failure --dns 1.1.1.1 --dns 8.8.8.8 jenkins/jenkins:lts-jdk17
Los argumentos que pasa a la ventana acoplable que ejecuta la imagen de Jenkins se pasan al iniciador de jenkins, por lo que, por ejemplo, puede ejecutar:
docker run jenkins/jenkins:lts-jdk17 --version
Esto mostrará la versión de Jenkins, igual que cuando ejecutas Jenkins desde una guerra ejecutable.
También puede definir argumentos de Jenkins mediante JENKINS_OPTS
. Esto es útil para personalizar argumentos para el iniciador de jenkins en una imagen de Jenkins derivada. El siguiente Dockerfile de ejemplo utiliza esta opción para forzar el uso de HTTPS con un certificado incluido en la imagen.
FROM jenkins/jenkins:lts-jdk17 COPY --chown=jenkins:jenkins certificate.pfx /var/lib/jenkins/certificate.pfx COPY --chown=jenkins:jenkins https.key /var/lib/jenkins/pk ENV JENKINS_OPTS="--httpPort=-1 --httpsPort=8083 --httpsKeyStore=/var/lib/jenkins/certificate.pfx --httpsKeyStorePassword=Password12" EXPOSE 8083
También puede cambiar el puerto del agente predeterminado para Jenkins definiendo JENKINS_SLAVE_AGENT_PORT
en un Dockerfile de muestra.
FROM jenkins/jenkins:lts-jdk17 ENV JENKINS_SLAVE_AGENT_PORT=50001
o como parámetro para Docker,
docker run --name myjenkins -p 8080:8080 -p 50001:50001 --restart=on-failure --env JENKINS_SLAVE_AGENT_PORT=50001 jenkins/jenkins:lts-jdk17
Nota : esta variable de entorno se utilizará para configurar la propiedad del sistema jenkins.model.Jenkins.slaveAgentPort
.
Si esta propiedad ya está configurada en JAVA_OPTS o JENKINS_JAVA_OPTS , entonces se ignorará el valor de
JENKINS_SLAVE_AGENT_PORT
.
Puede ejecutar su contenedor como root e instalarlo mediante apt-get, instalarlo como parte de los pasos de compilación mediante los instaladores de herramientas jenkins, o puede crear su propio Dockerfile para personalizarlo, por ejemplo:
FROM jenkins/jenkins:lts-jdk17 # if we want to install via apt USER root RUN apt-get update && apt-get install -y ruby make more-thing-here # drop back to the regular jenkins user - good practice USER jenkins
En dicha imagen derivada, puede personalizar su instancia de jenkins con scripts de enlace o complementos adicionales. Para este propósito, use /usr/share/jenkins/ref
como un lugar para definir el contenido JENKINS_HOME predeterminado al que desea que se vea la instalación de destino:
FROM jenkins/jenkins:lts-jdk17 COPY --chown=jenkins:jenkins custom.groovy /usr/share/jenkins/ref/init.groovy.d/custom.groovy
Puede confiar en la CLI del administrador de complementos para pasar un conjunto de complementos para descargar con sus dependencias. Esta herramienta realizará descargas desde los centros de actualización y se requiere acceso a Internet para los centros de actualización predeterminados.
Durante la descarga, la CLI utilizará centros de actualización definidos por las siguientes variables de entorno:
JENKINS_UC
- Centro de actualización principal. Este centro de actualización puede ofrecer versiones de complementos según las versiones de Jenkins LTS Core. Valor predeterminado: https://updates.jenkins.io
JENKINS_UC_EXPERIMENTAL
- Centro de actualización experimental. Este centro ofrece versiones Alpha y Beta de complementos. Valor predeterminado: https://updates.jenkins.io/experimental
JENKINS_INCREMENTALS_REPO_MIRROR
: define el espejo de Maven que se utilizará para descargar complementos del repositorio de Incrementals. Valor predeterminado: https://repo.jenkins-ci.org/incrementals
JENKINS_UC_DOWNLOAD
: URL de descarga del Centro de actualización. Valor predeterminado: $JENKINS_UC/download
JENKINS_PLUGIN_INFO
: ubicación de la información del complemento. Valor predeterminado: https://updates.jenkins.io/current/plugin-versions.json
Es posible anular las variables de entorno en las imágenes.
❗ Tenga en cuenta que cambiar las variables del centro de actualización no cambiará el Centro de actualización que utiliza el tiempo de ejecución de Jenkins; solo afecta a la CLI del administrador de complementos.
La instalación de complementos personalizados y prediseñados se puede realizar copiando el archivo HPI del complemento en /usr/share/jenkins/ref/plugins/
dentro del Dockerfile
:
COPY --chown=jenkins:jenkins path/to/custom.hpi /usr/share/jenkins/ref/plugins/
Puede ejecutar la CLI manualmente en Dockerfile:
DE jenkins/jenkins:lts-jdk17RUN jenkins-plugin-cli --plugins definición-modelo-canalización github-branch-source:1.8
Además, es posible pasar un archivo que contenga este conjunto de complementos (con o sin saltos de línea).
DESDE jenkins/jenkins:lts-jdk17COPY --chown=jenkins:jenkins plugins.txt /usr/share/jenkins/ref/plugins.txtRUN jenkins-plugin-cli -f /usr/share/jenkins/ref/plugins.txt
Cuando se inicia el contenedor jenkins, comprobará que JENKINS_HOME
tenga este contenido de referencia y lo copiará allí si es necesario. No anulará dichos archivos, por lo que si actualizó algunos complementos desde la interfaz de usuario, no se revertirán en el próximo inicio.
En caso de que desee anular, agregue '.override' al nombre del archivo de referencia. Por ejemplo, un archivo llamado /usr/share/jenkins/ref/config.xml.override
sobrescribirá un archivo config.xml
existente en JENKINS_HOME.
Ver también JENKINS-24986
Aquí hay un ejemplo para obtener la lista de complementos de un servidor existente:
JENKINS_HOST=username:[email protected]:port curl -sSL "http://$JENKINS_HOST/pluginManager/api/xml?depth=1&xpath=/*/*/shortName|/*/*/version&wrapper=plugins" | perl -pe 's/.*?<shortName>([w-]+).*?<version>([^<]+)()(</w+>)+/1 2n/g'|sed 's/ /:/'
Salida de ejemplo:
cucumber-testresult-plugin:0.8.2 pam-auth:1.1 matrix-project:1.4.1 script-security:1.13 ...
Para imágenes derivadas de 2.x, es posible que también desee
RUN echo 2.0 > /usr/share/jenkins/ref/jenkins.install.UpgradeWizard.state
para indicar que esta instalación de Jenkins está completamente configurada. De lo contrario, aparecerá un banner solicitando al usuario que instale complementos adicionales, que pueden resultar inapropiados.
Para habilitar los registros de acceso de usuarios de Jenkins desde el directorio de inicio de Jenkins dentro de un contenedor acoplable, establezca el valor de la variable de entorno JENKINS_OPTS
en --accessLoggerClassName=winstone.accesslog.SimpleAccessLogger --simpleAccessLogger.format=combined --simpleAccessLogger.file=/var/jenkins_home/logs/access_log
La convención de nomenclatura para las etiquetas en Docker Hub sigue el formato <repository_name>:<tag>
, donde el nombre del repositorio es jenkins/jenkins y donde la etiqueta especifica la versión de la imagen. En el caso de LTS y las últimas versiones, las etiquetas son lts
y latest
, respectivamente.
Puede utilizar estas etiquetas para extraer las imágenes de Jenkins correspondientes de Docker Hub y ejecutarlas en su sistema. Por ejemplo, para extraer la versión LTS de la imagen de Jenkins, utilice este comando: docker pull jenkins/jenkins:lts
Para usar Docker Compose con Jenkins, puede definir un archivo docker-compose.yml que incluya una instancia de Jenkins y cualquier otro servicio del que dependa. Por ejemplo, el siguiente archivo docker-compose.yml define un controlador Jenkins y un agente SSH de Jenkins:
servicios: jenkins:imagen: jenkins/jenkins:ltsports: - volúmenes "8080:8080": - jenkins_home:/var/jenkins_home ssh-agent:imagen: jenkins/ssh-agentvolumes: jenkins_home:
Este archivo docker-compose.yml
crea dos contenedores: uno para Jenkins y otro para el agente SSH de Jenkins.
El contenedor de Jenkins se basa en la imagen jenkins/jenkins:lts
y expone la interfaz web de Jenkins en el puerto 8080. El volumen jenkins_home
es un volumen con nombre creado y administrado por Docker.
Está montado en /var/jenkins_home
en el contenedor de Jenkins y persistirá la configuración y los datos de Jenkins.
El contenedor ssh-agent se basa en la imagen jenkins/ssh-agent
y ejecuta un servidor SSH para ejecutar Jenkins SSH Build Agent.
Para iniciar la instancia de Jenkins y los demás servicios definidos en el archivo docker-compose.yml
, ejecute docker compose up -d
.
Esto extraerá las imágenes necesarias de Docker Hub si aún no están presentes en su sistema e iniciará los servicios en segundo plano.
Luego puede acceder a la interfaz web de Jenkins en http://localhost:8080
en su sistema host para configurar y administrar su instancia de Jenkins (donde localhost
apunta al puerto publicado por su Docker Engine).
NOTA: lea la sección Configuración de DNS en caso de que vea el mensaje "Esta instancia de Jenkins parece estar fuera de línea". En ese caso agregue la configuración dns al yaml:
servicios: jenkins:# ... otras configuraciones: - 1.1.1.1 - 8.8.8.8# ... otra configuración
La herramienta de administrador de instalación de complementos admite la actualización del archivo del complemento por usted.
Comando de ejemplo:
JENKINS_IMAGE=jenkins/jenkins:lts-jdk17 docker run -it ${JENKINS_IMAGE} bash -c "stty -onlcr && jenkins-plugin-cli -f /usr/share/jenkins/ref/plugins.txt --available-updates --output txt" > plugins2.txt mv complementos2.txt complementos.txt
Todos los datos necesarios están en el directorio /var/jenkins_home, por lo que, dependiendo de cómo los administre, dependerá de cómo actualice. En general, puede copiarlo y luego "extraer" la imagen nuevamente y tendrá el LTS más reciente. Luego puede comenzar con -v apuntando a esos datos (/var/jenkins_home) y todo será como usted. lo dejé.
Como siempre, asegúrese de saber cómo manejar Docker, ¡especialmente el manejo de volúmenes!
Si monta el directorio de inicio de Jenkins en un volumen con nombre de Docker, la actualización consiste en docker pull
y nada más.
Recomendamos usar docker compose
, especialmente en los casos en los que el usuario también ejecuta un contenedor nginx/apache paralelo como proxy inverso para el contenedor Jenkins.
De forma predeterminada, los complementos se actualizarán si no se han actualizado manualmente y si la versión de la imagen de la ventana acoplable es más reciente que la versión del contenedor. Las versiones instaladas por la imagen de la ventana acoplable se rastrean a través de un archivo de marcador.
Para forzar actualizaciones de complementos que se han actualizado manualmente, ejecute la imagen de la ventana acoplable con -e PLUGINS_FORCE_UPGRADE=true
.
El comportamiento predeterminado al actualizar desde una imagen de la ventana acoplable que no escribió archivos de marcadores es dejar los complementos existentes en su lugar. Si desea actualizar los complementos existentes sin marcador, puede ejecutar la imagen de la ventana acoplable con -e TRY_UPGRADE_IF_NO_MARKER=true
. Luego, los complementos se actualizarán si la versión proporcionada por la imagen de la ventana acoplable es más nueva.
Si desea contribuir con correcciones a este repositorio, consulte la documentación dedicada.
Para obtener información relacionada con la seguridad de esta imagen de Docker, consulte la documentación dedicada.
Estamos en Gitter, https://gitter.im/jenkinsci/docker