Ka shumë artikuj në Habré rreth Jenkins, por pak përshkruajnë shembuj se si funksionojnë Jenkins dhe agjentët docker. Të gjitha mjetet e njohura të ndërtimit të projekteve si
Sot ka një zgjidhje për problemin: Jenkins 2 është i shkëlqyeshëm për të punuar me të
Pse fillova ta zgjidh këtë problem?
Meqenëse jemi në shoqëri
- një sasi e madhe kohëzgjatjeje që zhvilluesit harrojnë ta pastrojnë;
- ka konflikte midis versioneve të ndryshme të të njëjtave kohëzgjatje;
- Çdo zhvillues ka nevojë për një grup të ndryshëm komponentësh.
Ka probleme të tjera, por më lejoni t'ju tregoj për zgjidhjen.
Jenkins në Docker
Meqenëse Docker tani është i vendosur mirë në botën e zhvillimit, pothuajse çdo gjë mund të ekzekutohet duke përdorur Docker. Zgjidhja ime është të kem Jenkins në Docker dhe të jem në gjendje të drejtoj kontejnerë të tjerë Docker. Kjo pyetje filloi të bëhet në vitin 2013 në artikullin "
Me pak fjalë, ju vetëm duhet të instaloni vetë Docker në një enë pune dhe të montoni skedarin /var/run/docker.sock
.
Këtu është një shembull Dockerfile që doli për Jenkins.
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
Kështu, ne morëm një enë Docker që mund të ekzekutojë komandat Docker në makinën pritës.
Ndërtimi i konfigurimit
Jo shumë kohë më parë Jenkins mori mundësinë për të përshkruar rregullat e saj duke përdorur
Pra, le të vendosim një Dockerfile të veçantë në vetë depo, e cila do të përmbajë të gjitha bibliotekat e nevojshme për ndërtimin. Në këtë mënyrë, vetë zhvilluesi mund të përgatisë një mjedis të përsëritshëm dhe nuk do të duhet të kërkojë nga OPS të instalojë një version specifik të Node.JS në host.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Ky imazh ndërtimi është i përshtatshëm për shumicën e aplikacioneve Node.JS. Po sikur, për shembull, t'ju duhet një imazh për një projekt JVM me një skaner Sonar të përfshirë brenda? Ju jeni të lirë të zgjidhni komponentët që ju nevojiten për montim.
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/
Ne përshkruam mjedisin e montimit, por çfarë lidhje ka Jenkins me të? Dhe agjentët e Jenkins mund të punojnë me imazhe të tilla Docker dhe t'i ndërtojnë ato brenda.
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
përdor pronë docker
ku mund të specifikoni:
- emrin e kontejnerit të montimit sipas politikës suaj të emërtimit;
- argumentet e nevojshme për të ekzekutuar kontejnerin e ndërtimit, ku në rastin tonë ne montojmë direktoriumin aktual si një direktori brenda kontejnerit.
Dhe tashmë në hapat e ndërtimit ne tregojmë se cilat komanda duhet të ekzekutohen brenda agjentit të ndërtimit të Docker. Kjo mund të jetë çdo gjë, kështu që unë gjithashtu nis vendosjen e aplikacionit duke përdorur ansible.
Më poshtë dua të tregoj një Jenkinsfile gjenerike që mund të ndërtojë një aplikacion i thjeshtë 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()
}
}
}
Cfare ndodhi?
Falë kësaj metode, ne zgjidhëm problemet e mëposhtme:
- koha e konfigurimit të montimit të mjedisit reduktohet në 10 - 15 minuta për projekt;
- një mjedis ndërtimi aplikacioni plotësisht të përsëritshëm, pasi mund ta ndërtoni në këtë mënyrë në kompjuterin tuaj lokal;
- nuk ka probleme me konflikte midis versioneve të ndryshme të mjeteve të montimit;
- gjithmonë një hapësirë pune e pastër që nuk bllokohet.
Zgjidhja në vetvete është e thjeshtë dhe e dukshme dhe ju lejon të merrni disa avantazhe. Po, pragu i hyrjes është rritur pak në krahasim me komandat e thjeshta për asambletë, por tani ekziston një garanci që do të ndërtohet gjithmonë dhe vetë zhvilluesi mund të zgjedhë gjithçka që është e nevojshme për procesin e tij të ndërtimit.
Ju gjithashtu mund të përdorni imazhin që kam mbledhur
Gjatë shkrimit të këtij artikulli, u ngrit një diskutim rreth përdorimit të agjentëve në serverët e largët në mënyrë që të mos ngarkohet nyja kryesore duke përdorur një shtojcë
Burimi: www.habr.com