جینکنز کے بارے میں Habré پر بہت سے مضامین موجود ہیں، لیکن چند مثالیں بیان کرتے ہیں کہ جینکنز اور ڈاکر ایجنٹ کیسے کام کرتے ہیں۔ جیسے تمام مشہور پروجیکٹ بلڈ ٹولز
آج اس مسئلے کا ایک حل ہے: جینکنز 2 کے ساتھ کام کرنے میں بہت اچھا ہے۔
میں نے یہ مسئلہ کیوں حل کرنا شروع کیا؟
چونکہ ہم کمپنی میں ہیں۔
- رن ٹائم کی ایک بڑی مقدار جسے ڈویلپر صاف کرنا بھول جاتے ہیں۔
- ایک ہی رن ٹائم کے مختلف ورژن کے درمیان تنازعات ہیں۔
- ہر ڈویلپر کو اجزاء کے مختلف سیٹ کی ضرورت ہوتی ہے۔
اس کے علاوہ بھی مسائل ہیں لیکن میں آپ کو اس کا حل بتاتا ہوں۔
ڈوکر میں جینکنز
چونکہ ڈوکر اب ترقی کی دنیا میں اچھی طرح سے قائم ہے، ڈوکر کا استعمال کرتے ہوئے تقریباً کچھ بھی چلایا جا سکتا ہے۔ میرا حل یہ ہے کہ ڈوکر میں جینکنز ہوں اور دوسرے ڈوکر کنٹینرز کو چلانے کے قابل ہوں۔ یہ سوال 2013 میں آرٹیکل میں پوچھا جانے لگا۔
مختصراً، آپ کو صرف ڈوکر کو ایک ورکنگ کنٹینر میں انسٹال کرنے اور فائل کو ماؤنٹ کرنے کی ضرورت ہے۔ /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
اس طرح، ہمیں ایک ڈوکر کنٹینر ملا ہے جو میزبان مشین پر ڈوکر کمانڈز کو چلا سکتا ہے۔
سیٹ اپ بنائیں
ابھی کچھ عرصہ قبل جینکنز کو اس کے قواعد کا استعمال کرتے ہوئے بیان کرنے کا موقع ملا
تو آئیے ریپوزٹری میں ہی ایک خصوصی Dockerfile ڈالیں، جس میں تعمیر کے لیے ضروری تمام لائبریریاں ہوں گی۔ اس طرح، ڈویلپر خود ایک قابل تکرار ماحول تیار کر سکتا ہے اور اسے OPS سے Node.JS کا مخصوص ورژن میزبان پر انسٹال کرنے کے لیے نہیں کہنا پڑے گا۔
FROM node:12.10.0-alpine
RUN npm install yarn -g
یہ تعمیراتی تصویر زیادہ تر Node.JS ایپلی کیشنز کے لیے موزوں ہے۔ کیا ہوگا اگر، مثال کے طور پر، آپ کو جے وی ایم پروجیکٹ کے لیے ایک تصویر کی ضرورت ہو جس میں سونار اسکینر شامل ہو؟ آپ اسمبلی کے لیے ضروری اجزاء کا انتخاب کرنے کے لیے آزاد ہیں۔
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
جہاں آپ وضاحت کر سکتے ہیں:
- آپ کی نام کی پالیسی کے مطابق اسمبلی کنٹینر کا نام؛
- بلڈ کنٹینر کو چلانے کے لیے دلائل کی ضرورت ہوتی ہے، جہاں ہمارے معاملے میں ہم موجودہ ڈائرکٹری کو کنٹینر کے اندر ڈائرکٹری کے طور پر ماؤنٹ کرتے ہیں۔
اور پہلے سے ہی تعمیراتی مراحل میں ہم اس بات کی نشاندہی کرتے ہیں کہ ڈوکر بلڈ ایجنٹ کے اندر کن کمانڈز کو عمل میں لانا ہے۔ یہ کچھ بھی ہو سکتا ہے، اس لیے میں جوابی استعمال کرتے ہوئے ایپلیکیشن کی تعیناتی بھی شروع کرتا ہوں۔
ذیل میں میں ایک عام 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