مقالات زیادی در مورد هابره در مورد جنکینز وجود دارد، اما تعداد کمی از آنها نمونه هایی از نحوه کار جنکینز و عوامل داکر را شرح می دهند. همه ابزارهای محبوب ساخت پروژه مانند
امروز یک راه حل برای این مشکل وجود دارد: جنکینز 2 در کار کردن با آن عالی است
چرا شروع کردم به حل این مشکل؟
از آنجایی که ما در شرکت هستیم
- مقدار زیادی از زمان اجرا که توسعه دهندگان فراموش می کنند پاک کنند.
- تضادهایی بین نسخه های مختلف زمان اجرا وجود دارد.
- هر توسعهدهندهای به مجموعهای از اجزای مختلف نیاز دارد.
مشکلات دیگری هم وجود دارد، اما بگذارید راه حل را به شما بگویم.
جنکینز در داکر
از آنجایی که داکر اکنون به خوبی در دنیای توسعه جا افتاده است، تقریباً هر چیزی را می توان با استفاده از داکر اجرا کرد. راه حل من این است که جنکینز را در داکر داشته باشم و بتوانم سایر کانتینرهای داکر را اجرا کنم. این سوال در سال 2013 در مقاله پرسیده شد.
به طور خلاصه، شما فقط باید خود Docker را در یک ظرف کار نصب کنید و فایل را مونت کنید /var/run/docker.sock
.
در اینجا یک نمونه 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 مناسب است. برای مثال، اگر به یک تصویر برای پروژه 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/
ما محیط مونتاژ را توضیح دادیم، اما جنکینز چه ربطی به آن دارد؟ و عوامل جنکینز می توانند با چنین تصاویر داکر کار کنند و آنها را به صورت داخلی بسازند.
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 راه اندازی می کنم.
در زیر می خواهم یک Jenkinsfile عمومی را نشان دهم که یک برنامه Node.JS ساده می تواند بسازد.
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