Ako zbierať projekty v Jenkins, ak potrebujete veľa rôznych prostredí

Ako zbierať projekty v Jenkins, ak potrebujete veľa rôznych prostredí

Na Habrém je veľa článkov o Jenkinsovi, ale len málo z nich popisuje príklady toho, ako Jenkins a agenti dockerov fungujú. Všetky populárne nástroje na vytváranie projektov, ako sú Drone.io, Bitbucket Pipeline, GitLab, Akcie GitHubu a iní, môžu zbierať všetko do kontajnerov. Ale čo Jenkins?

Dnes existuje riešenie problému: Jenkins 2 je skvelý v práci Dockeroví agenti. V tomto článku sa chcem podeliť o svoje skúsenosti a ukázať, ako to môžete urobiť sami.

Prečo som začal tento problém riešiť?

Keďže sme v spoločnosti Citronium Pretože používame veľa rôznych technológií, musíme mať na montážnom stroji rôzne verzie Node.JS, Gradle, Ruby, JDK a ďalšie. Konfliktom verzií sa však často nedá vyhnúť. Áno, budete mať pravdu, ak poviete, že existujú rôzni správcovia verzií ako nvm, rvm, ale nie všetko je s nimi také hladké a tieto riešenia majú problémy:

  • veľké množstvo runtime, ktoré vývojári zabúdajú vyčistiť;
  • existujú konflikty medzi rôznymi verziami rovnakých runtime;
  • Každý vývojár potrebuje inú sadu komponentov.

Existujú aj iné problémy, ale dovoľte mi povedať vám o riešení.

Jenkins v Dockeri

Keďže Docker je teraz vo vývojovom svete dobre zavedený, pomocou Dockera je možné spustiť takmer čokoľvek. Mojím riešením je mať Jenkinsa v Dockeri a môcť spúšťať iné kontajnery Docker. Táto otázka sa začala klásť už v roku 2013 v článku „Docker je teraz možné spustiť v rámci Docker".

Stručne povedané, stačí nainštalovať samotný Docker do funkčného kontajnera a pripojiť súbor /var/run/docker.sock.

Tu je príklad Dockerfile, ktorý sa ukázal pre 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

Získali sme teda kontajner Docker, ktorý môže vykonávať príkazy Docker na hostiteľskom počítači.

Zostavte nastavenie

Nedávno dostal Jenkins príležitosť opísať jeho pravidlá pomocou Potrubie syntax, vďaka čomu je celkom jednoduché zmeniť skript zostavy a uložiť ho do úložiska.

Dajme teda do samotného úložiska špeciálny Dockerfile, ktorý bude obsahovať všetky knižnice potrebné na zostavenie. Takto môže samotný vývojár pripraviť opakovateľné prostredie a nebude musieť žiadať OPS o inštaláciu konkrétnej verzie Node.JS na hostiteľa.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Tento obrázok zostavy je vhodný pre väčšinu aplikácií Node.JS. Čo ak napríklad potrebujete obrázok pre projekt JVM s integrovaným skenerom Sonar? Môžete si slobodne vybrať komponenty, ktoré potrebujete na montáž.

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/

Opísali sme prostredie montáže, ale čo s tým má spoločné Jenkins? A agenti Jenkins môžu s takýmito obrázkami Docker pracovať a vytvárať ich interne.

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

smernice agent užíva majetok dockerkde môžete špecifikovať:

  • názov montážneho kontajnera podľa vašej politiky pomenovania;
  • argumenty potrebné na spustenie kontajnera na zostavenie, kde v našom prípade pripojíme aktuálny adresár ako adresár vnútri kontajnera.

A už v krokoch zostavenia uvádzame, ktoré príkazy sa majú vykonať vo vnútri zostavovacieho agenta Docker. Môže to byť čokoľvek, takže spúšťam nasadzovanie aplikácií aj pomocou ansible.

Nižšie chcem ukázať generický Jenkinsfile, ktorý dokáže vytvoriť jednoduchá aplikácia 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()
        }
    }

}

Čo sa stalo?

Vďaka tejto metóde sme vyriešili nasledujúce problémy:

  • čas konfigurácie montáže prostredia je skrátený na 10 - 15 minút na projekt;
  • úplne opakovateľné prostredie na zostavovanie aplikácií, keďže si ho môžete takto zostaviť na svojom lokálnom počítači;
  • nie sú žiadne problémy s konfliktmi medzi rôznymi verziami montážnych nástrojov;
  • vždy čistý pracovný priestor, ktorý sa neupcháva.

Samotné riešenie je jednoduché a zrejmé a umožňuje vám získať určité výhody. Áno, vstupný prah sa v porovnaní s jednoduchými príkazmi pre zostavy trochu zvýšil, ale teraz je zaručené, že sa vždy zostaví a samotný vývojár si môže vybrať všetko, čo je potrebné pre jeho proces zostavovania.

Môžete tiež použiť obrázok, ktorý som zhromaždil Jenkins + Docker. Všetky zdroje sú otvorené a nachádzajú sa na adrese rmuhamedgaliev/jenkins_docker.

Pri písaní tohto článku vznikla diskusia o používaní agentov na vzdialených serveroch, aby sa nenačítal hlavný uzol pomocou pluginu docker-plugin. Ale o tom budem hovoriť v budúcnosti.

Zdroj: hab.com

Pridať komentár