ื›ื™ืฆื“ ืœืืกื•ืฃ ืคืจื•ื™ืงื˜ื™ื ื‘ื’'ื ืงื™ื ืก ืื ืืชื” ืฆืจื™ืš ื”ืจื‘ื” ืกื‘ื™ื‘ื•ืช ืฉื•ื ื•ืช

ื›ื™ืฆื“ ืœืืกื•ืฃ ืคืจื•ื™ืงื˜ื™ื ื‘ื’'ื ืงื™ื ืก ืื ืืชื” ืฆืจื™ืš ื”ืจื‘ื” ืกื‘ื™ื‘ื•ืช ืฉื•ื ื•ืช

ื™ืฉ ืžืืžืจื™ื ืจื‘ื™ื ืขืœ Habrรฉ ืขืœ ื’'ื ืงื™ื ืก, ืื‘ืœ ืžืขื˜ื™ื ืžืชืืจื™ื ื“ื•ื’ืžืื•ืช ืœืื•ืคืŸ ืฉื‘ื• ื’'ื ืงื™ื ืก ื•ืกื•ื›ื ื™ ื“ื•ืงืจ ืขื•ื‘ื“ื™ื. ื›ืœ ื”ื›ืœื™ื ื”ืคื•ืคื•ืœืจื™ื™ื ืœื‘ื ื™ื™ืช ืคืจื•ื™ืงื˜ื™ื ื›ืžื• Drone.io, Bitbucket Pipeline, GitLab, ืคืขื•ืœื•ืช GitHub ื•ืื—ืจื™ื, ื™ื›ื•ืœื™ื ืœืืกื•ืฃ ื”ื›ืœ ื‘ืžื™ื›ืœื™ื. ืื‘ืœ ืžื” ืขื ื’'ื ืงื™ื ืก?

ื”ื™ื•ื ื™ืฉ ืคืชืจื•ืŸ ืœื‘ืขื™ื”: ื’'ื ืงื™ื ืก 2 ืžืขื•ืœื” ืœืขื‘ื•ื“ ืื™ืชื• ืกื•ื›ื ื™ ื“ื•ืงืจ. ื‘ืžืืžืจ ื–ื” ืื ื™ ืจื•ืฆื” ืœื—ืœื•ืง ืืช ื”ื—ื•ื•ื™ื” ืฉืœื™ ื•ืœื”ืจืื•ืช ืื™ืš ืืชื” ื™ื›ื•ืœ ืœืขืฉื•ืช ืืช ื–ื” ื‘ืขืฆืžืš.

ืœืžื” ื”ืชื—ืœืชื™ ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ื”ื–ื•?

ืžืื– ืื ื—ื ื• ื‘ื—ื‘ืจื” ืฆื™ื˜ืจื•ื ื™ื•ื ืžื›ื™ื•ื•ืŸ ืฉืื ื• ืžืฉืชืžืฉื™ื ื‘ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ืจื‘ื•ืช ื•ืฉื•ื ื•ืช, ืขืœื™ื ื• ืœืฉืžื•ืจ ื’ืจืกืื•ืช ืฉื•ื ื•ืช ืฉืœ Node.JS, Gradle, Ruby, JDK ื•ืื—ืจื•ืช ื‘ืžื›ื•ื ืช ื”ื”ืจื›ื‘ื”. ืื‘ืœ ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืื™ ืืคืฉืจ ืœืžื ื•ืข ื”ืชื ื’ืฉื•ื™ื•ืช ื’ืจืกืื•ืช. ื›ืŸ, ืืชื” ืฆื•ื“ืง ืื ืืชื” ืื•ืžืจ ืฉื™ืฉ ืžื ื”ืœื™ ื’ืจืกืื•ืช ืฉื•ื ื™ื ื›ืžื• nvm, rvm, ืื‘ืœ ืœื ื”ื›ืœ ื›ืœ ื›ืš ื—ืœืง ืื™ืชื ื•ืœืคืชืจื•ื ื•ืช ื”ืืœื” ื™ืฉ ื‘ืขื™ื•ืช:

  • ื›ืžื•ืช ื’ื“ื•ืœื” ืฉืœ ื–ืžืŸ ืจื™ืฆื” ืฉืžืคืชื—ื™ื ืฉื•ื›ื—ื™ื ืœื ืงื•ืช;
  • ื™ืฉ ื”ืชื ื’ืฉื•ื™ื•ืช ื‘ื™ืŸ ื’ืจืกืื•ืช ืฉื•ื ื•ืช ืฉืœ ืื•ืชื ื–ืžื ื™ ืจื™ืฆื”;
  • ื›ืœ ืžืคืชื— ืฆืจื™ืš ืกื˜ ืื—ืจ ืฉืœ ืจื›ื™ื‘ื™ื.

