Si të ndërtojmë projekte në Jenkins, kur nevojiten shumë ambientalitete të ndryshme

Si të ndërtojmë projekte në Jenkins, kur nevojiten shumë ambientalitete të ndryshme

Ka shumë artikuj në Habrë rreth Jenkins, por ka pak që përshkruajnë një shembull të funksionimit të Jenkins dhe agjentëve Docker. Të gjitha mjetet e njohura për ndërtimin e projekteve si Drone.io, Bitbucket Pipeline, GitLab, GitHub actions dhe të tjera, mund të ndërtojnë gjithçka në kontejnerë. Por çfarë me Jenkins?

Sot ka një zgjidhje për këtë problem: Jenkins 2 punon shumë mirë me agjentët Docker. Në këtë artikull, dëshiroj të ndaj përvojën time dhe të tregoj se si mund ta bëni vetë këtë.

Pse u merita me zgjidhjen e këtij problemi?

Pasi që në kompaninë Citronium përdorim një numër të madh teknologjish të ndryshme, në makinën e ndërtimit duhet të mbajmë versione të ndryshme të Node.JS, Gradle, Ruby, JDK dhe shumë të tjerave. Por shpesh konfliktet e versioneve janë të pashmangshme. Po, do të jeni të drejtë nëse thoni se ekzistojnë menaxherë versionesh si nvm, rvm, por nuk është gjithmonë e lehtë me ta, dhe këto zgjidhje kanë probleme:

  • një numër të madh runtime që zhvilluesit harrojnë të pastrojnë;
  • ka konflikte midis versioneve të ndryshme të të njëjtëve runtime;
  • secili zhvillues ka nevojë për një grup të ndryshëm komponentesh.

Ka edhe probleme të tjera, por le të flas më mirë për zgjidhjen.

Jenkins në Docker

Pasi që tani Docker është mirë themeluar në fushën e zhvillimit, pothuajse gjithçka mund të nisë përmes Docker. Zgjidhja ime është që Jenkins të jetë në Docker dhe të mundësojë nisin e kontejnerëve të tjerë Docker. Ky problem është diskutuar që në vitin 2013 në artikullin “Docker can now run within Docker«.

Nëse themi shkurt, thjesht është e nevojshme që në kontejnerin e punës të instalohet vetë Docker dhe të montoni skedarin /var/run/docker.sock.

Ja një shembull Dockerfile që kam krijuar për 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

Kështu kemi arritur një kontenier Docker që mund të ekzekutojë komandat Docker në makinën pritëse.

Konfigurimi i ndërtimit

Jo shumë kohë më parë, Jenkins mori mundësinë për të përshkruar rregullat e tij duke përdorur Pipeline sintaksit, që lejon që të ndryshoni mjaft lehtë skenarin e ndërtimit dhe ta ruani atë në repozitor.

Prandaj le të vendosim në vetë repozitorin një Dockerfile të veçantë, i cili do të përmbajë të gjitha bibliotekat e nevojshme për ndërtim. Kështu, zhvilluesi vet mund të përgatisë një mjedis të përsëritur dhe nuk do të jetë e nevojshme që OPS të kërkojë të instalohet një version i caktuar i Node.JS në host.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Ky imazh ndërtimi është i përshtatshëm për shumicën e aplikacioneve Node.JS. Dhe nëse, për shembull, ju nevojitet një imazh për një projekt JVM me skaner Sonar të përfshirë brenda? Ju jeni të lirë të zgjidhni komponentët që nevojiten për ndërtim.

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/

Ne e përshkruam mjedisin e ndërtimit, por çfarë lidhje ka këtu Jenkins? Agjentët e Jenkins dinë të punojnë me këto imazhe Docker dhe të kryejnë ndërtimin brenda.

stage("Ndërto projektin") {
    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 agjent përdor pronën docker, ku mund të specifikoni:

  • emrin e kontejnerit të ndërtimit sipas politikës tuaj të emërtimit;
  • argumentet e nevojshme për të nisur kontejnerin e ndërtimit, ku në rastin tonë ne po montojmë dizenjen aktuale si direktori brenda kontejnerit.

Dhe tashmë në hapat e ndërtimit ne përcaktojmë cilat komanda të kryejmë brenda agjentit Docker të ndërtimit. Kjo mund të jetë gjithçka, kështu që unë gjithashtu filloj depolimin e aplikacioneve me anë të ansible.

Më poshtë dëshiroj të tregoj një Jenkinsfile të përgjithshëm, i cili mund të ndjejë një aplikacion të thjeshtë 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()
        }
    }

}

Çfarë doli?

Falë këtij方式有限公司ne ne zgjidhëm problemet e mëposhtme:

  • kohëzgjatja e konfigurimit të mjedisit të ndërtimit reduktohet në 10 - 15 minuta për projekt;
  • një ambient ndërtimi plotësisht i ripërsëritshëm i aplikacionit, pasi mund të ndërtohet edhe në kompjuterin lokal;
  • nuk ka probleme me konflikte të versioneve të ndryshme të mjeteve të ndërtimit;
  • gjithmonë hapësirë e pastër pune, e cila nuk mbushet.

Vetë zgjidhja është e thjeshtë dhe e dukshme dhe lejon që të arrihen vetëm përfitime. Po, prakti i hyrjes është paksa i rritur në krahasim me komandat e thjeshta për ndërtim, por tani ka garanci që gjithmonë do të ndërtohet dhe zhvilluesi mund të zgjedhë vetë gjithçka që i nevojitet për procesin e ndërtimit.

Po ashtu, mund të përfitoni nga imazhi i ndërtuar nga unë Jenkins + Docker. Të gjitha burimet janë të hapura dhe ndodhen në rmuhamedgaliev\/jenkins_docker.

Gjatë shk writingtjes së artikullit, u zhvillua një diskutim mbi përdorimin e agjentëve në serverët e largët, për të mos ngarkuar nodën kryesore duke përdorur plugin-in docker-plugin. Por për këtë do të flas në të ardhmen.

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster