เชœเซ‹ เชคเชฎเชจเซ‡ เช˜เชฃเชพเช‚ เชตเชฟเชตเชฟเชง เชตเชพเชคเชพเชตเชฐเชฃเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เชคเซ‹ เชœเซ‡เชจเช•เชฟเชจเซเชธเชฎเชพเช‚ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ

เชœเซ‹ เชคเชฎเชจเซ‡ เช˜เชฃเชพเช‚ เชตเชฟเชตเชฟเชง เชตเชพเชคเชพเชตเชฐเชฃเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เชคเซ‹ เชœเซ‡เชจเช•เชฟเชจเซเชธเชฎเชพเช‚ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ

เชœเซ‡เชจเช•เชฟเชจเซเชธ เชตเชฟเชถเซ‡ เชนเซ‡เชฌเซเชฐเซ‡ เชชเชฐ เช˜เชฃเชพ เชฒเซ‡เช–เซ‹ เช›เซ‡, เชชเชฐเช‚เชคเซ เชœเซ‡เชจเช•เชฟเชจเซเชธ เช…เชจเซ‡ เชกเซ‹เช•เชฐ เชเชœเชจเซเชŸเซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซเช‚ เชตเชฐเซเชฃเชจ เชฅเซ‹เชกเชพ เช›เซ‡. เชฌเชงเชพ เชฒเซ‹เช•เชชเซเชฐเชฟเชฏ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชฟเชฒเซเชก เชŸเซ‚เชฒเซเชธ เชœเซ‡เชตเชพ Drone.io, เชฌเชฟเชŸเชฌเช•เซ‡เชŸ เชชเชพเช‡เชชเชฒเชพเช‡เชจ, GitLab, GitHub เช•เซเชฐเชฟเชฏเชพเช“ เช…เชจเซ‡ เช…เชจเซเชฏ, เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ เชฌเชงเซเช‚ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เชชเชฐเช‚เชคเซ เชœเซ‡เชจเช•เชฟเชจเซเชธ เชตเชฟเชถเซ‡ เชถเซเช‚?

เช†เชœเซ‡ เชธเชฎเชธเซเชฏเชพเชจเซ‹ เช‰เช•เซ‡เชฒ เช›เซ‡: เชœเซ‡เชจเช•เชฟเชจเซเชธ 2 เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช‰เชคเซเชคเชฎ เช›เซ‡ เชกเซ‹เช•เชฐ เชเชœเชจเซเชŸเซ‹. เช† เชฒเซ‡เช–เชฎเชพเช‚ เชนเซเช‚ เชฎเชพเชฐเซ‹ เช…เชจเซเชญเชต เชถเซ‡เชฐ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช…เชจเซ‡ เชฌเชคเชพเชตเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช•เซ‡ เชคเชฎเซ‡ เชคเซ‡ เชœเชพเชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเซ€ เชถเช•เซ‹.

เชถเชพ เชฎเชพเชŸเซ‡ เชฎเซ‡เช‚ เช† เชธเชฎเชธเซเชฏเชพ เชนเชฒ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚?

เช…เชฎเซ‡ เช•เช‚เชชเชจเซ€เชฎเชพเช‚ เชนเซ‹เชตเชพเชฅเซ€ เชธเชฟเชŸเซเชฐเซ‹เชจเชฟเชฏเชฎ เช•เชพเชฐเชฃ เช•เซ‡ เช†เชชเชฃเซ‡ เช˜เชฃเซ€ เชœเซเชฆเซ€ เชœเซเชฆเซ€ เชคเช•เชจเซ€เช•เซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช, เช…เชฎเชพเชฐเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชฎเชถเซ€เชจ เชชเชฐ Node.JS, Gradle, Ruby, JDK เช…เชจเซ‡ เช…เชจเซเชฏเชจเชพ เชตเชฟเชตเชฟเชง เชธเช‚เชธเซเช•เชฐเชฃเซ‹ เชฐเชพเช–เชตเชพ เชชเชกเชถเซ‡. เชชเชฐเช‚เชคเซ เช˜เชฃเซ€เชตเชพเชฐ เชธเช‚เชธเซเช•เชฐเชฃ เชคเช•เชฐเชพเชฐ เชŸเชพเชณเซ€ เชถเช•เชพเชคเซ€ เชจเชฅเซ€. เชนเชพ, เชœเซ‹ เชคเชฎเซ‡ เช•เชนเซ‹ เช•เซ‡ nvm, rvm เชœเซ‡เชตเชพ เชตเชฟเชตเชฟเชง เชตเชฐเซเชเชจ เชฎเซ‡เชจเซ‡เชœเชฐเซเชธ เช›เซ‡, เชคเซ‹ เชคเชฎเซ‡ เชธเชพเชšเชพ เชนเชถเซ‹, เชชเชฐเช‚เชคเซ เชคเซ‡เชฎเชจเซ€ เชธเชพเชฅเซ‡ เชฌเชงเซเช‚ เชเชŸเชฒเซเช‚ เชธเชฐเชณ เชจเชฅเซ€ เช…เชจเซ‡ เช† เช‰เช•เซ‡เชฒเซ‹เชฎเชพเช‚ เชธเชฎเชธเซเชฏเชพ เช›เซ‡:

  • เชฎเซ‹เชŸเซ€ เชฎเชพเชคเซเชฐเชพเชฎเชพเช‚ เชฐเชจเชŸเชพเช‡เชฎ เช•เซ‡ เชœเซ‡ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชธเชพเชซ เช•เชฐเชตเชพเชจเซเช‚ เชญเซ‚เชฒเซ€ เชœเชพเชฏ เช›เซ‡;
  • เชธเชฎเชพเชจ เชฐเชจเชŸเชพเช‡เชฎเชจเชพ เชตเชฟเชตเชฟเชง เชธเช‚เชธเซเช•เชฐเชฃเซ‹ เชตเชšเซเชšเซ‡ เชคเช•เชฐเชพเชฐ เช›เซ‡;
  • เชฆเชฐเซ‡เช• เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเชจเซ‡ เช˜เชŸเช•เซ‹เชจเชพ เช…เชฒเช— เชธเซ‡เชŸเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เช›เซ‡.

