Kuidas koguda projekte Jenkinsis, kui on vaja palju erinevaid keskkondi

Kuidas koguda projekte Jenkinsis, kui on vaja palju erinevaid keskkondi

Habr'is on palju artikleid Jenkinsist, kuid vähe kuskil kirjeldatakse Jenkins ja Docker agentide töö näidet. Kõik populaarsed projektide kogumise tööriistad nagu Drone.io, Bitbucket Pipeline, GitLab, GitHub actions ja teised, saavad kõik koguda konteinerites. Aga kuidas on Jenkinsiga?

Tänaseks on probleemile lahendus: Jenkins 2 oskab suurepäraselt töötada Docker agentidega. Artiklis tahan jagada oma kogemusi ja näidata, kuidas saate seda ise teha.

Miks ma hakkasin selle probleemi lahendamisega tegelema?

Kuna me ettevõttes Citronium kasutame mitmeid erinevaid tehnoloogiaid, peab kogumise masinas olema erinevad Node.JS, Gradle, Ruby, JDK ja teiste versioonid. Kuid sageli ei ole versioonide kokkusattumine vältimatu. Jah, teete õigesti, kui ütlete, et on olemas erinevad versioonihaldurid nagu nvm, rvm, kuid kõik ei ole seal nii sujuv ja nende lahendustega on probleeme:

  • suur hulk runtime'e, mida arendajad unustavad puhastada;
  • on konflikte erinevate versioonide vahel samade runtime'ide seas;
  • igal arendajal on vaja erinevat komplekti komponente.

On ka muid probleeme, aga las ma räägin pigem lahendusest.

Jenkins Docker'is

Kuna Docker on juba kindlalt juurdunud arendusvaldkonnas, siis saab peaaegu kõike käivitada Dockeriga. Minu lahendus on see, et Jenkins oleks Dockeris ja suudaks käivitada teisi Docker konteinerite. Seda küsimust hakati arutama juba 2013. aastal artiklis «Docker saab nüüd töötada Dockeris«.

Kokkuvõttes on tõeliselt hädavajalik, et töökonteinerisse oleks paigaldatud Docker ja et fail oleks monteeritud /var/run/docker.sock.

Siin on näide Dockerfile'ist, mis saadi Jenkinsel.

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

Nii saime Docker konteineri, mis suudab käivitada Docker käsklusi hostmasinas.

Kogumisseade

Hiljuti sai Jenkins võimaluse kirjeldada oma reegleid Pipeline süntaks, mis võimaldab piisavalt lihtsalt vahetada kogumise skripti ja hoida seda repozitooriumis.

Nii et paneme repozitooriumi spetsiaalse Dockerfile'i, mis sisaldab kõiki vajalikke kogumise raamatukogusid. Nii saab arendaja ette valmistada korduva keskkonna ja ei pea opsilt paluma, et nad paigaldaksid serverisse teatud versiooni Node.JS-i.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Selline kogumise pilt sobib enamikule Node.JS rakendustele. Ja kui teil on näiteks vaja pilti JVM projekti jaoks, mis sisaldab endas Sonar skannerit? Teise valimise osas olete vabalt valitud vajalikke komponente.

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/

Oleme kirjeldanud kogumise keskkonda, kuid kuidas see Jenkinsiga seondub? Jenkinsi agentide oskus töötada selliste Docker-piltidega ja teostada kogumist sees.

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

Direktiiv agent kasutab omadust docker, kus saate määrata:

  • kogumise konteineri nimi vastavalt teie nimede poliitikale;
  • argumendid, mis on vajalikud kogumise konteineri käivitamiseks, kus meie juhul me montime praeguse kausta konteineri sees olevaks kaustaks.

Ja kogumise etappides määrame, milliseid käske teostada kogumise Docker agendi sees. See võib olla mis tahes, seega käivitan ka rakenduste juurutamise ansible'i abil.

Allpool tahan näidata üldist Jenkinsfile'i, mis võib koguda lihtsa Node.JS rakenduse.

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

}

Mis on tulemus?

Sellise meetodi abil lahendasime järgmised probleemid:

  • projektide konfigureerimise aeg väheneb 10–15 minutini;
  • täiesti reprodutseeritav rakenduse ehituskeskkond, kuna seda saab valmistada ka kohalikul arvutil;
  • pole probleeme erinevate ehitustööriistade versioonide konfliktidega;
  • alati puhas tööruum, mis ei ole ummistunud.

Lahendus on iseenda jaoks lihtne ja ilmne, pakkudes ainult eeliseid. Jah, sisenemiskünnis on võrreldes lihtsate ehituskäsudega veidi tõusnud, kuid nüüd on tagatud, et ehitus toimub alati ning arendaja saab valida kõik, mis on vajalik tema ehitusprotsessiks.

Samuti võite kasutada minu koostatud pilti Jenkins + Docker. Kõik lähtekoodid on avatud ja asuvad aadressil rmuhamedgaliev/jenkins_docker.

Artikli kirjutamise käigus tekkis arutelu agentide kasutamise üle kaugsüsteemides, et mitte koormata põhinoode plugina abil docker-plugin. Kuid sellest räägin tulevikus.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster