Ukuqokelela njani iiprojekthi eJenkins ukuba ufuna iindawo ezininzi ezahlukeneyo

Ukuqokelela njani iiprojekthi eJenkins ukuba ufuna iindawo ezininzi ezahlukeneyo

Kukho amanqaku amaninzi kuHabré malunga neJenkins, kodwa abambalwa bachaza imizekelo yendlela iJenkins kunye nee-docker agents zisebenza ngayo. Zonke izixhobo ezithandwayo zokwakha iiprojekthi ezifana Drone.io, Umbhobho weBitbucket, GitLab, Iintshukumo zeGitHub kunye nabanye, banokuqokelela yonke into kwizikhongozeli. Kodwa kuthekani ngoJenkins?

Namhlanje kukho isisombululo kwingxaki: uJenkins 2 ulungile ekusebenzeni naye Iiarhente zeDocker. Kweli nqaku ndifuna ukwabelana ngamava am kwaye ndibonise indlela ongayenza ngayo ngokwakho.

Kwakutheni ukuze ndiqalise ukuyicombulula le ngxaki?

Kuba sikwinkampani Citronium Ngenxa yokuba sisebenzisa iitekhnoloji ezininzi ezahlukeneyo, kufuneka sigcine iinguqulelo ezahlukeneyo zeNode.JS, Gradle, Ruby, JDK kunye nabanye kumatshini wokuhlanganisa. Kodwa amaxesha amaninzi iingxabano zeenguqulelo azinakuphetshwa. Ewe, uya kuba ulungile ukuba uthi kukho abaphathi beenguqulelo ezahlukeneyo njenge-nvm, rvm, kodwa ayizizo zonke izinto ezigudileyo kunye nabo kwaye ezi zisombululo zineengxaki:

  • isixa esikhulu sexesha lokubaleka abaphuhlisi balibale ukulicoca;
  • kukho ungquzulwano phakathi kweenguqulelo ezahlukeneyo zamaxesha okuqhuba afanayo;
  • Wonke umphuhlisi ufuna isethi eyahlukileyo yamacandelo.

Zikhona ezinye iingxaki, kodwa mandikuxelele ngesicombululo.

Jenkins eDocker

Kuba iDocker ngoku imiselwe kakuhle kwihlabathi lophuhliso, phantse nantoni na inokuqhutywa kusetyenziswa iDocker. Isisombululo sam kukuba neJenkins eDocker kwaye nikwazi ukuqhuba ezinye izitya zeDocker. Lo mbuzo waqala ukubuzwa ngo-2013 kwinqaku elithi "IDocker ngoku inokubaleka ngaphakathi kweDocker«.

Ngamafutshane, kufuneka nje uzifakele iDocker ngokwayo kwisitya esisebenzayo kwaye unyuse ifayile /var/run/docker.sock.

Nanku umzekelo weDockerfile owaphumela kuJenkins.

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

Ke, sinesingxobo seDocker esinokwenza imiyalelo yeDocker kumatshini wokubamba.

Yakha ukuseta

Kungekudala iJenkins ifumene ithuba lokuchaza imithetho yayo isebenzisa Iipayipi i-syntax, eyenza kube lula ukutshintsha iskripthi sokwakha kwaye usigcine kwindawo yokugcina.

Ke makhe sibeke iDockerfile ekhethekileyo kwindawo yokugcina, eya kuthi iqulathe onke amathala eencwadi ayimfuneko ekwakheni. Ngale ndlela, umphuhlisi ngokwakhe unokulungiselela indawo ephindaphindiweyo kwaye akayi kucela i-OPS ukuba ifake inguqulo ethile ye-Node.JS kwinginginya.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Lo mfanekiso wokwakha ulungele uninzi lwezicelo zeNode.JS. Kuthekani ukuba, umzekelo, ufuna umfanekiso weprojekthi ye-JVM eneskena se-Sonar esibandakanyiweyo ngaphakathi? Ukhululekile ukukhetha amacandelo owafunayo kwindibano.

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/

Sichaze indawo yendibano, kodwa iJenkins inento yokwenza nayo? Kwaye ii-agent zeJenkins zinokusebenza kunye nemifanekiso ye-Docker enjalo kwaye iyakhe ngaphakathi.

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

Umyalelo agent isebenzisa ipropathi dockerapho unokuchaza khona:

  • igama lesikhongozeli sendibano ngokwepolisi yakho yamagama;
  • iingxoxo ezifunekayo ukuqhuba isikhongozeli sokwakha, apho kwimeko yethu sinyusa uvimba weefayili wangoku njengolawulo ngaphakathi kwesikhongozeli.

Kwaye sele kumanyathelo okwakha sibonisa ukuba yeyiphi imiyalelo ekufuneka yenziwe ngaphakathi kwe-arhente yokwakha ye-Docker. Oku kunokuba nantoni na, ngoko ke ndiqalise ukusasazwa kwesicelo usebenzisa i-ansible.

Ngezantsi ndifuna ukubonisa i-generic Jenkinsfile ukuba isicelo esilula seNode.JS sinokuyakha.

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

}

Kweneke ntoni?

Ngombulelo kule ndlela, sisombulule ezi ngxaki zilandelayo:

  • Ixesha lokumisela indibano yendalo esingqongileyo lincitshiswe ukuya kwi-10 - 15 imizuzu yeprojekthi nganye;
  • isicelo esiphinda-phinda-phinda ngokupheleleyo imeko-bume yokwakha, kuba ungayakha ngolu hlobo kwikhompyuter yakho yobulali;
  • akukho ngxaki ngeengxabano phakathi kweenguqulelo ezahlukeneyo zezixhobo zokuhlanganisa;
  • isoloko iyindawo yokusebenzela ecocekileyo engavalekiyo.

Isisombululo ngokwaso silula kwaye sicacile kwaye sikuvumela ukuba ufumane izibonelelo ezithile. Ewe, umda wokungena unyuke kancinci xa kuthelekiswa nemiyalelo elula yeendibano, kodwa ngoku kukho isiqinisekiso sokuba iya kuhlala yakhiwe kwaye umphuhlisi ngokwakhe unokukhetha yonke into efunekayo kwinkqubo yakhe yokwakha.

Ungasebenzisa kwakhona umfanekiso endiwuqokelele Jenkins + Docker. Yonke imithombo ivuliwe kwaye ibekwe kuyo rmuhamedgaliev/jenkins_docker.

Ngelixa ubhala eli nqaku, kwavela ingxoxo malunga nokusebenzisa iiarhente kwiiseva ezikude ukuze ungalayishi i-master node usebenzisa iplagin. docker-plugin. Kodwa ndiza kuthetha ngale nto kwixesha elizayo.

umthombo: www.habr.com

Yongeza izimvo