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