
เชนเซเชฌเชฐ เชชเชฐ เชเซเชจเชเชฟเชจเซเชธ เชตเชฟเชถเซ เชเชฃเชพ เชฒเซเชเซ เชเซ, เชชเชฐเชเชคเซ เชเซเชจเชเชฟเชจเซเชธ เช เชจเซ เชกเซเชเชฐ เชเชเชจเซเชเซ เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ เชคเซเชจเซเช เชเชฆเชพเชนเชฐเชฃ เชฌเชนเซ เชเชเชพ เชฒเซเชเซ เชตเชฐเซเชฃเชตเซ เชเซ. เชฌเชงเชพ เชฒเซเชเชชเซเชฐเชฟเชฏ เชชเซเชฐเซเชเซเชเซเช เชฌเชฟเชฒเซเชก เชเซเชฒเซเชธ เชเซเชฎ เชเซ , , , เช เชจเซ เช เชจเซเชฏ เชฒเซเชเซ เชเชจเซเชเซเชจเชฐเชฎเชพเช เชฌเชงเซเช เชฌเชจเชพเชตเซ เชถเชเซ เชเซ. เชชเชฃ เชเซเชจเชเชฟเชจเซเชธเชจเซเช เชถเซเช?
เชเชเซ เชธเชฎเชธเซเชฏเชพเชจเซ เชเชเซเชฒ เชเซ: เชเซเชจเชเชฟเชจเซเชธ 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เชเชฎ, เชเชชเชฃเชจเซ เชเช เชกเซเชเชฐ เชเชจเซเชเซเชจเชฐ เชฎเชณเซเชฏเซเช เชเซ เชนเซเชธเซเช เชฎเชถเซเชจ เชชเชฐ เชกเซเชเชฐ เชเชฆเซเชถเซ เชเชฒเชพเชตเซ เชถเชเซ เชเซ.
เชฌเชฟเชฒเซเชก เชธเซเชเช เชช
เชฅเซเชกเชพ เชธเชฎเชฏ เชชเชนเซเชฒเชพ, เชเซเชจเชเชฟเชจเซเชธเซ เชคเซเชจเชพ เชจเชฟเชฏเชฎเซเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเชตเชพเชจเซ เชเซเชทเชฎเชคเชพ เชฎเซเชณเชตเซ เชนเชคเซ เชธเชฟเชจเซเชเซเชเซเชธ, เชเซ เชฌเชฟเชฒเซเชก เชธเซเชเซเชฐเชฟเชชเซเชเชจเซ เชฌเชฆเชฒเชตเชพเชจเซเช เช เชจเซ เชคเซเชจเซ เชฐเชฟเชชเซเชเซเชเชฐเซเชฎเชพเช เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเชตเชพเชจเซเช เชธเชฐเชณ เชฌเชจเชพเชตเซ เชเซ.
เชคเซ เชเชพเชฒเซ เชฐเชฟเชชเซเชเซเชเชฐเซเชฎเชพเช เช เชเช เชเชพเชธ เชกเซเชเชฐเชซเชพเชเชฒ เชฎเซเชเซเช, เชเซเชฎเชพเช เชฌเชฟเชฒเซเชก เชเชฐเชตเชพ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชฌเชงเซ เชฒเชพเชเชฌเซเชฐเซเชฐเซเช เชนเชถเซ. เช เชฐเซเชคเซ, เชกเซเชตเชฒเชชเชฐ OPS เชจเซ เชนเซเชธเซเช เชชเชฐ Node.JS เชจเซเช เชเซเชเซเชเชธ เชธเชเชธเซเชเชฐเชฃ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพเชจเซเช เชเชนเซเชฏเชพ เชตเชฟเชจเชพ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชตเชพเชคเชพเชตเชฐเชฃ เชคเซเชฏเชพเชฐ เชเชฐเซ เชถเชเซ เชเซ.
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, เชเซเชฏเชพเช เชคเชฎเซ เชธเซเชชเชทเซเช เชเชฐเซ เชถเชเซ เชเซ:
- เชคเชฎเชพเชฐเซ เชจเชพเชฎเชเชฐเชฃ เชจเซเชคเชฟ เช เชจเซเชธเชพเชฐ เชเชธเซเชฎเซเชฌเชฒเซ เชเชจเซเชเซเชจเชฐเชจเซเช เชจเชพเชฎ;
- เชฌเชฟเชฒเซเชก เชเชจเซเชเซเชจเชฐ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชฆเชฒเซเชฒเซ, เชเซเชฏเชพเช เชเชชเชฃเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช เชเชชเชฃเซ เชตเชฐเซเชคเชฎเชพเชจ เชกเชฟเชฐเซเชเซเชเชฐเซเชจเซ เชเชจเซเชเซเชจเชฐเชจเซ เช เชเชฆเชฐ เชกเชฟเชฐเซเชเซเชเชฐเซ เชคเชฐเซเชเซ เชฎเชพเชเชจเซเช เชเชฐเซเช เชเซเช.
เช เชจเซ เชฌเชฟเชฒเซเชก เชธเซเชเซเชชเซเชธเชฎเชพเช, เชเชชเชฃเซ เชกเซเชเชฐ เชฌเชฟเชฒเซเชก เชเชเชจเซเชเชฎเชพเช เชเชฏเชพ เชเชฆเซเชถเซ เชเชฒเชพเชตเชตเชพ เชคเซ เชธเซเชชเชทเซเช เชเชฐเซเช เชเซเช. เช เชเชเชเชชเชฃ เชนเซเช เชถเชเซ เชเซ, เชคเซเชฅเซ เชนเซเช 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 เชฎเชฟเชจเชฟเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ;
- เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชเชชเซเชฒเชฟเชเซเชถเชจ เชฌเชฟเชฒเซเชก เชตเชพเชคเชพเชตเชฐเชฃ, เชเชพเชฐเชฃ เชเซ เชคเซ เชธเซเชฅเชพเชจเชฟเช เชเชฎเซเชชเซเชฏเซเชเชฐ เชชเชฐ เชชเชฃ เชฌเชจเชพเชตเซ เชถเชเชพเชฏ เชเซ;
- เชฌเชฟเชฒเซเชก เชเซเชฒเซเชธเชจเชพ เชตเชฟเชตเชฟเชง เชธเชเชธเซเชเชฐเชฃเซ เชตเชเซเชเซ เชคเชเชฐเชพเชฐ เชธเชพเชฅเซ เชเซเช เชธเชฎเชธเซเชฏเชพ เชจเชฅเซ;
- เชนเชเชฎเซเชถเชพ เชธเซเชตเชเซเช เชเชพเชฐเซเชฏเชธเซเชฅเชณ เชเซ เช เชตเซเชฏเชตเชธเซเชฅเชฟเชค เชจ เชฐเชนเซ.
เช เชเชเซเชฒ เชชเซเชคเซ เช เชธเชฐเชณ เช เชจเซ เชธเซเชชเชทเซเช เชเซ, เช เชจเซ เชคเซ เชซเชเซเชค เชซเชพเชฏเชฆเชพ เช เชเชชเซ เชเซ. เชนเชพ, เชธเชฐเชณ เชฌเชฟเชฒเซเชก เชเชฎเชพเชจเซเชกเซเชธ เชเชฐเชคเชพ เชชเซเชฐเชตเซเชถ เช เชตเชฐเซเชง เชฅเซเชกเซ เชตเชงเชพเชฐเซ เชเซ, เชชเชฐเชเชคเซ เชนเชตเซ เชเซเชฐเชเชเซ เชเซ เชเซ เชฌเชฟเชฒเซเชก เชนเชเชฎเซเชถเชพ เชเชพเชฎ เชเชฐเชถเซ, เช เชจเซ เชกเซเชตเชฒเชชเชฐ เชคเซเชฎเชจเซ เชฌเชฟเชฒเซเชก เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชฌเชงเซเช เชชเชธเชเชฆ เชเชฐเซ เชถเชเซ เชเซ.
เชคเชฎเซ เชฎเซเช เชเชฎเซเชชเชพเชเชฒ เชเชฐเซเชฒเซ เชเชฌเซเชจเซ เชชเชฃ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ. เชฌเชงเชพ เชธเซเชคเซเชฐเซเชค เชเซเชฒเซเชฒเชพ เชเซ เช เชจเซ เชธเซเชฅเชฟเชค เชเซ .
เช เชฒเซเช เชฒเชเชคเซ เชตเชเชคเซ, เชชเซเชฒเชเชเชจ เชตเชกเซ เชฎเชพเชธเซเชเชฐ เชจเซเชก เชฒเซเชก เชเชฐเชตเชพเชจเซเช เชเชพเชณเชตเชพ เชฎเชพเชเซ เชฐเชฟเชฎเซเช เชธเชฐเซเชตเชฐ เชชเชฐ เชเชเชจเซเชเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชตเชฟเชถเซ เชเชฐเซเชเชพ เชฅเช เชนเชคเซ. เชชเชฃ เชนเซเช เชคเชฎเชจเซ เชญเชตเชฟเชทเซเชฏเชฎเชพเช เช เชตเชฟเชถเซ เชเชฃเชพเชตเซเชถ.
เชธเซเชฐเซเชธ: www.habr.com
