рдЬреЗрдирдХреАрдВрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдмреЗ рдкрд░ рдХрдИ рд▓реЗрдЦ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреЗрдирдХреАрдВрд╕ рдФрд░ рдбреЙрдХрд░ рдПрдЬреЗрдВрдЯ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдмрддрд╛рддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рд╕рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд┐рд▓реНрдб рдЯреВрд▓
рдЖрдЬ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ: рдЬреЗрдирдХрд┐рдВрд╕ 2 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ
рдореИрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдХреНрдпреЛрдВ рд╢реБрд░реВ рдХрд┐рдпрд╛?
рдЪреВрдВрдХрд┐ рд╣рдо рдХрдВрдкрдиреА рдореЗрдВ рд╣реИрдВ
- рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдЬрд┐рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ;
- рдПрдХ рд╣реА рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдЯрдХрд░рд╛рд╡ рд╣реЛрддреЗ рд╣реИрдВ;
- рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдШрдЯрдХреЛрдВ рдХреЗ рдПрдХ рдЕрд▓рдЧ рд╕реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдФрд░ рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реВрдВред
рдбреЙрдХрд░ рдореЗрдВ рдЬреЗрдирдХреАрдВрд╕
рдЪреВрдВрдХрд┐ рдбреЙрдХрд░ рдЕрдм рд╡рд┐рдХрд╛рд╕ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдбреЙрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдЬреЗрдирдХрд┐рдВрд╕ рдХреЛ рдбреЙрдХрд░ рдореЗрдВ рд░рдЦрдирд╛ рдФрд░ рдЕрдиреНрдп рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╣реИред рдпрд╣ рдкреНрд░рд╢реНрди 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 рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЬреЗрд╡реАрдПрдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реЛрдирд╛рд░ рд╕реНрдХреИрдирд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЫрд╡рд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЖрдк рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред
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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░рд┐рдирд┐рдпреЛрдЬрди рднреА рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реВрдВред
рдиреАрдЪреЗ рдореИрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЬреЗрдирдХрд┐рдВрд╕рдлрд╛рдЗрд▓ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг 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