Ci hè parechje articuli nantu à Habré nantu à Jenkins, ma pocu descrizanu esempi di cumu travaglianu Jenkins è l'agenti docker. Tutti i prughjetti pupulari di custruì strumenti cum'è
Oghje ci hè una suluzione à u prublema: Jenkins 2 hè grande à travaglià
Perchè aghju cuminciatu à risolve stu prublema?
Siccomu simu in cumpagnia
- una grande quantità di runtime chì i sviluppatori si scurdanu di pulisce;
- ci sò cunflitti trà e diverse versioni di i stessi runtimes;
- Ogni sviluppatore hà bisognu di un settore diversu di cumpunenti.
Ci sò altri prublemi, ma lasciami dì di a suluzione.
Jenkins in Docker
Siccomu Docker hè avà ben stabilitu in u mondu di sviluppu, quasi tuttu pò esse gestitu cù Docker. A mo suluzione hè di avè Jenkins in Docker è esse capace di eseguisce altri cuntenituri Docker. Sta quistione hà cuminciatu à esse dumandata in u 2013 in l'articulu "
In breve, basta à stallà Docker stessu in un containeru di travagliu è muntate u schedariu /var/run/docker.sock
.
Eccu un esempiu di Dockerfile chì hè statu per 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
Cusì, avemu un containeru Docker chì pò eseguisce cumandamenti Docker nantu à a macchina host.
Custruisce a stallazione
Pocu tempu, Jenkins hà avutu l'uppurtunità di discrive e so regule utilizendu
Allora mettemu un Dockerfile speciale in u repositoriu stessu, chì cuntene tutte e librerie necessarie per a custruzione. Questu modu, u sviluppatore stessu pò preparà un ambiente ripetibile è ùn duverà micca dumandà à OPS per installà una versione specifica di Node.JS nantu à l'ospiti.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Questa immagine di custruzzione hè adattata per a maiò parte di l'applicazioni Node.JS. E se, per esempiu, avete bisognu di una maghjina per un prughjettu JVM cù un scanner Sonar inclusu in l'internu? Sò liberi di sceglie i cumpunenti chì avete bisognu per l'assemblea.
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/
Avemu discrittu l'ambienti di l'assemblea, ma chì Jenkins hà da fà cun questu? È l'agenti di Jenkins ponu travaglià cù tali imagine Docker è custruiscenu 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"
}
}
Direttiva agent
usa a pruprietà docker
induve pudete specificà:
- u nome di u containeru di l'assemblea secondu a vostra pulitica di nomenclatura;
- argumenti necessarii per eseguisce u containeru di custruzzione, induve in u nostru casu muntemu u cartulare attuale cum'è un repertoriu in u containeru.
E digià in i passi di custruzzione indichemu quali cumandamenti da eseguisce in l'agente di creazione Docker. Questu pò esse qualcosa, cusì lanciau ancu a implementazione di l'applicazioni cù ansible.
Sottu vogliu mustrà un Jenkinsfile genericu chì una semplice applicazione Node.JS pò custruisce.
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()
}
}
}
Chi hè successu?
Grazie à stu metudu, avemu risoltu i seguenti prublemi:
- u tempu di cunfigurazione di l'assemblea di l'ambiente hè ridutta à 10 - 15 minuti per prughjettu;
- un ambiente di creazione di applicazioni cumpletamente ripetibili, postu chì pudete custruisce cusì nantu à u vostru urdinatore locale;
- ùn ci sò micca prublemi cù cunflitti trà e diverse versioni di strumenti di assemblea;
- sempre un spaziu di travagliu pulitu chì ùn hè micca intasatu.
A suluzione stessu hè simplice è ovvia è permette di ottene qualchi vantaghji. Iè, u sogliu di entrata hè cresciutu un pocu cumparatu cù cumandamenti simplici per assemblee, ma avà ci hè una guaranzia chì serà sempre custruitu è u sviluppatore stessu pò sceglie tuttu ciò chì hè necessariu per u so prucessu di custruzzione.
Pudete ancu aduprà l'imaghjini chì aghju cullatu
Mentre scrive stu articulu, hè stata una discussione nantu à l'usu di l'agenti nantu à i servitori remoti per ùn carricà u nodu maestru cù un plugin.
Source: www.habr.com