
Habré'de Jenkins hakkında pek çok makale var, ancak çok azı Jenkins ve liman işçisi temsilcilerinin nasıl çalıştığına dair örnekleri açıklıyor. Gibi tüm popüler proje oluşturma araçları , , , ve diğerleri her şeyi kaplarda toplayabilir. Peki ya Jenkins?
Bugün bu sorunun bir çözümü var: Jenkins 2, . Bu yazıda deneyimlerimi paylaşmak ve bunu kendi başınıza nasıl yapabileceğinizi göstermek istiyorum.
Neden bu sorunu çözmeye başladım?
Şirkette olduğumuz için Birçok farklı teknoloji kullandığımız için Node.JS, Gradle, Ruby, JDK ve diğerlerinin farklı sürümlerini montaj makinesinde tutmamız gerekiyor. Ancak çoğu zaman sürüm çakışmalarından kaçınılamaz. Evet nvm, rvm gibi çeşitli versiyon yöneticileri var diyorsanız haklısınız ama onlarda her şey o kadar düzgün değil ve bu çözümlerin sorunları var:
- geliştiricilerin temizlemeyi unuttuğu büyük miktarda çalışma zamanı;
- aynı çalışma zamanlarının farklı sürümleri arasında çakışmalar var;
- Her geliştiricinin farklı bileşenlere ihtiyacı vardır.
Başka sorunlar da var ama çözümünü anlatayım.
Docker'da Jenkins
Docker artık geliştirme dünyasında iyice yerleşmiş olduğundan neredeyse her şey Docker kullanılarak çalıştırılabilir. Benim çözümüm Jenkins'in Docker'da olması ve diğer Docker konteynerlerini çalıştırabilmesidir. Bu soru 2013 yılında “".
Kısacası, Docker'ın kendisini çalışan bir konteynere kurmanız ve dosyayı bağlamanız yeterlidir. /var/run/docker.sock.
İşte Jenkins için ortaya çıkan örnek bir 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 jenkinsBöylece ana makinede Docker komutlarını yürütebilecek bir Docker konteynerimiz oldu.
Derleme kurulumu
Kısa bir süre önce Jenkins, kurallarını kullanarak açıklama fırsatı buldu. sözdizimi, derleme komut dosyasını değiştirmeyi ve depoda saklamayı oldukça kolaylaştırır.
Öyleyse, deponun kendisine, derleme için gerekli tüm kütüphaneleri içerecek özel bir Docker dosyası koyalım. Bu şekilde geliştiricinin kendisi tekrarlanabilir bir ortam hazırlayabilir ve OPS'den ana bilgisayara Node.JS'nin belirli bir sürümünü yüklemesini istemek zorunda kalmaz.
FROM node:12.10.0-alpine
RUN npm install yarn -gBu yapı görüntüsü çoğu Node.JS uygulaması için uygundur. Örneğin, içinde Sonar tarayıcı bulunan bir JVM projesi için bir görüntüye ihtiyacınız varsa ne olur? Montaj için ihtiyacınız olan bileşenleri seçmekte özgürsünüz.
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/
Montaj ortamını anlattık ama Jenkins'in bununla ne alakası var? Jenkins aracıları bu tür Docker görüntüleriyle çalışabilir ve bunları dahili olarak oluşturabilir.
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"
}
}yönerge agent özelliği kullanır dockerburada belirtebilirsiniz:
- adlandırma politikanıza göre montaj konteynerinin adı;
- derleme konteynerini çalıştırmak için gerekli argümanlar; bizim durumumuzda mevcut dizini konteynerin içindeki bir dizin olarak monte ediyoruz.
Ve zaten derleme adımlarında Docker derleme aracısında hangi komutların yürütüleceğini belirtiyoruz. Bu herhangi bir şey olabilir, bu yüzden uygulama dağıtımını da ansible'ı kullanarak başlatıyorum.
Aşağıda basit bir Node.JS uygulamasının oluşturabileceği genel bir Jenkinsfile göstermek istiyorum.
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()
}
}
}Ne oldu?
Bu yöntem sayesinde aşağıdaki sorunları çözdük:
- ortam montajı yapılandırma süresi proje başına 10 - 15 dakikaya düşürülür;
- tamamen tekrarlanabilir bir uygulama oluşturma ortamı, çünkü bunu yerel bilgisayarınızda bu şekilde oluşturabilirsiniz;
- montaj araçlarının farklı sürümleri arasındaki çatışmalarla ilgili herhangi bir sorun yoktur;
- her zaman tıkanmayan temiz bir çalışma alanı.
Çözümün kendisi basit ve açıktır ve bazı avantajlar elde etmenizi sağlar. Evet, montajlar için basit komutlara kıyasla giriş eşiği biraz arttı, ancak artık her zaman inşa edileceğine ve geliştiricinin kendi inşa süreci için gerekli olan her şeyi seçebileceğine dair bir garanti var.
Topladığım görseli de kullanabilirsiniz . Tüm kaynaklar açıktır ve şu adreste bulunmaktadır: .
Bu makaleyi yazarken, ana düğümün bir eklenti kullanarak yüklenmemesi için uzak sunucularda aracıların kullanılmasıyla ilgili bir tartışma ortaya çıktı. . Ancak gelecekte bunun hakkında konuşacağım.
Kaynak: habr.com