เชฌเซ€เชœเซ€ เชชเชฃ เชธเชฎเชธเซเชฏเชพเช“ เช›เซ‡, เชชเชฐเช‚เชคเซ เชนเซเช‚ เชคเชฎเชจเซ‡ เชคเซ‡เชจเชพ เช‰เช•เซ‡เชฒ เชตเชฟเชถเซ‡ เชœเชฃเชพเชตเซเช‚ เช›เซเช‚.

เชกเซ‹เช•เชฐเชฎเชพเช‚ เชœเซ‡เชจเช•เชฟเชจเซเชธ

เชกเซ‹เช•เชฐ เชนเชตเซ‡ เชตเชฟเช•เชพเชธเชจเซ€ เชฆเซเชจเชฟเชฏเชพเชฎเชพเช‚ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชธเซเชฅเชพเชชเชฟเชค เชฅเชˆ เช—เชฏเซเช‚ เชนเซ‹เชตเชพเชฅเซ€, เชกเซ‹เช•เชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฒเช—เชญเช— เช•เช‚เชˆเชชเชฃ เชšเชฒเชพเชตเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชฎเชพเชฐเซ‹ เช‰เช•เซ‡เชฒ เช เช›เซ‡ เช•เซ‡ เชกเซ‹เช•เชฐเชฎเชพเช‚ เชœเซ‡เชจเช•เชฟเชจเซเชธ เชนเซ‹เชฏ เช…เชจเซ‡ เช…เชจเซเชฏ เชกเซ‹เช•เชฐ เช•เชจเซเชŸเซ‡เชจเชฐ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชธเช•เซเชทเชฎ เชนเซ‹เชฏ. เช† เชชเซเชฐเชถเซเชจ 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 เชเชชเซเชฒเซ€เช•เซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เช›เซ‡. เชœเซ‹, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชคเชฎเชพเชฐเซ‡ JVM เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฎเชพเชŸเซ‡ เช…เช‚เชฆเชฐ เชธเซ‹เชจเชพเชฐ เชธเซเช•เซ‡เชจเชฐ เชธเชพเชฅเซ‡เชจเซ€ เช›เชฌเซ€เชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เชคเซ‹ เชถเซเช‚? เชคเชฎเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เช˜เชŸเช•เซ‹ เชชเชธเช‚เชฆ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซเชตเชคเช‚เชคเซเชฐ เช›เซ‹.

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เชœเซเชฏเชพเช‚ เชคเชฎเซ‡ เชธเซเชชเชทเซเชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹:

  • เชคเชฎเชพเชฐเซ€ เชจเชพเชฎเช•เชฐเชฃ เชจเซ€เชคเชฟ เช…เชจเซเชธเชพเชฐ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซเช‚ เชจเชพเชฎ;
  • เชฌเชฟเชฒเซเชก เช•เชจเซเชŸเซ‡เชจเชฐ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชฆเชฒเซ€เชฒเซ‹, เชœเซเชฏเชพเช‚ เช…เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช†เชชเชฃเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เช…เช‚เชฆเชฐ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชคเชฐเซ€เช•เซ‡ เชฎเชพเช‰เชจเซเชŸ เช•เชฐเซ€เช เช›เซ€เช.

เช…เชจเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชฌเชฟเชฒเซเชก เชธเซเชŸเซ‡เชชเซเชธเชฎเชพเช‚ เช…เชฎเซ‡ เชธเซ‚เชšเชตเซ€เช เช›เซ€เช เช•เซ‡ เชกเซ‹เช•เชฐ เชฌเชฟเชฒเซเชก เชเชœเชจเซเชŸเชจเซ€ เช…เช‚เชฆเชฐ เช•เชฏเชพ เช†เชฆเซ‡เชถเซ‹ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเชตเชพ. เช† เช•เช‚เชˆเชชเชฃ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ เชนเซเช‚ เชเชจเซเชธเชฟเชฌเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชœเชฎเชพเชตเชŸ เชชเชฃ เชถเชฐเซ‚ เช•เชฐเซเช‚ เช›เซเช‚.

เชจเซ€เชšเซ‡ เชนเซเช‚ เชเช• เชธเชพเชฎเชพเชจเซเชฏ เชœเซ‡เชจเช•เชฟเชจเซเชธเชซเชพเชˆเชฒ เชฌเชคเชพเชตเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เชœเซ‡ เชเช• เชธเชฐเชณ 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.

เช† เชฒเซ‡เช– เชฒเช–เชคเซ€ เชตเช–เชคเซ‡, เชฐเชฟเชฎเซ‹เชŸ เชธเชฐเซเชตเชฐ เชชเชฐ เชเชœเชจเซเชŸเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชตเชฟเชถเซ‡ เชšเชฐเซเชšเชพ เชฅเชˆ เชœเซ‡เชฅเซ€ เชชเซเชฒเช—เชˆเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฎเชพเชธเซเชŸเชฐ เชจเซ‹เชก เชฒเซ‹เชก เชจ เชฅเชพเชฏ. เชกเซ‹เช•เชฐ-เชชเซเชฒเช—เช‡เชจ. เชชเชฐเช‚เชคเซ เชนเซเช‚ เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚ เช† เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เชถ.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