HabrΓ©-da Jenkins haqida ko'plab maqolalar mavjud, ammo Jenkins va doker agentlari qanday ishlashiga misollar kam. Barcha mashhur loyihalarni yaratish vositalari kabi
Bugun muammoning yechimi bor: Jenkins 2 u bilan ishlashda ajoyib
Nega men bu muammoni hal qila boshladim?
Biz kompaniyada bo'lganimiz uchun
- ishlab chiquvchilar tozalashni unutadigan katta hajmdagi ish vaqti;
- bir xil ish vaqtlarining turli versiyalari o'rtasida ziddiyatlar mavjud;
- Har bir ishlab chiquvchiga turli xil komponentlar to'plami kerak.
Boshqa muammolar ham bor, lekin yechimi haqida aytib beraman.
Dockerdagi Jenkins
Docker hozirda rivojlanish dunyosida yaxshi o'rnatilganligi sababli, Docker yordamida deyarli hamma narsani ishlatish mumkin. Mening yechimim - Jenkins-ning Docker-da bo'lishi va boshqa Docker konteynerlarini ishga tushirish. Bu savol 2013 yilda "" maqolasida berila boshlandi.
Muxtasar qilib aytganda, siz Docker-ning o'zini ishlaydigan konteynerga o'rnatishingiz va faylni o'rnatishingiz kerak /var/run/docker.sock
.
Jenkins uchun yaratilgan Dockerfile misoli.
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
Shunday qilib, biz asosiy kompyuterda Docker buyruqlarini bajara oladigan Docker konteyneriga ega bo'ldik.
Qurilish sozlamalari
Yaqinda Jenkins o'z qoidalarini ishlatib tasvirlash imkoniyatiga ega bo'ldi
Shunday qilib, keling, omborning o'ziga maxsus Dockerfile qo'yaylik, unda qurish uchun zarur bo'lgan barcha kutubxonalar mavjud. Shunday qilib, ishlab chiquvchining o'zi takrorlanadigan muhitni tayyorlashi mumkin va OPSdan xostga Node.JS ning ma'lum bir versiyasini o'rnatishni so'rashi shart emas.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Ushbu qurilish tasviri ko'pchilik Node.JS ilovalari uchun mos keladi. Masalan, sizga Sonar skaneri o'rnatilgan JVM loyihasi uchun rasm kerak bo'lsa-chi? Yig'ish uchun kerakli komponentlarni tanlashda erkinsiz.
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/
Biz yig'ilish muhitini tasvirlab berdik, ammo Jenkinsning bunga nima aloqasi bor? Va Jenkins agentlari bunday Docker tasvirlari bilan ishlashi va ularni ichkarida qurishi mumkin.
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"
}
}
Direktiv agent
mulkdan foydalanadi docker
qaerda belgilashingiz mumkin:
- nomlash siyosatiga muvofiq yig'ish konteynerining nomi;
- argumentlar qurilish konteynerini ishga tushirish uchun kerak bo'ladi, bu erda bizning holatlarimizda biz joriy katalogni konteyner ichidagi katalog sifatida o'rnatamiz.
Qurilish bosqichlarida biz Docker qurish agentida qaysi buyruqlar bajarilishini ko'rsatamiz. Bu hamma narsa bo'lishi mumkin, shuning uchun men ansible yordamida ilovalarni joylashtirishni ham ishga tushiraman.
Quyida oddiy Node.JS ilovasi yaratishi mumkin bo'lgan umumiy Jenkinsfaylni ko'rsatmoqchiman.
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()
}
}
}
Nima bo'ldi?
Ushbu usul tufayli biz quyidagi muammolarni hal qildik:
- atrof-muhitni yig'ish konfiguratsiya vaqti har bir loyiha uchun 10 - 15 daqiqaga qisqartiriladi;
- butunlay takrorlanadigan ilovalar yaratish muhiti, chunki uni mahalliy kompyuteringizda shu tarzda yaratishingiz mumkin;
- yig'ish vositalarining turli versiyalari o'rtasidagi ziddiyatlar bilan bog'liq muammolar yo'q;
- har doim tiqilib qolmaydigan toza ish joyi.
Yechimning o'zi oddiy va ravshan va sizga ba'zi afzalliklarni olish imkonini beradi. Ha, yig'ilishlar uchun oddiy buyruqlar bilan solishtirganda kirish chegarasi biroz ko'tarildi, ammo endi u har doim qurilishi va ishlab chiquvchining o'zi qurish jarayoni uchun zarur bo'lgan hamma narsani tanlashi mumkinligiga kafolat bor.
Men to'plagan rasmdan ham foydalanishingiz mumkin
Ushbu maqolani yozish paytida plagin yordamida asosiy tugunni yuklamaslik uchun uzoq serverlarda agentlardan foydalanish haqida munozaralar paydo bo'ldi.
Manba: www.habr.com