Cumu cullà prughjetti in Jenkins se avete bisognu di parechji ambienti diffirenti

Cumu cullà prughjetti in Jenkins se avete bisognu di parechji ambienti diffirenti

Ci hè parechje articuli nantu à Habré nantu à Jenkins, ma pocu descrizanu esempi di cumu travaglianu Jenkins è l'agenti docker. Tutti i prughjetti pupulari di custruì strumenti cum'è Drone.io, Pipeline di Bitbucket, GitLab, Azzione di GitHub è altri, ponu cullà tuttu in cuntenituri. Ma chì ne di Jenkins?

Oghje ci hè una suluzione à u prublema: Jenkins 2 hè grande à travaglià Agenti Docker. In questu articulu vogliu sparte a mo spirienza è mustrà cumu pudete fà da sè stessu.

Perchè aghju cuminciatu à risolve stu prublema?

Siccomu simu in cumpagnia Citronium Perchè usemu assai tecnulugii diffirenti, avemu da mantene diverse versioni di Node.JS, Gradle, Ruby, JDK è altri nantu à a macchina di assemblea. Ma spessu i cunflitti di versione ùn ponu esse evitati. Iè, avarete ragiò se dite chì ci sò diversi gestori di versione cum'è nvm, rvm, ma micca tuttu hè cusì liscia cun elli è queste suluzioni anu prublemi:

  • una grande quantità di runtime chì i sviluppatori si scurdanu di pulisce;
  • ci sò cunflitti trà e diverse versioni di i stessi runtimes;
  • Ogni sviluppatore hà bisognu di un settore diversu di cumpunenti.

Ci sò altri prublemi, ma lasciami dì di a suluzione.

Jenkins in Docker

Siccomu Docker hè avà ben stabilitu in u mondu di sviluppu, quasi tuttu pò esse gestitu cù Docker. A mo suluzione hè di avè Jenkins in Docker è esse capace di eseguisce altri cuntenituri Docker. Sta quistione hà cuminciatu à esse dumandata in u 2013 in l'articulu "Docker pò avà eseguisce in Docker".

In breve, basta à stallà Docker stessu in un containeru di travagliu è muntate u schedariu /var/run/docker.sock.

Eccu un esempiu di Dockerfile chì hè statu per Jenkins.

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

Cusì, avemu un containeru Docker chì pò eseguisce cumandamenti Docker nantu à a macchina host.

Custruisce a stallazione

Pocu tempu, Jenkins hà avutu l'uppurtunità di discrive e so regule utilizendu Pipeline sintassi, chì rende abbastanza faciule per cambià u script di custruzzione è almacenà in u repository.

Allora mettemu un Dockerfile speciale in u repositoriu stessu, chì cuntene tutte e librerie necessarie per a custruzione. Questu modu, u sviluppatore stessu pò preparà un ambiente ripetibile è ùn duverà micca dumandà à OPS per installà una versione specifica di Node.JS nantu à l'ospiti.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Questa immagine di custruzzione hè adattata per a maiò parte di l'applicazioni Node.JS. E se, per esempiu, avete bisognu di una maghjina per un prughjettu JVM cù un scanner Sonar inclusu in l'internu? Sò liberi di sceglie i cumpunenti chì avete bisognu per l'assemblea.

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/

Avemu discrittu l'ambienti di l'assemblea, ma chì Jenkins hà da fà cun questu? È l'agenti di Jenkins ponu travaglià cù tali imagine Docker è custruiscenu internamente.

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

Direttiva agent usa a pruprietà dockerinduve pudete specificà:

  • u nome di u containeru di l'assemblea secondu a vostra pulitica di nomenclatura;
  • argumenti necessarii per eseguisce u containeru di custruzzione, induve in u nostru casu muntemu u cartulare attuale cum'è un repertoriu in u containeru.

E digià in i passi di custruzzione indichemu quali cumandamenti da eseguisce in l'agente di creazione Docker. Questu pò esse qualcosa, cusì lanciau ancu a implementazione di l'applicazioni cù ansible.

Sottu vogliu mustrà un Jenkinsfile genericu chì una semplice applicazione Node.JS pò custruisce.

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

}

Chi hè successu?

Grazie à stu metudu, avemu risoltu i seguenti prublemi:

  • u tempu di cunfigurazione di l'assemblea di l'ambiente hè ridutta à 10 - 15 minuti per prughjettu;
  • un ambiente di creazione di applicazioni cumpletamente ripetibili, postu chì pudete custruisce cusì nantu à u vostru urdinatore locale;
  • ùn ci sò micca prublemi cù cunflitti trà e diverse versioni di strumenti di assemblea;
  • sempre un spaziu di travagliu pulitu chì ùn hè micca intasatu.

A suluzione stessu hè simplice è ovvia è permette di ottene qualchi vantaghji. Iè, u sogliu di entrata hè cresciutu un pocu cumparatu cù cumandamenti simplici per assemblee, ma avà ci hè una guaranzia chì serà sempre custruitu è ​​​​u sviluppatore stessu pò sceglie tuttu ciò chì hè necessariu per u so prucessu di custruzzione.

Pudete ancu aduprà l'imaghjini chì aghju cullatu Jenkins + Docker. Tutte e fonti sò aperte è situate à rmuhamedgaliev/jenkins_docker.

Mentre scrive stu articulu, hè stata una discussione nantu à l'usu di l'agenti nantu à i servitori remoti per ùn carricà u nodu maestru cù un plugin. docker-plugin. Ma parleraghju di questu in u futuru.

Source: www.habr.com

Add a comment