рддреБрдореНрд╣рд╛рд▓рд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕ рдЬреЗрдирдХрд┐рдиреНрд╕рдордзреНрдпреЗ рдкреНрд░рдХрд▓реНрдк рдХрд╕реЗ рдЧреЛрд│рд╛ рдХрд░рд╛рд╡реЗ

рддреБрдореНрд╣рд╛рд▓рд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕ рдЬреЗрдирдХрд┐рдиреНрд╕рдордзреНрдпреЗ рдкреНрд░рдХрд▓реНрдк рдХрд╕реЗ рдЧреЛрд│рд╛ рдХрд░рд╛рд╡реЗ

рдЬреЗрдирдХрд┐рдиреНрд╕рдмрджреНрджрд▓ рд╣реЕрдмреНрд░реЗрд╡рд░ рдмрд░реЗрдЪ рд▓реЗрдЦ рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рдЬреЗрдирдХрд┐рдиреНрд╕ рдЖрдгрд┐ рдбреЙрдХрд░ рдПрдЬрдВрдЯ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд рдпрд╛рдЪреА рдХрд╛рд╣реА рдЙрджрд╛рд╣рд░рдгреЗ рд╡рд░реНрдгрди рдХрд░рддрд╛рдд. рд╕рд░реНрд╡ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд┐рд▓реНрдб рдЯреВрд▓реНрд╕ рдЬрд╕реЗ Drone.io, рдмрд┐рдЯрдмрдХреЗрдЯ рдкрд╛рдЗрдкрд▓рд╛рдЗрди, рдЧрд┐рдЯреЕрдм, GitHub рдХреНрд░рд┐рдпрд╛ рдЖрдгрд┐ рдЗрддрд░, рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ рд╕рд░реНрд╡рдХрд╛рд╣реА рдЧреЛрд│рд╛ рдХрд░реВ рд╢рдХрддрд╛рдд. рдкрдг рдЬреЗрдирдХрд┐рдиреНрд╕рдЪреЗ рдХрд╛рдп?

рдЖрдЬ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдЖрд╣реЗ: рдЬреЗрдирдХрд┐рдиреНрд╕ 2 рд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдд рдЙрддреНрдХреГрд╖реНрдЯ рдЖрд╣реЗ рдбреЙрдХрд░ рдПрдЬрдВрдЯ. рдпрд╛ рд▓реЗрдЦрд╛рдд рдореА рдорд╛рдЭрд╛ рдЕрдиреБрднрд╡ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ рдЖрдгрд┐ рдЖрдкрдг рддреЗ рд╕реНрд╡рддрдГ рдХрд╕реЗ рдХрд░реВ рд╢рдХрддрд╛ рд╣реЗ рджрд░реНрд╢рд╡реВ рдЗрдЪреНрдЫрд┐рддреЛ.

рдореА рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕реЛрдбрд╡рд╛рдпрд▓рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХреЗрд▓реА?

рдЖрдореНрд╣реА рдХрдВрдкрдиреАрдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ рд╕рд╛рдпрдЯреНрд░реЛрдирд┐рдпрдо рдЖрдореНрд╣реА рдЕрдиреЗрдХ рднрд┐рдиреНрди рддрдВрддреНрд░рдЬреНрдЮрд╛рди рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реНрдпрд╛рдореБрд│реЗ, рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрд╕реЗрдВрдмреНрд▓реА рдорд╢реАрдирд╡рд░ Node.JS, Gradle, Ruby, JDK рдЖрдгрд┐ рдЗрддрд░рд╛рдВрдЪреНрдпрд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдЖрд╡реГрддреНрддреНрдпрд╛ рдареЗрд╡рд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрддрд╛рдд. рдкрдг рдЕрдиреЗрдХрджрд╛ рдЖрд╡реГрддреНрддреА рд╕рдВрдШрд░реНрд╖ рдЯрд╛рд│рддрд╛ рдпреЗрдд рдирд╛рд╣реА. рд╣реЛрдп, nvm, rvm рд╕рд╛рд░рдЦреЗ рд╡рд┐рд╡рд┐рдз рдЖрд╡реГрддреНрддреНрдпрд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЖрд╣реЗрдд рдЕрд╕реЗ рддреБрдореНрд╣реА рдореНрд╣рдгрддрд╛, рдкрд░рдВрддреБ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЗрддрдХреЗ рдЧреБрд│рдЧреБрд│реАрдд рдирд╛рд╣реА рдЖрдгрд┐ рдпрд╛ рдЙрдкрд╛рдпрд╛рдВрдордзреНрдпреЗ рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗрдд:

  • рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рд░рдирдЯрд╛рдЗрдо рдЬреЗ рд╡рд┐рдХрд╕рдХ рд╕рд╛рдл рдХрд░рдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░рддрд╛рдд;
  • рд╕рдорд╛рди рд░рдирдЯрд╛рдЗрдордЪреНрдпрд╛ рднрд┐рдиреНрди рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдордзреНрдпреЗ рд╕рдВрдШрд░реНрд╖ рдЖрд╣реЗрдд;
  • рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд╕рдХрд╛рд▓рд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдШрдЯрдХрд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕рддреЗ.

