Existuje mnoho článků o Habrém o Jenkinsovi, ale jen málo z nich popisuje příklady toho, jak Jenkins a docker agenti pracují. Všechny oblíbené nástroje pro vytváření projektů jako
Dnes existuje řešení problému: Jenkins 2 je skvělý v práci
Proč jsem tento problém začal řešit?
Protože jsme ve společnosti
- velké množství běhového prostředí, které vývojáři zapomínají vyčistit;
- existují konflikty mezi různými verzemi stejných runtime;
- Každý vývojář potřebuje jinou sadu komponent.
Existují další problémy, ale dovolte mi, abych vám řekl o řešení.
Jenkins v Dockeru
Vzhledem k tomu, že Docker je nyní ve vývojovém světě dobře zaveden, lze pomocí Dockeru spustit téměř cokoliv. Mým řešením je mít Jenkinse v Dockeru a mít možnost spouštět další kontejnery Dockeru. Tato otázka se začala klást již v roce 2013 v článku „
Zkrátka stačí nainstalovat samotný Docker do funkčního kontejneru a soubor připojit /var/run/docker.sock
.
Zde je příklad Dockerfile, který se ukázal pro Jenkinse.
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 jsme tedy kontejner Docker, který může spouštět příkazy Docker na hostitelském počítači.
Sestavit nastavení
Před nedávnem dostal Jenkins příležitost popsat jeho pravidla pomocí
Vložme tedy do samotného úložiště speciální Dockerfile, který bude obsahovat všechny knihovny nutné pro sestavení. Vývojář si tak může sám připravit opakovatelné prostředí a nebude muset žádat OPS o instalaci konkrétní verze Node.JS na hostitele.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Tento obrázek sestavení je vhodný pro většinu aplikací Node.JS. Co když například potřebujete obrázek pro projekt JVM s integrovaným skenerem Sonar? Můžete si svobodně vybrat komponenty, které potřebujete pro 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/
Popsali jsme prostředí montáže, ale co s tím má společného Jenkins? A agenti Jenkins mohou s takovými obrazy Docker pracovat a vytvářet je interně.
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"
}
}
Směrnice agent
používá majetek docker
kde můžete specifikovat:
- název kontejneru sestavy podle vaší zásady pojmenování;
- argumenty potřebné pro spuštění kontejneru sestavení, kde v našem případě připojíme aktuální adresář jako adresář uvnitř kontejneru.
A již v krocích sestavení uvádíme, které příkazy se mají provést v agentovi sestavení Docker. To může být cokoliv, takže také spouštím nasazení aplikací pomocí ansible.
Níže chci ukázat obecný Jenkinsfile, který může sestavit jednoduchá aplikace 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()
}
}
}
Co se stalo?
Díky této metodě jsme vyřešili následující problémy:
- doba konfigurace montáže prostředí je snížena na 10 - 15 minut na projekt;
- zcela opakovatelné prostředí pro sestavení aplikace, protože jej můžete takto sestavit na svém místním počítači;
- nejsou žádné problémy s konflikty mezi různými verzemi montážních nástrojů;
- vždy čistý pracovní prostor, který se neucpává.
Samotné řešení je jednoduché a zřejmé a umožňuje vám získat některé výhody. Ano, vstupní práh se ve srovnání s jednoduchými příkazy pro sestavy trochu zvedl, ale nyní je zaručeno, že se bude stavět vždy a samotný vývojář si může vybrat vše, co je pro jeho proces sestavení nezbytné.
Můžete také použít obrázek, který jsem shromáždil
Při psaní tohoto článku vznikla diskuse o použití agentů na vzdálených serverech, aby nedošlo k načtení hlavního uzlu pomocí pluginu
Zdroj: www.habr.com