Na Habréju je veliko člankov o Jenkinsu, le malo jih opisuje primere delovanja Jenkinsa in pristaniških agentov. Vsa priljubljena orodja za gradnjo projektov, kot je
Danes obstaja rešitev za problem: Jenkins 2 je odličen za delo
Zakaj sem se lotil reševanja tega problema?
Ker smo v družbi
- veliko časa izvajanja, ki ga razvijalci pozabijo očistiti;
- obstajajo konflikti med različnimi različicami istih izvajalnih časov;
- Vsak razvijalec potrebuje drugačen nabor komponent.
Obstajajo še druge težave, a naj vam povem o rešitvi.
Jenkins v Dockerju
Ker je Docker zdaj dobro uveljavljen v razvojnem svetu, je mogoče z Dockerjem izvajati skoraj vse. Moja rešitev je, da imam Jenkinsa v Dockerju in da lahko poganjam druge vsebnike Docker. To vprašanje se je začelo postavljati že leta 2013 v članku "
Skratka, samo Docker morate namestiti v delujoč vsebnik in namestiti datoteko /var/run/docker.sock
.
Tukaj je primer Dockerfile, ki se je izkazal 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 vsebnik, ki lahko izvaja Docker ukaze na gostiteljskem računalniku.
Nastavitev zgradbe
Nedolgo nazaj je Jenkins dobil priložnost opisati svoja pravila z uporabo
V repozitorij postavimo torej poseben Dockerfile, ki bo vseboval vse knjižnice, potrebne za gradnjo. Na ta način lahko razvijalec sam pripravi ponovljivo okolje in mu ne bo treba zahtevati od OPS-a, da na gostitelja namesti določeno različico Node.JS.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Ta gradbena slika je primerna za večino aplikacij Node.JS. Kaj pa, če na primer potrebujete sliko za projekt JVM z vključenim optičnim bralnikom Sonar? Komponente, ki jih potrebujete za sestavo, lahko prosto izberete.
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 montažno okolje, toda kaj ima Jenkins s tem? In Jenkinsovi agenti lahko delajo s takšnimi slikami Docker in jih sestavijo 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
uporablja lastnino docker
kjer lahko določite:
- ime vsebnika za sestavljanje v skladu z vašo politiko poimenovanja;
- argumenti, potrebni za zagon gradbenega vsebnika, kjer v našem primeru vpnemo trenutni imenik kot imenik znotraj vsebnika.
In že v korakih gradnje navedemo, katere ukaze je treba izvesti znotraj gradbenega agenta Docker. To je lahko karkoli, zato zaženem tudi uvajanje aplikacije z uporabo ansible.
Spodaj želim prikazati generično datoteko Jenkins, ki jo lahko zgradi preprosta aplikacija 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()
}
}
}
Kaj se je zgodilo?
Zahvaljujoč tej metodi smo rešili naslednje težave:
- čas konfiguracije sestave okolja se zmanjša na 10 - 15 minut na projekt;
- popolnoma ponovljivo okolje za gradnjo aplikacije, saj ga lahko na ta način zgradite na vašem lokalnem računalniku;
- ni težav s konflikti med različnimi različicami montažnih orodij;
- vedno čist delovni prostor, ki se ne zamaši.
Sama rešitev je preprosta in očitna ter vam omogoča, da pridobite nekaj prednosti. Da, vstopni prag se je nekoliko zvišal v primerjavi s preprostimi ukazi za sklope, vendar zdaj obstaja jamstvo, da bo vedno zgrajen in razvijalec lahko sam izbere vse, kar je potrebno za njegov gradbeni proces.
Uporabite lahko tudi sliko, ki sem jo zbral
Med pisanjem tega članka se je pojavila razprava o uporabi agentov na oddaljenih strežnikih, da ne bi nalagali glavnega vozlišča z vtičnikom
Vir: www.habr.com