Hai moitos artigos sobre Habré sobre Jenkins, pero poucos describen exemplos de como funcionan Jenkins e os axentes docker. Todas as ferramentas populares de construción de proxectos como
Hoxe hai unha solución ao problema: Jenkins 2 é excelente para traballar
Por que comecei a resolver este problema?
Xa que estamos en compañía
- unha gran cantidade de tempo de execución que os desenvolvedores esquecen limpar;
- hai conflitos entre diferentes versións dos mesmos tempos de execución;
- Cada programador necesita un conxunto diferente de compoñentes.
Hai outros problemas, pero déixeme falar da solución.
Jenkins en Docker
Dado que Docker está agora ben establecido no mundo do desenvolvemento, case calquera cousa pódese executar usando Docker. A miña solución é ter Jenkins en Docker e poder executar outros contedores Docker. Esta pregunta comezou a facerse en 2013 no artigo "
En resumo, só precisa instalar o propio Docker nun contedor que funcione e montar o ficheiro /var/run/docker.sock
.
Aquí tes un exemplo de Dockerfile que resultou para Jenkins.
FROM jenkins/jenkins:lts
USER root
RUN apt-get update &&
apt-get -y install apt-transport-https
ca-certificates
curl
gnupg2
git
software-properties-common &&
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey &&
add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")
$(lsb_release -cs)
stable" &&
apt-get update &&
apt-get -y install docker-ce &&
usermod -aG docker jenkins
RUN curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
RUN apt-get clean autoclean && apt-get autoremove —yes && rm -rf /var/lib/{apt,dpkg,cache,log}/
USER jenkins
Así, temos un contedor Docker que pode executar comandos Docker na máquina host.
Configuración de compilación
Non hai moito Jenkins tivo a oportunidade de describir as súas regras usando
Entón, imos poñer un Dockerfile especial no propio repositorio, que conterá todas as bibliotecas necesarias para a compilación. Deste xeito, o propio desenvolvedor pode preparar un ambiente repetible e non terá que pedirlle a OPS que instale unha versión específica de Node.JS no host.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Esta imaxe de compilación é adecuada para a maioría das aplicacións Node.JS. E se, por exemplo, necesitas unha imaxe para un proxecto JVM cun escáner Sonar incluído no seu interior? Vostede é libre de escoller os compoñentes que precisa para a montaxe.
FROM adoptopenjdk/openjdk12:latest
RUN apt update
&& apt install -y
bash unzip wget
RUN mkdir -p /usr/local/sonarscanner
&& cd /usr/local/sonarscanner
&& wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.3.0.1492-linux.zip
&& unzip sonar-scanner-cli-3.3.0.1492-linux.zip
&& mv sonar-scanner-3.3.0.1492-linux/* ./
&& rm sonar-scanner-cli-3.3.0.1492-linux.zip
&& rm -rf sonar-scanner-3.3.0.1492-linux
&& ln -s /usr/local/sonarscanner/bin/sonar-scanner /usr/local/bin/sonar-scanner
ENV PATH $PATH:/usr/local/sonarscanner/bin/
ENV SONAR_RUNNER_HOME /usr/local/sonarscanner/bin/
Describimos o ambiente de montaxe, pero que ten que ver Jenkins con el? E os axentes de Jenkins poden traballar con tales imaxes de Docker e crealas internamente.
stage("Build project") {
agent {
docker {
image "project-build:${DOCKER_IMAGE_BRANCH}"
args "-v ${PWD}:/usr/src/app -w /usr/src/app"
reuseNode true
label "build-image"
}
}
steps {
sh "yarn"
sh "yarn build"
}
}
Directiva agent
utiliza a propiedade docker
onde podes especificar:
- o nome do contedor de montaxe segundo a súa política de nomenclatura;
- argumentos necesarios para executar o contenedor de compilación, onde no noso caso montamos o directorio actual como un directorio dentro do contenedor.
E xa nos pasos de compilación indicamos que comandos executar dentro do axente de compilación Docker. Isto pode ser calquera cousa, polo que tamén lanzo a implementación de aplicacións usando ansible.
A continuación quero mostrar un ficheiro Jenkins xenérico que pode construír unha aplicación simple Node.JS.
def DOCKER_IMAGE_BRANCH = ""
def GIT_COMMIT_HASH = ""
pipeline {
options {
buildDiscarder(
logRotator(
artifactDaysToKeepStr: "",
artifactNumToKeepStr: "",
daysToKeepStr: "",
numToKeepStr: "10"
)
)
disableConcurrentBuilds()
}
agent any
stages {
stage("Prepare build image") {
steps {
sh "docker build -f Dockerfile.build . -t project-build:${DOCKER_IMAGE_BRANCH}"
}
}
stage("Build project") {
agent {
docker {
image "project-build:${DOCKER_IMAGE_BRANCH}"
args "-v ${PWD}:/usr/src/app -w /usr/src/app"
reuseNode true
label "build-image"
}
}
steps {
sh "yarn"
sh "yarn build"
}
}
post {
always {
step([$class: "WsCleanup"])
cleanWs()
}
}
}
Que pasou?
Grazas a este método, resolvemos os seguintes problemas:
- o tempo de configuración da montaxe do ambiente redúcese a 10 - 15 minutos por proxecto;
- un entorno de compilación de aplicacións completamente repetible, xa que podes crealo deste xeito no teu ordenador local;
- non hai problemas con conflitos entre diferentes versións de ferramentas de montaxe;
- sempre un espazo de traballo limpo que non se atasca.
A solución en si é sinxela e obvia e permítelle obter algunhas vantaxes. Si, o limiar de entrada aumentou un pouco en comparación cos comandos simples para as montaxes, pero agora hai a garantía de que sempre se construirá e o propio desenvolvedor pode escoller todo o que sexa necesario para o seu proceso de construción.
Tamén podes usar a imaxe que recollín
Ao escribir este artigo, xurdiu unha discusión sobre o uso de axentes en servidores remotos para non cargar o nodo mestre usando un complemento
Fonte: www.habr.com