Nola bildu proiektuak Jenkins-en hainbat ingurune behar badituzu

Nola bildu proiektuak Jenkins-en hainbat ingurune behar badituzu

Jenkins-i buruzko HabrΓ©-ri buruzko artikulu asko daude, baina gutxi batzuk deskribatzen dituzte Jenkins eta docker agenteek nola funtzionatzen duten. Horrelako proiektu ezagun guztiak eraikitzeko tresnak Drone.io, Bitbucket Pipeline, GitLab, GitHub ekintzak eta beste batzuk, dena edukiontzietan jaso dezakete. Baina zer gertatzen da Jenkins?

Gaur egun arazoari irtenbide bat dago: Jenkins 2 bikaina da lanean Docker agenteak. Artikulu honetan nire esperientzia partekatu nahi dut eta zuk zeuk nola egin dezakezun erakutsi.

Zergatik hasi nintzen arazo hau konpontzen?

Konpainian gaudenez Zitronioa Hainbat teknologia erabiltzen ditugunez, Node.JS, Gradle, Ruby, JDK eta beste hainbat bertsio gorde behar ditugu muntaia-makinan. Baina askotan bertsio gatazkak ezin dira saihestu. Bai, arrazoia izango duzu nvm, rvm bezalako bertsio-kudeatzaile desberdinak daudela esaten baduzu, baina haiekin dena ez da hain erraza eta irtenbide hauek arazoak dituzte:

  • Garatzaileek garbitzea ahazten duten exekuzio-denbora handi bat;
  • exekuzio-denbora beraren bertsio ezberdinen artean gatazkak daude;
  • Garatzaile bakoitzak osagai multzo ezberdin bat behar du.

Badira beste arazo batzuk, baina konponbidearen berri emango dizut.

Jenkins Docker-en

Docker garapen munduan ondo ezarrita dagoenez, ia edozer gauza exekutatu daiteke Docker erabiliz. Nire irtenbidea Jenkins Docker-en izatea eta beste Docker-eko edukiontzi batzuk exekutatu ahal izatea da. Galdera hau 2013an hasi zen egiten "artikuluanDocker-ek Docker barruan exekutatu daiteke orain".

Laburbilduz, Docker bera laneko edukiontzi batean instalatu eta fitxategia muntatu besterik ez duzu behar /var/run/docker.sock.

Hona hemen Jenkinsentzat atera den Dockerfile adibide bat.

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

Horrela, Docker edukiontzi bat lortu dugu, Docker komandoak exekutatu ditzakeen makina ostalarian.

Eraikitzeko konfigurazioa

Duela ez asko Jenkinsek bere arauak erabiliz deskribatzeko aukera izan zuen Pipeline sintaxia, eta horrek nahiko erraz egiten du eraikitze-scripta aldatzea eta biltegian gordetzea.

Beraz, jar dezagun Dockerfile berezi bat biltegian bertan, eraikuntzarako beharrezkoak diren liburutegi guztiak edukiko dituena. Horrela, garatzaileak berak ingurune errepikagarria prestatu dezake eta ez dio OPS-ri eskatu beharko Ostalarian Node.JS-ren bertsio zehatz bat instalatzeko.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Eraikitze-irudi hau Node.JS aplikazio gehienetarako egokia da. Zer gertatzen da, adibidez, barruan Sonar eskaner bat duen JVM proiektu baterako irudi bat behar baduzu? Muntatzeko behar dituzun osagaiak aukeratzeko askatasuna duzu.

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/

Muntaketa-ingurunea deskribatu genuen, baina zer zerikusi du Jenkinsek? Eta Jenkins-eko agenteek Docker-eko irudiekin lan egin dezakete eta barnean eraiki ditzakete.

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

Zuzentaraua agent jabetza erabiltzen du dockernon zehaztu dezakezu:

  • muntaketa-edukiontziaren izena zure izendatze-politikaren arabera;
  • eraikitzeko edukiontzia exekutatzeko beharrezkoak diren argumentuak, non gure kasuan uneko direktorioa edukiontzi barruan direktorio gisa muntatzen dugu.

Eta dagoeneko eraikitzeko urratsetan Docker eraikitzeko agentearen barruan zein komando exekutatu behar diren adierazten dugu. Hau edozer izan daiteke, beraz, aplikazioen hedapena ere abiarazten dut ansible erabiliz.

Jarraian, Node.JS aplikazio sinple batek eraiki dezakeen Jenkinsfile generiko bat erakutsi nahi dut.

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

}

Zer gertatu da?

Metodo honi esker, arazo hauek konpondu ditugu:

  • ingurunea muntatzeko konfigurazio-denbora 10 - 15 minutura murrizten da proiektu bakoitzeko;
  • guztiz errepikagarria den aplikazioa eraikitzeko ingurunea, zure tokiko ordenagailuan horrela eraiki dezakezu eta;
  • ez dago arazorik muntaketa tresnen bertsio ezberdinen arteko gatazkekin;
  • beti trabatu egiten ez den lan-espazio garbia.

Irtenbidea bera erraza eta bistakoa da eta abantaila batzuk lortzeko aukera ematen du. Bai, sarrera-atalasea apur bat igo da muntaien komando sinpleekin alderatuta, baina orain beti eraikiko den bermea dago eta garatzaileak berak bere eraikuntza-prozesurako beharrezkoa den guztia aukeratu dezake.

Nik bildutako irudia ere erabil dezakezu Jenkins + Docker. Iturri guztiak irekita daude eta helbidean kokatuta daude rmuhamedgaliev/jenkins_docker.

Artikulu hau idaztean, eztabaida sortu zen urruneko zerbitzarietan agenteak erabiltzeari buruz, nodo nagusia plugin bat erabiliz ez kargatzeko docker-plugin. Baina honetaz hitz egingo dut aurrerantzean.

Iturria: www.habr.com

Gehitu iruzkin berria