
Habr'da Jenkins hakkında birçok makale var, ancak Jenkins ve Docker ajanlarının çalışma örneği pek az yerde açıklanıyor. Proje derleme araçları olan bütün popüler araçlar gibi , , , ve diğerleri, her şeyi konteynerlerde derleyebilir. Peki Jenkins ne durumda?
Günümüzde bu sorunun bir çözümü mevcut: Jenkins 2, harika bir şekilde çalışabiliyor. Bu yazıda deneyimlerimi paylaşmak ve bunu nasıl kendi başınıza yapabileceğinizi göstermek istiyorum.
Neden bu sorunu çözmeyi üstlendim?
Şirketimizde, birçok farklı teknoloji kullandığımız için, derleme makinesinde birçok Node.JS, Gradle, Ruby, JDK ve diğerlerinin farklı sürümlerini bulundurmak zorundayız. Ancak çoğu zaman sürüm çatışmalarından kaçınmak mümkün olmuyor. Evet, nvm, rvm gibi çeşitli sürüm yöneticilerinin olduğunu söylerseniz haklısınız, ama bunlarla ilgili işler o kadar da kolay değil ve bu çözümlerin bazı sorunları var:
- geliştiricilerin temizlemeyi unuttukları büyük bir runtime hacmi;
- birbirine ait farklı runtime sürümleri arasında çatışmalar mevcut;
- her geliştiricinin farklı bir bileşen setine ihtiyacı var.
Başka sorunlar da var ama en iyisi çözümden bahsedelim.
Docker içinde Jenkins
Docker şimdi geliştirme alanında iyi bir şekilde yerleştiği için, neredeyse her şey Docker yardımıyla çalıştırılabiliyor. Benim çözümüm ise Jenkins'in Docker içinde olması ve başka Docker konteynerlerini çalıştırabilmesidir. Bu konu 2013 yılında "«.
başlıklı makalede sorulmaya başlanmıştı. Kısaca, çalışma konteynerine Docker'ı kurmak ve bir dosyayı bağlamak gerekiyor. /var/run/docker.sock.
İşte Jenkins için elde edilen bir Dockerfile örneği.
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 jenkinsBöylece Docker komutlarını ana makinede çalıştırabilen bir Docker konteynerine sahip olduk.
Derleme ayarları
Yakın zamanda Jenkins, kurallarını sözdizimiyle tanımlama yeteneği kazandı ve bu da derleme scriptini değiştirmeyi ve onu bir depoda saklamayı oldukça kolay hale getiriyor.
O halde, derleme için gerekli tüm kütüphaneleri içeren özel bir Dockerfile'ı doğrudan depoya koyalım. Bu sayede geliştirici tekrar edilebilir bir ortam hazırlayabilir ve OPS'ten ana makineye belirli bir Node.JS sürümünü kurmasını istemez.
FROM node:12.10.0-alpine
RUN npm install yarn -gBu aracı görüntü, əksər Node.JS tətbiqləri üçün uyğundur. Məsələn, daxilində Sonar skaneri olan bir JVM layihəsi üçün görüntü lazımdırsa, özünüz lazım olan komponentləri seçə bilərsiniz.
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 qurma mühitini təsvir etdik, amma Jenkins burada necədir? Jenkins agentləri bu cür Docker görüntüləri ilə işləyə bilir və daxilində qurma həyata keçirir.
stage("Layihəni qur") {
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 özəlliyindən istifadə edir docker, burada siz göstərə bilərsiniz:
- yeni adlandırma siyasətinizə uyğun qurma konteynerinin adı;
- lazım olan qurma konteynerini işə salmaq üçün lazım olan arqumentlər, burada olduğumuz vəziyyətdə hazırki dərci konteynerin içərisinə montaj edirik.
Qurma addımlarında, qurma Docker agentinin daxilində hansı komutların yerinə yetiriləcəyini göstəririk. Bu hər şey ola bilər, bu şəkildə ansible ilə tətbiqlərin yerləşdirilməsini də həyata keçirirəm.
Aşağıda sadə bir Node.JS tətbiqini qura biləcək ümumi bir 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("Yaradın qurma görüntüsünü") {
steps {
sh "docker build -f Dockerfile.build . -t project-build:${DOCKER_IMAGE_BRANCH}"
}
}
stage("Layihəni qur") {
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əticə nə oldu?
Bu üsul sayəsində aşağıdakı problemləri həll etdik:
- qurma mühitinin konfiqurasiyası, layihəyə 10-15 dəqiqədir;
- tamamilə təkrarlana bilən tətbiq qurma mühiti, çünki bunu yerli kompüterdə də qura bilərik;
- fərqli versiya qurma alətləri ilə münaqişə problemi yoxdur;
- həmişə təmiz bir iş sahəsi var, bu da dolmur.
Həmin qərar sadə və aydındır və yalnız müsbət nəticələr əldə etməyə imkan tanıyır. Bəli, giriş həddi bir az qalxdı, ancaq indi hər zaman toplanmasının təminatı var və proqramçı öz yığım prosesi üçün lazım olan hər şeyi seçə bilər.
Eyni zamanda, mənim topladığım imkandan da istifadə edə bilərsiniz. . Bütün mənbələr açıqdır və burada yerləşir .
Məqaləni yazarkən, master nodunu yükləməmək üçün uzaq serverlərdə agentlərin istifadəsi barədə müzakirə yarandı, . Ancaq bunu gələcəkdə izah edəcəyəm.
Mənbə: habr.com
