Kako prikupiti projekte u Jenkinsu ako vam treba mnogo različitih okruženja

Kako prikupiti projekte u Jenkinsu ako vam treba mnogo različitih okruženja

Na Habréu postoji mnogo članaka o Jenkinsu, ali nekoliko opisuje primjere kako funkcioniraju Jenkins i docker agenti. Svi popularni alati za izradu projekata kao što su Drone.io, Bitbucket Pipeline, GitLab, GitHub akcije i drugi, mogu sve skupljati u kontejnere. Ali šta je sa Dženkinsom?

Danas postoji rješenje za problem: Jenkins 2 je odličan u radu Docker agenti. U ovom članku želim podijeliti svoje iskustvo i pokazati kako to možete učiniti sami.

Zašto sam počeo da rešavam ovaj problem?

Pošto smo u društvu Citronium Budući da koristimo mnogo različitih tehnologija, moramo zadržati različite verzije Node.JS, Gradle, Ruby, JDK i druge na mašini za sklapanje. Ali često se sukobi verzija ne mogu izbjeći. Da, bićete u pravu ako kažete da postoje razni menadžeri verzija poput nvm, rvm, ali kod njih nije sve tako glatko i ova rješenja imaju problema:

  • velika količina vremena izvođenja koje programeri zaboravljaju očistiti;
  • postoje sukobi između različitih verzija istog vremena izvođenja;
  • Svaki programer treba drugačiji skup komponenti.

Ima i drugih problema, ali dozvolite mi da vam kažem nešto o rješenju.

Jenkins u Dockeru

Pošto je Docker sada dobro uspostavljen u svijetu razvoja, gotovo sve se može pokrenuti pomoću Dockera. Moje rješenje je imati Jenkinsa u Dockeru i moći pokrenuti druge Docker kontejnere. Ovo pitanje počelo se postavljati još 2013. godine u članku “Docker se sada može pokrenuti unutar Dockera".

Ukratko, samo trebate instalirati sam Docker u radni kontejner i montirati datoteku /var/run/docker.sock.

Evo primjera Dockerfile-a koji je ispao za Jenkinsa.

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

Tako smo dobili Docker kontejner koji može izvršavati Docker komande na host mašini.

Build setup

Ne tako davno Jenkins je dobio priliku da opiše svoja pravila koristeći cjevovod sintaksu, što olakšava promjenu skripte za izgradnju i pohranjivanje u spremište.

Dakle, stavimo poseban Dockerfile u samo spremište, koji će sadržavati sve biblioteke potrebne za izgradnju. Na ovaj način, sam programer može pripremiti ponovljivo okruženje i neće morati tražiti od OPS-a da instalira određenu verziju Node.JS-a na hostu.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Ova build slika je pogodna za većinu Node.JS aplikacija. Što ako vam je, na primjer, potrebna slika za JVM projekt s uključenim Sonar skenerom? Slobodno birate komponente koje su vam potrebne za montažu.

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/

Opisali smo okruženje za sklapanje, ali kakve veze Dženkins ima s tim? A agenti Jenkinsa mogu raditi s takvim Docker slikama i interno ih izgraditi.

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 koristi imovinu dockergdje možete odrediti:

  • naziv kontejnera za sklapanje prema vašoj politici imenovanja;
  • argumente potrebne za pokretanje kontejnera za izgradnju, gdje u našem slučaju montiramo trenutni direktorij kao direktorij unutar kontejnera.

I već u koracima izgradnje ukazujemo koje naredbe treba izvršiti unutar Docker agenta za izgradnju. Ovo može biti bilo šta, tako da pokrećem i implementaciju aplikacije koristeći ansible.

U nastavku želim pokazati generički Jenkinsfile koji može napraviti jednostavna Node.JS aplikacija.

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

}

Šta se desilo?

Zahvaljujući ovoj metodi riješili smo sljedeće probleme:

  • vrijeme konfiguracije montaže okruženja je smanjeno na 10 - 15 minuta po projektu;
  • potpuno ponovljivo okruženje za pravljenje aplikacija, budući da ga na ovaj način možete izgraditi na svom lokalnom računaru;
  • nema problema s sukobima između različitih verzija alata za sklapanje;
  • uvijek čist radni prostor koji se ne začepljuje.

Samo rješenje je jednostavno i očigledno i omogućava vam da dobijete neke prednosti. Da, ulazni prag je malo porastao u odnosu na jednostavne komande za sklopove, ali sada postoji garancija da će uvijek biti izgrađen i da sam programer može odabrati sve što je potrebno za njegov proces izgradnje.

Možete koristiti i sliku koju sam prikupio Jenkins + Docker. Svi izvori su otvoreni i nalaze se na adresi rmuhamedgaliev/jenkins_docker.

Tokom pisanja ovog članka, pokrenula se rasprava o korištenju agenata na udaljenim serverima kako se ne bi učitavao glavni čvor pomoću dodatka docker-plugin. Ali o tome ću govoriti u budućnosti.

izvor: www.habr.com

Dodajte komentar