
Në Habrë ka shumë artikuj për Jenkins, por pak vende e përshkruajnë një shembull të punës me Jenkins dhe agentët Docker. Të gjitha mjetet e njohura të ndërtimit të projekteve si , , , dhe të tjerë, mund të mbledhin gjithçka në kontejnerë. Por si është më me Jenkins?
Sot ka një zgjidhje për këtë problem: Jenkins 2 punon mrekullisht me . Në këtë artikull do të ndaj përvojën time dhe do të tregoj se si mund ta bëni këtë vetë.
Përse u angazhova në zgjidhjen e këtij problemi?
Duke qenë se ne në kompaninë përdorim shumë teknologji të ndryshme, makina e ndërtimit duhet të mbajë versione të ndryshme të Node.JS, Gradle, Ruby, JDK dhe të tjerave. Por shpeshherë nuk mund të shmangen konfliktet e versioneve. Po, do të keni të drejtë nëse thoni se ka menaxherë të ndryshëm versioni si nvm, rvm, por nuk është gjithçka kaq e lehtë me ta dhe këto zgjidhje kanë probleme:
- volumi i madh i runtime që zhvilluesit harrojnë të pastrojnë;
- ka konflikte mes versioneve të ndryshme të të njëjtëve runtime;
- çdo zhvillues ka nevojë për një set të ndryshëm komponentesh.
Ka edhe probleme të tjera, por le të flas më mirë për zgjidhjen.
Jenkins në Docker
Meqenëse tani Docker është thellësisht i pranishëm në fushën e zhvillimit, pothuajse gjithçka mund të nisë me Docker. Zgjidhja ime është që Jenkins të jetë në Docker dhe të mund të ekzekutojë kontejnerë të tjerë Docker. Ky pyetje filloi të diskutohej që në vitin 2013 në artikullin "«.
Nëse përmbledhim, është absolutisht e nevojshme të vendosni Docker në një kontejner aktiv dhe të montoni skedarin /var/run/docker.sock.
Ja një shembull Dockerfile që kemi krijuar 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 jenkinsKështu morëm një kontejner Docker që mund të ekzekutojë komandat Docker në makinën host.
Konfigurimi i ndërtimit
Më së fundmi, Jenkins fitoi mundësinë të përshkruajë rregullat e tij përmes sintaksit, që lejon të ndryshohet mjaft thjeshtë skema e ndërtimit dhe ta ruajmë atë në repositor.
Pra, le të vendosim në vetë repositorin një Dockerfile të veçantë, që do të përmbajë të gjitha bibliotekat e nevojshme për ndërtim. Kështu, zhvilluesi mund të përgatisë një ambient të përsëritshëm dhe nuk do t'i duhet të kërkojë OPS-it të vendosë një version të caktuar të Node.JS në host.
FROM node:12.10.0-alpine
RUN npm install yarn -gKy imazh ndërtimi është i përshtatshëm për shumicën e aplikacioneve Node.JS. Dhe nëse, për shembull, ju nevojitet një imazh për një projekt JVM me një skaner Sonar të përfshirë brenda? Ju jeni të lirë të zgjidhni komponentët e nevojshëm për ndërtim.
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 kemi përshkruar ambientin e ndërtimit, por çfarë ka lidhje me Jenkins? Agjentët e Jenkins janë në gjendje të punojnë me imazhe të tilla Docker dhe të kryejnë ndërtimin brenda.
stage("Ndërtimi i projektit") {
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 agjent përdor pronën docker, ku mund të tregoni:
- emrin e konteinerit të ndërtimit sipas politikës suaj të emërtimit;
- argumentet e nevojshme për të nisur konteinerin e ndërtimit, ku në rastin tonë ne po montojmë drejtorinë aktuale si një direktori brenda konteinerit.
Dhe në hapat e ndërtimit ne tregojmë se cilat komanda të ekzekutohen brenda agjentit Docker të ndërtimit. Kjo mund të jetë çfarëdo, kështu që unë gjithashtu aktivizoj shpërndarjen e aplikacioneve nëpërmjet ansibl.
Më poshtë dëshiroj të tregoj një Jenkinsfile të përgjithshëm, i cili mund të ndihmojë për të ndërtuar një aplikacion të 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()
}
}
}Çfarë bëri ky proces?
Falë këtij procesi ne zgjidhen problemet e mëposhtme:
- koha e konfigurimit të ambientit të ndërtimit është reduktuar në 10 - 15 minuta për projekt;
- një ambient ndërtimi plotësisht i ripërsëritshëm i aplikacionit, pasi mund të ndërtosh edhe në kompjuterin lokal;
- nuk ka probleme me konflikte të versioneve të ndryshme të mjeteve të ndërtimit;
- përherë një ambient të pastër pune që nuk mbushet.
Zgjidhja është e thjeshtë dhe e qartë dhe ofron përfitime të shumta. Po, pragun e hyrjes e rriti paksa në krahasim me komandat e thjeshta për ndërtimet, por tani ka garanci se gjithmonë do të ndërtohet dhe zhvilluesi vetë mund të zgjedhë gjithçka që i nevojitet për procesin e tij të ndërtimit.
Po ashtu mund të shfrytëzoni imazhin e ndërtuar nga unë. . Të gjithë burimet janë të hapura dhe ndodhen në .
Gjatë shkruarjes së artikullit, u zhvillua një diskutim mbi përdorimin e agenëve në serverë të distancuar, për të mos ngarkuar nodën kryesore me anë të plugin-it . Por për këtë do të flas në të ardhmen.
Burimi: habr.com
