Как ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π² Jenkins, Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ

Как ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π² Jenkins, Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ

На Π₯Π°Π±Ρ€Π΅ ΠΌΠ½ΠΎΠ³ΠΎ статСй ΠΎ Jenkins, Π½ΠΎ ΠΌΠ°Π»ΠΎ Π³Π΄Π΅ описываСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Jenkins ΠΈ Π΄ΠΎΠΊΠ΅Ρ€ Π°Π³Π΅Π½Ρ‚ΠΎΠ². ВсС популярныС инструмСнты сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° Drone.io, Bitbucket Pipeline, GitLab, GitHub actions ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ всС Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ…. Но ΠΊΠ°ΠΊ ΠΆΠ΅ Jenkins?

На сСгодняшний дСнь Π΅ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹: Jenkins 2 Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Docker Π°Π³Π΅Π½Ρ‚Π°ΠΌΠΈ. Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ сами.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ я занялся Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹?

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Citronium ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ мноТСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ, Ρ‚ΠΎ Π½Π° сборочной машинС приходится Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Node.JS, Gradle, Ruby, JDK ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ…. Но Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² вСрсий Π½Π΅ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ. Π”Π°, Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΡ€Π°Π²Ρ‹ Ссли скаТСтС, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ вСрсий Ρ‚ΠΈΠΏΠ° nvm, rvm, Π½ΠΎ Π½Π΅ всё Ρ‚Π°ΠΊ Π³Π»Π°Π΄ΠΊΠΎ с Π½ΠΈΠΌΠΈ ΠΈ Ρƒ этих Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

  • большой объСм Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π·Π°Π±Ρ‹Π²Π°ΡŽΡ‚ Ρ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ;
  • Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ вСрсиями ΠΎΠ΄Π½ΠΈΡ… Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠΎΠ²;
  • ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ Π½ΡƒΠΆΠ΅Π½ Ρ€Π°Π·Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

Π•ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ я Π»ΡƒΡ‡ΡˆΠ΅ расскаТу ΠΏΡ€ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

Jenkins Π² Docker

Π’Π°ΠΊ ΠΊΠ°ΠΊ сСйчас Docker ΡƒΠΆΠ΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ укорСнился Π² сфСрС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‚ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ всС ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Docker. МоС ΠΆΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Jenkins Π±Ρ‹Π» Π² Docker ΠΈ ΠΌΠΎΠ³ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Docker ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹. Π­Ρ‚ΠΈΠΌ вопросом стали Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π΅Ρ‰Π΅ Π² 2013 Π³ΠΎΠ΄Ρƒ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ «Docker can now run within Docker«.

Если Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅ просто Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π² Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ сам Docker ΠΈ ΠΏΡ€ΠΈΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» /var/run/docker.sock.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Dockerfile, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ получился для Jenkins.

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 ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π° хостовой машинС.

Настройка сборки

НС Ρ‚Π°ΠΊ Π΄Π°Π²Π½ΠΎ Jenkins ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ свои ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Pipeline синтаксиса, Ρ‡Ρ‚ΠΎ позволяСт достаточно просто ΠΌΠ΅Π½ΡΡ‚ΡŒ скрипт сборки ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

Π’Π°ΠΊ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΆΠ΅ ΠΌΡ‹ помСстим Π² сам Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ 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/

ΠœΡ‹ описали сборочноС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, Π½ΠΎ ΠΏΡ€ΠΈ Ρ‡Π΅ΠΌ Ρ‚ΡƒΡ‚ Jenkins? А Jenkins Π°Π³Π΅Π½Ρ‚Ρ‹ ΡƒΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚Π°ΠΊΠΈΠΌΠΈ 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 ΠΌΠΈΠ½ΡƒΡ‚Π°ΠΌ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚;
  • ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ повторяСмоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ сборки прилоТСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈ Π½Π° локальном ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅;
  • Π½Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°ΠΌΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… вСрсий сборочных инструмСнтов;
  • всСгда чистый воркспСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ забиваСтся.

Π‘Π°ΠΌΠΎ ΠΏΠΎ сСбС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ простоС ΠΈ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ΅ ΠΈ позволяСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΏΠ»ΡŽΡΡ‹. Π”Π°, ΠΏΠΎΡ€ΠΎΠ³ Π²Ρ…ΠΎΠ΄Π° Ρ‡ΡƒΡ‚ΠΎΡ‡ΠΊΡƒ поднялся ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с простыми ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ для сборок, Π½ΠΎ Π·Π°Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΅ΡΡ‚ΡŒ гарантия, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒΡΡ всСгда ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сам ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Π΅Π³ΠΎ процСсса сборки.

Π’Π°ΠΊ ΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ собранным мною ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Jenkins + Docker. ВсС исходники ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ ΠΈ Π»Π΅ΠΆΠ°Ρ‚ Π½Π° rmuhamedgaliev/jenkins_docker.

Π’ Ρ…ΠΎΠ΄Π΅ написания ΡΡ‚Π°Ρ‚ΡŒΠΈ появилась дискуссия ΠΎ использовании Π°Π³Π΅Π½Ρ‚ΠΎΠ² Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… сСрвСрах, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ мастСр Π½ΠΎΠ΄Ρƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π° docker-plugin. Но ΠΎΠ± этом я расскаТу Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com