ื™ืฉ ืขื•ื“ ื‘ืขื™ื•ืช, ืื‘ืœ ื”ืจืฉื• ืœื™ ืœืกืคืจ ืœื›ื ืขืœ ื”ืคืชืจื•ืŸ.

ื’'ื ืงื™ื ืก ื‘ื“ื•ืงืจ

ืžื›ื™ื•ื•ืŸ ืฉ-Docker ืžื‘ื•ืกืกืช ื›ื™ื•ื ื”ื™ื˜ื‘ ื‘ืขื•ืœื ื”ืคื™ืชื•ื—, ื ื™ืชืŸ ืœื”ืคืขื™ืœ ื›ืžืขื˜ ื›ืœ ื“ื‘ืจ ื‘ืืžืฆืขื•ืช Docker. ื”ืคืชืจื•ืŸ ืฉืœื™ ื”ื•ื ืฉื’'ื ืงื™ื ืก ื™ื”ื™ื” ื‘-Docker ื•ื™ื•ื›ืœ ืœื”ืคืขื™ืœ ืงื•ื ื˜ื™ื™ื ืจื™ื ืื—ืจื™ื ืฉืœ Docker. ืฉืืœื” ื–ื• ื”ื—ืœื” ืœื”ื™ืฉืืœ ืขื•ื“ ื‘ืฉื ืช 2013 ื‘ืžืืžืจ "Docker ื™ื›ื•ืœ ื›ืขืช ืœืคืขื•ืœ ื‘ืชื•ืš Docker".

ื‘ืงื™ืฆื•ืจ, ืืชื” ืจืง ืฆืจื™ืš ืœื”ืชืงื™ืŸ ืืช Docker ืขืฆืžื• ื‘ืงื•ื ื˜ื™ื™ื ืจ ืขื•ื‘ื“ ื•ืœื”ืขืœื•ืช ืืช ื”ืงื•ื‘ืฅ /var/run/docker.sock.

ื”ื ื” ื“ื•ื’ืžื” ืฉืœ Dockerfile ืฉื”ืชื‘ืจืจ ืขื‘ื•ืจ ื’'ื ืงื™ื ืก.

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 ื‘ืžื—ืฉื‘ ื”ืžืืจื—.

ื‘ื ื™ื™ืช ื”ืชืงื ื”

ืœื ืžื–ืžืŸ ื’'ื ืงื™ื ืก ืงื™ื‘ืœื” ืืช ื”ื”ื–ื“ืžื ื•ืช ืœืชืืจ ืืช ื”ื›ืœืœื™ื ืฉืœื” ื‘ืืžืฆืขื•ืช ืฆื™ื ื•ืจ ืชื—ื‘ื™ืจ, ืžื” ืฉืžืงืœ ืœืžื“ื™ ืœืฉื ื•ืช ืืช ืกืงืจื™ืคื˜ ื”ื‘ื ื™ื™ื” ื•ืœืื—ืกืŸ ืื•ืชื• ื‘ืžืื’ืจ.

ืื– ื‘ื•ืื• ื ืฉื™ื 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/

ืชื™ืืจื ื• ืืช ืกื‘ื™ื‘ืช ื”ื”ืจื›ื‘ื”, ืื‘ืœ ืžื” ื”ืงืฉืจ ืฉืœ ื’'ื ืงื™ื ืก ืœื–ื”? ื•ืกื•ื›ื ื™ ื’'ื ืงื™ื ืก ื™ื›ื•ืœื™ื ืœืขื‘ื•ื“ ืขื ืชืžื•ื ื•ืช ื“ื•ืงืจ ื›ืืœื” ื•ืœื‘ื ื•ืช ืื•ืชืŸ ื‘ืื•ืคืŸ ืคื ื™ืžื™.

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ืื™ืคื” ืืชื” ื™ื›ื•ืœ ืœืฆื™ื™ืŸ:

  • ืฉื ืžื™ื›ืœ ื”ื”ืจื›ื‘ื” ื‘ื”ืชืื ืœืžื“ื™ื ื™ื•ืช ื”ืฉืžื•ืช ืฉืœืš;
  • ืืจื’ื•ืžื ื˜ื™ื ื”ื“ืจื•ืฉื™ื ืœื”ืคืขืœืช ื”ืงื•ื ื˜ื™ื™ื ืจ ื”-build, ื›ืืฉืจ ื‘ืžืงืจื” ืฉืœื ื• ืื ื• ืžืขืœื™ื ืืช ื”ืกืคืจื™ื™ื” ื”ื ื•ื›ื—ื™ืช ื‘ืชื•ืจ ืกืคืจื™ื™ื” ื‘ืชื•ืš ื”ืงื•ื ื˜ื™ื™ื ืจ.

ื•ื›ื‘ืจ ื‘ืฉืœื‘ื™ ื”ื‘ื ื™ื™ื” ืื ื• ืžืฆื™ื™ื ื™ื ืื™ืœื• ืคืงื•ื“ื•ืช ืœื‘ืฆืข ื‘ืชื•ืš ืกื•ื›ืŸ ื”ื‘ื ื™ื™ื” ืฉืœ 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 ื“ืงื•ืช ืœื›ืœ ืคืจื•ื™ืงื˜;
  • ืกื‘ื™ื‘ืช ื‘ื ื™ื™ืช ื™ื™ืฉื•ืžื™ื ื ื™ืชื ืช ืœื—ื–ืจื” ืœื—ืœื•ื˜ื™ืŸ, ืžื›ื™ื•ื•ืŸ ืฉืืชื” ื™ื›ื•ืœ ืœื‘ื ื•ืช ืื•ืชื” ื›ืš ื‘ืžื—ืฉื‘ ื”ืžืงื•ืžื™ ืฉืœืš;
  • ืื™ืŸ ื‘ืขื™ื•ืช ืขื ื”ืชื ื’ืฉื•ื™ื•ืช ื‘ื™ืŸ ื’ืจืกืื•ืช ืฉื•ื ื•ืช ืฉืœ ื›ืœื™ ื”ืจื›ื‘ื”;
  • ืชืžื™ื“ ืกื‘ื™ื‘ืช ืขื‘ื•ื“ื” ื ืงื™ื™ื” ืฉืœื ื ืกืชื.

ื”ืคืชืจื•ืŸ ืขืฆืžื• ืคืฉื•ื˜ ื•ื‘ืจื•ืจ ื•ืžืืคืฉืจ ืœืงื‘ืœ ื›ืžื” ื™ืชืจื•ื ื•ืช. ื›ืŸ, ืกืฃ ื”ื›ื ื™ืกื” ืขืœื” ืžืขื˜ ื‘ื”ืฉื•ื•ืื” ืœืคืงื•ื“ื•ืช ืคืฉื•ื˜ื•ืช ืœืžื›ืœื•ืœื™ื, ืืš ื›ืขืช ื™ืฉื ื” ืขืจื•ื‘ื” ืฉื”ื•ื ืชืžื™ื“ ื™ื™ื‘ื ื” ื•ื”ืžืคืชื— ื‘ืขืฆืžื• ื™ื›ื•ืœ ืœื‘ื—ื•ืจ ืืช ื›ืœ ืžื” ืฉืฆืจื™ืš ืœืชื”ืœื™ืš ื”ื‘ื ื™ื™ื” ืฉืœื•.

ืืคืฉืจ ื’ื ืœื”ืฉืชืžืฉ ื‘ืชืžื•ื ื” ืฉืืกืคืชื™ ื’'ื ืงื™ื ืก + ื“ื•ืงืจ. ื›ืœ ื”ืžืงื•ืจื•ืช ืคืชื•ื—ื™ื ื•ืžืžื•ืงืžื™ื ื‘ rmuhamedgaliev/jenkins_docker.

ื‘ืžื”ืœืš ื›ืชื™ื‘ืช ืžืืžืจ ื–ื”, ื”ืชืขื•ืจืจ ื“ื™ื•ืŸ ืขืœ ืฉื™ืžื•ืฉ ื‘ืกื•ื›ื ื™ื ื‘ืฉืจืชื™ื ืžืจื•ื—ืงื™ื ื›ื“ื™ ืœื ืœื˜ืขื•ืŸ ืืช ื”ืฆื•ืžืช ื”ืจืืฉื™ ื‘ืืžืฆืขื•ืช ืชื•ืกืฃ docker-plugin. ืื‘ืœ ืื ื™ ืื“ื‘ืจ ืขืœ ื–ื” ื‘ืขืชื™ื“.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”