Giunsa pagkolekta ang mga proyekto sa Jenkins kung kinahanglan nimo ang daghang lainlaing mga palibot

Giunsa pagkolekta ang mga proyekto sa Jenkins kung kinahanglan nimo ang daghang lainlaing mga palibot

Adunay daghang mga artikulo sa Habré bahin kang Jenkins, apan pipila ra ang naghulagway sa mga pananglitan kung giunsa ang pagtrabaho sa Jenkins ug mga ahente sa pantalan. Ang tanan nga bantog nga mga himan sa pagtukod sa proyekto sama sa Drone.io, Bitbucket Pipeline, GitLab, Mga aksyon sa GitHub ug uban pa, makakolekta sa tanan sa mga sudlanan. Apan komosta si Jenkins?

Karon adunay solusyon sa problema: Ang Jenkins 2 maayo sa pagtrabaho Mga ahente sa Docker. Niini nga artikulo gusto nakong ipaambit ang akong kasinatian ug ipakita kung giunsa nimo kini mahimo sa imong kaugalingon.

Ngano nga gisugdan nako pagsulbad kini nga problema?

Since naa mi kauban Citronium Tungod kay naggamit kami og daghang lain-laing mga teknolohiya, kinahanglan namo nga tipigan ang lain-laing mga bersyon sa Node.JS, Gradle, Ruby, JDK ug uban pa sa assembly machine. Apan kasagaran ang mga panagsumpaki sa bersyon dili malikayan. Oo, husto ka kung giingon nimo nga adunay lainlaing mga managers sa bersyon sama sa nvm, rvm, apan dili tanan nga hapsay sa kanila ug kini nga mga solusyon adunay mga problema:

  • usa ka dako nga kantidad sa runtime nga nakalimtan sa mga developer nga limpyohan;
  • adunay mga panagbangi tali sa lainlaing mga bersyon sa parehas nga runtime;
  • Ang matag developer nanginahanglan usa ka lainlaing hugpong sa mga sangkap.

Adunay ubang mga problema, apan sultihan ko ikaw bahin sa solusyon.

Jenkins sa Docker

Tungod kay ang Docker maayo na karon nga natukod sa kalibutan sa pag-uswag, halos bisan unsang butang mahimong ipadagan gamit ang Docker. Ang akong solusyon mao ang pagbaton sa Jenkins sa Docker ug makahimo sa pagpadagan sa ubang mga sudlanan sa Docker. Kini nga pangutana nagsugod sa pagpangutana balik sa 2013 sa artikulo nga "Ang Docker mahimo na karon nga modagan sa sulod sa Docker".

Sa laktud, kinahanglan nimo nga i-install ang Docker mismo sa usa ka sulud nga nagtrabaho ug i-mount ang file /var/run/docker.sock.

Ania ang usa ka pananglitan nga Dockerfile nga nahimo alang sa 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

Sa ingon, nakakuha kami usa ka sudlanan sa Docker nga mahimo’g ipatuman ang mga mando sa Docker sa host machine.

Pagtukod og setup

Dili pa lang dugay nakuha ni Jenkins ang oportunidad sa paghulagway sa mga lagda niini gamit Pipeline syntax, nga nakapasayon ​​sa pagbag-o sa script sa pagtukod ug pagtipig niini sa repositoryo.

Busa ibutang nato ang usa ka espesyal nga Dockerfile sa repositoryo mismo, nga maglangkob sa tanang mga librarya nga gikinahanglan alang sa pagtukod. Niining paagiha, ang developer mismo makaandam sa usa ka balikbalik nga palibot ug dili kinahanglan nga mangutana sa OPS sa pag-instalar sa usa ka piho nga bersyon sa Node.JS sa host.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Kini nga imahe sa pagtukod angay alang sa kadaghanan sa mga aplikasyon sa Node.JS. Unsa kaha kung, pananglitan, kinahanglan nimo ang usa ka imahe alang sa usa ka proyekto sa JVM nga adunay usa ka Sonar scanner nga gilakip sa sulod? Ikaw gawasnon sa pagpili sa mga sangkap nga imong gikinahanglan alang sa asembliya.

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/

Among gihulagway ang palibot sa asembliya, apan unsa may kalabotan niini ni Jenkins? Ug ang mga ahente sa Jenkins mahimong magtrabaho sa ingon nga mga imahe sa Docker ug matukod kini sa sulod.

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

Direktiba agent naggamit sa kabtangan dockerdiin mahimo nimong itakda:

  • ang ngalan sa sudlanan sa asembliya sumala sa imong palisiya sa pagngalan;
  • mga argumento nga gikinahanglan sa pagpadagan sa pagtukod nga sudlanan, diin sa among kaso among gi-mount ang kasamtangan nga direktoryo isip usa ka direktoryo sulod sa sudlanan.

Ug naa na sa mga lakang sa pagtukod gipakita namon kung unsang mga mando ang ipatuman sa sulod sa ahente sa pagtukod sa Docker. Mahimo kini nga bisan unsa, mao nga naglansad usab ako sa pag-deploy sa aplikasyon gamit ang ansible.

Sa ubos gusto nakong ipakita ang usa ka generic nga Jenkinsfile nga mahimo sa usa ka yano nga aplikasyon sa 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()
        }
    }

}

Unsay nahitabo?

Salamat niini nga pamaagi, nasulbad namo ang mosunod nga mga problema:

  • Ang oras sa pag-configure sa asembliya sa palibot gipamubu sa 10 - 15 minuto matag proyekto;
  • usa ka bug-os nga mabalikbalik nga aplikasyon sa pagtukod sa palibot, tungod kay mahimo nimo kini tukuron sa imong lokal nga kompyuter;
  • walay mga problema sa mga panagbangi tali sa lain-laing mga bersyon sa mga himan sa asembliya;
  • kanunay usa ka limpyo nga workspace nga dili mabara.

Ang solusyon mismo yano ug klaro ug nagtugot kanimo nga makakuha og pipila ka mga bentaha. Oo, ang entry threshold mitaas og gamay kon itandi sa yano nga mga sugo alang sa mga asembliya, apan karon adunay usa ka garantiya nga kini kanunay nga matukod ug ang developer mismo makapili sa tanan nga gikinahanglan alang sa iyang proseso sa pagtukod.

Mahimo usab nimo gamiton ang imahe nga akong nakolekta Jenkins + Docker. Ang tanan nga mga tinubdan bukas ug nahimutang sa rmuhamedgaliev/jenkins_docker.

Samtang gisulat kini nga artikulo, mitumaw ang usa ka diskusyon bahin sa paggamit sa mga ahente sa hilit nga mga server aron dili ma-load ang master node gamit ang usa ka plugin docker-plugin. Apan hisgutan ko kini sa umaabot.

Source: www.habr.com

Idugang sa usa ka comment