Jenkins á¡ááŒá±á¬ááºáž Habre ááœáẠáá±á¬ááºážáá«ážáá»á¬ážá
áœá¬ááŸááá±á¬áºáááºáž Jenkins ááŸáá·áº docker á¡á±ážáá»áá·áºáá»á¬ážá á¡áá¯ááºáá¯ááºáá¯á¶ á¥ááá¬á¡áááºážáááºááᯠáá±á¬áºááŒáá«áááºá áá°ááŒáá¯ááºáá»á¬ážáá²á· project build tools ááœá±á¡áá¯ááºááŒáá¯ááºáááºá
ááá±á· ááŒá¿áá¬á¡ááœáẠá¡ááŒá±áá
áºáᯠááŸááá¬áááº- Jenkins 2 ááẠáááºááœá²áá¯ááºáá±á¬ááºáá¬ááœáẠáá±á¬ááºážááœááºáá«áááºá
áá¬ááŒá±á¬áá·áº áá®ááŒá¿áá¬ááᯠá áááºááŒá±ááŸááºážáá²á·áá¬áá²á
áá»áœááºáá±á¬áºááá¯á· áá¯áá¹ááá®ááŸá¬ ááŸááá±ááááºážá
- developer áá»á¬ážááẠclean áá¯ááºáááºáá±á·ááœá¬ážáá±á¬ runtime á¡áá»á¬ážá¡ááŒá¬ážá
- áá°áá®áá±á¬ runtime áá»á¬ážá ááá°áá®áá±á¬áá¬ážááŸááºážáá»á¬ážááŒá¬ážááœáẠááœá²ááœá²ááŸá¯áá»á¬ážááŸááá±áá«áááºá
- áá±á¬á·ááºáá²áá±ážáá¬ážáá°ááá¯ááºážááẠááá°áá®áá±á¬ á¡á áááºá¡ááá¯ááºážáá»á¬áž ááá¯á¡ááºáá«áááºá
á¡ááŒá¬ážááŒá¿áá¬áá»á¬ážááŸááá±á¬áºáááºáž ááŒá±ááŸááºážáááºážááᯠááŒá±á¬ááŒáá«áá á±á
Docker ááœáẠJenkins
Docker ááẠááá¯á¡áá« ááœá¶á·ááŒáá¯ážááá¯ážáááºáá±ážáá±á¬áááœáẠáá±á¬ááºážááœááºá
áœá¬ááœá²á·á
ááºážáá¬ážáá±á¬ááŒá±á¬áá·áº Docker ááᯠá¡áá¯á¶ážááŒá¯á á¡áá¬á¡á¬ážáá¯á¶ážáá®ážáá«ážááᯠáá¯ááºáá±á¬ááºááá¯ááºáá«áááºá áá»áœááºá¯ááºáááŒá±ááŸááºážáá»ááºááŸá¬ Docker ááœáẠJenkins ááŸááááºááŸáá·áº á¡ááŒá¬ážáá±á¬ Docker ááœááºááááºáá¬áá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºá
á±áááºááŒá
áºáááºá áá®áá±ážááœááºážááᯠ2013 áá¯ááŸá
Ạáá±á¬ááºážáá«ážááŸá¬ â
á¡ááá¯áá»á¯ááºááŒá±á¬ááá»áŸááºá áááºááẠDocker ááᯠá¡áá¯ááºáá¯ááºáá±á¬ ááœááºááááºáá¬ááœáẠááá¯ááºááá¯ááºááá·áºááœááºážááŒá®áž ááá¯ááºááᯠáááºáááºááẠááá¯á¡ááºáááºá /var/run/docker.sock
.
á€áááºááŸá¬ Jenkins á¡ááœááºááœááºááŸááá±á¬ Dockerfile á¥ááá¬áá áºáá¯ááŒá áºáááºá
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
ááá¯á·ááŒá±á¬áá·áºá host machine ááœáẠDocker command áá»á¬ážááá¯áá¯ááºáá±á¬ááºááá¯ááºáá±á¬ Docker container áá áºáá¯áááŸááá«áááºá
áááºáá±á¬ááºáááºáááºááŸá¯
áááŒá¬áá±ážáá®á Jenkins ááẠáááºážáá
ááºážáá»ááºážáá»á¬ážááá¯á¡áá¯á¶ážááŒá¯á áá±á¬áºááŒáááºá¡ááœáá·áºá¡áá±ážááá²á·áááºá
áá®áá±á¬á· áááºáá±á¬ááºááŸá¯á¡ááœáẠááá¯á¡ááºáá²á· libraries ááœá±á¡á¬ážáá¯á¶ážááᯠrepository áá²ááŸá¬ á¡áá°áž Dockerfile áá áºáá¯áá¬ážááá¯ááºááŒáá¡á±á¬ááºá á€áááºážá¡á¬ážááŒáá·áºá developer ááá¯ááºááá¯ááºááẠáááºáá«ááá²áá²ááá¯ááºáá±á¬ áááºáááºážáá»ááºááᯠááŒááºáááºááá¯ááºááŒá®áž host ááœáẠNode.JS á áá®ážááŒá¬ážáá¬ážááŸááºážáá áºáá¯ááᯠááá·áºááœááºážááẠOPS ááᯠáá±á¬ááºážááá¯áá±á áá¬áááá¯áá±á¬á·áá«á
FROM node:12.10.0-alpine
RUN npm install yarn -g
á€áááºáá±á¬ááºáá¯á¶ááẠNode.JS á¡ááá®áá±ážááŸááºážá¡áá»á¬ážá á¯á¡ááœáẠááá·áºáá»á±á¬áºáááºá á¥ááá¬á á¡áá²ááŸá¬ Sonar scanner áá«ááŸááá²á· 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/
á ááºážáá±ážááœá²áááºáááºážáá»ááºááᯠáá»áœááºá¯ááºááá¯á·áá±á¬áºááŒáá±á¬áºáááºáž Jenkins ááŸáá·áº áááºááá¯á·áááºááá¯ááºááááºážá Jenkins á¡á±ážáá»áá·áºáá»á¬ážááẠááá¯áá²á·ááá¯á·áá±á¬ Docker áá¯á¶áá»á¬ážááŸáá·áº á¡áá¯ááºáá¯ááºááá¯ááºááŒá®áž áááºážááá¯á·ááᯠá¡ááœááºážááá¯ááºážá áááºáá±á¬ááºááá¯ááºáááºá
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
áááºáááºááŸááºááá¯ááºááá·áºáá±áá¬ááœááº-
- áááºáá¡áááºáá±á«áºáá á®á¡á ááááááºááœááºááááºáá¬áá¡áááºá
- build container ááᯠrun ááẠááá¯á¡ááºáá±á¬ á¡ááŒááºážá¡áá¯á¶áá»á¬áž á á¡áááºá áá»áœááºá¯ááºááá¯á·ááẠáááºááŸá directory ááᯠcontainer á¡ááœááºážááœáẠdirectory á¡ááŒá Ạáááºáááºáá«áááºá
ááá¯á·á¡ááŒáẠáá»áœááºá¯ááºááá¯á·ááẠáááºáá±á¬ááºááŸá¯á¡ááá·áºáá»á¬ážááœáẠDocker áááºáá±á¬ááºááŸá¯á¡á±ážáá»áá·áºá¡ááœááºáž áááºááá·áºá¡áááá·áºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááááºááᯠáá»áœááºá¯ááºááá¯á·ááœáŸááºááŒáá¬ážááŒá®ážááŒá áºáááºá áá«á áá¬áááá¯ááŒá áºááá¯ááºáá«áááºá áá«ááŒá±á¬áá·áº ansible ááá¯áá¯á¶ážááŒá®áž á¡ááá®áá±ážááŸááºážááŒáá·áºáá»ááºááŸá¯ááá¯áááºáž ááœáá·áºáá«áááºá
á¡á±á¬ááºááœáẠáá»áœááºá¯ááºááẠááá¯ážááŸááºážáá±á¬ Node.JS á¡ááá®áá±ážááŸááºážááᯠáááºáá±á¬ááºááá¯ááºáá±á¬ áá±áá¯áá» Jenkins ááá¯ááºááᯠááŒáááá¯áá«áááºá
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 áááá áºááá¯á· áá»áŸá±á¬á·áá»áááºá
- ááá·áºááŒááºááœááºážááœááºááŒá°áá¬ááœáẠá€áááºážááŒáá·áº áááºážááá¯áááºáá±á¬ááºááá¯ááºáá±á¬ááŒá±á¬áá·áº áá¯á¶ážááááºááá²áá²ááá¯ááºáá±á¬ application build environment áá áºáá¯ááŒá áºáááºá
- áááºáááºáááááá¬áá»á¬ážá ááá°áá®áá±á¬áá¬ážááŸááºážáá»á¬ážá¡ááŒá¬áž ááœá²ááœá²ááŸá¯áá»á¬ážááŸáá·áº ááŒá¿áá¬áááŸááá«á
- á¡ááŒá²áááºáž ááááºááá¯á·ááŸá¯áááŸááá±á¬ ááá·áºááŸááºážáá±á¬ á¡áá¯ááºááœááºá
ááŒá±ááŸááºážáá»ááºááá¯ááºááá¯ááºá ááá¯ážááŸááºážááŒá®áž áááá¬áááºááŸá¬ážááŒá®áž á¡áá»áá¯ážáá»á±ážáá°ážá¡áá»áá¯á·ááᯠáááŸáá á±áá«áááºá áá¯ááºáá²á·á á ááºážáá±ážááœá²áá»á¬ážá¡ááœáẠááá¯ážááŸááºážáá±á¬ ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááŸáá·áº ááŸáá¯ááºážááŸááºáá«á áááºááœáá·áºááá·áºáááºáá»áẠá¡áááºážááẠááŒáá·áºáááºáá¬áá±á¬áºáááºáž ááá¯á¡áá« áááºážááᯠá¡ááŒá²áááºáž áááºáá±á¬ááºááœá¬ážááẠááŒá áºááŒá±á¬ááºáž á¡á¬ááá¶áá»ááºááŸáááŒá®áž developer ááá¯ááºááá¯ááºá áá°á áááºáá±á¬ááºááŸá¯ áá¯ááºáááºážá ááºá¡ááœáẠááá¯á¡ááºááá·áº á¡áá¬á¡á¬ážáá¯á¶ážááᯠááœá±ážáá»ááºááá¯ááºáááºá
áá«á
á¯áá±á¬ááºážáá¬ážáá±á¬áá¯á¶ááá¯áááºáááºážáá¯á¶ážááá¯ááºáááºá
á€áá±á¬ááºážáá«ážááᯠáá±ážáá¬ážáá±á
ááºááœááºá ááááºá¡ááºááᯠá¡áá¯á¶ážááŒá¯á master node ááᯠááááºááẠá¡áá±ážááááºážáá¬áá¬áá»á¬ážááœáẠá¡á±ážáá»áá·áºáá»á¬ážá¡áá¯á¶ážááŒá¯ááŒááºážááŸáá·áº áááºáááºá ááœá±ážááœá±ážááŸá¯áá
áºáᯠáá±á«áºáá±á«ááºáá²á·áááºá
source: www.habr.com