Na Habréu postoji mnogo članaka o Jenkinsu, ali nekoliko opisuje primjere kako funkcioniraju Jenkins i docker agenti. Svi popularni alati za izradu projekata kao što su
Danas postoji rješenje za problem: Jenkins 2 je odličan u radu
Zašto sam počeo da rešavam ovaj problem?
Pošto smo u društvu
- velika količina vremena izvođenja koje programeri zaboravljaju očistiti;
- postoje sukobi između različitih verzija istog vremena izvođenja;
- Svaki programer treba drugačiji skup komponenti.
Ima i drugih problema, ali dozvolite mi da vam kažem nešto o rješenju.
Jenkins u Dockeru
Pošto je Docker sada dobro uspostavljen u svijetu razvoja, gotovo sve se može pokrenuti pomoću Dockera. Moje rješenje je imati Jenkinsa u Dockeru i moći pokrenuti druge Docker kontejnere. Ovo pitanje počelo se postavljati još 2013. godine u članku “
Ukratko, samo trebate instalirati sam Docker u radni kontejner i montirati datoteku /var/run/docker.sock
.
Evo primjera Dockerfile-a koji je ispao za Jenkinsa.
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
Tako smo dobili Docker kontejner koji može izvršavati Docker komande na host mašini.
Build setup
Ne tako davno Jenkins je dobio priliku da opiše svoja pravila koristeći
Dakle, stavimo poseban Dockerfile u samo spremište, koji će sadržavati sve biblioteke potrebne za izgradnju. Na ovaj način, sam programer može pripremiti ponovljivo okruženje i neće morati tražiti od OPS-a da instalira određenu verziju Node.JS-a na hostu.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Ova build slika je pogodna za većinu Node.JS aplikacija. Što ako vam je, na primjer, potrebna slika za JVM projekt s uključenim Sonar skenerom? Slobodno birate komponente koje su vam potrebne za montažu.
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/
Opisali smo okruženje za sklapanje, ali kakve veze Dženkins ima s tim? A agenti Jenkinsa mogu raditi s takvim Docker slikama i interno ih izgraditi.
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"
}
}
Direktiva agent
koristi imovinu docker
gdje možete odrediti:
- naziv kontejnera za sklapanje prema vašoj politici imenovanja;
- argumente potrebne za pokretanje kontejnera za izgradnju, gdje u našem slučaju montiramo trenutni direktorij kao direktorij unutar kontejnera.
I već u koracima izgradnje ukazujemo koje naredbe treba izvršiti unutar Docker agenta za izgradnju. Ovo može biti bilo šta, tako da pokrećem i implementaciju aplikacije koristeći ansible.
U nastavku želim pokazati generički Jenkinsfile koji može napraviti jednostavna Node.JS aplikacija.
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()
}
}
}
Šta se desilo?
Zahvaljujući ovoj metodi riješili smo sljedeće probleme:
- vrijeme konfiguracije montaže okruženja je smanjeno na 10 - 15 minuta po projektu;
- potpuno ponovljivo okruženje za pravljenje aplikacija, budući da ga na ovaj način možete izgraditi na svom lokalnom računaru;
- nema problema s sukobima između različitih verzija alata za sklapanje;
- uvijek čist radni prostor koji se ne začepljuje.
Samo rješenje je jednostavno i očigledno i omogućava vam da dobijete neke prednosti. Da, ulazni prag je malo porastao u odnosu na jednostavne komande za sklopove, ali sada postoji garancija da će uvijek biti izgrađen i da sam programer može odabrati sve što je potrebno za njegov proces izgradnje.
Možete koristiti i sliku koju sam prikupio
Tokom pisanja ovog članka, pokrenula se rasprava o korištenju agenata na udaljenim serverima kako se ne bi učitavao glavni čvor pomoću dodatka
izvor: www.habr.com