
Π Π₯Π°Π±Ρ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ°ΡΠΈΠΈ Π·Π° Jenkins, Π½ΠΎ ΠΌΠ°Π»ΠΊΠΎ ΠΊΡΠ΄Π΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π° ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Jenkins ΠΈ Docker Π°Π³Π΅Π½ΡΠΈ. ΠΡΠΈΡΠΊΠΈ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΠΊΠ°ΡΠΎ , , , ΠΈ Π΄ΡΡΠ³ΠΈ, ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΡΠ±ΠΈΡΠ°Ρ Π²ΡΠΈΡΠΊΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ. ΠΠΎ ΠΊΠ°ΠΊ Π΅ Ρ Jenkins?
ΠΠ½Π΅Ρ ΠΈΠΌΠ° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°: Jenkins 2 ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠΈ Ρ . Π ΡΡΠ°ΡΠΈΡΡΠ° ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»Ρ ΠΎΠΏΠΈΡ ΠΈ Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠ°ΠΌΠΈ.
ΠΠ°ΡΠΎ Π·Π°ΠΏΠΎΡΠ½Π°Ρ Π΄Π° ΡΠ΅ΡΠ°Π²Π°ΠΌ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ?
Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π½ΠΈΠ΅ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½Π° ΡΡΡΠΎΠΈΡΠ΅Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° Node.JS, Gradle, Ruby, JDK ΠΈ Π΄ΡΡΠ³ΠΈ. ΠΠΎ ΡΠ΅ΡΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π°Ρ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π²Π΅ΡΡΠΈΠΈΡΠ΅. ΠΠ°, ΠΏΡΠ°Π²ΠΈ ΡΡΠ΅, Π°ΠΊΠΎ ΠΊΠ°ΠΆΠ΅ΡΠ΅, ΡΠ΅ ΠΈΠΌΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΠΈ Π½Π° Π²Π΅ΡΡΠΈΠΈ, ΠΊΠ°ΡΠΎ nvm, rvm, Π½ΠΎ Π½Π΅ Π²ΡΠΈΡΠΊΠΎ Π΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π³Π»Π°Π΄ΠΊΠΎ Ρ ΡΡΡ ΠΈ ΡΠ΅Π·ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠΌΠ°Ρ ΡΠ²ΠΎΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ:
- Π³ΠΎΠ»ΡΠΌ ΠΎΠ±Π΅ΠΌ ΡΠ°Π½ΡΠ°ΠΉΠΌΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π·Π°Π±ΡΠ°Π²ΡΡ Π΄Π° ΡΠΈΡΡΡΡ;
- ΠΈΠΌΠ° ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡ ΡΠ°Π½ΡΠ°ΠΉΠΌ;
- Π½Π° Π²ΡΠ΅ΠΊΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΌΡ Π΅ Π½ΡΠΆΠ΅Π½ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ.
ΠΠΌΠ° ΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, Π½ΠΎ Π½Π΅ΠΊΠ° Π΄Π° Π²ΠΈ ΡΠ°Π·ΠΊΠ°ΠΆΠ° Π·Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ.
Jenkins Π² Docker
Π’ΡΠΉ ΠΊΠ°ΡΠΎ Docker Π²Π΅ΡΠ΅ ΡΠ΅ ΡΡΠ²ΡΡΠ΄ΠΈ Π² ΡΠ΅ΠΊΡΠΎΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ°, ΠΏΠΎΡΡΠΈ Π²ΡΠΈΡΠΊΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Docker. ΠΠΎΠ΅ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΅, ΡΠ΅ Jenkins Π΅ Π² Docker ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ° Π΄ΡΡΠ³ΠΈ Docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ. Π’ΠΎΠ·ΠΈ Π²ΡΠΏΡΠΎΡ Π·Π°ΠΏΠΎΡΠ½Π° Π΄Π° ΡΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π° ΠΎΡΠ΅ ΠΏΡΠ΅Π· 2013 Π³ΠΎΠ΄ΠΈΠ½Π° Π² ΡΡΠ°ΡΠΈΡΡΠ° βΒ«.
ΠΡΠ°ΡΠΊΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, ΠΏΡΠΎΡΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΈΡ Docker Π² ΡΠ°Π±ΠΎΡΠ½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΈ Π΄Π° ΠΌΠΎΠ½ΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΉΠ»Π° /var/run/docker.sock.
ΠΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Dockerfile, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡ ΠΌΠ΅ Π·Π° Jenkins.
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Π’Π°ΠΊΠ° ΠΏΠΎΠ»ΡΡΠΈΡ ΠΌΠ΅ Docker ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Docker ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π½Π° Ρ ΠΎΡΡ ΠΌΠ°ΡΠΈΠ½Π°ΡΠ°.
ΠΠ°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ
ΠΠ΅ΠΎΡΠ΄Π°Π²Π½Π° Jenkins ΠΏΠΎΠ»ΡΡΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΎΠΏΠΈΡΠ²Π° ΡΠ²ΠΎΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π»Π΅ΡΠ½Π° ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΈ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΡΠΎ ΠΌΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ.
ΠΠ΅ΠΊΠ° Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΠΌ Π² ΡΠ°ΠΌΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ Dockerfile, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° Π²ΡΠΈΡΠΊΠΈ Π½ΡΠΆΠ½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠ°ΠΌΠΈΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΠΈ ΠΏΠΎΠ²ΡΠ°ΡΡΠ΅ΠΌΠ° ΡΡΠ΅Π΄Π° ΠΈ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΌΠΎΠ»ΠΈ OPS Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈ Π½Π° Ρ ΠΎΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π²Π΅ΡΡΠΈΡ Π½Π° Node.JS.
FROM node:12.10.0-alpine
RUN npm install yarn -gΠ’ΠΎΠ·ΠΈ ΠΎΠ±ΡΠ°Π· Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π·Π° ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° Node.JS. Π Π°ΠΊΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½ΡΠΆΠ΄Π°ΡΠ° Π²ΠΈ Π΅ ΠΎΠ±ΡΠ°Π· Π·Π° JVM ΠΏΡΠΎΠ΅ΠΊΡ Ρ Π²Π³ΡΠ°Π΄Π΅Π½ Sonar ΡΠΊΠ΅Π½Π΅Ρ? Π‘Π°ΠΌΠΈ ΠΈΠ·Π±ΠΈΡΠ°ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅.
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, ΠΊΡΠ΄Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅:
- ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΈΠ·Π³ΡΠ°Π΄Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΡΡΠ³Π»Π°ΡΠ½ΠΎ Π²Π°ΡΠ°ΡΠ° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° Π·Π° ΠΈΠΌΠ΅Π½ΡΠ²Π°Π½Π΅;
- Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅, Π½ΡΠΆΠ½ΠΈ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ·Π³ΡΠ°Π΄Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΠΊΡΠ΄Π΅ΡΠΎ Π² Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΠΌΠΎΠ½ΡΠΈΡΠ°ΠΌΠ΅ ΡΠ΅ΠΊΡΡΠ°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΊΠ°ΡΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π²ΡΡΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
Π Π² ΡΡΡΠΏΠΊΠΈΡΠ΅ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΏΠΎΡΠΎΡΠ²Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ Π²ΡΡΡΠ΅ Π² ΠΈΠ·Π³ΡΠ°Π΄Π½ΠΈΡ 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("ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° ΠΎΠ±ΡΠ°Π·Π° Π·Π° ΡΠ±ΠΎΡΠΊΠ°") {
steps {
sh "docker build -f Dockerfile.build . -t project-build:${DOCKER_IMAGE_BRANCH}"
}
}
stage("Π‘Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°") {
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 ΠΌΠΈΠ½ΡΡΠΈ Π·Π° ΠΏΡΠΎΠ΅ΠΊΡ;
- ΠΠ°ΠΏΡΠ»Π½ΠΎ ΠΏΠΎΠ²ΡΠ°ΡΡΡΠ° ΡΠ΅ ΡΡΠ΅Π΄Π° Π·Π° ΡΠ±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΡΡΠΎΠΈ ΠΈ Π½Π° Π»ΠΎΠΊΠ°Π»Π½ΠΈΡ ΠΊΠΎΠΌΠΏΡΡΡΡ;
- ΠΡΠΌΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΠ±ΠΎΡΡΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ;
- ΠΠΈΠ½Π°Π³ΠΈ ΡΠΈΡΡ ΡΠ°Π±ΠΎΡΠ΅Π½ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅Π½, ΠΊΠΎΠΉΡΠΎ Π½Π΅ ΡΠ΅ Π·Π°ΠΏΡΠ»Π²Π°.
Π‘Π°ΠΌΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΅ ΠΏΡΠΎΡΡΠΎ ΠΈ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ°ΠΌΠΎ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²Π°. ΠΠ°, ΠΏΡΠ°Π³Π° Π½Π° Π²Ρ ΠΎΠ΄Π° ΠΌΠ°Π»ΠΊΠΎ ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠΈ Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ ΠΏΡΠΎΡΡΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° ΡΠ±ΠΎΡΠΊΠΈ, Π½ΠΎ ΡΠ΅Π³Π° ΠΈΠΌΠ° Π³Π°ΡΠ°Π½ΡΠΈΡ, ΡΠ΅ ΡΠ΅ ΡΠ΅ ΡΠ³Π»ΠΎΠ±ΡΠ²Π° Π²ΠΈΠ½Π°Π³ΠΈ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡΡ ΡΠ°ΠΌ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π° Π½Π΅Π³ΠΎΠ²ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ±ΠΎΡΠΊΠ°.
ΠΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΎΡ ΠΎΠ±ΡΠ°Π·Π°, ΠΊΠΎΠΉΡΠΎ ΡΡΠΌ ΡΡΠ·Π΄Π°Π» . ΠΡΠΈΡΠΊΠΈ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ ΡΠ° ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΈ ΠΈ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ Π½Π° .
ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ° Π²ΡΠ·Π½ΠΈΠΊΠ½Π° Π΄ΠΈΡΠΊΡΡΠΈΡ ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π°Π³Π΅Π½ΡΠΈ Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ΠΈ ΡΡΡΠ²ΡΡΠΈ, Π·Π° Π΄Π° Π½Π΅ ΡΠ΅ Π½Π°ΡΠΎΠ²Π°ΡΠ²Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ Π²ΡΠ·Π΅Π» ΡΡΠ΅Π· ΠΏΠ»ΡΠ³ΠΈΠ½Π° . ΠΠΎ Π·Π° ΡΠΎΠ²Π° ΡΠ΅ ΡΠ°Π·ΠΊΠ°ΠΆΠ° Π² Π±ΡΠ΄Π΅ΡΠ΅.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
