Bir çox fərqli mühitə ehtiyacınız varsa, Jenkins-də layihələri necə toplamaq olar

Bir çox fərqli mühitə ehtiyacınız varsa, Jenkins-də layihələri necə toplamaq olar

Habré-də Jenkins haqqında çoxlu məqalələr var, lakin bir neçəsi Jenkins və docker agentlərinin necə işlədiyinə dair nümunələri təsvir edir. kimi bütün məşhur layihə qurma vasitələri Drone.io, Bitbucket Boru Kəməri, GitLab, GitHub hərəkətləri və başqaları, hər şeyi qablarda toplaya bilər. Bəs Jenkins?

Bu gün problemin həlli var: Jenkins 2 ilə işləmək əladır Docker agentləri. Bu yazıda təcrübəmi bölüşmək və bunu özünüz necə edə biləcəyinizi göstərmək istəyirəm.

Niyə mən bu problemi həll etməyə başladım?

Şirkətdə olduğumuz üçün Citronium Çox müxtəlif texnologiyalardan istifadə etdiyimiz üçün montaj maşınında Node.JS, Gradle, Ruby, JDK və digərlərinin müxtəlif versiyalarını saxlamalıyıq. Lakin çox vaxt versiya münaqişələrinin qarşısını almaq olmur. Bəli, nvm, rvm kimi müxtəlif versiya menecerlərinin olduğunu söyləsəniz, haqlı olacaqsınız, lakin onlarla hər şey o qədər də hamar deyil və bu həllərdə problemlər var:

  • tərtibatçıların təmizləməyi unutduğu böyük miqdarda iş vaxtı;
  • eyni iş vaxtlarının müxtəlif versiyaları arasında ziddiyyətlər var;
  • Hər bir tərtibatçıya fərqli komponentlər dəsti lazımdır.

Başqa problemlər də var, amma həllini sizə deyim.

Jenkins Docker-də

Docker indi inkişaf dünyasında yaxşı qurulduğundan, Docker istifadə edərək demək olar ki, hər şeyi idarə etmək olar. Mənim həllim odur ki, Jenkins-in Docker-də olması və digər Docker konteynerlərini işlədə bilsin. Bu sual 2013-cü ildə “ məqaləsində soruşulmağa başladı.Docker indi Docker daxilində işləyə bilər".

Bir sözlə, sadəcə Docker-in özünü işləyən konteynerə quraşdırmalı və faylı quraşdırmalısınız /var/run/docker.sock.

Jenkins üçün ortaya çıxan bir Dockerfile nümunəsidir.

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

Beləliklə, biz ana maşında Docker əmrlərini yerinə yetirə bilən Docker konteyneri əldə etdik.

Quraşdırma

Bir müddət əvvəl Jenkins öz qaydalarını istifadə edərək təsvir etmək imkanı əldə etdi Kəmər quruluş skriptini dəyişdirməyi və onu depoda saxlamağı asanlaşdıran sintaksis.

Odur ki, repozitoriyanın özünə xüsusi bir Dockerfile qoyaq ki, bu da quraşdırma üçün lazım olan bütün kitabxanaları ehtiva edir. Beləliklə, tərtibatçı özü təkrarlana bilən mühit hazırlaya bilər və OPS-dən Node.JS-in xüsusi versiyasını hostda quraşdırmasını tələb etməli olmayacaq.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Bu quruluş şəkli əksər Node.JS proqramları üçün uyğundur. Əgər, məsələn, içərisində Sonar skaneri olan JVM layihəsi üçün şəkilə ehtiyacınız olarsa? Montaj üçün lazım olan komponentləri seçməkdə sərbəstsiniz.

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/

Biz montaj mühitini təsvir etdik, amma Cenkinsin bununla nə əlaqəsi var? Jenkins agentləri belə Docker şəkilləri ilə işləyə və onları daxili şəkildə qura bilərlər.

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"
    }
}

Direktiv agent əmlakdan istifadə edir dockerharada qeyd edə bilərsiniz:

  • adlandırma siyasətinizə uyğun olaraq montaj qabının adı;
  • Quraşdırma konteynerini işə salmaq üçün lazım olan arqumentlər, burada bizim vəziyyətimizdə cari kataloqu konteynerin içərisində bir kataloq kimi quraşdırırıq.

Artıq qurma addımlarında biz Docker qurma agentində hansı əmrlərin yerinə yetiriləcəyini göstəririk. Bu hər hansı bir şey ola bilər, ona görə də mən ansible istifadə edərək proqram yerləşdirməsini işə salıram.

Aşağıda sadə Node.JS proqramının qura biləcəyi ümumi Jenkinsfile göstərmək istəyirəm.

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()
        }
    }

}

Nə olub?

Bu üsul sayəsində biz aşağıdakı problemləri həll etdik:

  • ətraf mühitin montajının konfiqurasiya müddəti hər layihə üçün 10 - 15 dəqiqəyə endirilir;
  • tamamilə təkrarlana bilən proqram qurma mühiti, çünki onu yerli kompüterinizdə bu şəkildə qura bilərsiniz;
  • montaj alətlərinin müxtəlif versiyaları arasında münaqişələrlə bağlı heç bir problem yoxdur;
  • həmişə tıxanmayan təmiz iş yeri.

Həllin özü sadə və aydındır və bəzi üstünlüklər əldə etməyə imkan verir. Bəli, yığıncaqlar üçün sadə əmrlərlə müqayisədə giriş həddi bir qədər yüksəldi, lakin indi onun həmişə qurulacağına və tərtibatçının özü qurma prosesi üçün lazım olan hər şeyi seçə biləcəyinə zəmanət var.

Topladığım şəkildən də istifadə edə bilərsiniz Jenkins + Docker. Bütün mənbələr açıqdır və burada yerləşir rmuhamedgaliev/jenkins_docker.

Bu məqaləni yazarkən, bir plagin istifadə edərək master nodu yükləməmək üçün uzaq serverlərdə agentlərdən istifadə ilə bağlı müzakirə yarandı. docker-plugin. Amma bu haqda gələcəkdə danışacam.

Mənbə: www.habr.com

Добавить комментарий