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