Как Π΄Π° ΡΡŠΠ±ΠΈΡ€Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Π² Jenkins, Π°ΠΊΠΎ ΠΈΠΌΠ°Ρ‚Π΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ срСди

Как Π΄Π° ΡΡŠΠ±ΠΈΡ€Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Π² Jenkins, Π°ΠΊΠΎ ΠΈΠΌΠ°Ρ‚Π΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ срСди

На Π₯Π°Π±Ρ€Π΅ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ статии Π·Π° Jenkins, Π½ΠΎ ΠΈΠΌΠ° ΠΌΠ°Π»ΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с Jenkins ΠΈ Docker Π°Π³Π΅Π½Ρ‚ΠΈ. Всички популярни инструмСнти Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ ΠΊΠ°Ρ‚ΠΎ 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"
    }
}

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π°Π³Π΅Π½Ρ‚ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° свойство 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("ΠŸΡ€ΠΈΠ³ΠΎΡ‚Π²Π΅Ρ‚Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° сборката") {
            steps {
                sh "docker build -f Dockerfile.build . -t project-build:${DOCKER_IMAGE_BRANCH}"
            }
        }

        stage("БъздаванС Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°") {
            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 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚;
  • пълно повторяСмо срСда Π·Π° сборка Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΡΡŠΠ±ΠΈΡ€Π° ΠΈ Π½Π° Π»ΠΎΠΊΠ°Π»Π΅Π½ ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€;
  • няма ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈΡ‚Π΅ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ вСрсии Π½Π° инструмСнтитС Π·Π° сборка;
  • Π²ΠΈΠ½Π°Π³ΠΈ чист Ρ€Π°Π±ΠΎΡ‚Π΅Π½ пространствo, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π΅ сС Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°.

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

Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС Π²ΡŠΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΎΡ‚ създадСния ΠΎΡ‚ ΠΌΠ΅Π½ ΠΎΠ±Ρ€Π°Π· Jenkins + Docker. Всички ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅ са ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΈ ΠΈ сС Π½Π°ΠΌΠΈΡ€Π°Ρ‚ Π½Π° rmuhamedgaliev\/jenkins_docker.

По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° написванСто Π½Π° статията възникна дискусия относно ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π°Π³Π΅Π½Ρ‚ΠΈ Π½Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ, Π·Π° Π΄Π° Π½Π΅ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°ΠΌΠ΅ основната Π½ΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° плъгина docker-plugin. Но Π·Π° Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Ρ€Π°Π·ΠΊΠ°ΠΆΠ° Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅.

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster