O servidor Jenkins Continuous Integration and Delivery disponível no Docker Hub.
Este é um servidor Jenkins totalmente funcional. https://jenkins.io/.
docker run -p 8080:8080 -p 50000:50000 --restart=on-failure jenkins/jenkins:lts-jdk17
NOTA: leia a seção Conectando agentes abaixo para saber a função do mapeamento de portas 50000
. NOTA: leia a seção Configuração de DNS caso veja a mensagem "Esta instância do Jenkins parece estar offline".
Isso armazenará o espaço de trabalho em /var/jenkins_home
. Todos os dados do Jenkins residem lá - incluindo plug-ins e configuração. Você provavelmente desejará tornar esse volume explícito para poder gerenciá-lo e anexá-lo a outro contêiner para atualizações:
docker run -p 8080:8080 -p 50000:50000 --restart=on-failure -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk17
Isso criará automaticamente um volume docker 'jenkins_home' na máquina host. Os volumes do Docker retêm seu conteúdo mesmo quando o contêiner é interrompido, iniciado ou excluído.
NOTA: Evite usar uma montagem vinculada de uma pasta na máquina host para /var/jenkins_home
, pois isso pode resultar em problemas de permissão de arquivo (o usuário usado dentro do contêiner pode não ter direitos para a pasta na máquina host). Se você realmente precisar vincular o mount jenkins_home, certifique-se de que o diretório no host esteja acessível ao usuário jenkins dentro do contêiner (usuário jenkins - uid 1000) ou use o parâmetro -u some_other_user
com docker run
.
docker run -d -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --restart=on-failure jenkins/jenkins:lts-jdk17
Isso executará o Jenkins em modo desanexado com encaminhamento de porta e volume adicionado. Você pode acessar os logs com o comando 'docker logs CONTAINER_ID' para verificar o primeiro token de login. O ID do contêiner será retornado pela saída do comando acima.
Se você vincular a montagem em um volume - você pode simplesmente fazer backup desse diretório (que é jenkins_home) a qualquer momento.
O uso de uma montagem vinculada não é recomendado, pois pode levar a problemas de permissão. Trate o diretório jenkins_home como se fosse um banco de dados - no Docker você geralmente colocaria um banco de dados em um volume.
Se o seu volume estiver dentro de um contêiner - você pode usar o comando docker cp $ID:/var/jenkins_home
para extrair os dados ou outras opções para descobrir onde estão os dados do volume. Observe que alguns links simbólicos em alguns sistemas operacionais podem ser convertidos em cópias (isso pode confundir jenkins com links lastStableBuild, etc.)
Para obter mais informações, verifique a seção de documentos do Docker em Usar volumes
Você pode definir o número de executores no nó integrado do Jenkins usando um script bacana. Por padrão, ele é definido como 2 executores, mas você pode estender a imagem e alterá-la para o número desejado de executores (recomendado 0 executores no nó integrado):
executors.groovy
import jenkins.model.* Jenkins.instance.setNumExecutors(0) // Recommended to not run builds on the built-in node
e Dockerfile
FROM jenkins/jenkins:lts COPY --chown=jenkins:jenkins executors.groovy /usr/share/jenkins/ref/init.groovy.d/executors.groovy
Você pode executar compilações no controlador imediatamente. O projeto Jenkins recomenda que nenhum executor seja habilitado no controlador.
Para conectar agentes por meio de uma conexão TCP de entrada , mapeie a porta: -p 50000:50000
. Essa porta será usada quando você conectar agentes ao controlador.
Se você estiver usando apenas agentes de construção SSH (de saída), essa porta não será necessária, pois as conexões são estabelecidas a partir do controlador. Se você conectar agentes usando web sockets (desde Jenkins 2.217), a porta do agente TCP também não será usada.
Talvez seja necessário personalizar a JVM que executa o Jenkins, normalmente para ajustar as propriedades do sistema ou ajustar as configurações de memória heap. Use as variáveis de ambiente JAVA_OPTS
ou JENKINS_JAVA_OPTS
para esta finalidade:
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
As opções JVM especificamente para o controlador Jenkins devem ser definidas por meio de JENKINS_JAVA_OPTS
, pois outras ferramentas também podem responder à variável de ambiente JAVA_OPTS
.
O log do Jenkins pode ser configurado por meio de um arquivo de propriedades e da propriedade Java java.util.logging.config.file
. Por exemplo:
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
Se você deseja instalar o Jenkins atrás de um proxy reverso com um prefixo, exemplo: mysite.com/jenkins, você precisa adicionar a variável de ambiente JENKINS_OPTS="--prefix=/jenkins"
e seguir os procedimentos abaixo para configurar seu proxy reverso, o que dependerá se você possui Apache ou Nginx:
Apache
Nginx
Se a mensagem "Esta instância do Jenkins parece estar offline." aparecer na primeira inicialização e os logs do contêiner mostrarem linhas como java.net.UnknownHostException: updates.jenkins.io
, seu contêiner pode estar tendo problemas para resolver nomes DNS.
Para potencialmente resolver o problema, inicie o contêiner especificando um servidor DNS (por exemplo, 1.1.1.1 da Cloudflare ou 8.8.8.8 do Google, ou qualquer outro 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
Os argumentos que você passa para o docker executando a imagem do Jenkins são passados para o inicializador do jenkins, então, por exemplo, você pode executar:
docker run jenkins/jenkins:lts-jdk17 --version
Isso mostrará a versão do Jenkins, a mesma de quando você executa o Jenkins a partir de um war executável.
Você também pode definir argumentos Jenkins via JENKINS_OPTS
. Isso é útil para personalizar argumentos para o inicializador do Jenkins em uma imagem derivada do Jenkins. O exemplo de Dockerfile a seguir usa essa opção para forçar o uso de HTTPS com um certificado incluído na imagem.
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
Você também pode alterar a porta do agente padrão para Jenkins definindo JENKINS_SLAVE_AGENT_PORT
em um Dockerfile de amostra.
FROM jenkins/jenkins:lts-jdk17 ENV JENKINS_SLAVE_AGENT_PORT=50001
ou 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 variável de ambiente será usada para definir a propriedade do sistema jenkins.model.Jenkins.slaveAgentPort
.
Se esta propriedade já estiver configurada em JAVA_OPTS ou JENKINS_JAVA_OPTS , então o valor de
JENKINS_SLAVE_AGENT_PORT
será ignorado.
Você pode executar seu contêiner como root - e instalar via apt-get, instalar como parte das etapas de construção por meio dos instaladores da ferramenta jenkins ou pode criar seu próprio Dockerfile para personalizar, por exemplo:
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
Nessa imagem derivada, você pode personalizar sua instância do Jenkins com scripts de gancho ou plug-ins adicionais. Para este propósito, use /usr/share/jenkins/ref
como um local para definir o conteúdo JENKINS_HOME padrão com o qual você deseja que a instalação de destino se pareça:
FROM jenkins/jenkins:lts-jdk17 COPY --chown=jenkins:jenkins custom.groovy /usr/share/jenkins/ref/init.groovy.d/custom.groovy
Você pode contar com a CLI do gerenciador de plug-ins para passar um conjunto de plug-ins para download com suas dependências. Esta ferramenta realizará downloads de centros de atualização e é necessário acesso à Internet para os centros de atualização padrão.
Durante o download, a CLI usará centros de atualização definidos pelas seguintes variáveis de ambiente:
JENKINS_UC
- Centro principal de atualização. Este centro de atualização pode oferecer versões de plugins dependendo das versões do Jenkins LTS Core. Valor padrão: https://updates.jenkins.io
JENKINS_UC_EXPERIMENTAL
- Centro de Atualização Experimental. Este centro oferece versões Alpha e Beta de plugins. Valor padrão: https://updates.jenkins.io/experimental
JENKINS_INCREMENTALS_REPO_MIRROR
- Define o espelho Maven a ser usado para baixar plugins do repositório Incrementals. Valor padrão: https://repo.jenkins-ci.org/incrementals
JENKINS_UC_DOWNLOAD
- Url de download do Update Center. Valor padrão: $JENKINS_UC/download
JENKINS_PLUGIN_INFO
– Localização das informações do plugin. Valor padrão: https://updates.jenkins.io/current/plugin-versions.json
É possível substituir as variáveis de ambiente nas imagens.
❗ Observe que alterar as variáveis do centro de atualização não alterará o Centro de Atualização usado pelo tempo de execução do Jenkins, trata-se apenas da CLI do gerenciador de plug-ins.
A instalação de plug-ins personalizados pré-construídos pode ser realizada copiando o arquivo HPI do plug-in em /usr/share/jenkins/ref/plugins/
dentro do Dockerfile
:
COPY --chown=jenkins:jenkins path/to/custom.hpi /usr/share/jenkins/ref/plugins/
Você pode executar a CLI manualmente no Dockerfile:
DE jenkins/jenkins:lts-jdk17RUN jenkins-plugin-cli --plugins pipeline-model-definition github-branch-source:1.8
Além disso é possível passar um arquivo que contenha este conjunto de plugins (com ou sem quebras de linha).
DE jenkins/jenkins:lts-jdk17COPY --chown=jenkins:jenkins plugins.txt /usr/share/jenkins/ref/plugins.txtEXECUTAR jenkins-plugin-cli -f /usr/share/jenkins/ref/plugins.txt
Quando o contêiner jenkins for iniciado, ele verificará se JENKINS_HOME
tem esse conteúdo de referência e os copiará lá, se necessário. Ele não substituirá esses arquivos, portanto, se você atualizou alguns plug-ins da IU, eles não serão revertidos na próxima inicialização.
Caso você queira substituir, acrescente '.override' ao nome do arquivo de referência. Por exemplo, um arquivo chamado /usr/share/jenkins/ref/config.xml.override
substituirá um arquivo config.xml
existente em JENKINS_HOME.
Veja também JENKINS-24986
Aqui está um exemplo para obter a lista de plugins de um 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/ /:/'
Exemplo de saída:
cucumber-testresult-plugin:0.8.2 pam-auth:1.1 matrix-project:1.4.1 script-security:1.13 ...
Para imagens derivadas de 2.x, você também pode querer
RUN echo 2.0 > /usr/share/jenkins/ref/jenkins.install.UpgradeWizard.state
para indicar que esta instalação do Jenkins está totalmente configurada. Caso contrário, aparecerá um banner solicitando que o usuário instale plug-ins adicionais, o que pode ser inapropriado.
Para ativar os logs de acesso do usuário Jenkins do diretório inicial do Jenkins dentro de um contêiner docker, defina o valor da variável de ambiente JENKINS_OPTS
como --accessLoggerClassName=winstone.accesslog.SimpleAccessLogger --simpleAccessLogger.format=combined --simpleAccessLogger.file=/var/jenkins_home/logs/access_log
A convenção de nomenclatura para as tags no Docker Hub segue o formato <repository_name>:<tag>
, onde o nome do repositório é jenkins/jenkins e onde a tag especifica a versão da imagem. No caso do LTS e das versões mais recentes, as tags são lts
e latest
, respectivamente.
Você pode usar essas tags para extrair as imagens Jenkins correspondentes do Docker Hub e executá-las em seu sistema. Por exemplo, para extrair a versão LTS da imagem Jenkins, use este comando: docker pull jenkins/jenkins:lts
Para usar o Docker Compose com Jenkins, você pode definir um arquivo docker-compose.yml incluindo uma instância do Jenkins e quaisquer outros serviços dos quais ele dependa. Por exemplo, o seguinte arquivo docker-compose.yml define um controlador Jenkins e um agente SSH Jenkins:
serviços: jenkins:imagem: jenkins/jenkins:ltsports: - Volumes "8080:8080": - jenkins_home:/var/jenkins_home ssh-agent:imagem: jenkins/ssh-agentvolumes: jenkins_home:
Este arquivo docker-compose.yml
cria dois contêineres: um para Jenkins e outro para o agente SSH Jenkins.
O contêiner Jenkins é baseado na imagem jenkins/jenkins:lts
e expõe a interface da web Jenkins na porta 8080. O volume jenkins_home
é um volume nomeado criado e gerenciado pelo Docker.
Ele é montado em /var/jenkins_home
no contêiner Jenkins e persistirá a configuração e os dados do Jenkins.
O contêiner ssh-agent é baseado na imagem jenkins/ssh-agent
e executa um servidor SSH para executar o Jenkins SSH Build Agent.
Para iniciar a instância do Jenkins e os outros serviços definidos no arquivo docker-compose.yml
, execute docker compose up -d
.
Isso extrairá as imagens necessárias do Docker Hub, caso ainda não estejam presentes em seu sistema, e iniciará os serviços em segundo plano.
Você pode então acessar a interface web do Jenkins em http://localhost:8080
no seu sistema host para configurar e gerenciar sua instância do Jenkins (onde localhost
aponta para a porta publicada pelo seu Docker Engine).
NOTA: leia a seção Configuração de DNS caso veja a mensagem "Esta instância do Jenkins parece estar offline". Nesse caso, adicione a configuração do DNS ao yaml:
serviços: jenkins:# ... outras configurações: - 1.1.1.1 - 8.8.8.8# ... outra configuração
A ferramenta plugin-installation-manager-tool suporta a atualização do arquivo do plugin para você.
Comando de exemplo:
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 plugins2.txt plugins.txt
Todos os dados necessários estão no diretório /var/jenkins_home - portanto, dependendo de como você gerencia isso - depende de como você atualiza. Geralmente - você pode copiá-lo - e então "docker pull" a imagem novamente - e você terá o LTS mais recente - você pode então iniciar com -v apontando para esses dados (/var/jenkins_home) e tudo ficará como você deixei.
Como sempre - certifique-se de saber como controlar o docker - especialmente o manuseio de volumes!
Se você montar o diretório inicial do Jenkins em um volume chamado Docker, a atualização consistirá em docker pull
e nada mais.
Recomendamos o uso docker compose
, especialmente nos casos em que o usuário também está executando um contêiner nginx/apache paralelo como proxy reverso para o contêiner Jenkins.
Por padrão, os plug-ins serão atualizados se não tiverem sido atualizados manualmente e se a versão da imagem do Docker for mais recente que a versão no contêiner. As versões instaladas pela imagem do Docker são rastreadas por meio de um arquivo marcador.
Para forçar atualizações de plug-ins que foram atualizados manualmente, execute a imagem do docker com -e PLUGINS_FORCE_UPGRADE=true
.
O comportamento padrão ao atualizar de uma imagem docker que não gravou arquivos marcadores é deixar os plug-ins existentes no lugar. Se você deseja atualizar plug-ins existentes sem marcador, você pode executar a imagem do docker com -e TRY_UPGRADE_IF_NO_MARKER=true
. Em seguida, os plug-ins serão atualizados se a versão fornecida pela imagem do docker for mais recente.
Se você deseja contribuir com correções para este repositório, consulte a documentação dedicada.
Para obter informações relacionadas à segurança desta imagem Docker, consulte a documentação dedicada.
Estamos no Gitter, https://gitter.im/jenkinsci/docker