рдЗрддрд░рд╣реА рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗрдд, рдкрдг рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдЙрдкрд╛рдп рд╕рд╛рдВрдЧрддреЛ.

рдбреЙрдХрд░рдордзреАрд▓ рдЬреЗрдирдХрд┐рдиреНрд╕

рдбреЙрдХрд░ рдЖрддрд╛ рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯрдЪреНрдпрд╛ рдЬрдЧрд╛рдд рдкреНрд░рд╕реНрдерд╛рдкрд┐рдд рдЭрд╛рд▓реНрдпрд╛рдореБрд│реЗ, рдбреЙрдХрд░ рд╡рд╛рдкрд░реВрди рдЬрд╡рд│рдкрд╛рд╕ рдХрд╛рд╣реАрд╣реА рдЪрд╛рд▓рд╡рддрд╛ рдпреЗрддреЗ. рдбреЙрдХрд░рдордзреНрдпреЗ рдЬреЗрдирдХрд┐рдиреНрд╕ рдЕрд╕рдгреЗ рдЖрдгрд┐ рдЗрддрд░ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рдЕрд╕рдгреЗ рд╣рд╛ рдорд╛рдЭрд╛ рдЙрдкрд╛рдп рдЖрд╣реЗ. рд╣рд╛ рдкреНрд░рд╢реНрди 2013 рдордзреНрдпреЗ рд▓реЗрдЦрд╛рдд рд╡рд┐рдЪрд╛рд░рд▓рд╛ рдЬрд╛рдК рд▓рд╛рдЧрд▓рд╛.рдбреЙрдХрд░ рдЖрддрд╛ рдбреЙрдХрд░рдордзреНрдпреЗ рдЪрд╛рд▓реВ рд╢рдХрддреЛ".

рдереЛрдбрдХреНрдпрд╛рдд, рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рдбреЙрдХрд░ рд╕реНрд╡рддрдГ рдХрд╛рд░реНрдпрд░рдд рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрдгрд┐ рдлрд╛рдЗрд▓ рдорд╛рдЙрдВрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ /var/run/docker.sock.

рдЬреЗрдирдХрд┐рдиреНрд╕рд╕рд╛рдареА рдбреЙрдХрд░рдлрд╛рдЗрд▓рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдпреЗрдереЗ рдЖрд╣реЗ.

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

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рдорд┐рд│рд╛рд▓рд╛ рдЬреЛ рд╣реЛрд╕реНрдЯ рдорд╢реАрдирд╡рд░ рдбреЙрдХрд░ рдХрдорд╛рдВрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реВ рд╢рдХрддреЛ.

рд╕реЗрдЯрдЕрдк рддрдпрд╛рд░ рдХрд░рд╛

рдХрд╛рд╣реА рдХрд╛рд│рд╛рдкреВрд░реНрд╡реА рдЬреЗрдирдХрд┐рдиреНрд╕рд▓рд╛ рддреНрдпрд╛рдЪреЗ рдирд┐рдпрдо рд╡рд╛рдкрд░реВрди рд╡рд░реНрдгрди рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдВрдзреА рдорд┐рд│рд╛рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕рд┐рдВрдЯреЕрдХреНрд╕, рдЬреЗ рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрджрд▓рдгреЗ рдЖрдгрд┐ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреЗ рд╕реЛрдкреЗ рдХрд░рддреЗ.

рдЪрд▓рд╛ рддрд░ рдордЧ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗрдЪ рдПрдХ рдЦрд╛рд╕ рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдареЗрд╡реВ, рдЬреНрдпрд╛рдордзреНрдпреЗ рдмрд┐рд▓реНрдбрд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рд▓рд╛рдпрдмреНрд░рд░реА рдЕрд╕рддреАрд▓. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рд╡рд┐рдХрд╛рд╕рдХ рд╕реНрд╡рддрдГ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рд╡рд╛рддрд╛рд╡рд░рдг рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддреЛ рдЖрдгрд┐ рд╣реЛрд╕реНрдЯрд╡рд░ Node.JS рдЪреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡реГрддреНрддреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА OPS рд▓рд╛ рд╕рд╛рдВрдЧрд╛рд╡реЗ рд▓рд╛рдЧрдгрд╛рд░ рдирд╛рд╣реА.

FROM node:12.10.0-alpine

RUN npm install yarn -g

рд╣реА рдмрд┐рд▓реНрдб рдЗрдореЗрдЬ рдмрд╣реБрддреЗрдХ Node.JS рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рд╕рд╛рдареА рдпреЛрдЧреНрдп рдЖрд╣реЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реЛрдирд╛рд░ рд╕реНрдХреЕрдирд░рд╕рд╣ JVM рдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╛рдареА рдЗрдореЗрдЬ рд╣рд╡реА рдЕрд╕рд▓реНрдпрд╛рд╕? рдЕрд╕реЗрдВрдмреНрд▓реАрд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реЗ рдШрдЯрдХ рдирд┐рд╡рдбрдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣реА рдореЛрдХрд│реЗ рдЖрд╣рд╛рдд.

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/

рдЖрдореНрд╣реА рдЕрд╕реЗрдВрдмреНрд▓реАрдЪреНрдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдЪреЗ рд╡рд░реНрдгрди рдХреЗрд▓реЗ, рдкрд░рдВрддреБ рдЬреЗрдирдХрд┐рдиреНрд╕рдЪрд╛ рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рдХрд╛рдп рд╕рдВрдмрдВрдз рдЖрд╣реЗ? рдЖрдгрд┐ рдЬреЗрдирдХрд┐рдиреНрд╕ рдПрдЬрдВрдЯ рдЕрд╢рд╛ рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛рдВрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░реВ рд╢рдХрддрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛ рдЕрдВрддрд░реНрдЧрдд рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛рдд.

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рдЖрдкрдг рдХреБрдареЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рд╢рдХрддрд╛:

  • рддреБрдордЪреНрдпрд╛ рдирд╛рдордХрд░рдг рдзреЛрд░рдгрд╛рдиреБрд╕рд╛рд░ рдЕрд╕реЗрдВрдмреНрд▓реА рдХрдВрдЯреЗрдирд░рдЪреЗ рдирд╛рд╡;
  • рдмрд┐рд▓реНрдб рдХрдВрдЯреЗрдирд░ рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдпреБрдХреНрддрд┐рд╡рд╛рдж, рдЬреЗрдереЗ рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рдЖрдореНрд╣реА рд╡рд░реНрддрдорд╛рди рдбрд┐рд░реЗрдХреНрдЯрд░реА рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ рдбрд┐рд░реЗрдХреНрдЯрд░реА рдореНрд╣рдгреВрди рдорд╛рдЙрдВрдЯ рдХрд░рддреЛ.

рдЖрдгрд┐ рдбреЙрдХрд░ рдмрд┐рд▓реНрдб рдПрдЬрдВрдЯрдордзреНрдпреЗ рдХреЛрдгрддреА рдХрдорд╛рдВрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рд╛рдпрдЪреА рд╣реЗ рдЖрдореНрд╣реА рдЖрдзреАрдЪ рдмрд┐рд▓реНрдб рдЪрд░рдгрд╛рдВрдордзреНрдпреЗ рд╕реВрдЪрд┐рдд рдХрд░рддреЛ. рд╣реЗ рдХрд╛рд╣реАрд╣реА рдЕрд╕реВ рд╢рдХрддреЗ, рдореНрд╣рдгреВрди рдореА рдЙрддреНрддрд░рджрд╛рдпреА рд╡рд╛рдкрд░реВрди рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдкрдпреЛрдЬрди рджреЗрдЦреАрд▓ рд╕реБрд░реВ рдХрд░рддреЛ.

