Si të mblidhni projekte në Jenkins nëse keni nevojë për shumë mjedise të ndryshme

Si të mblidhni projekte në Jenkins nëse keni nevojë për shumë mjedise të ndryshme

Ka shumë artikuj në Habré rreth Jenkins, por pak përshkruajnë shembuj se si funksionojnë Jenkins dhe agjentët docker. Të gjitha mjetet e njohura të ndërtimit të projekteve si Drone.io, Tubacioni Bitbucket, GitLab, Veprimet e GitHub dhe të tjerët, mund të mbledhin gjithçka në kontejnerë. Por çfarë ndodh me Jenkins?

Sot ka një zgjidhje për problemin: Jenkins 2 është i shkëlqyeshëm për të punuar me të Agjentët Docker. Në këtë artikull dua të ndaj përvojën time dhe të tregoj se si mund ta bëni vetë.

Pse fillova ta zgjidh këtë problem?

Meqenëse jemi në shoqëri Citronium Për shkak se ne përdorim shumë teknologji të ndryshme, duhet të mbajmë versione të ndryshme të Node.JS, Gradle, Ruby, JDK dhe të tjera në makinën e montimit. Por shpesh konfliktet e versioneve nuk mund të shmangen. Po, do të keni të drejtë nëse thoni se ka menaxherë të ndryshëm versionesh si nvm, rvm, por jo gjithçka është aq e qetë me ta dhe këto zgjidhje kanë probleme:

  • një sasi e madhe kohëzgjatjeje që zhvilluesit harrojnë ta pastrojnë;
  • ka konflikte midis versioneve të ndryshme të të njëjtave kohëzgjatje;
  • Çdo zhvillues ka nevojë për një grup të ndryshëm komponentësh.

Ka probleme të tjera, por më lejoni t'ju tregoj për zgjidhjen.

Jenkins në Docker

Meqenëse Docker tani është i vendosur mirë në botën e zhvillimit, pothuajse çdo gjë mund të ekzekutohet duke përdorur Docker. Zgjidhja ime është të kem Jenkins në Docker dhe të jem në gjendje të drejtoj kontejnerë të tjerë Docker. Kjo pyetje filloi të bëhet në vitin 2013 në artikullin "Docker tani mund të ekzekutohet brenda Docker".

Me pak fjalë, ju vetëm duhet të instaloni vetë Docker në një enë pune dhe të montoni skedarin /var/run/docker.sock.

Këtu është një shembull Dockerfile që doli për 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

Kështu, ne morëm një enë Docker që mund të ekzekutojë komandat Docker në makinën pritës.

Ndërtimi i konfigurimit

Jo shumë kohë më parë Jenkins mori mundësinë për të përshkruar rregullat e saj duke përdorur Gazsjellës sintaksë, e cila e bën mjaft të lehtë ndryshimin e skriptit të ndërtimit dhe ruajtjen e tij në depo.

Pra, le të vendosim një Dockerfile të veçantë në vetë depo, e cila do të përmbajë të gjitha bibliotekat e nevojshme për ndërtimin. Në këtë mënyrë, vetë zhvilluesi mund të përgatisë një mjedis të përsëritshëm dhe nuk do të duhet të kërkojë nga OPS të instalojë një version specifik të Node.JS në host.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Ky imazh ndërtimi është i përshtatshëm për shumicën e aplikacioneve Node.JS. Po sikur, për shembull, t'ju duhet një imazh për një projekt JVM me një skaner Sonar të përfshirë brenda? Ju jeni të lirë të zgjidhni komponentët që ju nevojiten për montim.

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/

Ne përshkruam mjedisin e montimit, por çfarë lidhje ka Jenkins me të? Dhe agjentët e Jenkins mund të punojnë me imazhe të tilla Docker dhe t'i ndërtojnë ato brenda.

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 përdor pronë dockerku mund të specifikoni:

  • emrin e kontejnerit të montimit sipas politikës suaj të emërtimit;
  • argumentet e nevojshme për të ekzekutuar kontejnerin e ndërtimit, ku në rastin tonë ne montojmë direktoriumin aktual si një direktori brenda kontejnerit.

Dhe tashmë në hapat e ndërtimit ne tregojmë se cilat komanda duhet të ekzekutohen brenda agjentit të ndërtimit të Docker. Kjo mund të jetë çdo gjë, kështu që unë gjithashtu nis vendosjen e aplikacionit duke përdorur ansible.

Më poshtë dua të tregoj një Jenkinsfile gjenerike që mund të ndërtojë një aplikacion i thjeshtë Node.JS.

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

}

Cfare ndodhi?

Falë kësaj metode, ne zgjidhëm problemet e mëposhtme:

  • koha e konfigurimit të montimit të mjedisit reduktohet në 10 - 15 minuta për projekt;
  • një mjedis ndërtimi aplikacioni plotësisht të përsëritshëm, pasi mund ta ndërtoni në këtë mënyrë në kompjuterin tuaj lokal;
  • nuk ka probleme me konflikte midis versioneve të ndryshme të mjeteve të montimit;
  • gjithmonë një hapësirë ​​pune e pastër që nuk bllokohet.

Zgjidhja në vetvete është e thjeshtë dhe e dukshme dhe ju lejon të merrni disa avantazhe. Po, pragu i hyrjes është rritur pak në krahasim me komandat e thjeshta për asambletë, por tani ekziston një garanci që do të ndërtohet gjithmonë dhe vetë zhvilluesi mund të zgjedhë gjithçka që është e nevojshme për procesin e tij të ndërtimit.

Ju gjithashtu mund të përdorni imazhin që kam mbledhur Jenkins + Docker. Të gjitha burimet janë të hapura dhe të vendosura në rmuhamedgaliev/jenkins_docker.

Gjatë shkrimit të këtij artikulli, u ngrit një diskutim rreth përdorimit të agjentëve në serverët e largët në mënyrë që të mos ngarkohet nyja kryesore duke përdorur një shtojcë docker-plugin. Por unë do të flas për këtë në të ardhmen.

Burimi: www.habr.com

Shto një koment