рдпрджрд┐ рдЖрдкрдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рд╡реЗрд╢реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЬреЗрдирдХреАрдВрд╕ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреИрд╕реЗ рдПрдХрддреНрд░ рдХрд░реЗрдВ

рдпрджрд┐ рдЖрдкрдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рд╡реЗрд╢реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЬреЗрдирдХреАрдВрд╕ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреИрд╕реЗ рдПрдХрддреНрд░ рдХрд░реЗрдВ

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

рдЖрдЬ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ: рдЬреЗрдирдХрд┐рдВрд╕ 2 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдбреЙрдХрд░ рдПрдЬреЗрдВрдЯ. рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдХреНрдпреЛрдВ рд╢реБрд░реВ рдХрд┐рдпрд╛?

рдЪреВрдВрдХрд┐ рд╣рдо рдХрдВрдкрдиреА рдореЗрдВ рд╣реИрдВ рд╕рд┐рдЯреНрд░реЛрдирд┐рдпрдо рдЪреВрдБрдХрд┐ рд╣рдо рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рдорд╢реАрди рдкрд░ Node.JS, Gradle, Ruby, JDK рдФрд░ рдЕрдиреНрдп рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдг рд░рдЦрдиреЗ рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рд░реЛрдзреЛрдВ рдХреЛ рдЯрд╛рд▓рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ред рд╣рд╛рдВ, рдЖрдк рд╕рд╣реА рд╣реЛрдВрдЧреЗ рдпрджрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрдирд╡реАрдПрдо, рдЖрд░рд╡реАрдПрдо рдЬреИрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдмрдВрдзрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  • рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдЬрд┐рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ;
  • рдПрдХ рд╣реА рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдЯрдХрд░рд╛рд╡ рд╣реЛрддреЗ рд╣реИрдВ;
  • рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдШрдЯрдХреЛрдВ рдХреЗ рдПрдХ рдЕрд▓рдЧ рд╕реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдФрд░ рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реВрдВред

рдбреЙрдХрд░ рдореЗрдВ рдЬреЗрдирдХреАрдВрд╕

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

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.

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