Како прикупити пројекте у Јенкинсу ако вам треба много различитих окружења

Како прикупити пројекте у Јенкинсу ако вам треба много различитих окружења

Постоји много чланака на Хабреу о Џенкинсу, али неколико описује примере како функционишу Џенкинс и доцкер агенти. Сви популарни алати за прављење пројеката као што су Дроне.ио, Битбуцкет Пипелине, ГитЛаб, ГитХуб акције и други, могу све скупити у контејнере. Али шта је са Џенкинсом?

Данас постоји решење за проблем: Џенкинс 2 је одличан у раду Доцкер агенти. У овом чланку желим да поделим своје искуство и покажем како то можете учинити сами.

Зашто сам почео да решавам овај проблем?

Пошто смо у друштву Цитронијум Пошто користимо много различитих технологија, морамо да задржимо различите верзије Ноде.ЈС, Градле, Руби, ЈДК и других на машини за склапање. Али често се сукоби верзија не могу избећи. Да, бићете у праву ако кажете да постоје различити менаџери верзија као што су нвм, рвм, али није све тако глатко са њима и ова решења имају проблема:

  • велика количина времена извршавања коју програмери заборављају да очисте;
  • постоје сукоби између различитих верзија истог времена извршавања;
  • Сваком програмеру је потребан другачији скуп компоненти.

Постоје и други проблеми, али дозволите ми да вам кажем нешто о решењу.

Џенкинс у Доцкеру

Пошто је Доцкер сада добро успостављен у свету развоја, скоро све се може покренути помоћу Доцкера. Моје решење је да имам Џенкинса у Доцкер-у и да будем у могућности да покрећем друге Доцкер контејнере. Ово питање је почело да се поставља још 2013. године у чланку „Доцкер сада може да ради у оквиру Доцкер-а".

Укратко, само треба да инсталирате сам Доцкер у радни контејнер и монтирате датотеку /var/run/docker.sock.

Ево примера Доцкерфиле-а који се показао за Џенкинса.

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

Тако смо добили Доцкер контејнер који може да извршава Доцкер команде на главној машини.

Буилд сетуп

Не тако давно Џенкинс је добио прилику да опише своја правила користећи Цевовод синтаксу, што олакшава промену скрипте за изградњу и складиштење у спремишту.

Дакле, ставимо посебан Доцкерфиле у само спремиште, који ће садржати све библиотеке неопходне за прављење. На овај начин, сам програмер може да припреми поновљиво окружење и неће морати да тражи од ОПС-а да инсталира одређену верзију Ноде.ЈС-а на хосту.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Ова слика израде је погодна за већину Ноде.ЈС апликација. Шта ако вам је, на пример, потребна слика за ЈВМ пројекат са укљученим Сонар скенером? Слободно бирате компоненте које су вам потребне за монтажу.

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

Direktiva agent користи имовину dockerгде можете одредити:

  • назив контејнера за склапање према вашој политици именовања;
  • аргументи потребни за покретање контејнера за изградњу, где у нашем случају монтирамо тренутни директоријум као директоријум унутар контејнера.

И већ у корацима изградње указујемо које команде треба извршити унутар Доцкер агента за прављење. Ово може бити било шта, тако да такође покрећем примену апликације користећи ансибле.

У наставку желим да покажем генерички Јенкинсфиле који може да направи једноставна Ноде.ЈС апликација.

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 минута по пројекту;
  • потпуно поновљиво окружење за прављење апликација, пошто га на овај начин можете изградити на свом локалном рачунару;
  • нема проблема са сукобима између различитих верзија алата за склапање;
  • увек чист радни простор који се не запушава.

Само решење је једноставно и очигледно и омогућава вам да добијете неке предности. Да, улазни праг је мало порастао у поређењу са једноставним командама за склопове, али сада постоји гаранција да ће увек бити изграђен и да сам програмер може изабрати све што је неопходно за његов процес изградње.

Такође можете користити слику коју сам прикупио Јенкинс + Доцкер. Сви извори су отворени и налазе се на адреси рмухамедгалиев/јенкинс_доцкер.

Током писања овог чланка, настала је дискусија о коришћењу агената на удаљеним серверима како се не би учитавао главни чвор помоћу додатка доцкер-плугин. Али о овоме ћу говорити у будућности.

Извор: ввв.хабр.цом

Купите поуздан хостинг за сајтове са ДДоС заштитом, ВПС ВДС сервере 🔥 Купите поуздан веб хостинг са DDoS заштитом, VPS VDS сервере | ProHoster