Sut i gasglu prosiectau yn Jenkins os oes angen llawer o amgylcheddau gwahanol arnoch

Sut i gasglu prosiectau yn Jenkins os oes angen llawer o amgylcheddau gwahanol arnoch

Mae llawer o erthyglau ar Habré am Jenkins, ond ychydig sy'n disgrifio enghreifftiau o sut mae Jenkins ac asiantau docwyr yn gweithio. Pob offeryn adeiladu prosiect poblogaidd fel Drone.io, Piblinell Bitbucket, GitLab, Gweithredoedd GitHub ac eraill, yn gallu casglu popeth mewn cynwysyddion. Ond beth am Jenkins?

Heddiw mae ateb i’r broblem: mae Jenkins 2 yn wych am weithio gydag ef Asiantau docwyr. Yn yr erthygl hon rwyf am rannu fy mhrofiad a dangos sut y gallwch chi ei wneud eich hun.

Pam wnes i ddechrau datrys y broblem hon?

Gan ein bod mewn cwmni Citronium Oherwydd ein bod yn defnyddio llawer o wahanol dechnolegau, mae'n rhaid i ni gadw gwahanol fersiynau o Node.JS, Gradle, Ruby, JDK ac eraill ar y peiriant cydosod. Ond yn aml ni ellir osgoi gwrthdaro fersiwn. Byddwch, byddwch yn iawn os dywedwch fod yna wahanol reolwyr fersiwn fel nvm, rvm, ond nid yw popeth mor llyfn â nhw ac mae gan yr atebion hyn broblemau:

  • llawer iawn o amser rhedeg y mae datblygwyr yn anghofio ei lanhau;
  • mae gwrthdaro rhwng gwahanol fersiynau o'r un amseroedd rhedeg;
  • Mae angen set wahanol o gydrannau ar bob datblygwr.

Mae problemau eraill, ond gadewch imi ddweud wrthych am yr ateb.

Jenkins yn Docker

Gan fod Docker bellach wedi'i hen sefydlu yn y byd datblygu, gellir rhedeg bron unrhyw beth gan ddefnyddio Docker. Fy ateb yw cael Jenkins yn Docker a gallu rhedeg cynwysyddion Docker eraill. Dechreuwyd gofyn y cwestiwn hwn yn ôl yn 2013 yn yr erthygl “Gall Docker nawr redeg o fewn Docker".

Yn fyr, does ond angen i chi osod Docker ei hun mewn cynhwysydd sy'n gweithio a gosod y ffeil /var/run/docker.sock.

Dyma enghraifft Dockerfile a drodd allan i 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

Felly, cawsom gynhwysydd Docker a all weithredu gorchmynion Docker ar y peiriant gwesteiwr.

Adeiladu setup

Ddim yn bell yn ôl cafodd Jenkins y cyfle i ddisgrifio ei reolau gan ddefnyddio Pipeline cystrawen, sy'n ei gwneud hi'n eithaf hawdd newid y sgript adeiladu a'i storio yn y gadwrfa.

Felly gadewch i ni roi Dockerfile arbennig yn yr ystorfa ei hun, a fydd yn cynnwys yr holl lyfrgelloedd sy'n angenrheidiol ar gyfer yr adeiladu. Fel hyn, gall y datblygwr ei hun baratoi amgylchedd ailadroddadwy ac ni fydd yn rhaid iddo ofyn i OPS osod fersiwn benodol o Node.JS ar y gwesteiwr.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Mae'r ddelwedd adeiladu hon yn addas ar gyfer y rhan fwyaf o gymwysiadau Node.JS. Beth os, er enghraifft, mae angen delwedd arnoch ar gyfer prosiect JVM gyda sganiwr Sonar wedi'i gynnwys y tu mewn? Rydych chi'n rhydd i ddewis y cydrannau sydd eu hangen arnoch chi ar gyfer cydosod.

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/

Disgrifiasom amgylchedd y cynulliad, ond beth sydd gan Jenkins i'w wneud ag ef? A gall asiantau Jenkins weithio gyda delweddau Docker o'r fath a'u hadeiladu'n fewnol.

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

Cyfarwyddeb agent yn defnyddio eiddo dockerlle gallwch chi nodi:

  • enw'r cynhwysydd cydosod yn unol â'ch polisi enwi;
  • dadleuon sydd eu hangen i redeg y cynhwysydd adeiladu, lle yn ein hachos ni rydym yn gosod y cyfeiriadur cyfredol fel cyfeiriadur y tu mewn i'r cynhwysydd.

Ac eisoes yn y camau adeiladu rydym yn nodi pa orchmynion i'w gweithredu y tu mewn i asiant adeiladu Docker. Gall hyn fod yn unrhyw beth, felly rwyf hefyd yn lansio defnydd cais gan ddefnyddio ansible.

Isod rwyf am ddangos ffeil Jenkins generig y gall cymhwysiad Node.JS syml ei adeiladu.

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

}

Beth ddigwyddodd?

Diolch i'r dull hwn, rydym wedi datrys y problemau canlynol:

  • mae amser cyfluniad y cynulliad amgylchedd yn cael ei leihau i 10 - 15 munud fesul prosiect;
  • amgylchedd adeiladu cymwysiadau cwbl ailadroddadwy, oherwydd gallwch chi ei adeiladu fel hyn ar eich cyfrifiadur lleol;
  • nid oes unrhyw broblemau gyda gwrthdaro rhwng gwahanol fersiynau o offer cydosod;
  • man gwaith glân bob amser nad yw'n rhwystredig.

Mae'r ateb ei hun yn syml ac yn amlwg ac yn caniatáu ichi gael rhai manteision. Ydy, mae'r trothwy mynediad wedi codi ychydig o'i gymharu â gorchmynion syml ar gyfer gwasanaethau, ond nawr mae gwarant y bydd bob amser yn cael ei adeiladu a gall y datblygwr ei hun ddewis popeth sy'n angenrheidiol ar gyfer ei broses adeiladu.

Gallwch hefyd ddefnyddio'r ddelwedd a gasglwyd gennyf Jenkins + Dociwr. Mae pob ffynhonnell yn agored ac wedi'i lleoli yn rmuhamedgaliev/jenkins_docker.

Wrth ysgrifennu'r erthygl hon, cododd trafodaeth am ddefnyddio asiantau ar weinyddion pell er mwyn peidio â llwytho'r prif nod gan ddefnyddio ategyn docker-plug. Ond byddaf yn siarad am hyn yn y dyfodol.

Ffynhonnell: hab.com

Ychwanegu sylw