اگر آپ کو بہت سے مختلف ماحول کی ضرورت ہو تو جینکنز میں پروجیکٹس کو کیسے اکٹھا کریں۔

اگر آپ کو بہت سے مختلف ماحول کی ضرورت ہو تو جینکنز میں پروجیکٹس کو کیسے اکٹھا کریں۔

جینکنز کے بارے میں Habré پر بہت سے مضامین موجود ہیں، لیکن چند مثالیں بیان کرتے ہیں کہ جینکنز اور ڈاکر ایجنٹ کیسے کام کرتے ہیں۔ جیسے تمام مشہور پروجیکٹ بلڈ ٹولز Drone.io, بٹ بکٹ پائپ لائن, GitLab, GitHub کی کارروائیاں اور دیگر، کنٹینرز میں سب کچھ جمع کر سکتے ہیں. لیکن جینکنز کے بارے میں کیا خیال ہے؟

آج اس مسئلے کا ایک حل ہے: جینکنز 2 کے ساتھ کام کرنے میں بہت اچھا ہے۔ ڈاکر ایجنٹس. اس مضمون میں میں اپنے تجربے کا اشتراک کرنا چاہتا ہوں اور یہ بتانا چاہتا ہوں کہ آپ خود یہ کیسے کر سکتے ہیں۔

میں نے یہ مسئلہ کیوں حل کرنا شروع کیا؟

چونکہ ہم کمپنی میں ہیں۔ سیٹرونیم چونکہ ہم بہت سی مختلف ٹیکنالوجیز استعمال کرتے ہیں، ہمیں Node.JS، Gradle، Ruby، JDK اور دیگر کے مختلف ورژن اسمبلی مشین پر رکھنے ہوتے ہیں۔ لیکن اکثر ورژن تنازعات سے گریز نہیں کیا جا سکتا. ہاں، آپ درست ہوں گے اگر آپ کہتے ہیں کہ مختلف ورژن مینیجر ہیں جیسے nvm, rvm، لیکن ان کے ساتھ سب کچھ اتنا ہموار نہیں ہے اور ان حلوں میں مسائل ہیں:

  • رن ٹائم کی ایک بڑی مقدار جسے ڈویلپر صاف کرنا بھول جاتے ہیں۔
  • ایک ہی رن ٹائم کے مختلف ورژن کے درمیان تنازعات ہیں۔
  • ہر ڈویلپر کو اجزاء کے مختلف سیٹ کی ضرورت ہوتی ہے۔

اس کے علاوہ بھی مسائل ہیں لیکن میں آپ کو اس کا حل بتاتا ہوں۔

ڈوکر میں جینکنز

چونکہ ڈوکر اب ترقی کی دنیا میں اچھی طرح سے قائم ہے، ڈوکر کا استعمال کرتے ہوئے تقریباً کچھ بھی چلایا جا سکتا ہے۔ میرا حل یہ ہے کہ ڈوکر میں جینکنز ہوں اور دوسرے ڈوکر کنٹینرز کو چلانے کے قابل ہوں۔ یہ سوال 2013 میں آرٹیکل میں پوچھا جانے لگا۔Docker اب 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

اس طرح، ہمیں ایک ڈوکر کنٹینر ملا ہے جو میزبان مشین پر ڈوکر کمانڈز کو چلا سکتا ہے۔

سیٹ اپ بنائیں

ابھی کچھ عرصہ قبل جینکنز کو اس کے قواعد کا استعمال کرتے ہوئے بیان کرنے کا موقع ملا پائپ لائن نحو، جس سے بلڈ اسکرپٹ کو تبدیل کرنا اور اسے ذخیرہ میں ذخیرہ کرنا کافی آسان ہوجاتا ہے۔

تو آئیے ریپوزٹری میں ہی ایک خصوصی 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 منٹ فی پروجیکٹ تک کم کر دیا گیا ہے۔
  • ایک مکمل طور پر دوبارہ قابل اطلاق ایپلیکیشن بنانے کا ماحول، کیونکہ آپ اسے اپنے مقامی کمپیوٹر پر اس طرح بنا سکتے ہیں۔
  • اسمبلی کے اوزار کے مختلف ورژن کے درمیان تنازعات کے ساتھ کوئی مسئلہ نہیں ہے؛
  • ہمیشہ ایک صاف کام کی جگہ جو بھری نہیں ہوتی۔

حل خود سادہ اور واضح ہے اور آپ کو کچھ فوائد حاصل کرنے کی اجازت دیتا ہے۔ جی ہاں، اسمبلیوں کے لیے آسان کمانڈز کے مقابلے میں داخلے کی حد تھوڑی بڑھ گئی ہے، لیکن اب اس بات کی گارنٹی ہے کہ اسے ہمیشہ بنایا جائے گا اور ڈویلپر خود ہر وہ چیز منتخب کر سکتا ہے جو اس کی تعمیر کے عمل کے لیے ضروری ہے۔

آپ میری جمع کردہ تصویر بھی استعمال کر سکتے ہیں۔ جینکنز + ڈوکر. تمام ذرائع کھلے ہیں اور پر واقع ہیں۔ rmuhamedgaliev/jenkins_docker.

اس مضمون کو لکھتے وقت، ریموٹ سرورز پر ایجنٹوں کے استعمال کے بارے میں بحث ہوئی تاکہ پلگ ان کا استعمال کرتے ہوئے ماسٹر نوڈ کو لوڈ نہ کیا جا سکے۔ docker-plugin. لیکن میں اس بارے میں آئندہ بات کروں گا۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں