Женкинсийн тухай Хабрегийн тухай олон нийтлэл байдаг ч Женкинс болон докерын агентууд хэрхэн ажилладаг тухай жишээ цөөн байдаг. Бүх алдартай төсөл бүтээх хэрэгслүүд гэх мэт
Өнөөдөр энэ асуудлыг шийдэх гарц байна: Jenkins 2 нь ажиллахдаа гайхалтай
Би яагаад энэ асуудлыг шийдэж эхэлсэн бэ?
Бид компанид байгаа болохоор
- хөгжүүлэгчид цэвэрлэхээ мартдаг их хэмжээний ажиллах хугацаа;
- ижил ажиллах цагийн өөр хувилбаруудын хооронд зөрчилдөөн байгаа;
- Хөгжүүлэгч бүр өөр өөр бүрэлдэхүүн хэсгүүдийг шаарддаг.
Өөр асуудал байгаа ч шийдлийг нь хэлье.
Докер дахь Женкинс
Docker одоо хөгжлийн ертөнцөд сайн байр суурь эзэлдэг тул Docker ашиглан бараг бүх зүйлийг ажиллуулж болно. Миний шийдэл бол Женкинсийг Docker-д суулгаж, бусад Docker контейнеруудыг ажиллуулах боломжтой байх явдал юм. Энэ асуултыг 2013 онд " нийтлэлд асууж эхэлсэн.
Товчхондоо та Docker-г өөрөө ажиллаж байгаа саванд суулгаад файлаа холбоход л хангалттай /var/run/docker.sock
.
Jenkins-д зориулсан Dockerfile-ийн жишээ энд байна.
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
Тиймээс бид хост машин дээр Docker командуудыг гүйцэтгэх боломжтой Docker контейнертэй болсон.
Барилга байгууламж
Удалгүй Женкинс өөрийн дүрмээ ашиглан тайлбарлах боломжтой болсон
Тиймээс, бүтээхэд шаардлагатай бүх сангуудыг агуулсан тусгай Dockerfile-г агуулахдаа оруулъя. Ингэснээр хөгжүүлэгч өөрөө давтагдах орчинг бэлдэж болох бөгөөд OPS-оос Node.JS-ийн тодорхой хувилбарыг хост дээр суулгахыг шаардах шаардлагагүй болно.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Энэхүү бүтээх зураг нь ихэнх Node.JS програмуудад тохиромжтой. Жишээлбэл, танд Sonar сканнер бүхий JVM төслийн зураг хэрэгтэй бол яах вэ? Та угсрахад шаардлагатай бүрэлдэхүүн хэсгүүдийг сонгох боломжтой.
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/
Бид угсралтын орчныг тодорхойлсон боловч Женкинс үүнд ямар хамаатай вэ? Женкинсийн агентууд ийм Docker зургуудтай ажиллаж, тэдгээрийг дотооддоо бүтээх боломжтой.
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"
}
}
Удирдамж agent
өмчийг ашигладаг docker
хаана зааж өгч болно:
- таны нэрлэх бодлогын дагуу угсрах савны нэр;
- Барилга угсралтын контейнерыг ажиллуулахад шаардлагатай аргументууд бөгөөд бидний тохиолдолд бид одоогийн лавлахыг чингэлэг доторх лавлах хэлбэрээр холбодог.
Бүтээлтийн үе шатанд бид Docker бүтээх агент дотор ямар командуудыг гүйцэтгэхийг зааж өгсөн. Энэ нь юу ч байж болох тул би мөн ansible ашиглан програмын байршуулалтыг эхлүүлдэг.
Доор би энгийн Node.JS програм бүтээх боломжтой ерөнхий Jenkinsfile-г харуулахыг хүсч байна.
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()
}
}
}
Юу болсон бэ?
Энэ аргын ачаар бид дараах асуудлуудыг шийдсэн.
- байгаль орчныг угсрах тохиргооны хугацааг төсөл бүрт 10 - 15 минут болгон бууруулсан;
- бүрэн давтагдах боломжтой програм бүтээх орчин, учир нь та үүнийг өөрийн локал компьютер дээрээ ингэж бүтээх боломжтой;
- угсрах хэрэгслийн янз бүрийн хувилбаруудын хооронд зөрчилдөөнтэй холбоотой асуудал байхгүй;
- үргэлж бөглөрдөггүй цэвэрхэн ажлын байр.
Шийдэл нь өөрөө энгийн бөгөөд ойлгомжтой бөгөөд зарим давуу талыг олж авах боломжийг олгодог. Тийм ээ, элсэлтийн босго нь угсралтын энгийн командуудтай харьцуулахад бага зэрэг өссөн боловч одоо үүнийг үргэлж барьж байх баталгаа бий бөгөөд хөгжүүлэгч өөрөө бүтээх үйл явцад шаардлагатай бүх зүйлийг сонгох боломжтой болсон.
Та мөн миний цуглуулсан зургийг ашиглаж болно
Энэ нийтлэлийг бичиж байх үед залгаас ашиглан мастер зангилааг ачаалахгүйн тулд алсын серверүүд дээр агентуудыг ашиглах талаар хэлэлцүүлэг өрнөв.
Эх сурвалж: www.habr.com