نحوه جمع آوری پروژه ها در جنکینز در صورت نیاز به محیط های مختلف

نحوه جمع آوری پروژه ها در جنکینز در صورت نیاز به محیط های مختلف

مقالات زیادی در مورد هابره در مورد جنکینز وجود دارد، اما تعداد کمی از آنها نمونه هایی از نحوه کار جنکینز و عوامل داکر را شرح می دهند. همه ابزارهای محبوب ساخت پروژه مانند Drone.io, خط لوله بیت باکت, گیتلب, اقدامات GitHub و دیگران، می توانند همه چیز را در ظروف جمع کنند. اما جنکینز چطور؟

امروز یک راه حل برای این مشکل وجود دارد: جنکینز 2 در کار کردن با آن عالی است عوامل داکر. در این مقاله می خواهم تجربه خود را به اشتراک بگذارم و نشان دهم که چگونه می توانید خودتان این کار را انجام دهید.

چرا شروع کردم به حل این مشکل؟

از آنجایی که ما در شرکت هستیم سیترونیوم از آنجایی که ما از بسیاری از فناوری‌های مختلف استفاده می‌کنیم، باید نسخه‌های مختلف Node.JS، Gradle، Ruby، JDK و موارد دیگر را روی دستگاه مونتاژ نگه داریم. اما اغلب نمی توان از تضاد نسخه اجتناب کرد. بله، شما درست می گویید که مدیریت نسخه های مختلفی مانند nvm، rvm وجود دارد، اما همه چیز با آنها به این راحتی نیست و این راه حل ها مشکلاتی دارند:

  • مقدار زیادی از زمان اجرا که توسعه دهندگان فراموش می کنند پاک کنند.
  • تضادهایی بین نسخه های مختلف زمان اجرا وجود دارد.
  • هر توسعه‌دهنده‌ای به مجموعه‌ای از اجزای مختلف نیاز دارد.

مشکلات دیگری هم وجود دارد، اما بگذارید راه حل را به شما بگویم.

جنکینز در داکر

از آنجایی که داکر اکنون به خوبی در دنیای توسعه جا افتاده است، تقریباً هر چیزی را می توان با استفاده از داکر اجرا کرد. راه حل من این است که جنکینز را در داکر داشته باشم و بتوانم سایر کانتینرهای داکر را اجرا کنم. این سوال در سال 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 دقیقه در هر پروژه کاهش می یابد.
  • یک محیط ساخت برنامه کاملاً تکرارپذیر، زیرا می توانید آن را به این روش در رایانه محلی خود بسازید.
  • هیچ مشکلی با درگیری بین نسخه های مختلف ابزار مونتاژ وجود ندارد.
  • همیشه یک فضای کاری تمیز که مسدود نمی شود.

راه حل به خودی خود ساده و واضح است و به شما امکان می دهد از مزایایی بهره مند شوید. بله، آستانه ورود در مقایسه با دستورات ساده برای اسمبلی ها کمی افزایش یافته است، اما اکنون این تضمین وجود دارد که همیشه ساخته می شود و خود توسعه دهنده می تواند هر چیزی را که برای فرآیند ساخت خود لازم است انتخاب کند.

شما همچنین می توانید از تصویری که من جمع آوری کردم استفاده کنید جنکینز + داکر. همه منابع باز هستند و در آن قرار دارند rmuhamedgaliev/jenkins_docker.

هنگام نوشتن این مقاله، بحثی در مورد استفاده از عوامل در سرورهای راه دور به وجود آمد تا گره اصلی با استفاده از یک افزونه بارگیری نشود. docker-plugin. اما در آینده در این مورد صحبت خواهم کرد.

منبع: www.habr.com

اضافه کردن نظر