كيفية بناء مشاريع في جنكينز ، إذا كنت بحاجة إلى الكثير من البيئات المختلفة

صورة


هناك الكثير من المقالات حول Habré حول جنكينز ، ولكن تم وصف أمثلة قليلة من عمل جنكينز ووكلاء الرصيف. يمكن لجميع أدوات إنشاء المشاريع الشائعة مثل Drone.io و Bitbucket Pipeline و GitLab وإجراءات GitHub وغيرها جمع كل شيء في حاويات. ولكن ماذا عن جنكينز؟


اليوم يوجد حل للمشكلة: Jenkins 2 رائع في العمل مع عملاء Docker . في المقالة أريد أن أشارككم التجربة وأظهر كيف يمكنك القيام بذلك بنفسك.


لماذا حللت هذه المشكلة؟


نظرًا لأننا في Citronium نستخدم العديد من التقنيات المختلفة ، يتعين علينا الاحتفاظ بإصدارات مختلفة من Node.JS و Gradle و Ruby و JDK وغيرها على آلة التجميع. ولكن في كثير من الأحيان لا يمكن تجنب تعارضات الإصدار. نعم ، ستكون على صواب إذا قلت أن هناك العديد من مديري الإصدارات مثل nvm ، rvm ، لكن ليس كل شيء سهل للغاية معهم ، وهذه الحلول تواجه مشاكل:


  • كمية كبيرة من أوقات التشغيل التي ينسى المطورون تنظيفها ؛
  • هناك تعارضات بين الإصدارات المختلفة من نفس أوقات التشغيل ؛
  • يحتاج كل مطور إلى مجموعة مختلفة من المكونات.

هناك مشاكل أخرى ، لكن دعني أخبرك بشكل أفضل عن الحل.


جنكينز في دوكر


نظرًا لأن Docker متجذر الآن في صناعة التطوير ، يمكن بدء تشغيل كل شيء تقريبًا باستخدام Docker. الحل الخاص بي هو أن يكون جنكينز في ميناء دوكر وقادر على تشغيل حاويات دوكر الأخرى. بدأ طرح هذا السؤال مرة أخرى في عام 2013 في مقال " Docker يمكن أن يعمل الآن ضمن Docker ".


إذا كان باختصار ، من الضروري تثبيت Docker في حاوية العمل /var/run/docker.sock ملف /var/run/docker.sock .


هنا مثال Dockerfile الذي خرج لجينكينز.


 FROM jenkins/jenkins:lts ARG DOCKER_COMPOSE_VERSION=1.25.0 USER root RUN apt-get update && \ apt-get upgrade -y && \ 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 && \ apt-get clean autoclean && apt-get autoremove && rm -rf /var/lib/{apt,dpkg,cache,log}/ RUN curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose RUN usermod -aG docker jenkins && gpasswd -a jenkins docker USER jenkins 

وبالتالي ، حصلنا على حاوية Docker يمكنها تنفيذ أوامر Docker على الجهاز المضيف.


بناء الإعداد


منذ وقت ليس ببعيد ، حصلت Jenkins على الفرصة لوصف قواعدها باستخدام بناء جملة Pipeline ، والذي يتيح لك ببساطة تغيير نص البناء وتخزينه في المستودع.


لذلك دعونا نضع Dockerfile خاصًا في المستودع نفسه ، والذي سيحتوي على جميع المكتبات اللازمة لبناء المكتبة. وبالتالي ، يمكن للمطور نفسه إعداد بيئة قابلة للتكرار ولن يحتاج الأمر إلى طلب OPS لوضع إصدار محدد من Node.JS على المضيف.


 FROM node:12.10.0-alpine RUN npm install yarn -g 

صورة البنية هذه مناسبة لمعظم تطبيقات Node.JS. وإذا كنت ، على سبيل المثال ، تحتاج إلى صورة لمشروع JVM مع وجود ماسح ضوئي مدمج داخل برنامج Sonar؟ أنت نفسك حر في اختيار المكونات التي تحتاج إلى بنائها.


 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/ 

لقد وصفنا بيئة البناء ، لكن ما علاقة جينكينز بها؟ ويمكن لوكلاء جينكينز العمل مع صور Docker هذه والبناء في الداخل.


 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 دقيقة لكل مشروع ؛
  • بيئة قابلة للتكرار تمامًا لتجميع التطبيق ، حيث يمكن أيضًا تجميعها على الكمبيوتر المحلي ؛
  • لا يتعارض مع الإصدارات المختلفة من أدوات التجميع ؛
  • دائمًا مساحة عمل نظيفة لا تسد.

الحل نفسه بسيط وواضح ويسمح لك بالحصول على بعض المزايا. نعم ، ارتفعت عتبة الدخول قليلاً مقارنة بأوامر الإنشاء البسيطة ، ولكن يوجد الآن ضمان بأن يتم تجميعها دائمًا ويمكن للمطور نفسه اختيار كل ما هو ضروري لعملية الإنشاء الخاصة به.


يمكنك أيضًا استخدام الصورة التي جمعتها Jenkins + Docker . جميع المصادر مفتوحة وتكمن في rmuhamedgaliev / jenkins_docker .


أثناء كتابة المقال ، كان هناك نقاش حول استخدام الوكلاء على الخوادم البعيدة حتى لا يتم تحميل العقدة الرئيسية باستخدام البرنامج المساعد لرسو السفن . لكن سأتحدث عن هذا في المستقبل.

Source: https://habr.com/ru/post/ar481466/


All Articles