Na Habrém je veľa článkov o Jenkinsovi, ale len málo z nich popisuje príklady toho, ako Jenkins a agenti dockerov fungujú. Všetky populárne nástroje na vytváranie projektov, ako sú
Dnes existuje riešenie problému: Jenkins 2 je skvelý v práci
Prečo som začal tento problém riešiť?
Keďže sme v spoločnosti
- veľké množstvo runtime, ktoré vývojári zabúdajú vyčistiť;
- existujú konflikty medzi rôznymi verziami rovnakých runtime;
- Každý vývojár potrebuje inú sadu komponentov.
Existujú aj iné problémy, ale dovoľte mi povedať vám o riešení.
Jenkins v Dockeri
Keďže Docker je teraz vo vývojovom svete dobre zavedený, pomocou Dockera je možné spustiť takmer čokoľvek. Mojím riešením je mať Jenkinsa v Dockeri a môcť spúšťať iné kontajnery Docker. Táto otázka sa začala klásť už v roku 2013 v článku „
Stručne povedané, stačí nainštalovať samotný Docker do funkčného kontajnera a pripojiť súbor /var/run/docker.sock
.
Tu je príklad Dockerfile, ktorý sa ukázal pre 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
Získali sme teda kontajner Docker, ktorý môže vykonávať príkazy Docker na hostiteľskom počítači.
Zostavte nastavenie
Nedávno dostal Jenkins príležitosť opísať jeho pravidlá pomocou
Dajme teda do samotného úložiska špeciálny Dockerfile, ktorý bude obsahovať všetky knižnice potrebné na zostavenie. Takto môže samotný vývojár pripraviť opakovateľné prostredie a nebude musieť žiadať OPS o inštaláciu konkrétnej verzie Node.JS na hostiteľa.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Tento obrázok zostavy je vhodný pre väčšinu aplikácií Node.JS. Čo ak napríklad potrebujete obrázok pre projekt JVM s integrovaným skenerom Sonar? Môžete si slobodne vybrať komponenty, ktoré potrebujete na montáž.
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/
Opísali sme prostredie montáže, ale čo s tým má spoločné Jenkins? A agenti Jenkins môžu s takýmito obrázkami Docker pracovať a vytvárať ich interne.
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"
}
}
smernice agent
užíva majetok docker
kde môžete špecifikovať:
- názov montážneho kontajnera podľa vašej politiky pomenovania;
- argumenty potrebné na spustenie kontajnera na zostavenie, kde v našom prípade pripojíme aktuálny adresár ako adresár vnútri kontajnera.
A už v krokoch zostavenia uvádzame, ktoré príkazy sa majú vykonať vo vnútri zostavovacieho agenta Docker. Môže to byť čokoľvek, takže spúšťam nasadzovanie aplikácií aj pomocou ansible.
Nižšie chcem ukázať generický Jenkinsfile, ktorý dokáže vytvoriť jednoduchá aplikácia 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()
}
}
}
Čo sa stalo?
Vďaka tejto metóde sme vyriešili nasledujúce problémy:
- čas konfigurácie montáže prostredia je skrátený na 10 - 15 minút na projekt;
- úplne opakovateľné prostredie na zostavovanie aplikácií, keďže si ho môžete takto zostaviť na svojom lokálnom počítači;
- nie sú žiadne problémy s konfliktmi medzi rôznymi verziami montážnych nástrojov;
- vždy čistý pracovný priestor, ktorý sa neupcháva.
Samotné riešenie je jednoduché a zrejmé a umožňuje vám získať určité výhody. Áno, vstupný prah sa v porovnaní s jednoduchými príkazmi pre zostavy trochu zvýšil, ale teraz je zaručené, že sa vždy zostaví a samotný vývojár si môže vybrať všetko, čo je potrebné pre jeho proces zostavovania.
Môžete tiež použiť obrázok, ktorý som zhromaždil
Pri písaní tohto článku vznikla diskusia o používaní agentov na vzdialených serveroch, aby sa nenačítal hlavný uzol pomocou pluginu
Zdroj: hab.com