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

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

Na Habréu postoji mnogo članaka o Jenkinsu, ali malo ih opisuje kako Jenkins i dokeri agenti rade. Svi popularni alati za izradu projekata poput Drone.io, Bitbucket cjevovod, GitLab, GitHub akcije i drugi, mogu skupljati sve u kontejnere. Ali što je s Jenkinsom?

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

Zašto sam počeo rješavati ovaj problem?

Budući da smo u društvu Citronij Budući da koristimo mnogo različitih tehnologija, moramo držati različite verzije Node.JS, Gradle, Ruby, JDK i drugih na stroju za sklapanje. Ali često se sukobi verzija ne mogu izbjeći. Da, bit ćete u pravu ako kažete da postoje razni upravitelji verzija poput nvm, rvm, ali s njima nije sve tako glatko i ova rješenja imaju problema:

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

Postoje i drugi problemi, ali reći ću vam rješenje.

Jenkins u Dockeru

Budući da 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 spremnike. Ovo pitanje počelo se postavljati još 2013. godine u članku “Docker sada može raditi unutar Dockera”.

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

Evo primjera Dockerfilea 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 naredbe na glavnom računalu.

Postavljanje građenja

Nedavno je Jenkins dobio priliku opisati svoja pravila korištenjem Cjevovod sintaksu, što olakšava promjenu skripte za izgradnju i njezino pohranjivanje u repozitorij.

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

FROM node:12.10.0-alpine

RUN npm install yarn -g

Ova je slika prikladna za većinu Node.JS aplikacija. Što ako vam je, na primjer, potrebna slika za JVM projekt s uključenim sonarnim skenerom? Slobodni ste odabrati 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 sklopa, ali što Jenkins ima s tim? Jenkinsovi agenti mogu raditi s takvim Docker slikama i graditi ih interno.

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 navesti:

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

I već u koracima izgradnje ukazujemo koje naredbe treba izvršiti unutar Docker build agenta. To može biti bilo što, tako da također pokrećem implementaciju aplikacije koristeći ansible.

U nastavku želim pokazati generičku Jenkins datoteku koju može izgraditi 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()
        }
    }

}

Što se dogodilo?

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

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

Samo rješenje je jednostavno i očito i omogućuje vam da dobijete neke prednosti. Da, ulazni prag je malo porastao u usporedbi s jednostavnim naredbama za sklopove, ali sada postoji jamstvo da će se uvijek graditi i sam programer može odabrati sve što je potrebno za njegov proces izgradnje.

Također možete koristiti sliku koju sam prikupio Jenkins + Docker. Svi izvori su otvoreni i nalaze se na rmuhamedgaliev/jenkins_docker.

Tijekom pisanja ovog članka pojavila se rasprava o korištenju agenata na udaljenim poslužiteljima 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