Ger hûn hewceyê gelek hawîrdorên cihêreng bin meriv çawa li Jenkins projeyan berhev dike

Ger hûn hewceyê gelek hawîrdorên cihêreng bin meriv çawa li Jenkins projeyan berhev dike

Li ser Habré di derbarê Jenkins de gelek gotar hene, lê hindik mînakan diyar dikin ka Jenkins û ajanên docker çawa dixebitin. Hemî amûrên avakirina projeya populer ên mîna Drone.io, Pipeline Bitbucket, GitLab, Çalakiyên GitHub û yên din, dikarin her tiştî di konteyneran de kom bikin. Lê çi li ser Jenkins?

Îro çareseriyek ji pirsgirêkê re heye: Jenkins 2 di xebatê de pir baş e ajanên Docker. Di vê gotarê de ez dixwazim ezmûna xwe parve bikim û nîşan bidim ka hûn çawa dikarin bi xwe bikin.

Çima min dest bi çareserkirina vê pirsgirêkê kir?

Ji ber ku em di şirketê de ne Citronium Ji ber ku em gelek teknolojiyên cihêreng bikar tînin, pêdivî ye ku em guhertoyên cûda yên Node.JS, Gradle, Ruby, JDK û yên din li ser makîneya kombûnê bihêlin. Lê pir caran nakokiyên guhertoyê nikarin ji holê rabin. Erê, hûn ê rast bin ger hûn bibêjin ku rêveberên guhertoyên cihêreng ên mîna nvm, rvm hene, lê ne her tişt bi wan re ew qas hêsan e û van çareseriyan pirsgirêk hene:

  • hejmareke mezin ji dema xebitandinê ya ku pêşdebiran ji bîr dikin ku paqij bikin;
  • nakokî di navbera guhertoyên cihêreng ên heman demê de hene;
  • Her pêşdebir pêdivî bi komek pêkhateyên cûda heye.

Pirsgirêkên din jî hene, lê ez ji we re behsa çareseriyê bikim.

Jenkins li Docker

Ji ber ku Docker naha di cîhana pêşkeftinê de baş hatî damezrandin, hema hema her tişt dikare bi karanîna Docker were meşandin. Çareseriya min ev e ku Jenkins li Docker hebe û bikaribim konteynerên din ên Docker bimeşînin. Vê pirsê di sala 2013-an de di gotara "Docker naha dikare di hundurê Docker de bixebite".

Bi kurtasî, hûn tenê hewce ne ku Docker bixwe di konteynirek xebitandinê de saz bikin û pelê siwar bikin /var/run/docker.sock.

Li vir mînakek Dockerfile ye ku ji bo Jenkins derketiye.

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

Bi vî rengî, me konteynirek Docker wergirt ku dikare fermanên Docker li ser makîneya mêvandar bicîh bîne.

Avakirina sazkirinê

Ne demek berê Jenkins fersendek wergirt ku qaîdeyên xwe bikar bîne Pipeline hevoksaziyê, ku guhartina skrîpta çêkirinê û hilanîna wê di depoyê de pir hêsan dike.

Ji ber vê yekê bila em Dockerfile-ya taybetî di depoyê de bixwe, ku dê hemî pirtûkxaneyên ku ji bo çêkirinê hewce ne vedihewîne. Bi vî rengî, pêşdebir bixwe dikare hawîrdorek dubarekirî amade bike û neçar e ku ji OPS bipirse ku guhertoyek taybetî ya Node.JS li ser mêvandar saz bike.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Ev wêneya çêkirinê ji bo piraniya serîlêdanên Node.JS-ê maqûl e. Ger, mînakî, ji bo projeyek JVM-ya ku di hundurê de skanerek Sonar-ê tê de hebe, hûn hewceyê wêneyek hewce ne? Hûn azad in ku hûn hêmanên ku hûn ji bo kombûnê hewce ne hilbijêrin.

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/

Me hawirdora meclîsê diyar kir, lê çi têkiliya Jenkins bi wê re heye? Û nûnerên Jenkins dikarin bi van wêneyên Docker re bixebitin û wan di hundurê de ava bikin.

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

Direktîf agent milkê bikar tîne dockerku hûn dikarin diyar bikin:

  • navê konteynera meclîsê li gorî polîtîkaya navdêriya we;
  • argûmanên ku ji bo xebitandina konteynera çêkirinê hewce ne, li cihê ku di doza me de em pelrêça heyî wekî pelrêçek di hundurê konteynerê de girêdidin.

Û jixwe di gavên avakirinê de em destnîşan dikin ka kîjan fermanan di hundurê nûnerê avakirina Docker de bicîh dikin. Ev dikare her tişt be, ji ber vê yekê ez jî bi karanîna ansible vesazkirina serîlêdanê dest pê dikim.

Li jêr ez dixwazim Jenkinsfile-ya gelemperî nîşan bidim ku serîlêdanek Node.JS-ya hêsan dikare ava bike.

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

}

Çi qewimî?

Bi saya vê rêbazê, me pirsgirêkên jêrîn çareser kirin:

  • dema veavakirina meclîsa jîngehê ji bo her projeyê 10 - 15 hûrdem kêm dibe;
  • jîngehek avakirina serîlêdanê ya bi tevahî dubarekirî, ji ber ku hûn dikarin bi vî rengî li ser komputera xweya herêmî ava bikin;
  • ti pirsgirêk bi nakokiyên di navbera guhertoyên cuda yên amûrên civîn hene;
  • her gav cîhek xebata paqij a ku xitimî nabe.

Çareserî bi xwe hêsan û eşkere ye û dihêle hûn hin avantajan bistînin. Erê, sînorê têketinê li gorî fermanên hêsan ên ji bo meclîsan piçek zêde bûye, lê naha garantiyek heye ku ew ê her gav were çêkirin û pêşdebir bixwe dikare her tiştê ku ji bo pêvajoya avakirina wî hewce ye hilbijêrin.

Hûn dikarin wêneya ku min berhev kiriye jî bikar bînin Jenkins + Docker. Hemî çavkanî vekirî ne û li wir in rmuhamedgaliev/jenkins_docker.

Di dema nivîsandina vê gotarê de, nîqaşek li ser karanîna ajanên li ser pêşkêşkerên dûr derket holê da ku bi karanîna pêvekek girêk master neyê barkirin. docker-plugin. Lê ez ê di pêşerojê de li ser vê yekê biaxivim.

Source: www.habr.com

Add a comment