Hvernig á að safna verkefnum í Jenkins ef þú þarft mörg mismunandi umhverfi

Hvernig á að safna verkefnum í Jenkins ef þú þarft mörg mismunandi umhverfi

Það eru margar greinar á Habré um Jenkins, en fáar lýsa dæmum um hvernig Jenkins og hafnarverkamenn vinna. Öll vinsæl verkfæri verkefna eins og Drone.io, Bitbucket leiðsla, GitLab, GitHub aðgerðir og aðrir, geta safnað öllu í gáma. En hvað með Jenkins?

Í dag er lausn á vandamálinu: Jenkins 2 er frábært að vinna með Skipagerðarmenn. Í þessari grein vil ég deila reynslu minni og sýna hvernig þú getur gert það sjálfur.

Af hverju byrjaði ég að leysa þetta vandamál?

Þar sem við erum í félagsskap Sítróníum Vegna þess að við notum margar mismunandi tækni, verðum við að hafa mismunandi útgáfur af Node.JS, Gradle, Ruby, JDK og öðrum á samsetningarvélinni. En oft er ekki hægt að forðast útgáfuárekstra. Já, það er rétt hjá þér ef þú segir að það séu til ýmsir útgáfustjórar eins og nvm, rvm, en ekki er allt svo slétt með þá og þessar lausnir hafa vandamál:

  • mikið magn af keyrslutíma sem forritarar gleyma að þrífa;
  • það eru árekstrar á milli mismunandi útgáfur af sömu keyrslutíma;
  • Sérhver þróunaraðili þarf mismunandi sett af íhlutum.

Það eru önnur vandamál, en ég skal segja þér frá lausninni.

Jenkins í Docker

Þar sem Docker er nú vel við lýði í þróunarheiminum er hægt að keyra næstum hvað sem er með Docker. Mín lausn er að hafa Jenkins í Docker og geta keyrt aðra Docker gáma. Þessi spurning byrjaði að vera spurð aftur árið 2013 í greininni "Docker getur nú keyrt innan Docker".

Í stuttu máli, þú þarft bara að setja Docker sjálft upp í virka ílát og tengja skrána /var/run/docker.sock.

Hér er dæmi um Dockerfile sem reyndist Jenkins.

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

Þannig fengum við Docker gám sem getur framkvæmt Docker skipanir á hýsingarvélinni.

Byggja uppsetningu

Ekki er langt síðan Jenkins fékk tækifæri til að lýsa reglum sínum með því að nota Leiðslukerfi setningafræði, sem gerir það frekar auðvelt að breyta byggingarforritinu og geyma það í geymslunni.

Svo skulum við setja sérstaka Dockerfile í geymsluna sjálfa, sem mun innihalda öll nauðsynleg bókasöfn fyrir bygginguna. Þannig getur verktaki sjálfur undirbúið endurtekið umhverfi og þarf ekki að biðja OPS um að setja upp ákveðna útgáfu af Node.JS á hýsilinn.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Þessi smíðamynd hentar flestum Node.JS forritum. Hvað ef þú þarft til dæmis mynd fyrir JVM verkefni með Sonar skanni innifalinn? Þér er frjálst að velja þá íhluti sem þú þarft fyrir samsetningu.

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/

Við lýstum samsetningarumhverfinu, en hvað hefur Jenkins með það að gera? Og umboðsmenn Jenkins geta unnið með slíkar Docker myndir og smíðað þær innbyrðis.

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

Tilskipun agent notar eign dockerþar sem þú getur tilgreint:

  • nafn samsetningarílátsins samkvæmt nafnastefnu þinni;
  • rök sem þarf til að keyra byggingargáminn, þar sem í okkar tilviki festum við núverandi möppu sem möppu inni í gámnum.

Og þegar í byggingarskrefunum tilgreinum við hvaða skipanir á að framkvæma innan Docker byggingarfulltrúans. Þetta getur verið hvað sem er, svo ég ræsi líka uppsetningu forrita með því að nota ansible.

Hér að neðan vil ég sýna almenna Jenkinsskrá sem einfalt Node.JS forrit getur byggt.

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

}

Hvað gerðist?

Þökk sé þessari aðferð leystum við eftirfarandi vandamál:

  • Stillingartími umhverfissamsetningar minnkar í 10 - 15 mínútur á hvert verkefni;
  • algjörlega endurtekið forritsbyggingarumhverfi, þar sem þú getur byggt það upp á þennan hátt á heimatölvunni þinni;
  • það eru engin vandamál með árekstra milli mismunandi útgáfur af samsetningarverkfærum;
  • alltaf hreint vinnusvæði sem stíflast ekki.

Lausnin sjálf er einföld og augljós og gerir þér kleift að fá nokkra kosti. Já, aðgangsþröskuldurinn hefur hækkað aðeins miðað við einfaldar skipanir fyrir samsetningar, en nú er trygging fyrir því að það verði alltaf byggt og verktaki getur sjálfur valið allt sem er nauðsynlegt fyrir byggingarferli hans.

Þú getur líka notað myndina sem ég safnaði Jenkins + Docker. Allar heimildir eru opnar og staðsettar kl rmuhamedgaliev/jenkins_docker.

Við ritun þessarar greinar kom upp umræða um að nota umboðsmenn á ytri netþjónum til að hlaða ekki aðalhnút með viðbót docker-viðbót. En ég mun tala um þetta í framtíðinni.

Heimild: www.habr.com

Bæta við athugasemd