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

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

Π’ Π₯Π°Π±Ρ€ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ статии Π·Π° Jenkins, Π½ΠΎ ΠΌΠ°Π»ΠΊΠΎ къдС сС описва ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с Jenkins ΠΈ Docker Π°Π³Π΅Π½Ρ‚ΠΈ. Всички популярни инструмСнти Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ, ΠΊΠ°Ρ‚ΠΎ Drone.io, Bitbucket Pipeline, GitLab, GitHub дСйствия ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ, ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΡΡŠΠ±ΠΈΡ€Π°Ρ‚ всичко Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ. Но ΠΊΠ°ΠΊ Π΅ с 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("ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° ΠΎΠ±Ρ€Π°Π·Π° Π·Π° сборка") {
            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 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚;
  • Напълно повтаряща сС срСда Π·Π° сборка Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС строи ΠΈ Π½Π° локалния ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€;
  • Няма ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ вСрсии Π½Π° ΡΠ±ΠΎΡ€ΡŠΡ‡Π½ΠΈ инструмСнти;
  • Π’ΠΈΠ½Π°Π³ΠΈ чист Ρ€Π°Π±ΠΎΡ‚Π΅Π½ пространствСн, ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ сС запълва.

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

ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π΄Π° сС Π²ΡŠΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΎΡ‚ ΠΎΠ±Ρ€Π°Π·Π°, ΠΊΠΎΠΉΡ‚ΠΎ съм създал Jenkins + Docker. Всички ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ са ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΈ ΠΈ сС Π½Π°ΠΌΠΈΡ€Π°Ρ‚ Π½Π° rmuhamedgaliev/jenkins_docker.

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

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

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