рдЦрд╛рд▓реА рдорд▓рд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп 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 рдорд┐рдирд┐рдЯреЗ рдХрдореА рдХреЗрд▓рд╛ рдЬрд╛рддреЛ;
  • рдПрдХ рдкреВрд░реНрдгрдкрдгреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрд┐рд▓реНрдб рд╡рд╛рддрд╛рд╡рд░рдг, рдХрд╛рд░рдг рдЖрдкрдг рддреЗ рдЖрдкрд▓реНрдпрд╛ рд╕реНрдерд╛рдирд┐рдХ рд╕рдВрдЧрдгрдХрд╛рд╡рд░ рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛;
  • рдЕрд╕реЗрдВрдмреНрд▓реА рдЯреВрд▓реНрд╕рдЪреНрдпрд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдордзреАрд▓ рд╕рдВрдШрд░реНрд╖рд╛рдВрдордзреНрдпреЗ рдХреЛрдгрддреАрд╣реА рд╕рдорд╕реНрдпрд╛ рдирд╛рд╣реА;
  • рдиреЗрд╣рдореА рд╕реНрд╡рдЪреНрдЫ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдЬреЗ рдЕрдбрдХрдд рдирд╛рд╣реА.

рдЙрдкрд╛рдп рд╕реНрд╡рддрдГрдЪ рд╕реЛрдкреЗ рдЖрдгрд┐ рд╕реНрдкрд╖реНрдЯ рдЖрд╣реЗ рдЖрдгрд┐ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдХрд╛рд╣реА рдлрд╛рдпрджреЗ рдорд┐рд│рд╡рд┐рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ. рд╣реЛрдп, рдЕрд╕реЗрдВрдмреНрд▓реАрд╕рд╛рдареА рд╕реЛрдкреНрдпрд╛ рдЖрджреЗрд╢рд╛рдВрдЪреНрдпрд╛ рддреБрд▓рдиреЗрдд рдПрдВрдЯреНрд░реА рдереНрд░реЗрд╢реЛрд▓реНрдб рдереЛрдбрд╛ рд╡рд╛рдврд▓рд╛ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЖрддрд╛ рдЕрд╢реА рд╣рдореА рдЖрд╣реЗ рдХреА рддреА рдиреЗрд╣рдореАрдЪ рддрдпрд╛рд░ рдХреЗрд▓реА рдЬрд╛рдИрд▓ рдЖрдгрд┐ рд╡рд┐рдХрд╕рдХ рд╕реНрд╡рддрдГ рддреНрдпрд╛рдЪреНрдпрд╛ рдмрд┐рд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ рдирд┐рд╡рдбреВ рд╢рдХрддреЛ.

рддреБрдореНрд╣реА рдореА рдЧреЛрд│рд╛ рдХреЗрд▓реЗрд▓реА рдкреНрд░рддрд┐рдорд╛ рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛ рдЬреЗрдирдХрд┐рдиреНрд╕ + рдбреЙрдХрд░. рд╕рд░реНрд╡ рд╕реНрддреНрд░реЛрдд рдЦреБрд▓реЗ рдЖрд╣реЗрдд рдЖрдгрд┐ рдпреЗрдереЗ рд╕реНрдерд┐рдд рдЖрд╣реЗрдд rmuhamedgaliev/jenkins_docker.

рд╣рд╛ рд▓реЗрдЦ рд▓рд┐рд╣рд┐рддрд╛рдирд╛, рд░рд┐рдореЛрдЯ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдПрдЬрдВрдЯ рд╡рд╛рдкрд░рдгреНрдпрд╛рдмрджреНрджрд▓ рдЪрд░реНрдЪрд╛ рдЭрд╛рд▓реА рдЬреЗрдгреЗрдХрд░реВрди рдкреНрд▓рдЧрдЗрди рд╡рд╛рдкрд░реВрди рдорд╛рд╕реНрдЯрд░ рдиреЛрдб рд▓реЛрдб рд╣реЛрдК рдирдпреЗ. рдбреЙрдХрд░-рдкреНрд▓рдЧрдЗрди. рдкрдг рдореА рднрд╡рд┐рд╖реНрдпрд╛рдд рдпрд╛рдмрджреНрджрд▓ рдмреЛрд▓реЗрди.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