Habré-də Jenkins haqqında çoxlu məqalələr var, lakin bir neçəsi Jenkins və docker agentlərinin necə işlədiyinə dair nümunələri təsvir edir. kimi bütün məşhur layihə qurma vasitələri
Bu gün problemin həlli var: Jenkins 2 ilə işləmək əladır
Niyə mən bu problemi həll etməyə başladım?
Şirkətdə olduğumuz üçün
- tərtibatçıların təmizləməyi unutduğu böyük miqdarda iş vaxtı;
- eyni iş vaxtlarının müxtəlif versiyaları arasında ziddiyyətlər var;
- Hər bir tərtibatçıya fərqli komponentlər dəsti lazımdır.
Başqa problemlər də var, amma həllini sizə deyim.
Jenkins Docker-də
Docker indi inkişaf dünyasında yaxşı qurulduğundan, Docker istifadə edərək demək olar ki, hər şeyi idarə etmək olar. Mənim həllim odur ki, Jenkins-in Docker-də olması və digər Docker konteynerlərini işlədə bilsin. Bu sual 2013-cü ildə “ məqaləsində soruşulmağa başladı.
Bir sözlə, sadəcə Docker-in özünü işləyən konteynerə quraşdırmalı və faylı quraşdırmalısınız /var/run/docker.sock
.
Jenkins üçün ortaya çıxan bir Dockerfile nümunəsidir.
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
Beləliklə, biz ana maşında Docker əmrlərini yerinə yetirə bilən Docker konteyneri əldə etdik.
Quraşdırma
Bir müddət əvvəl Jenkins öz qaydalarını istifadə edərək təsvir etmək imkanı əldə etdi
Odur ki, repozitoriyanın özünə xüsusi bir Dockerfile qoyaq ki, bu da quraşdırma üçün lazım olan bütün kitabxanaları ehtiva edir. Beləliklə, tərtibatçı özü təkrarlana bilən mühit hazırlaya bilər və OPS-dən Node.JS-in xüsusi versiyasını hostda quraşdırmasını tələb etməli olmayacaq.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Bu quruluş şəkli əksər Node.JS proqramları üçün uyğundur. Əgər, məsələn, içərisində Sonar skaneri olan JVM layihəsi üçün şəkilə ehtiyacınız olarsa? Montaj üçün lazım olan komponentləri seçməkdə sərbəstsiniz.
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 montaj mühitini təsvir etdik, amma Cenkinsin bununla nə əlaqəsi var? Jenkins agentləri belə Docker şəkilləri ilə işləyə və onları daxili şəkildə qura bilərlər.
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
əmlakdan istifadə edir docker
harada qeyd edə bilərsiniz:
- adlandırma siyasətinizə uyğun olaraq montaj qabının adı;
- Quraşdırma konteynerini işə salmaq üçün lazım olan arqumentlər, burada bizim vəziyyətimizdə cari kataloqu konteynerin içərisində bir kataloq kimi quraşdırırıq.
Artıq qurma addımlarında biz Docker qurma agentində hansı əmrlərin yerinə yetiriləcəyini göstəririk. Bu hər hansı bir şey ola bilər, ona görə də mən ansible istifadə edərək proqram yerləşdirməsini işə salıram.
Aşağıda sadə Node.JS proqramının qura biləcəyi ümumi Jenkinsfile göstərmək istəyirəm.
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()
}
}
}
Nə olub?
Bu üsul sayəsində biz aşağıdakı problemləri həll etdik:
- ətraf mühitin montajının konfiqurasiya müddəti hər layihə üçün 10 - 15 dəqiqəyə endirilir;
- tamamilə təkrarlana bilən proqram qurma mühiti, çünki onu yerli kompüterinizdə bu şəkildə qura bilərsiniz;
- montaj alətlərinin müxtəlif versiyaları arasında münaqişələrlə bağlı heç bir problem yoxdur;
- həmişə tıxanmayan təmiz iş yeri.
Həllin özü sadə və aydındır və bəzi üstünlüklər əldə etməyə imkan verir. Bəli, yığıncaqlar üçün sadə əmrlərlə müqayisədə giriş həddi bir qədər yüksəldi, lakin indi onun həmişə qurulacağına və tərtibatçının özü qurma prosesi üçün lazım olan hər şeyi seçə biləcəyinə zəmanət var.
Topladığım şəkildən də istifadə edə bilərsiniz
Bu məqaləni yazarkən, bir plagin istifadə edərək master nodu yükləməmək üçün uzaq serverlərdə agentlərdən istifadə ilə bağlı müzakirə yarandı.
Mənbə: www.habr.com