Хэрэв танд олон янзын орчин хэрэгтэй бол Женкинс дэх төслүүдийг хэрхэн цуглуулах вэ

Хэрэв танд олон янзын орчин хэрэгтэй бол Женкинс дэх төслүүдийг хэрхэн цуглуулах вэ

Женкинсийн тухай Хабрегийн тухай олон нийтлэл байдаг ч Женкинс болон докерын агентууд хэрхэн ажилладаг тухай жишээ цөөн байдаг. Бүх алдартай төсөл бүтээх хэрэгслүүд гэх мэт Drone.io, Битбукет дамжуулах хоолой, GitLab, GitHub үйлдлүүд болон бусад, бүх зүйлийг саванд цуглуулж болно. Харин Женкинс яах вэ?

Өнөөдөр энэ асуудлыг шийдэх гарц байна: Jenkins 2 нь ажиллахдаа гайхалтай Докер агентууд. Энэ нийтлэлд би өөрийн туршлагаа хуваалцаж, үүнийг хэрхэн өөрөө хийж болохыг харуулахыг хүсч байна.

Би яагаад энэ асуудлыг шийдэж эхэлсэн бэ?

Бид компанид байгаа болохоор Citronium Бид олон төрлийн технологи ашигладаг тул угсрах машин дээр Node.JS, Gradle, Ruby, JDK болон бусад хувилбаруудыг хадгалах хэрэгтэй болдог. Гэхдээ ихэнхдээ хувилбарын зөрчилдөөнөөс зайлсхийх боломжгүй байдаг. Тийм ээ, хэрэв та nvm, rvm гэх мэт янз бүрийн хувилбарын менежерүүд байдаг гэж хэлбэл та зөв байх болно, гэхдээ бүх зүйл тийм ч жигд биш бөгөөд эдгээр шийдлүүдэд асуудал гардаг:

  • хөгжүүлэгчид цэвэрлэхээ мартдаг их хэмжээний ажиллах хугацаа;
  • ижил ажиллах цагийн өөр хувилбаруудын хооронд зөрчилдөөн байгаа;
  • Хөгжүүлэгч бүр өөр өөр бүрэлдэхүүн хэсгүүдийг шаарддаг.

Өөр асуудал байгаа ч шийдлийг нь хэлье.

Докер дахь Женкинс

Docker одоо хөгжлийн ертөнцөд сайн байр суурь эзэлдэг тул Docker ашиглан бараг бүх зүйлийг ажиллуулж болно. Миний шийдэл бол Женкинсийг Docker-д суулгаж, бусад Docker контейнеруудыг ажиллуулах боломжтой байх явдал юм. Энэ асуултыг 2013 онд " нийтлэлд асууж эхэлсэн.Docker одоо Docker дотор ажиллах боломжтой".

Товчхондоо та Docker-г өөрөө ажиллаж байгаа саванд суулгаад файлаа холбоход л хангалттай /var/run/docker.sock.

Jenkins-д зориулсан 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 програмуудад тохиромжтой. Жишээлбэл, танд Sonar сканнер бүхий 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/

Бид угсралтын орчныг тодорхойлсон боловч Женкинс үүнд ямар хамаатай вэ? Женкинсийн агентууд ийм 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 ашиглан програмын байршуулалтыг эхлүүлдэг.

Доор би энгийн Node.JS програм бүтээх боломжтой ерөнхий Jenkinsfile-г харуулахыг хүсч байна.

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

сэтгэгдэл нэмэх