Jak sbírat projekty v Jenkins, pokud potřebujete mnoho různých prostředí

Jak sbírat projekty v Jenkins, pokud potřebujete mnoho různých prostředí

Existuje mnoho článků o Habrém o Jenkinsovi, ale jen málo z nich popisuje příklady toho, jak Jenkins a docker agenti pracují. Všechny oblíbené nástroje pro vytváření projektů jako Drone.io, Bitbucket Pipeline, GitLab, Akce GitHubu a další, mohou sbírat vše do kontejnerů. Ale co Jenkins?

Dnes existuje řešení problému: Jenkins 2 je skvělý v práci Dockeroví agenti. V tomto článku se chci podělit o své zkušenosti a ukázat, jak to můžete udělat sami.

Proč jsem tento problém začal řešit?

Protože jsme ve společnosti Citronium Protože používáme mnoho různých technologií, musíme mít na montážním stroji různé verze Node.JS, Gradle, Ruby, JDK a další. Konfliktům verzí se ale často nelze vyhnout. Ano, budete mít pravdu, pokud řeknete, že existují různí správci verzí jako nvm, rvm, ale ne všechno je s nimi tak hladké a tato řešení mají problémy:

  • velké množství běhového prostředí, které vývojáři zapomínají vyčistit;
  • existují konflikty mezi různými verzemi stejných runtime;
  • Každý vývojář potřebuje jinou sadu komponent.

Existují další problémy, ale dovolte mi, abych vám řekl o řešení.

Jenkins v Dockeru

Vzhledem k tomu, že Docker je nyní ve vývojovém světě dobře zaveden, lze pomocí Dockeru spustit téměř cokoliv. Mým řešením je mít Jenkinse v Dockeru a mít možnost spouštět další kontejnery Dockeru. Tato otázka se začala klást již v roce 2013 v článku „Docker lze nyní spustit v rámci Dockeru".

Zkrátka stačí nainstalovat samotný Docker do funkčního kontejneru a soubor připojit /var/run/docker.sock.

Zde je příklad Dockerfile, který se ukázal pro Jenkinse.

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 jsme tedy kontejner Docker, který může spouštět příkazy Docker na hostitelském počítači.

Sestavit nastavení

Před nedávnem dostal Jenkins příležitost popsat jeho pravidla pomocí Potrubí syntaxe, díky které je docela snadné změnit skript sestavení a uložit jej do úložiště.

Vložme tedy do samotného úložiště speciální Dockerfile, který bude obsahovat všechny knihovny nutné pro sestavení. Vývojář si tak může sám připravit opakovatelné prostředí a nebude muset žádat OPS o instalaci konkrétní verze Node.JS na hostitele.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Tento obrázek sestavení je vhodný pro většinu aplikací Node.JS. Co když například potřebujete obrázek pro projekt JVM s integrovaným skenerem Sonar? Můžete si svobodně vybrat komponenty, které potřebujete pro 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/

Popsali jsme prostředí montáže, ale co s tím má společného Jenkins? A agenti Jenkins mohou s takovými obrazy Docker pracovat a vytvářet je interně.

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

Směrnice agent používá majetek dockerkde můžete specifikovat:

  • název kontejneru sestavy podle vaší zásady pojmenování;
  • argumenty potřebné pro spuštění kontejneru sestavení, kde v našem případě připojíme aktuální adresář jako adresář uvnitř kontejneru.

A již v krocích sestavení uvádíme, které příkazy se mají provést v agentovi sestavení Docker. To může být cokoliv, takže také spouštím nasazení aplikací pomocí ansible.

Níže chci ukázat obecný Jenkinsfile, který může sestavit jednoduchá aplikace 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()
        }
    }

}

Co se stalo?

Díky této metodě jsme vyřešili následující problémy:

  • doba konfigurace montáže prostředí je snížena na 10 - 15 minut na projekt;
  • zcela opakovatelné prostředí pro sestavení aplikace, protože jej můžete takto sestavit na svém místním počítači;
  • nejsou žádné problémy s konflikty mezi různými verzemi montážních nástrojů;
  • vždy čistý pracovní prostor, který se neucpává.

Samotné řešení je jednoduché a zřejmé a umožňuje vám získat některé výhody. Ano, vstupní práh se ve srovnání s jednoduchými příkazy pro sestavy trochu zvedl, ale nyní je zaručeno, že se bude stavět vždy a samotný vývojář si může vybrat vše, co je pro jeho proces sestavení nezbytné.

Můžete také použít obrázek, který jsem shromáždil Jenkins + Docker. Všechny zdroje jsou otevřené a umístěné na rmuhamedgaliev/jenkins_docker.

Při psaní tohoto článku vznikla diskuse o použití agentů na vzdálených serverech, aby nedošlo k načtení hlavního uzlu pomocí pluginu docker-plugin. Ale o tom budu mluvit v budoucnu.

Zdroj: www.habr.com

Přidat komentář