рдпрджрд┐ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдзреЗрд░реИ рдлрд░рдХ рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд╛рд╣рд┐рдиреНрдЫ рднрдиреЗ рдЬреЗрдирдХрд┐рдиреНрд╕рдорд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рдХрд╕рд░реА рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреЗ

рдпрджрд┐ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдзреЗрд░реИ рдлрд░рдХ рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд╛рд╣рд┐рдиреНрдЫ рднрдиреЗ рдЬреЗрдирдХрд┐рдиреНрд╕рдорд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рдХрд╕рд░реА рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреЗ

рдЬреЗрдиреНрдХрд┐рдиреНрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ Habr├й рдорд╛ рдзреЗрд░реИ рд▓реЗрдЦрд╣рд░реВ рдЫрдиреН, рддрд░ рдЬреЗрдиреНрдХрд┐рдиреНрд╕ рд░ рдбрдХрд░ рдПрдЬреЗрдиреНрдЯрд╣рд░реВрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫрдиреН рднрдиреНрдиреЗ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдереЛрд░реИрд▓реЗ рд╡рд░реНрдгрди рдЧрд░реНрдЫрдиреНред рд╕рдмреИ рд▓реЛрдХрдкреНрд░рд┐рдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рдЙрдкрдХрд░рдгрд╣рд░реВ рдЬрд╕реНрддреИ Drone.io, рдмрд┐рдЯрдмрдХреЗрдЯ рдкрд╛рдЗрдкрд▓рд╛рдЗрди, GitLab, GitHub рдХрд╛рд░реНрдпрд╣рд░реВ рд░ рдЕрдиреНрдп, рдХрдиреНрдЯреЗрдирд░рдорд╛ рд╕рдмреИ рдХреБрд░рд╛ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рддрд░ рдЬреЗрдирдХрд┐рдиреНрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреЗ?

рдЖрдЬ рддреНрдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛рдХреЛ рд╕рдорд╛рдзрд╛рди рдЫ: Jenkins 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рдЬрд╣рд╛рдБ рддрдкрд╛рдЗрдБ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:

  • рддрдкрд╛рдИрдВрдХреЛ рдирд╛рдордХрд░рдг рдиреАрддрд┐ рдЕрдиреБрд╕рд╛рд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХрдиреНрдЯреЗрдирд░рдХреЛ рдирд╛рдо;
  • рдмрд┐рд▓реНрдб рдХрдиреНрдЯреЗрдирд░ рдЪрд▓рд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЖрд░реНрдЧреБрдореЗрдиреНрдЯрд╣рд░реВ, рдЬрд╣рд╛рдБ рд╣рд╛рдореНрд░реЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╣рд╛рдореА рд╣рд╛рд▓рдХреЛ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрд▓рд╛рдИ рдХрдиреНрдЯреЗрдирд░ рднрд┐рддреНрд░ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдХреЛ рд░реВрдкрдорд╛ рдорд╛рдЙрдиреНрдЯ рдЧрд░реНрдЫреМрдВред

рд░ рдкрд╣рд┐рд▓реЗ рдиреИ рдирд┐рд░реНрдорд╛рдг рдЪрд░рдгрд╣рд░реВрдорд╛ рд╣рд╛рдореА рд╕рдВрдХреЗрдд рдЧрд░реНрдЫреМрдВ рдХрд┐ рдХреБрди рдЖрджреЗрд╢рд╣рд░реВ рдбрдХрд░ рдмрд┐рд▓реНрдб рдПрдЬреЗрдиреНрдЯ рднрд┐рддреНрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗред рдпреЛ рдХреЗрд╣рд┐ рдкрдирд┐ рд╣реБрди рд╕рдХреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рдо рдкрдирд┐ ansible рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддреИрдирд╛рддреА рд╕реБрд░реБ рдЧрд░реНрдЫреБред

рддрд▓ рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЬреЗрдирдХрд┐рдиреНрд╕рдлрд╛рдЗрд▓ рджреЗрдЦрд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫреБ рдЬреБрди рд╕рд╛рдзрд╛рд░рдг 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди