Na Habréu postoji mnogo članaka o Jenkinsu, ali malo ih opisuje kako Jenkins i dokeri agenti rade. Svi popularni alati za izradu projekata poput
Danas postoji rješenje za problem: Jenkins 2 je odličan za rad
Zašto sam počeo rješavati ovaj problem?
Budući da smo u društvu
- velika količina runtimea koju programeri zaborave očistiti;
- postoje sukobi između različitih verzija istog vremena izvođenja;
- Svaki programer treba drugačiji skup komponenti.
Postoje i drugi problemi, ali reći ću vam rješenje.
Jenkins u Dockeru
Budući da 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 spremnike. Ovo pitanje počelo se postavljati još 2013. godine u članku “
Ukratko, samo trebate instalirati sam Docker u radni spremnik i montirati datoteku /var/run/docker.sock
.
Evo primjera Dockerfilea 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 naredbe na glavnom računalu.
Postavljanje građenja
Nedavno je Jenkins dobio priliku opisati svoja pravila korištenjem
Dakle, stavimo poseban Dockerfile u sam repozitorij, koji će sadržavati sve biblioteke potrebne za izgradnju. Na ovaj način programer sam može pripremiti ponovljivo okruženje i neće morati tražiti od OPS-a da instalira određenu verziju Node.JS na host.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Ova je slika prikladna za većinu Node.JS aplikacija. Što ako vam je, na primjer, potrebna slika za JVM projekt s uključenim sonarnim skenerom? Slobodni ste odabrati 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 sklopa, ali što Jenkins ima s tim? Jenkinsovi agenti mogu raditi s takvim Docker slikama i graditi ih interno.
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 navesti:
- naziv spremnika sklopa prema vašoj politici imenovanja;
- argumente potrebne za pokretanje spremnika za izgradnju, gdje u našem slučaju montiramo trenutni direktorij kao direktorij unutar spremnika.
I već u koracima izgradnje ukazujemo koje naredbe treba izvršiti unutar Docker build agenta. To može biti bilo što, tako da također pokrećem implementaciju aplikacije koristeći ansible.
U nastavku želim pokazati generičku Jenkins datoteku koju može izgraditi 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()
}
}
}
Što se dogodilo?
Zahvaljujući ovoj metodi riješili smo sljedeće probleme:
- vrijeme konfiguracije sklopa okruženja smanjeno je na 10 - 15 minuta po projektu;
- potpuno ponovljivo okruženje za izradu aplikacije, budući da je možete izgraditi na ovaj način na svom lokalnom računalu;
- nema problema sa sukobima između različitih verzija alata za montažu;
- uvijek čist radni prostor koji se ne začepljuje.
Samo rješenje je jednostavno i očito i omogućuje vam da dobijete neke prednosti. Da, ulazni prag je malo porastao u usporedbi s jednostavnim naredbama za sklopove, ali sada postoji jamstvo da će se uvijek graditi i sam programer može odabrati sve što je potrebno za njegov proces izgradnje.
Također možete koristiti sliku koju sam prikupio
Tijekom pisanja ovog članka pojavila se rasprava o korištenju agenata na udaljenim poslužiteljima kako se ne bi učitavao glavni čvor pomoću dodatka
Izvor: www.habr.com