
Habr'is on palju artikleid Jenkinsist, kuid vähe kuskil kirjeldatakse Jenkins ja Docker agentide töö näidet. Kõik populaarsed projektide kogumise tööriistad nagu , , , ja teised, saavad kõik koguda konteinerites. Aga kuidas on Jenkinsiga?
Tänaseks on probleemile lahendus: Jenkins 2 oskab suurepäraselt töötada . Artiklis tahan jagada oma kogemusi ja näidata, kuidas saate seda ise teha.
Miks ma hakkasin selle probleemi lahendamisega tegelema?
Kuna me ettevõttes kasutame mitmeid erinevaid tehnoloogiaid, peab kogumise masinas olema erinevad Node.JS, Gradle, Ruby, JDK ja teiste versioonid. Kuid sageli ei ole versioonide kokkusattumine vältimatu. Jah, teete õigesti, kui ütlete, et on olemas erinevad versioonihaldurid nagu nvm, rvm, kuid kõik ei ole seal nii sujuv ja nende lahendustega on probleeme:
- suur hulk runtime'e, mida arendajad unustavad puhastada;
- on konflikte erinevate versioonide vahel samade runtime'ide seas;
- igal arendajal on vaja erinevat komplekti komponente.
On ka muid probleeme, aga las ma räägin pigem lahendusest.
Jenkins Docker'is
Kuna Docker on juba kindlalt juurdunud arendusvaldkonnas, siis saab peaaegu kõike käivitada Dockeriga. Minu lahendus on see, et Jenkins oleks Dockeris ja suudaks käivitada teisi Docker konteinerite. Seda küsimust hakati arutama juba 2013. aastal artiklis ««.
Kokkuvõttes on tõeliselt hädavajalik, et töökonteinerisse oleks paigaldatud Docker ja et fail oleks monteeritud /var/run/docker.sock.
Siin on näide Dockerfile'ist, mis saadi Jenkinsel.
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 jenkinsNii saime Docker konteineri, mis suudab käivitada Docker käsklusi hostmasinas.
Kogumisseade
Hiljuti sai Jenkins võimaluse kirjeldada oma reegleid süntaks, mis võimaldab piisavalt lihtsalt vahetada kogumise skripti ja hoida seda repozitooriumis.
Nii et paneme repozitooriumi spetsiaalse Dockerfile'i, mis sisaldab kõiki vajalikke kogumise raamatukogusid. Nii saab arendaja ette valmistada korduva keskkonna ja ei pea opsilt paluma, et nad paigaldaksid serverisse teatud versiooni Node.JS-i.
FROM node:12.10.0-alpine
RUN npm install yarn -gSelline kogumise pilt sobib enamikule Node.JS rakendustele. Ja kui teil on näiteks vaja pilti JVM projekti jaoks, mis sisaldab endas Sonar skannerit? Teise valimise osas olete vabalt valitud vajalikke komponente.
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/
Oleme kirjeldanud kogumise keskkonda, kuid kuidas see Jenkinsiga seondub? Jenkinsi agentide oskus töötada selliste Docker-piltidega ja teostada kogumist sees.
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"
}
}Direktiiv agent kasutab omadust docker, kus saate määrata:
- kogumise konteineri nimi vastavalt teie nimede poliitikale;
- argumendid, mis on vajalikud kogumise konteineri käivitamiseks, kus meie juhul me montime praeguse kausta konteineri sees olevaks kaustaks.
Ja kogumise etappides määrame, milliseid käske teostada kogumise Docker agendi sees. See võib olla mis tahes, seega käivitan ka rakenduste juurutamise ansible'i abil.
Allpool tahan näidata üldist Jenkinsfile'i, mis võib koguda lihtsa Node.JS rakenduse.
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()
}
}
}Mis on tulemus?
Sellise meetodi abil lahendasime järgmised probleemid:
- projektide konfigureerimise aeg väheneb 10–15 minutini;
- täiesti reprodutseeritav rakenduse ehituskeskkond, kuna seda saab valmistada ka kohalikul arvutil;
- pole probleeme erinevate ehitustööriistade versioonide konfliktidega;
- alati puhas tööruum, mis ei ole ummistunud.
Lahendus on iseenda jaoks lihtne ja ilmne, pakkudes ainult eeliseid. Jah, sisenemiskünnis on võrreldes lihtsate ehituskäsudega veidi tõusnud, kuid nüüd on tagatud, et ehitus toimub alati ning arendaja saab valida kõik, mis on vajalik tema ehitusprotsessiks.
Samuti võite kasutada minu koostatud pilti . Kõik lähtekoodid on avatud ja asuvad aadressil .
Artikli kirjutamise käigus tekkis arutelu agentide kasutamise üle kaugsüsteemides, et mitte koormata põhinoode plugina abil . Kuid sellest räägin tulevikus.
Allikas: habr.com
