Чӣ гуна лоиҳаҳоро дар Ҷенкинс ҷамъ кардан мумкин аст, агар ба шумо муҳитҳои гуногун лозим бошад

Чӣ гуна лоиҳаҳоро дар Ҷенкинс ҷамъ кардан мумкин аст, агар ба шумо муҳитҳои гуногун лозим бошад

Дар бораи Ҳабре дар бораи Ҷенкинс мақолаҳои зиёде мавҷуданд, аммо чанде аз онҳо мисолҳои чӣ гуна кор кардани Ҷенкинс ва агентҳои докерро тавсиф мекунанд. Ҳама асбобҳои маъмули сохтани лоиҳа ба монанди Drone.io, Қубури Bitbucket, Гуглаб, Амалҳои GitHub ва дигарон ҳама чизро дар зарфҳо ҷамъ карда метавонанд. Аммо дар бораи Ҷенкинс чӣ гуфтан мумкин аст?

Имрӯз роҳи ҳалли мушкилот вуҷуд дорад: Ҷенкинс 2 дар кор бо олиҷаноб аст Агентҳои Docker. Дар ин мақола ман мехоҳам таҷрибаи худро мубодила кунам ва нишон диҳам, ки чӣ тавр шумо метавонед онро худатон иҷро кунед.

Чаро ман ба ҳалли ин мушкилот шурӯъ кардам?

Азбаски мо дар ширкат ҳастем Citronium Азбаски мо бисёр технологияҳои гуногунро истифода мебарем, мо бояд версияҳои гуногуни Node.JS, Gradle, Ruby, JDK ва дигаронро дар мошини васлкунӣ нигоҳ дорем. Аммо аксар вақт ихтилофҳои версияро пешгирӣ кардан мумкин нест. Бале, шумо дуруст мегӯед, агар шумо гӯед, ки менеҷерҳои гуногуни версияҳо ба монанди nvm, rvm мавҷуданд, аммо на ҳама чиз бо онҳо ҳамвор аст ва ин ҳалли мушкилот дорад:

  • миқдори зиёди вақти корӣ, ки таҳиягарон тоза карданро фаромӯш мекунанд;
  • байни версияҳои гуногуни як вақтҳои корӣ ихтилофҳо вуҷуд доранд;
  • Ҳар як таҳиякунанда ба маҷмӯи ҷузъҳои гуногун ниёз дорад.

Проблемахои дигар хам хастанд, вале ичозат дихед дар бораи халли он ба шумо накл кунам.

Ҷенкинс дар Докер

Азбаски Docker ҳоло дар ҷаҳони рушд хуб ба роҳ монда шудааст, қариб ҳама чизро бо Docker иҷро кардан мумкин аст. Ҳалли ман ин аст, ки Ҷенкинс дар Docker дошта бошад ва метавонад контейнерҳои дигари Docker-ро идора кунад. Ин савол боз дар соли 2013 дар мақолаи "Ҳоло Docker метавонад дар дохили Docker кор кунад".

Хулоса, ба шумо танҳо лозим аст, ки худи Docker-ро дар як контейнери корӣ насб кунед ва файлро насб кунед /var/run/docker.sock.

Ин аст як мисоли Dockerfile, ки барои Ҷенкинс пайдо шудааст.

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

Ҳамин тариқ, мо як контейнери Docker гирифтем, ки метавонад фармонҳои Docker-ро дар мошини ҳост иҷро кунад.

Сохтани танзим

Чанде пеш Ҷенкинс имкон пайдо кард, ки қоидаҳои худро бо истифода аз тавсиф кунад Борбадозии синтаксис, ки тағир додани скрипти сохта ва нигоҳ доштани онро дар анбор хеле осон мекунад.

Пас биёед дар худи анбор як файли махсуси Dockerfile гузорем, ки дар он тамоми китобхонаҳои барои сохтан зарурӣ мавҷуданд. Ҳамин тариқ, худи таҳиякунанда метавонад муҳити такроршавандаро омода кунад ва набояд аз OPS дархост кунад, ки версияи мушаххаси Node.JS-ро дар ҳост насб кунад.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Ин тасвири сохташуда барои аксари барномаҳои Node.JS мувофиқ аст. Чӣ мешавад, агар, масалан, ба шумо тасвир барои лоиҳаи JVM бо сканери Sonar дар дохили он лозим аст? Шумо метавонед ҷузъҳои барои васлкунӣ лозимиро интихоб кунед.

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/

Мо муҳити ҷамъомадро тавсиф кардем, аммо Ҷенкинс бо он чӣ кор дорад? Ва агентҳои Ҷенкинс метавонанд бо чунин тасвирҳои Docker кор кунанд ва онҳоро дар дохили худ созанд.

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

Дастур agent моликиятро истифода мебарад dockerки дар он шумо метавонед муайян кунед:

  • номи контейнери васлкунӣ мувофиқи сиёсати номгузории шумо;
  • далелҳо барои иҷро кардани контейнери сохтмон лозиманд, ки дар ҳолати мо директорияи ҷорӣро ҳамчун директория дар дохили контейнер насб мекунем.

Ва аллакай дар марҳилаҳои сохтмон мо нишон медиҳем, ки кадом фармонҳо дар дохили агенти сохтани Docker иҷро мешаванд. Ин метавонад ҳама чиз бошад, бинобар ин ман инчунин бо истифода аз ansible ҷойгиркунии барномаҳоро оғоз мекунам.

Дар зер ман мехоҳам як Jenkinsfile-и умумиеро нишон диҳам, ки барномаи оддии 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()
        }
    }

}

Чӣ гап шуд?

Ба шарофати ин усул мо мушкилоти зеринро ҳал кардем:

  • вақти конфигуратсияи васлкунии муҳити зист дар як лоиҳа то 10 - 15 дақиқа кам карда мешавад;
  • муҳити комилан такроршавандаи сохтани барнома, зеро шумо метавонед онро бо ин роҳ дар компютери маҳаллии худ созед;
  • дар байни версияҳои гуногуни асбобҳои васлкунӣ мушкилот вуҷуд надорад;
  • ҳамеша як фазои кории тоза, ки баста намешавад.

Худи ҳалли он оддӣ ва возеҳ аст ва ба шумо имкон медиҳад, ки баъзе бартариҳоро ба даст оред. Бале, ҳадди вуруд дар муқоиса бо фармонҳои оддии маҷлисҳо каме баланд шуд, аммо ҳоло кафолат вуҷуд дорад, ки он ҳамеша сохта мешавад ва худи таҳиякунанда метавонад ҳама чизеро, ки барои раванди сохтани худ зарур аст, интихоб кунад.

Шумо инчунин метавонед тасвиреро, ки ман ҷамъ овардаам, истифода баред Ҷенкинс + Докер. Ҳама манбаъҳо кушода ва ҷойгиранд rmuhamedgliev/jenkins_docker.

Ҳангоми навиштани ин мақола баҳс дар бораи истифодаи агентҳо дар серверҳои дурдаст ба миён омад, то гиреҳи асосӣ бо истифода аз плагин бор нашавад докер-плагин. Аммо ман дар ин бора дар оянда сӯҳбат хоҳам кард.

Манбаъ: will.com

Илова Эзоҳ