90 ááŸá±á¬ááºážááá¯ááºážááœá±ááŸá¬ áá»áœááºáá±á¬á·áºáá²á· ááááá¯á¶áž áááºááá¯ááºááœá±ááᯠáá±ážáá²á·áá«áááºá ááá¯á¡áá»áááºá áááºážááá¯á·ááᯠáá¯ááºáááºážáá±á¬ááºáá¬á¡ááŒá
ẠáááºááŸááºááẠá¡ááœááºááœááºáá°áá²á·áááºá áá»áŸáá±áá¬ážáá±á¬ hosting á¡áá»áá¯á·ááœáẠApache áá¬áá¬áá
áºáá¯ááŸááá«áááºá áááºááẠFTP ááŸáá
áºááá·áº á€áá¬áá¬ááá¯á· áááºáá±á¬ááºááá¯ááºáááºá ftp://ftp.example.com
. ááá¯á·áá±á¬áẠááá·áºá¡áááºááŸáá·áº á
áá¬ážááŸááºááᯠááá·áºááœááºážááŒá®áž ááá¯ááºáá»á¬ážááᯠáá¬áá¬ááá¯á· á¡ááºáá¯ááºáá¯ááºááá«áááºá ááá°áá®áá±á¬á¡áá»áááºáá»á¬ážááŸááá²á·áááºá á¡áá¬á¡á¬ážáá¯á¶ážáááºááá¯áááºááá¯ááá¯ááá¯ážááŸááºážáá²á·áááºá
ááá¯á¡áá»áááºááŸá á áááºá á¯ááŸá ẠááŸá áºáá¯á¡ááœááºáž á¡áá¬á¡á¬ážáá¯á¶ážááẠáá»á¬ážá áœá¬ááŒá±á¬ááºážáá²ááœá¬ážáá²á·áááºá áááºááá¯ááºáá»á¬ážááẠááá¯ááá¯ááŸá¯ááºááœá±ážáá¬áááºá áááºážááá¯á·ááᯠáá¯ááºáá¯ááºááŒááºážááá¯á· ááá¯ááºáá®ááœáẠá á¯á ááºážááááºááŒá áºáááºá áá áºáá¯áááºážáá±á¬áá¬áá¬áá áºáá¯ááẠload balancers áá»á¬ážááá±á¬ááºááœááºááœááºáááºáááºáá±áá±á¬áá¬áá¬áá»á¬ážá áœá¬ááŒá áºáá¬áá²á·áááºá áá¬ážááŸááºážááááºážáá»á¯ááºááŸá¯á áá áºáá»á¬ážááá¯á¡áá¯á¶ážááŒá¯ááŒááºážáááºáá¯á¶ááŸááºááŒá áºáá¬áá²á·áááºá
áá»áœááºá¯ááºáááá¯ááºáá±ážááá¯ááºáá¬ááá±á¬áá»ááºá¡ááœáẠáá»áœááºá¯ááºááœáẠá¡áá°ážááœá²á·á
ááºážáá¯á¶áá
áºáá¯ááŸááááºá áá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯áááºážááᯠáá¯ááºáá±á¬ááºááŒááºážááŒáá·áº áá¯ááºáá¯ááºááŸá¯ááœáẠááá¯ááºááᯠááŒáá·áºáá»ááºááẠááá¯á¡ááºááŒá±á¬ááºáž áá»áœááºá¯ááºáááá«áááº- áá¬áááœá²áá
áºáá¯ááá¯á· áá¯ááºáá±ážááŒááºáž master
GitHub ááœáẠááá¯á·á¡ááŒááºá áá»áœááºá¯ááºááááºá¡ááºááá®áá±ážááŸááºážáááºááááºáááºááŸá¯ááá¯áá±áá»á¬á
á±áááºá¡ááœááºá áá»áœááºá¯ááºááẠááŒá®ážáá¬ážáá±á¬ Kubernetes á¡á
á¯á¡áá±ážááŒá®ážááᯠá
á®áá¶ááá·áºááœá²áááºá ááá¯á·ááá¯áẠDocker Swarm áááºážááá¬ááᯠá¡áá¯á¶ážáááŒá¯áá»ááºáá±á¬á·áá«á ááá¯á·ááá¯áẠpodsá á¡á±ážáá»áá·áºáá»á¬ážááŸáá·áº á¡ááŒá¬ážá¡áá»áá¯ážá¡á
á¬ážá¡á¬ážáá¯á¶ážáá«ááŸááá±á¬ áá¬áá¬áá»á¬ážááᯠááááºážááááºážáá¬ážááá¯ááŒá±á¬ááºáž áá»áœááºá¯ááºáááá«áááºá ááŸá¯ááºááœá±ážááŸá¯áá»á¬ážá á¡áá¯ááºááᯠáááºááá¯ááºááá»áŸ ááœááºáá°á¡á±á¬áẠáá¯ááºááá¯á· áááºážááá¯ááºááᯠáá±á¬ááºááá¯á·á¡ááœáẠCI/CD áá²á· áááºážááŸá®ážááá¯á· ááá¯áá«áááºá
á¡áááºá ááá·áºááœáẠááá±á¬áá»ááºáááºáá
áºáᯠ(á€ááá
á¹á
ááœááºá Node.js ááá±á¬áá»ááº) ááŸááá«áá á€ááá±á¬áá»ááºá ááŒáá·áºáá»ááºááŸá¯ááᯠá¡ááá¯á¡áá»á±á¬áẠáááºááá¯á·áá¯ááºáá±á¬ááºááááºááᯠááááá¯áááºá ááá¯ááŸá±á¬ááºááŸá¯ááœáẠááááºážáááºážáá¬ážááá·áºá¡áá¬ááẠáá¯ááºáá¯ááºááŸá¯ááœáẠáá¯ááºáá±á¬ááºááá·áºá¡áá¬ááŸáá·áº á¡ááá¡áá»ááá¯ááºáá®ááŒá±á¬ááºáž áá±áá»á¬á
á±ááŒá®ážá áá»áœááºá¯ááºááẠáá®áá±á¬ááºážáá«ážááᯠá
áááºáááºá
á¬ážáááºáááºáá«áááºá
ááá¯á¡ááºáá»ááºáá»á¬áž
á€áá±á¬ááºážáá«ážááá¯áááºááŸá¯áá°ááẠcommand line ááŸáá·áº Bash scripts áá»á¬ážááá¯á¡ááŒá±áá¶áá¬ážáááºááŸá¯ááŸááááºáá»áŸá±á¬áºááá·áºáá«áááºá ááá¯á·á¡ááŒááºáá°áááºá¡áá±á¬áá·áºáá»á¬ážááá¯á¡ááºáááá·áºáááºá
áááºááŸááºážáá»ááºáááºážááá¯ááº
á€áá±á¬ááºážáá«ážááᯠááŒáœááºážáá»ááºáááŸá âáá»á°ááá¯áá®áááºâ áá¯áá±á«áºáááºáᯠáááŒá±á¬ááá¯áá«á áááºážááẠáá»áœááºá¯ááºáá±á·áá¬áááºáá°áá²á·ááá·áºá¡áá¬áá»á¬ážá¡ááŒá±á¬ááºážááŸáá·áº áá¯ááºááᯠá ááºážáááºááŒááºážááŸáá·áº áá¯ááºáá¯ááºááŒááºážááá¯á· á¡áá¯á¶ážáá»ááŒááºážá¡ááœáẠáá»áœááºá¯ááºááŸáá·áº ááá¯ááºáá®ááá·áº áá¯ááºáááºážá ááºááᯠáá±á¬áºááŒááá·áº á á¬ááœááºá á¬áááºážáá áºáá¯ááŒá áºááŒá®áž á¡ááá¯á¡áá»á±á¬ááºááŒááºáááºážááŸá¯áá áºáá¯ááœáẠáá¯ááºáá±á¬ááºááŒááºážááŒá áºáááºá
á€áááºááŸá¬ áá»áœááºá¯ááºá á¡áá¯ááºá¡ááœá¬ážá¡áᬠááŒá®ážáá¯á¶ážááœá¬ážááŒááºážáááºááŒá áºáááºá
áá¯ááºááŸááœá²á áááºááá·áº repository áá¬áááœá²ááœááºáááᯠáááºáá¬ážáá±á¬ áá¯ááºá¡ááœáẠmaster
á¡á±á¬ááºáá«áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáááº-
- Travis CI ááœáẠáááºáá±á¬ááºááá·áº ááá±á¬áá»ááºááẠá áááºáááºá
- áá°áá áºá áá±á«ááºážá ááºážááŸá¯ááŸáá·áº á¡áá¯á¶ážá០á¡áá¯á¶ážá ááºážáááºááŸá¯á¡á¬ážáá¯á¶ážááᯠáá¯ááºáá±á¬ááºáááºá
áá²ááá¯á·áá»áá±á¬áá¯ááºá¡ááœááºáᬠmaster
á¡á±á¬ááºáá«á¡ááá¯ááºážáá¯ááºáá±á¬ááºáááº-
- á¡áá±á«áºááŸá¬ááŒá±á¬áá²á·áá²á·á¡áá¬á¡á¬ážáá¯á¶ážá¡ááŒááº...
- áááºááŸááá¯ááºá áááºáááºáá»á¬ážááŸáá·áº áááºáááºážáá»ááºááᯠá¡ááŒá±áá¶á Docker áá¯á¶áá áºáᯠáááºáá±á¬ááºááŒááºážá
- áá¯á¶ááᯠDocker Hub ááá¯á· ááŒáá·áºáá»ááºááŒááºážá
- áá¯ááºáá¯ááºááŸá¯áá¬áá¬ááá¯á·áá»áááºáááºááŸá¯á
- Docker Hub á០áá¯á¶áá áºáá¯á¶ááᯠáá¬áá¬ááá¯á· á¡ááºáá¯ááºáá¯ááºááŒááºážá
- áááºááŸáááœááºááááºáá¬ááᯠáááºááá¯ááºááŒá®áž áá¯á¶á¡áá áºááá¯á¡ááŒá±áá¶á á¡áá áºáá áºáá¯á áááºáá«á
Dockerá áá¯á¶áá»á¬ážááŸáá·áº containers áá»á¬ážá¡ááŒá±á¬ááºáž áá¯á¶ážáááááá«á á áááºááá°áá«ááŸáá·áºá á¡á²áá«ááᯠá¡á¬ážáá¯á¶ážááŒá±á¬ááŒáááºá
CI/CD ááá¯áá¬áá¬áá²á
á¡ááá¯áá±á¬áẠCI/CD ááẠ"á ááºáááºáááŒáẠáá±á«ááºážá ááºážááŒááºáž/á¡áááºáááŒáẠááŒáá·áºáá»ááºááŒááºáž" ááᯠááá¯ááºá á¬ážááŒá¯áááºá
â á ááºáááºáááŒááºáá±á«ááºážá ááºááŒááºážá
á
ááºáááºáááŒáẠáá±á«ááºážá
ááºááŒááºážááẠááá±á¬áá»ááºá áááºáá¡áááºážá¡ááŒá
áºáá¯áẠááá¯ááŸá±á¬ááºááŸá¯ááœáẠáá±á¬á·ááºáá²á¡ááºáá»ááºáá®áá¬áá»á¬ážá áááááááºááŒá¯ááá·áº áá¯ááºáááºážá
ááºáá
áºáᯠ(áá»á¬ážáá±á¬á¡á¬ážááŒáá·áº áá¬áááœá²áá
áºáá¯ááŒá
áºáááºá master
) áá
áºáá»áááºáááºážááŸá¬áááºá á¡ááá¯á¡áá»á±á¬ááºá
ááºážáááºááŒááºážááŒáá·áº áá¯ááºáá¡áááºá¡ááœá±ážááᯠá¡á¬ááá¶áá«áááºá
â á¡áááºáááŒááºááŒáá·áºáá»ááºááŒááºážá
á ááºáááºáááŒáẠááŒáá·áºáá»ááºááŒááºážááẠáá¯ááºááᯠáá¯ááºáá¯ááºááŒááºážááá¯á· áááŒá¬áá á¡ááá¯á¡áá»á±á¬áẠááŒáá·áºáá»ááºááŒááºáž ááŒá áºáááºá CI/CD á¡ááá¯áá±á¬ááºá áá¯áááá¡ááá¯ááºážááᯠáá áºáá«áá áºáᶠâá ááºáááºáááŒáẠáá±ážááá¯á·ááŒááºážâ á¡ááŒá Ạá á¬áá¯á¶ážáá±á«ááºážáá«áááºá áááºážááẠá¡ááŒá±áá¶á¡á¬ážááŒáá·áº "á ááºáááºáááŒáẠááŒáá·áºáá»ááºááŒááºáž" ááŸáá·áº áá°áá®áá±á¬áºáááºáž "á ááºáááºáááŒáẠáá±ážááá¯á·ááŒááºáž" ááẠááá±á¬áá»áẠááŒáá·áºáá»ááºááŸá¯ áá¯ááºáááºážá áẠáá áááºáá® á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠááá¯ááºááá¯áẠá¡áááºááŒá¯ááẠááá¯á¡ááºááŒá±á¬ááºáž á¡áááá¹áá¬ááºáááºáá±á¬ááºáááºá
á áááº
áá»áœááºáá±á¬áºáá±á·áá¬áá°ážáá²á· app á áá® app ááá¯á·áá±á«áºáá«áááºá
áá»áœááºá¯ááºáááá
á¹á
ááœááºá á¡ááá®áá±ážááŸááºážááẠNode.js áááºáááºážáá»ááºááœááºáááºáááºáá±áá±á¬ Express áá¬áá¬áá
áºáá¯ááŒá
áºááŒá®áž á
á¬áá»ááºááŸá¬áá
áºáá¯áááºáž React á¡ááºááºáá®áá±ážááŸááºážááᯠáááºáá±á¬ááºááŸá¯áá±ážáᬠáá¯á¶ááŒá¯á¶áá±á¬áá¬áá¬áááºááŒááºáž API ááᯠáá¶á·ááá¯ážáá±ážáá«áááºá á€áááá¯áá¬ááẠááœááºááœá±á·ááá¯ááºáá±á¬ áááºážáá»á°áá¬ááᯠááá¯ááºáá¬áááºá
áá«áá²á· ááá¯ááºáááºáááºá
Docker
Docker ááẠááœááºááááºáá¬ááŒá¯áá¯ááºááŒááºážáááºážááá¬ááŒá±á¬áá·áº á¡ááá®áá±ážááŸááºážáá»á¬ážááᯠááœááºáá°á
áœá¬ááŒáá·áºáá±ááá¯ááºá
á±áááºá á¡áá¯á¶ážááŒá¯ááá¯ááºááŒá®áž áá°áá®áá±á¬áááºáááºážáá»ááºááœáẠáá¯ááºáá±á¬ááºááá¯ááºá
á±ááá·áº áááááá¬áá
áºáá¯ááŒá
áºáááºá ááááŠážá
áœá¬á áá»áœááºá¯ááºááẠDocker command line tools (CLI) ááœáẠáá»áœááºá¯ááºááááºááᯠááá°áááºááá¯á¡ááºáá«áááºá
Docker Hub ááẠá¡ááŒááºážá¡á¬ážááŒáá·áº á¡áá°áá°áááº
ááá¯á·ááŒá±á¬áá·áº Docker ááá¯á áááºáááºá¡ááœáẠáááºááẠá¡áá¬ááŸá áºáá¯ááᯠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááº-
- áááºááŸááºáááº
DockerDesktop . - ááŸááºáá¯á¶áááºáááº
Docker á¡áá»ááºá¡áá»á¬ .
áááºážááŒá®ážáá±á¬ááºá Docker áá¬ážááŸááºážááá¯á á áºáá±ážááẠá¡á±á¬ááºáá« command ááᯠrun ááŒááºážááŒáá·áº Docker CLI á¡áá¯ááºáá¯ááºááŒááºážááŸááááŸá á á áºáá±ážááá¯ááºáááº-
docker -v
ááá¯á·áá±á¬áẠáááºáá¡áá¯á¶ážááŒá¯áá°á¡áááºááŸáá·áº á áá¬ážááŸááºááᯠááá·áºááœááºážááŒááºážááŒáá·áº Docker Hub ááá¯á· áááºáá±á¬ááºáá«-
docker login
Docker ááá¯á¡áá¯á¶ážááŒá¯áááºá áá¯á¶áá»á¬ážááŸáá·áº ááœááºááááºáá¬áá»á¬ážá ááá±á¬ááá¬ážáá»á¬ážááᯠáá¬ážáááºááá«áááºá
â áá¯á¶áá»á¬áž
áá¯á¶áá áºáá¯á¶ááẠááœááºááááºáá¬ááᯠáááºáááºáááºá¡ááœáẠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážáá«ááŸááá±á¬ á¡áá±ážá áááºáá¯á¶á á¶áá áºáá¯áá²á·ááá¯á· á¡áá¬áá áºáá¯ááŒá áºáááºá á€áááºááŸá¬ á¡ááá®áá±ážááŸááºážá ááá¯ááºá áá áºááŸáá·áº áááºáááºáá»á¬ážá áááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ áá»áŸááºáá áºááŒááºáá¯á¶ááŒá áºáááºá Developer áá»á¬ážááẠáá¯á¶áá»á¬ážááᯠá¡ááœááºááá°áá»áŸáá±ááá¯ááºáááºá
# ÐÑвПЎ ÑвеЎеМОй ПбП вÑеÑ
ПбÑазаÑ
docker images
ဠcommand ááẠá¡á±á¬ááºáá« áá±á«ááºážá á®ážááŒáá·áº ááá¬ážáá áºáá¯ááᯠáá¯ááºáá«áááº-
REPOSITORY TAG IMAGE ID CREATED SIZE
---
áá±á¬ááºáá áºáá¯ááá±á¬á· áá°áá®áá²á· format áá²á· command áá áºáá»áá¯á·ááᯠáá±á·áá¬ááŒáá·áºáá«ááẠ- á¡áááºáá¯á¶áž comment áá áºáá¯áá«áá²á· command áá áºáá¯á ááŒá®ážááẠoutput áá¯ááºááá¯á·ááá²á· á¥ááá¬áá áºáá¯áá«á
â ááœááºááááºáá¬áá»á¬áž
ááœááºááááºáá¬ááẠá¡ááºááá®áá±ážááŸááºážáá áºáá¯áááºáááºááẠááá¯á¡ááºááá·áºá¡áá¬á¡á¬ážáá¯á¶ážáá«áááºááá·áº á á®áá¶áá¯ááºáá±á¬ááºááá¯ááºáá±á¬ á¡áá¯ááºáá áºáá¯ááŒá áºáááºá á€áá»ááºážáááºáááºážáá«ááŸááá±á¬ á¡ááºááºáá®áá±ážááŸááºážááẠá¡ááŒá±áá¶á¡áá±á¬ááºá¡áŠáá»á¬áž áááºááá¯á·áááºááŸáá á±áá¬áá° á¡ááŒá²áááºážáá°áá®áá±áá«áááº- áá®ážááŒá¬ážáááºáááºážáá»ááºááœááºááŸáá·áº áá°áá®áá±á¬áááºáááºážáá»ááºááœááºááŸááááºá á¡áááá¡áá»ááºááŸá¬ áá°áá®áá±á¬áá¯á¶áá¥ááá¬áá»á¬ážááᯠááá°áá®áá±á¬áááºáááºážáá»ááºáá»á¬ážááœáẠááœáŸáá·áºáááºáá¬ážááŒááºážááŒá áºáááºá
# ÐеÑеÑОÑлеМОе вÑеÑ
кПМÑейМеÑПв
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
---
â áááºáá»á¬áž
Tag ááẠáá¯á¶áá áºáá¯á¶á áá®ážááŒá¬ážáá¬ážááŸááºážááᯠááœáŸááºááŒáá±áá«áááºá
â Docker ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠá¡ááŒááºááá¯ážáá¬ážáá«á
á€áááºááŸá¬ á¡áá¯á¶ážáá»á¬ážáá±á¬ Docker command á¡áá»áá¯á·á ááŒá¯á¶áá¯á¶áá¯á¶ážáááºáá»ááºááŒá áºáááºá
á¡ááœá²á·
á áá¬ážá ááº
á¡áá»áá¯áž
áá¯á¶ááááº
Dockerfile ááŸáá¯á¶áá áºáá¯áááºáá±á¬ááºááŒááºážá
áá¯á¶ááááº
áá¯á¶áááºáá¯ááºááŒááºážá
áá¯á¶ááááº
áá¯á¶áá»á¬ážááᯠá á¬áááºážááŒá¯á á¯ááŒááºážá
ááá·áºáá±á¬á¡áá¬
áá¯á¶áá áºáá¯á¡áá±á«áº á¡ááŒá±áá¶á ááœááºááááºáá¬ááᯠáá¯ááºáá±á¬ááºááŒááºážá
áá¯á¶ááááº
áá¯á¶áá áºáá¯á¶ááᯠááŸááºáá¯á¶áááºááŒááºážááá¯á· á¡ááºáá¯ááºáá¯ááºááŒááºážá
áá¯á¶ááááº
ááŸááºáá¯á¶áááºááŒááºážá០áá¯á¶áá áºáá¯á¶ááᯠáááºáá±áááºá
ááá·áºáá±á¬á¡áá¬
ááœááºááááºáá¬á á¬áááºáž
áá¯á¶/ááœááºááááºáá¬
á¡áá¯á¶ážáááŒá¯áá±á¬ ááœááºááááºáá¬áá»á¬ážááŸáá·áº áá¯á¶áá»á¬ážááᯠáááºááŸá¬ážááŒááºážá
âDockerfile
ááŒááºááœááºážááŸá¬ áá¯ááºáá¯ááºáá±ážá¡ááºááá®áá±ážááŸááºážááᯠáááºááᯠrun áááá² áááááºá áá»áœááºá¯ááºááœáẠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ React á¡ááá®áá±ážááŸááºážááᯠáááºáá±á¬ááºááẠáá®ááá¯ááºážáá¯ááºáá¬ážáá±á¬ Webpack ááœá²á·á
ááºážááŸá¯áá
áºáá¯ááŸááááºá ááá¯á·áá±á¬ááºá áá»áœááºá¯ááºááœáẠNode.js á¡ááŒá±áá¶áá¬áá¬ááᯠá
áááºááá·áº á¡áááá·áºáá
áºáá¯ááŸááááºá 5000
. á€áá¯á¶áááº-
npm i # ÑÑÑаМПвка завОÑОЌПÑÑей
npm run build # ÑбПÑка React-пÑОлПжеМОÑ
npm run start # запÑÑк Node-ÑеÑвеÑа
á€áá á¹á ááºážá¡ááœáẠáá»áœááºá¯ááºááœáẠááá°áá¬á¡ááá®áá±ážááŸááºážáá áºáᯠáááŸáááŒá±á¬ááºáž áááááŒá¯ááá·áºáááºá ááá¯á·áá±á¬áº á€ááœááºá á ááºážáááºááŸá¯áá»á¬ážá¡ááœááºá áááºááá·áºááá¯ážááŸááºážáá±á¬ Node á¡ááá®áá±ážááŸááºážáááᯠáá¯ááºáá±á¬ááºáááá·áºáááºá
ááœááºááááºáá¬ááᯠá¡áá¯á¶ážááŒá¯áááºá¡ááœáẠáááºááẠDocker á¡á¬áž ááœáŸááºááŒá¬ážáá»ááºáá»á¬áž áá±ážááá«áááºá áááºážááá¯áá±á«áºáá±á¬ááá¯ááºááŸáááá·áºáá¯ááºáá±á¬ááºáááºá Dockerfile
ááá±á¬áá»ááºá root directory ááœááºáááºááŸááááºá á€ááá¯ááºááẠá¡á
ááá¯ááºážááœáẠáá¬ážááááºááá¯ááºááŒá
áºáá¯á¶ááááºá
ááá¯á·áá±á¬áº áááºážááœááºáá«áááºááá·áºá¡áá¬áá»á¬ážááẠáá¯ááºáááºážááœááºáááºáááºážáá»ááºáá áºáá¯áááºáá±á¬ááºááŒááºážááŸáá·áº áááºáá°ááá·áº á¡áá°ážá¡áááá·áºáá»á¬ážááŒáá·áº áá±á¬áºááŒááŒááºážáá¬ááŒá áºáááºá á€áááºááŸá¬ á€á¡áááá·áºáá±á¬áºáá»á¬ážáá²á០á¡áá»áá¯á·ááŒá áºáááº-
FROM á០- á€á¡áááá·áºááẠááá¯ááºáá áºáá¯ááᯠá áááºáááºá áááºážááẠááœááºááááºáá¬áááºáá±á¬ááºáá¬ážááá·áº á¡ááŒá±áá¶áá¯á¶á¡á¬áž áááºááŸááºáá±ážáááºááááá¹áá° - áá±áááœááºáž á¡áááºážá¡ááŒá áºá០ááá¯ááºáá»á¬ážááᯠááœááºááááºáá¬ááá¯á· áá°ážáá°ááŒááºážáá¡áá¯ááºááá¯ááºáᬠ- á¡á±á¬ááºáá« command áá»á¬ážá¡ááœáẠá¡áá¯ááºáááºážááœáŸááºááᯠáááºááŸááºááŒááºážáRUN - á¡áááá·áºáá»á¬ážááᯠrun ááá±á¬áºáá¯ááºáá«á - ááááºáááºážáááºáááºáá»á¬ážáENTRYPOINT - áá¯ááºáá±á¬ááºáááá·áº á¡áááá·áºááᯠááœáŸááºááŒááŒááºážá
Dockerfile
á€áá²á·ááá¯á·áá±á¬áá¯á¶ááááº-
# ÐагÑÑзОÑÑ Ð±Ð°Ð·ÐŸÐ²Ñй ПбÑаз
FROM node:12-alpine
# СкПпОÑПваÑÑ ÑÐ°Ð¹Ð»Ñ ÐžÐ· ÑекÑÑей ЎОÑекÑПÑОО в ЎОÑекÑПÑÐžÑ app/
COPY . app/
# ÐÑпПлÑзПваÑÑ app/ в ÑПлО ÑабПÑей ЎОÑекÑПÑОО
WORKDIR app/
# УÑÑаМПвОÑÑ Ð·Ð°Ð²ÐžÑОЌПÑÑО (кПЌаМЎа npm ci пПÑ
Пжа npm i, МП ОÑпПлÑзÑеÑÑÑ ÐŽÐ»Ñ Ð°Ð²ÑПЌаÑОзОÑПваММÑÑ
ÑбПÑПк)
RUN npm ci --only-production
# СПбÑаÑÑ ÐºÐ»ÐžÐµÐœÑÑкПе React-пÑОлПжеМОе ÐŽÐ»Ñ Ð¿ÑПЎакÑМа
RUN npm run build
# ÐÑПÑлÑÑОваÑÑ ÑказаММÑй пПÑÑ
EXPOSE 5000
# ÐапÑÑÑОÑÑ Node-ÑеÑвеÑ
ENTRYPOINT npm run start
áááºááœá±ážáá»ááºáá±á¬ á¡ááŒá±áá¶áá¯ááºáá¯á¶áá±á«áº áá°áááºá áá±á¬ááºáááºááŸá®ááá¯ááŸá¯áá»á¬áž ááá·áºááœááºážááẠááá¯á¡ááºááá¯ááºáááºá á¡ááŸááºááŸá¬ á¡áá»áá¯á·áá±á¬ á¡ááŒá±áá¶áá¯á¶áá»á¬áž (Node Alpine Linux áá²á·ááá¯á·) ááᯠáááºááá¯ááºááá»áŸ áá»á áºáá áºá á±ááẠáááºááœááºáá»ááºááŒáá·áº áááºáá®ážáá¬ážáááºá ááááºá¡áá±ááŒáá·áº áááºážááá¯á·ááœáẠáááºáá»áŸá±á¬áºááá·áºáá¬ážááá·áº áááá¯ááááºá¡áá»áá¯á· ááŸááááºááá¯ááºáá«á
â ááœááºááááºáá¬ááᯠáááºáá±á¬ááºááŒááºážá áááºááŒááºážááŸáá·áº áá¯ááºáá±á¬ááºááŒááºážá
ááœááºááááºáá¬ááᯠááŒááºááœááºáž áááºáááºááŒááºážááŸáá·áº ááœáŸááºáááºááŒááºážááá¯á·ááẠáá»áœááºá¯ááºááá¯á· áááŸáááŒá®ážáá±á¬ááºááŒá
áºáááºá Dockerfile
á¡áá¯ááºááœá±á áá±á¬áºáá±á¬áºááá¯ážááŸááºážáá«áááºá áá¯á¶ááᯠDocker Hub ááá¯á· áááœááºážáá®á áááºážááᯠá
ááºááœááºážá á
ááºážáááºááẠááá¯á¡ááºáááºá
â á ááºážáá±ážááœá²
ááááŠážá
áœá¬áááºá
á¯áá±á¬ááºážáááºááá¯á¡ááºáááºá latest
).
# СбПÑка ПбÑаза
docker build -t <image>:<tag> .
á€á¡áááá·áºááá¯á¡áá¯á¶ážááŒá¯ááŒá®ážáá±á¬ááºá áááºááẠDocker áááºáá±á¬ááºáá¯á¶ááá¯ááŒáá·áºááŸá¯ááá¯ááºáááºá
Sending build context to Docker daemon 2.88MB
Step 1/9 : FROM node:12-alpine
---> ...вÑпПлМеМОе ÑÑапПв ÑбПÑкО...
Successfully built 123456789123
Successfully tagged <image>:<tag>
áááºáá±á¬ááºááŸá¯ááẠáááá
áºá¡áááºážááẠááŒá¬ááá¯ááºááẠ- áááºážááẠááá·áºááœáẠááŸá®ááá¯ááŸá¯áááºáá»áŸááŸááááºá¡áá±á«áº áá°áááºáááºá áááºáá±á¬ááºááŸá¯ááŒá®ážáááºááŸáá·áºá áááºááẠcommand ááᯠrun ááá¯ááºáááºá docker images
ááá·áºáá¯á¶á¡áá
áºá áá±á¬áºááŒáá»ááºááᯠááŒáá·áºáá«á
REPOSITORY TAG IMAGE ID CREATED SIZE
<image> latest 123456789123 About a minute ago x.xxGB
â á áááºáá«á
áá¯á¶ááᯠáááºáá®ážááŒá®ážáá«ááŒá®á ááá¯ááá¯áááºááŸá¬ áááºážááᯠá¡ááŒá±áá¶á ááœááºááááºáá¬ááᯠáááºáá¯á¶ážááá¯ááºáááºá ááœááºááááºáá¬ááŸá¬ áááºáááºáá±áá²á· application ááᯠáááºááŒáá·áºáá»ááºáá¬ááŒá±á¬áá·áºáá«á localhost:5000
á¡ááœá²á áááºáááºááŒááºážááœáẠáá»áœááºá¯ááºá 5000:5000
áá±á¬áẠcommand ááŸá¬ install áá¯ááºáá«á 5000
. áá¬áááºááœáẠááœááºááááºáá¬ááááºáááºážááŸááááºá
# ÐапÑÑк Ñ ÐžÑпПлÑзПваМОеЌ лПкалÑМПгП пПÑÑа 5000 О пПÑÑа кПМÑейМеÑа 5000
docker run -p 5000:5000 <image>:<tag>
ááᯠááœááºááááºáá¬ááᯠáááºáá®ážááŒá®áž áááºáááºáá±áááŒáá·áº áááºááẠá¡áááá·áºááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá docker ps
á€ááœááºááááºáá¬á¡ááŒá±á¬ááºáž á¡áá»ááºá¡áááºááᯠááŒáá·áºááŸá¯ááẠ(ááá¯á·ááá¯áẠááẠcommand ááá¯áá¯á¶ážááá¯ááºáááºá docker ps -a
áá¯ááºáá±á¬ááºáá±áá¯á¶áá»áŸáá ááœááºááááºáá¬á¡á¬ážáá¯á¶ážá á¡áá»ááºá¡áááºáá»á¬ážááᯠááŒááá±ážáá±á¬á
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
987654321234 <image> "/bin/sh -c 'npm runâŠ" 6 seconds ago Up 6 seconds 0.0.0.0:5000->5000/tcp stoic_darwin
á¡áᯠááááºá
á¬ááᯠááœá¬ážááŒáá·áºááá¯ááºáá«á localhost:5000
â áá¯ááºáá¯ááºááŸá¯áááºáááºážáá»ááºááœáẠáááºáááºáá±ááá·áº á¡ááºááá®áá±ážááŸááºážáá
áºáá¯á á
á¬áá»ááºááŸá¬ááŸáá·áº á¡ááá¡áá»áá°áá®áá±á¬ áááºáááºáá±áá±á¬ á¡ááºááºáá®áá±ážááŸááºážáá
áºáá¯á á
á¬áá»ááºááŸá¬ááᯠáááºááœá±á·ááŒááºááá¯ááºáááºá
â áááºááŒááºážááŸáá·áº áá¯ááºáá±ááŒááºážá
áá¯ááºáá¯ááºááŸá¯áá¬áá¬ááœáẠáááºáá®ážáá¬ážáá±á¬ áá¯á¶áá»á¬ážáá²á០áá áºáá¯ááᯠá¡áá¯á¶ážááŒá¯áááºá¡ááœááºá á€áá¯á¶ááᯠDocker Hub á០áá±á«ááºážáá¯ááºáá¯ááºááẠááá¯á¡ááºáá«áááºá ááá¯ááá¯áááºááŸá¬ áááºááẠDocker Hub ááœáẠááá±á¬áá»ááºá¡ááœáẠááá¯ááŸá±á¬ááºááŸá¯áá áºáá¯ááᯠááááá¯á¶ážáááºáá®ážááẠááá¯á¡ááºáááºáᯠááá¯ááá¯áááºá ááŒá®ážááẠáá«ááºáá¯á¶ááᯠááá¯á·ááá¯ááºáá²á· áá±áá¬áá áºáᯠááá«áááá·áºáááºá áá¯á¶á¡á¬áž áá»áœááºá¯ááºááá¯á· Docker Hub á¡áá¯á¶ážááŒá¯áá°á¡áááºááŒáá·áº á áááºááá¯ááºááẠáááºážáá¡áááºááᯠá¡áááºááŒá±á¬ááºážááẠááá¯á¡ááºáá«áááºá áááºážááᯠrepository á¡áááºááŒáá·áº ááá¯ááºáá¬ááá«áááºá áááºááá·áº tag ááá¯áááᯠáá¬áááºáá¡áá¯á¶ážááœáẠááá·áºááá¯ááºáááºá á¡á±á¬ááºááœáẠá€á¡á á®á¡á á¥áºááᯠá¡áá¯á¶ážááŒá¯á áá¯á¶áá»á¬ážááᯠá¡áááºáá±ážááŒááºážá á¥ááá¬áá áºáá¯ááŒá áºáááºá
ááᯠáááºááẠáá¯á¶ááᯠá¡áááºá¡áá
áºááŒáá·áº áááºáá±á¬ááºááá¯ááºááŒá®áž á¡áááá·áºááᯠáá¯ááºáá±á¬ááºááá¯ááºáááºá docker push
Docker Hub repository ááá¯á· ááœááºážááá¯á·áááºá
docker build -t <username>/<repository>:<tag> .
docker tag <username>/<repository>:<tag> <username>/<repository>:latest
docker push <username>/<repository>:<tag>
# Ðа пÑакÑОке ÑÑП ÐŒÐŸÐ¶ÐµÑ Ð²ÑглÑЎеÑÑ, МапÑОЌеÑ, Ñак:
docker build -t user/app:v1.0.0 .
docker tag user/app:v1.0.0 user/app:latest
docker push user/app:v1.0.0
á¡á¬ážáá¯á¶ážá¡áááºááŒá±áá«á áá¯á¶á¡á¬áž Docker Hub ááœááºáááŸáááá¯ááºááŒá®áž áá¬áá¬ááá¯á· á¡ááœááºááá° á¡ááºáá¯ááºáááºááá¯ááºááẠááá¯á·ááá¯áẠá¡ááŒá¬áž developer áá»á¬ážáᶠááœáŸá²ááŒá±á¬ááºážááá¯ááºáá«áááºá
áá±á¬ááºá¡ááá·áºáá»á¬áž
Docker ááœááºááááºáá¬áá¯á¶á á¶ááŒáá·áº á¡ááá®áá±ážááŸááºážááẠááŒááºááœááºážá á¡áá¯ááºáá¯ááºáá±ááŒá±á¬ááºáž ááá¯á¡áá»áááºááœáẠáá»áœááºá¯ááºááá¯á· á¡áááºááŒá¯ááŒá®ážááŒá áºáááºá áá»áœááºá¯ááºááá¯á·ááẠááœááºááááºáá¬ááᯠDocker Hub ááá¯á· á¡ááºáá¯ááºáá¯ááºáá¬ážáá«áááºá ááá¯ááá¯áááºááŸá¬ áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·á áááºážááá¯ááºáá®ááá¯á· á¡ááœááºáá±á¬ááºážááœááºáá±á¬ ááá¯ážáááºááŸá¯ááᯠááŒá¯áá¯ááºáá±ááŒá®áᯠááá¯ááá¯áá«áááºá ááᯠáá»áœááºá¯ááºááá¯á·ááẠáá±á¬ááºáááºáá±ážááœááºážááŸá áºáá¯ááᯠááŒá±ááŸááºážááẠááá¯á¡ááºáá«áááºá
- áá¯ááºááᯠá ááºážáááºááŒááºážááŸáá·áº á¡áá¯á¶ážááŒá¯ááŒááºážá¡ááœáẠCI áááááá¬ááᯠá áá áºááá·áºááœááºážááŒááºážá
- áá»áœááºá¯ááºááá¯á·ááá¯ááºááᯠáá±á«ááºážáá¯ááºáá¯ááºáᬠáá¯ááºáá±á¬ááºááá¯ááºá á±ááẠáá¯ááºáá¯ááºááŸá¯áá¬áá¬ááᯠá áá áºááá·áºááœááºážááŒááºážá
áá»áœááºá¯ááºááá¯á·áááá
á¹á
ááœááºá áá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯áááºá
á€áá±áá¬ááœáẠáááºááẠá¡ááŒá¬ážáááºáá±á¬ááºááŸá¯áá»á¬ážááᯠáá±á«ááºážá ááºá¡áá¯á¶ážááŒá¯ááá¯ááºáááºááᯠáááááŒá¯ááá·áºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá Travis CI á¡á á¬ážá áááºááẠCircleCI ááá¯á·ááá¯áẠGithub áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá DigitalOcean - AWS ááá¯á·ááá¯áẠLinode á¡á á¬áž
áá»áœááºá¯ááºááá¯á·ááẠTravis CI ááŸáá·áº áá¯ááºáá±á¬ááºááẠáá¯á¶ážááŒááºáá²á·ááŒá®ážá áá»áœááºá¯ááºááœáẠá€áááºáá±á¬ááºááŸá¯ááœáẠááŒááºáááºáááºááŸááºáá¬ážáá±á¬ á¡áá¬áá áºáᯠááŸáááŸáá·áºááŒá®ážááŒá áºáááºá ááá¯á·ááŒá±á¬áá·áº ááᯠáá»áœááºá¯ááºááẠá¡áá¯ááºá¡ááœáẠáááºááá¯á·ááŒááºáááºááááºááᯠá¡áá»ááºážáá»á¯á¶áž ááŒá±á¬ááŒáá«áááºá
áá ẠCI
Travis CI ááẠáá¯ááºááᯠá ááºážáááºááŒááºážááŸáá·áº á¡áá¯á¶ážááŒá¯ááŒááºážá¡ááœáẠáááááá¬áá áºáá¯ááŒá áºáááºá ááá±á¬áá»ááºáá áºáá¯á á®ááẠáá°ážááŒá¬ážáá±á¬ááŒá±á¬áá·áº Travis CI ááá¯ááœáá·áºáá¬ááœáẠááŸá¯ááºááœá±ážááŸá¯ááºááœá±ážááŸá¯áá»á¬ážáá²ááá¯á· áááœá¬ážááá¯áá«á áá«áá±ááá·áº Travis CI ááá¯áá¯á¶ážááá¯á·áá¯á¶ážááŒááºááẠáááºážá áááºááá¯á·á¡ááœáẠá¡ááŒá±áá¶á¡áá»ááºááœá±ááᯠáá«ááŒá±á¬ááŒáááºá Travis CIá CircleCIá Jenkins ááá¯á·ááá¯áẠá¡ááŒá¬ážáá áºáá¯áá¯ááᯠááœá±ážáá»ááºáááºááŒá áºá á± á¡áá¬ážáá°áá¯á¶á á¶ááœá²á·á ááºážááŸá¯áááºážáááºážáá»á¬ážááᯠáá±áá¬ááá¯ááºážááœáẠá¡áá¯á¶ážááŒá¯áááºááŒá áºáááºá
Travis CI ááŒáá·áº á
áááºáááºá ááá¯á· ááœá¬ážáá«á
Travis CI ááᯠá áááºáá»áááºááá¯ááºážá áááºááá¯ááºáᬠrepository á¡ááá¯ááºážá¡áááºáá»á¬ážááᯠááŒáá·áºáá»ááºááŒááºáž á¡áá«á¡áááºá ááœá²á·á ááºážááŸá¯ááá¯ááºááœáẠáááºááŸááºáá¬ážááá·áº ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááŒá®áž áá¬áá¬ááᯠá áááºáá¯ááºáá±á¬ááºáá«áááºá
â á¡áá¯ááºá¡ááá¯áẠáá¶ááá¬
Travis CI configuration file áá¯áá±á«áºáááºá .travis.yml
ááá±á¬áá»áẠroot directory ááœáẠááááºážáááºážáá¬ážááŒá®áž ááŒá
áºáááºáá»á¬ážá ááá±á¬ááá¬ážááᯠáá¶á·ááá¯ážáá±ážáááºá
apt addons
cache components
before_install
install
before_script
script
before_cache
after_success ОлО after_failure
before_deploy
deploy
after_deploy
after_script
â á ááºážáááºááŒááºážá
configuration file ááœáẠlocal Travis CI server ááᯠconfigure áá¯ááºáá«áááºá áá»áœááºá¯ááºááẠNode 12 ááᯠáá¬áá¬á áá¬ážá¡ááŒá Ạááœá±ážáá»ááºááŒá®áž Docker á¡áá¯á¶ážááŒá¯ááẠááá¯á¡ááºáá±á¬ ááŸá®ááá¯ááŸá¯áá»á¬ážááᯠááá·áºááœááºážááẠá áá áºááᯠááŒá±á¬áá²á·áááºá
ááœááºáá±á¬áºááŒáá¬ážáá±á¬á¡á¬ážáá¯á¶áž .travis.yml
á¡ááŒá¬ážáááºážááŒáá·áº áááºááŸááºáá¬ážááŒááºážáááŸááá«áá repository á á¡ááá¯ááºážá¡áááºáá»á¬ážá¡á¬ážáá¯á¶ážááá¯á· ááœá²áá°áá±á¬ááºážááá¯ááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááᯠááŒá¯áá¯ááºáá±á¬á¡áá«ááœáẠáá¯ááºáá±á¬ááºáá«áááºá áááºážááẠrepository áá²ááá¯á·áááºáá¬áá±á¬áá¯ááºá¡á¬ážáá¯á¶ážááá¯á
ááºážáááºááá¯ááºáá±á¬ááŒá±á¬áá·áºáááºážáááºá¡áá¯á¶ážáááºáá±á¬á¡ááºá¹áá«áááºáá
áºáá¯ááŒá
áºáááºá áááºážááẠáá¯ááºááᯠáá¬áááœá²ááá¯á· á
á¬áá±ážááẠá¡áááºááá·áºááŒá
áºáááŒá
Ạááááá¯ááºáááºá master
ááá±á¬áá»ááºááᯠáá±á¬ááºáá»ááºááŸá¬áá¬ážá á€ááá¹áá¬áá¯á¶ážááá¯ááºáá¬ááœá²á·á
ááºážáá¯á¶ááœááºá áá»áœááºá¯ááºááẠá
ááºááœááºážááŸá á¡áá¬á¡á¬ážáá¯á¶ážááᯠááá·áºááœááºážááŒá®ážá áá±á¬ááºáá¶ááœáẠWebpack dev áá¬áá¬ááᯠááœáá·áºáá« (áááºážááẠáá»áœááºá¯ááºááá¯ááºáááºážá¡ááœá¬ážá¡áá¬á á¡ááºá¹áá«áááºááŒá
áºáááº)á ááŸáá·áº á
ááºážáááºááŸá¯áá»á¬ážááᯠáá¯ááºáá±á¬ááºáá«áááºá
ááá·áºááá¯ááŸá±á¬ááºááŸá¯á¡á¬áž á
ááºážáááºááœáŸááºážááŒá¯á¶ááŸá¯áááºá¹áá±ááá»á¬ážááᯠááŒáááá¯áá«áá
áá«ááŒá±á¬áá·áº áá®ááá¯ááºáá²á· á¡ááŒá±á¬ááºážá¡áá¬ááᯠáá±á¬áºááŒáá±ážááá¯ááºáá«áááºá .travis.yml
:
# УÑÑаМПвОÑÑ ÑзÑк
language: node_js
# УÑÑаМПвОÑÑ Ð²ÐµÑÑÐžÑ Node.js
node_js:
- '12'
services:
# ÐÑпПлÑзПваÑÑ ÐºÐŸÐŒÐ°ÐœÐŽÐœÑÑ ÑÑÑÐŸÐºÑ Docker
- docker
install:
# УÑÑаМПвОÑÑ Ð·Ð°Ð²ÐžÑОЌПÑÑО ÐŽÐ»Ñ ÑеÑÑПв
- npm ci
before_script:
# ÐапÑÑÑОÑÑ ÑеÑÐ²ÐµÑ Ðž ÐºÐ»ÐžÐµÐœÑ ÐŽÐ»Ñ ÑеÑÑПв
- npm run dev &
script:
# ÐапÑÑÑОÑÑ ÑеÑÑÑ
- npm run test
á€áá±áá¬ááœáẠrepository á á¡ááá¯ááºážá¡áááºá¡á¬ážáá¯á¶ážá¡ááœáẠáá¯ááºáá±á¬ááºááá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž ááŸáá·áº ááœá²áá¯ááºááẠáá±á¬ááºážááá¯ááŸá¯áá»á¬áž á¡ááœáẠááŒá®ážáá¯á¶ážáá«áááºá
â ááŒáá·áºáá»ááºááŒááºážá
á¡ááá¯á¡áá»á±á¬ááºá
ááºážáááºááŸá¯áá»á¬ážá¡á¬ážáá¯á¶ážááᯠá¡á±á¬ááºááŒááºá
áœá¬ ááŒá®ážááŒá±á¬ááºáá²á·áááºáᯠáá°ááá»ááºá¡áá±á«áº á¡ááŒá±áá¶áá áá»áœááºá¯ááºááá¯á·ááẠááœá±ážáá»ááºááá¯ááºáá±á¬á áá¯ááºááᯠáá¯ááºáá¯ááºáá±ážáá¬áá¬ááá¯á· ááŒáá·áºáá»ááºááá¯ááºáá«áááºá áá¬áááœá²á០áá¯ááºá¡ááœááºáᬠáá¯ááºááá¯áá±á¬ááŒá±á¬áá·áº ááŒá
áºáááºá master
ááŒáá·áºáá»ááºááŸá¯áááºáááºáá»á¬ážááœáẠá
áá
áºááá·áºáá»á±á¬áºáá±á¬ ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á·áá±ážáá«áááºá ááá·áºááá±á¬áá»ááºááœáẠáá»áœááºá¯ááºááá¯á·ááŒáá·áºááŸá¯ááá·áºáá¯ááºááᯠáááºá¡áá¯á¶ážáááŒá¯áá®á ááá·áºááœáẠáááºááœá±á·á¡áá¯á¶ážáá»ááẠáá±á¬ááºážááá¯áá¬ážáá±á¬ á¡ááŸááºáááẠscript áá
áºáá¯ááŸáááááºááᯠáá»áœááºá¯ááºááááá±ážááá¯áá«áááºá
deploy:
# СПбÑаÑÑ Docker-кПМÑÐµÐ¹ÐœÐµÑ Ðž ПÑпÑавОÑÑ ÐµÐ³ÐŸ Ма Docker Hub
provider: script
script: bash deploy.sh
on:
branch: master
deployment script ááẠááŒá¿áá¬ááŸá áºáá¯ááᯠááŒá±ááŸááºážáá±ážáááº-
- CI áááááá¬ááᯠá¡áá¯á¶ážááŒá¯á áá¯á¶á¡á¬áž áááºáá±á¬ááºááŒááºážá áááºáá¯ááºááŒá®áž Docker Hub ááá¯á· áá±ážááá¯á·áá« (áá»áœááºá¯ááºááá¯á·á ááá á¹á ááŸá¬ Travis CI)á
- áá¯á¶ááᯠáá¬áá¬ááœáẠáááºáá±ááŒááºážá ááœááºááááºáá¬á¡áá±á¬ááºážááᯠáááºááá·áºááŒá®áž á¡áá áºáá áºáᯠá áááºááŒááºáž (áá»áœááºá¯ááºááá¯á·á á¡ááŒá±á¡áá±ááœááºá áá¬áá¬ááẠDigitalOcean ááááºáá±á¬ááºážáá±á«áºááœáẠá¡áá¯ááºáá¯ááºáááº)á
ááááŠážá áœá¬á áááºááẠDocker Hub ááá¯á· áá¯á¶ááᯠáááºáá±á¬ááºááŒááºážá áááºáá¯ááºááŒááºážááŸáá·áº ááœááºážááá¯á·ááŒááºážá¡ááœáẠá¡ááá¯á¡áá»á±á¬áẠáá¯ááºáááºážá ááºááᯠáááºááŸááºááẠááá¯á¡ááºáááºá á€á¡áá¬ááẠáá»áœááºá¯ááºááá¯á·ááá¯ááºááá¯ááºááŒá¯áá¯ááºáá¬ážááŒá®ážááŒá áºááá·áºá¡áá¬ááŸáá·áº á¡ááœááºáááºáá°áááºáá áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºáá¯á¶áá»á¬ážááá¯á· áá®ážááá·áºáááºáá»á¬ážáááºááŸááºáá±ážááŒááºážááŸáá·áº á¡ááá¯á¡áá»á±á¬ááºáááºáá±á¬ááºááŒááºážáá»á¬ážá¡ááœáẠáá»á°áá¬áá áºáá¯ááá¯á¡ááºáá«áááºá áááºáá¯ááºááŒááºážáá»á°áá¬á áá±á¬á·ááºá¡ááºá SSH áá±á¬á·áá¯ááºááŒá±á¬ááºážááŒááºážá SSH áá»áááºáááºááŸá¯áááºáá±á¬ááºááŒááºážáá²á·ááá¯á·áá±á¬ á¡áá¯á¶ážáá»ááŸá¯ script áá¡áá±ážá áááºá¡áá»ááºá¡áá»áá¯á·ááᯠáá»áœááºá¯ááºááœáẠá¡áááºá¡áá²ááŸááá²á·áá«áááºá áá«áá±ááá·áº áá¶áá±á¬ááºážáá±á¬ááºáá áœá¬ áá«á·áá»á áºáá°á áááŒá¬ážá¡áá¬ááœá±ááá¯áá² bash áá²á· á¡áááºážáá±á¬áºáááºá áá°á áá®áá¬ááºááœáŸááºážáá±ážááá¯á· áá°áá®áá±ážáááºá
ááá¯á·ááŒá±á¬áá·áºá áá¬ááºááœáŸááºážááááááá¯ááºážááẠáá¯á¶ááᯠDocker Hub ááá¯á· á¡ááºáá¯ááºáááºááŒááºážááŒá
áºáááºá áá«ááá¯ááºááá¯á·á¡áá±á¬áºáá±ážááœááºáá°áááºá áá»áœááºáá±á¬áºá¡áá¯á¶ážááŒá¯áá²á·ááá·áº tagging á¡á
á®á¡á
ááºááœáẠáá
áºáá¯ááŸááá»áŸáẠgit hash ááŸáá·áº git tag ááᯠáá±á«ááºážá
ááºáá¬ážááŒááºážááŒá
áºáááºá áááºážááẠáááºááẠáá°ážááŒá¬ážááŒá±á¬ááºáž áá±áá»á¬á
á±ááŒá®áž áááºážááᯠá¡ááŒá±áá¶áá¬ážááá·áº á
ááºážáá±ážááœá²á¡á¬áž áá±á¬áºáá¯ááºááẠááá¯ááá¯ááœááºáá°á
á±áááºá DOCKER_USERNAME
О DOCKER_PASSWORD
Travis CI á¡ááºáá¬áá±á·á
áºááᯠá¡áá¯á¶ážááŒá¯á áááºááŸááºááá¯ááºáá±á¬ áá¯á¶ážá
áœá²áá°áááºáááºážáá»áẠááááºážááŸááºáá»á¬ážááŒá
áºáááºá Travis CI ááẠááááœááºááŸááœáẠáá±áá¬áá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬áẠá
á®áá¶áá±á¬ááºááœááºáá±ážáááºááŒá
áºáá±á¬ááŒá±á¬áá·áº áááºážááẠáááºáá²ááá¯á· ááá»áá±á¬ááºá
á±ááá«á
áá«á áá¬ááºááœáŸááºážáá²á· áááááá¯ááºážáá«á deploy.sh
.
#!/bin/sh
set -e # ÐÑÑаМПвОÑÑ ÑкÑÐžÐ¿Ñ Ð¿ÑО МалОÑОО ПÑОбПк
IMAGE="<username>/<repository>" # ÐбÑаз Docker
GIT_VERSION=$(git describe --always --abbrev --tags --long) # Git-Ñ
ÑÑ Ðž ÑегО
# СбПÑка О ÑегОÑПваМОе ПбÑаза
docker build -t ${IMAGE}:${GIT_VERSION} .
docker tag ${IMAGE}:${GIT_VERSION} ${IMAGE}:latest
# ÐÑ
ПЎ в Docker Hub О вÑгÑÑзка ПбÑаза
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
docker push ${IMAGE}:${GIT_VERSION}
Script á áá¯áááá¡ááá¯ááºážááẠáááºá¡áá¯á¶ážááŒá¯áá±ááá·áº host ááŸáá·áº áááºážááŸáá·áºáá»áááºáááºááŸá¯á¡á¬áž áááºááá¯á·ááœá²á·á
ááºážáá¯á¶áá±á«áºááœáẠáá¯á¶ážááá°áááºáá«áááºá áá»áœááºá¯ááºáááá
á¹á
ááœááºá áá»áœááºá¯ááºááẠDigital Ocean ááá¯á¡áá¯á¶ážááŒá¯áá±á¬ááŒá±á¬áá·áº áá¬áá¬ááá¯á·áá»áááºáááºááẠá¡áááá·áºáá»á¬ážááá¯á¡áá¯á¶ážááŒá¯áá«áááºá aws
, áá±á¬áẠ... ááŒá®ážáá±á¬á·á
áá¬áá¬ááᯠá
áá
áºááá·áºááœááºážááŒááºážááẠá¡áá°ážáááºáá²áááºááá¯ááºá áá«ááŒá±á¬áá·áº á¡ááŒá±áá¶áá¯á¶áá±á«áºá¡ááŒá±áá¶ááŒá®áž á¡á
ááºáá
áºá
ááºááᯠáááºáááºááá¯ááºáááºá áá»áœááºá¯ááºááœá±ážáá»ááºáá±á¬á
áá
áºááẠDocker ááᯠáá
áºááŒáááºáááºážááá·áºááœááºážááŒááºážááŸáá·áº Docker ááᯠáá
áºááŒáááºáááºážáá¯ááºááŒááºážááá¯á·ááᯠááá¯á¡ááºááŒá±á¬ááºáž áááááŒá¯ááá·áºáááºá Docker ááᯠinstall áá¯ááºááá¯á· Ubuntu 18.04 ááá¯áá¯á¶ážáá²á·áááºá áá«ááŒá±á¬áá·áº áááºáááºáž Ubuntu ááá¯á¡áá¯á¶ážááŒá¯áá±áááºááá¯ááẠááá¯ááºáá¯ááºááá¯ááºáá¯á¶áá«áá²á
á€ááŸá¯áá±á¬áá·áºááẠááá°áá®áá±á¬ááá á¹á áá»á¬ážááœáẠáá»á¬ážá áœá¬ááœá²ááŒá¬ážááá¯ááºáá±á¬ááŒá±á¬áá·áº áááºáá±á¬ááºááŸá¯á¡ááœáẠáá®ážááŒá¬ážá¡áááá·áºáá»á¬ážá¡ááŒá±á¬ááºáž á€áá±áá¬ááœáẠáááŒá±á¬áá«á SSH ááŸáá áºááá·áº ááá±á¬áá»ááºááᯠá¡áá¯á¶ážááŒá¯ááá·áº áá¬áá¬ááá¯á· SSH ááŸáá áºááá·áº áá»áááºáááºááŒá®ážáá±á¬áẠáá¯ááºáá±á¬ááºáááá·áº á¡ááœá±ááœá± áá¯ááºáá±á¬ááºáá»áẠá¡á á®á¡á ááºááᯠáá»áœááºá¯áẠáá±ážáá«áááºá
- áá»áœááºá¯ááºááá¯á·ááẠáááºááŸááááºáááºáá±áá±á¬ ááœááºááááºáá¬ááᯠááŸá¬ááœá±ááŒá®áž áááºážááᯠáááºááá·áºááẠááá¯á¡ááºáááºá
- ááá¯á·áá±á¬áẠáá±á¬ááºáá¶ááœáẠááœááºááááºáá¬á¡áá áºáá áºáá¯ááᯠá áááºááẠááá¯á¡ááºáááºá
- áá¬áá¬á áá±áááœááºáž ááááºáááºážááᯠááẠáááºááŸááºááẠááá¯á¡ááºáá«áááºá
80
- áááºážááẠááá·áºá¡á¬áž ááá¯ááºáá²á·ááá¯á·áá±á¬ ááááºá á¬áá áºáá¯ááœáẠááá·áºááœááºážááá¯ááºá á±áááºááŒá áºáááºáexample.com
ááááºá á¬áá²á·ááá¯á· ááááºá á¬ááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááẠááááºáááºážááᯠááááºááŸááºáá²áexample.com:5000
. - áá±á¬ááºáá¯á¶ážááœááºá áááºááẠááœááºááááºáá¬áá±á¬ááºážáá»á¬ážááŸáá·áº áá¯á¶áá»á¬ážá¡á¬ážáá¯á¶ážááᯠáá»ááºááẠááá¯á¡ááºáááºá
áá«á áá¬ááºááœáŸááºážáá²á· á¡áááºáá«á
# ÐайÑО ID ÑабПÑаÑÑегП кПМÑейМеÑа
CONTAINER_ID=$(docker ps | grep takenote | cut -d" " -f1)
# ÐÑÑаМПвОÑÑ ÑÑаÑÑй кПМÑейМеÑ, запÑÑÑОÑÑ ÐœÐŸÐ²Ñй, ПÑОÑÑОÑÑ ÑОÑÑеЌÑ
docker stop ${CONTAINER_ID}
docker run --restart unless-stopped -d -p 80:5000 ${IMAGE}:${GIT_VERSION}
docker system prune -a -f
áááááŒá¯áááá·áºá¡áá»ááºáá»á¬áž
Travis CI á០SSH ááŸáá áºááá·áº áá¬áá¬ááá¯á· áá»áááºáááºááá·áºá¡áá«á á áá áºááẠá¡áá¯á¶ážááŒá¯áá°á áá¯á¶á·ááŒááºááŸá¯ááᯠá á±á¬áá·áºáááºááŒá áºáá±á¬ááŒá±á¬áá·áº áááºáááºááŸá¯á¡á¬áž áááºáááºáá¯ááºáá±á¬ááºááŒááºážá០áá¬ážáá®ážááá·áº ááááá±ážáá»ááºááᯠáááºááœá±á·ááá«áááºá
The authenticity of host '<hostname> (<IP address>)' can't be established.
RSA key fingerprint is <key fingerprint>.
Are you sure you want to continue connecting (yes/no)?
á¡áááºááŒá±ááŒá± á
áááºáá»áá¯á¶ááŒááºá
áœá¬ á¡áá¯ááºáá¯ááºááá¯ááºáá±á¬ áá¯á¶á
á¶ááŒáá·áº áááºážááᯠááááºážáááºážáááºá¡ááœáẠstring key áá
áºáá¯ááᯠbase64 ááœáẠáá¯ááºááœááºážááá¯ááºáááºááᯠáá»áœááºáá±á¬áº áá±á·áá¬áá²á·áááºá áááºáááºááŒááºážá¡ááá·áºááœááºá áááºááẠá¡áá»á¬ážáá°ááŸá¬áá±á¬á·ááᯠáá¯ááºááŸááºááŒá®áž ááá¯ááºáá
áºáá¯ááá¯á· áá±ážááá¯ááºáááºá known_hosts
á¡áááºáá±á¬áºááŒáá« error áá»á¬ážááᯠáááºááŸá¬ážááá¯ááºá
á±áááºá
echo <public key> | base64 # вÑÐ²ÐŸÐŽÐžÑ <пÑблОÑÐœÑй клÑÑ, закПЎОÑПваММÑй в base64>
áááºááœá±á·ááœááºá á€á¡áááá·áºááẠá€áá²á·ááá¯á·ááŒá áºááá¯ááºáááº-
echo "123.45.67.89 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== [email protected]" | base64
á€ááœááºáááºážááá¯ááºáá¯ááºááẠ- base64 encoded string ááá¯
MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==
á€áááºááŸá¬ á¡áááºáá±á¬áºááŒáá« á¡áááá·áºááŒá áºáááºá
install:
- echo < пÑблОÑÐœÑй клÑÑ, закПЎОÑПваММÑй в base64> | base64 -d >> $HOME/.ssh/known_hosts
áá¬áá¬ááá¯áááºáá±á¬ááºááẠáá®ážááá·áºáá±á¬á·áá áºáᯠááá¯á¡ááºááá¯ááºáá±á¬ááŒá±á¬áá·áº áá»áááºáááºááŸá¯áá áºáá¯áááºáá±á¬ááºáá¬ááœáẠáá°áá®áá±á¬áá»ááºážáááºááŸá¯ááᯠáá®ážááá·áºáá±á¬á·ááŒáá·áº á¡áá¯á¶ážááŒá¯ááá¯ááºáááºá áá±á¬á·ááŒáá·áºá¡áá¯ááºáá¯ááºáá±á¬á¡áá«á áááºážááᯠTravis CI áááºáááºážáá»áẠvariable ááœáẠáá¯á¶ááŒá¯á¶á áœá¬ááááºážáááºážáá¬ážááŒá±á¬ááºážááŸáá·áº áááºážááᯠáááºááá·áºáá±áá¬ááœááºááŸááŒááááºááá¯ááºááŒá±á¬ááºáž áá±áá»á¬á á±áááºááá¯á¡ááºáá«áááºá
áá±á¬ááºáááºáááááŒá¯áááá·áºá¡áá»ááºááŸá¬á á¥ááᬠ- ááŒáá·áº áá
áºááŒá±á¬ááºážáááºážááŒáá·áº ááŒáá·áºáá»ááºáá¬ážáá±á¬ script áá
áºáá¯áá¯á¶ážááᯠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáá«áááºá doctl
. áááºážááẠá¡ááá¯á¡á¬ážáá¯ááºááŸá¯ á¡áááºážááẠááá¯á¡ááºááá¯ááºáááºá
doctl compute ssh <droplet> --ssh-command "вÑе ÐºÐŸÐŒÐ°ÐœÐŽÑ Ð±ÑÐŽÑÑ Ð·ÐŽÐµÑÑ && зЎеÑÑ"
TLS/SSL ááŸáá·áº Load Balancing
á¡áááºáá±á¬áºááŒáá«á¡áá¬á¡á¬ážáá¯á¶ážááᯠáá»áœááºáá±á¬áºáá¯ááºáá±á¬ááºááŒá®ážáá±á¬ááºá áá»áœááºáá±á¬áºááŒá¯á¶ááœá±á·áá²á·áááá·áº áá±á¬ááºáá¯á¶ážááŒá¿áá¬ááŸá¬ áá¬áá¬ááœáẠSSL áááŸáááŒááºážáááºááŒá
áºáááºá áá»áœááºá¯ááºááẠNode.js áá¬áá¬ááᯠá¡áá¯á¶ážááŒá¯áá±á¬ááŒá±á¬áá·áºá
ဠSSL configuration á¡á¬ážáá¯á¶ážááᯠááá¯ááºááá¯ááºáááŒá¯áá¯ááºááá¯áá«á ááá¯á·ááŒá±á¬áá·áº load balancer áá
áºáá¯ááᯠáááºáá®ážááŒá®áž áááºážáá¡áá±ážá
áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠDNS ááœáẠááŸááºáááºážáááºáá²á·áá«áááºá á¥ááá¬á DigitalOcean áááŒá
áºáááºááœááºá load balancer ááœáẠá¡ááá¯á¡áá»á±á¬ááºáááºáááºážááá¯ážááŒááºážááá¯ááºááá¯ááºáááºááŸááºááá¯ážáá¬ážáá±á¬áááºááŸááºááá¯áááºáá®ážááŒááºážááẠááá¯ážááŸááºážá á¡ááá²á·ááŒá
áºááŒá®áž ááŒááºáááºáá±á¬áá¯ááºáááºážá
ááºáá
áºáá¯ááŒá
áºáááºá á€áá»ááºážáááºááŸá¯ááœáẠááá¯á¡ááºáá«á load balancer áá±á¬ááºááœááºááŸá áá¬áá¬áá»á¬ážá
áœá¬ááœáẠSSL ááá¯áááºáááºááẠá¡ááœááºááœááºáá°á
á±áá±á¬ááŒá±á¬áá·áº áááºáá±á¬ááºážá¡áá»áá¯ážáá»á±ážáá°ážááŸááááºá áááºážááẠáá¬áá¬áá»á¬ážá¡á¬áž SSL á¡ááŒá±á¬ááºáž áá¯á¶ážá âáá
ááºážá
á¬ážâ ááá¯ááºáá² áá
áºáá»áááºáááºážááœáẠáá¯á¶ááŸááºá¡ááá¯ááºáž ááááºáááºážááᯠá¡áá¯á¶ážááŒá¯áá«á 80
. ááá¯á·ááŒá±á¬áá·áº load balancer ááœáẠSSL ááá¯áááºááŸááºááŒááºážááẠSSL ááá¯ááá·áºááœááºážááŒááºážáá¡ááŒá¬ážáááºážáááºážáá»á¬ážáááºááá¯ááá¯ááœááºáá°ááŒá®ážááá¯ááá¯á¡áááºááŒá±áááºá
ááááºáááºážááŸááœá²á á¡áááºáá»áááºáááºááŸá¯áá»á¬ážááᯠáááºáá¶ááá·áº áá¬áá¬ááŸá port á¡á¬ážáá¯á¶ážááᯠááᯠáááºááááºááá¯ááºáá«ááŒá®á 80
, load balancer ááŸáá·áº port ááᯠáááºááœááºááẠá¡áá¯á¶ážááŒá¯áááºá 22
SSH á¡ááœáẠááááºá¡áá±ááŒáá·áºá á€ááŸá
áºáá¯ááŸááœá²á á¡ááŒá¬áž port áá»á¬ážáá±á«áºááŸá áá¬áá¬ááᯠááá¯ááºááá¯ááºáááºáá±á¬ááºááẠááŒáá¯ážáááºážááŸá¯ áá¡á±á¬ááºááŒááºáá«á
ááááºáá»á¬ážááá¯
á€á¡ááŒá±á¬ááºážá¡áá¬ááœáẠáá»áœááºáá±á¬áºááŒá±á¬áá²á·ááá»áŸá¡á¬ážáá¯á¶ážááᯠáá¯ááºáá±á¬ááºááŒá®ážáá±á¬ááºá Docker ááááºáá±á¬ááºážááŸáá·áº á¡ááá¯á¡áá»á±á¬áẠCI/CD ááœááºážáááºáá»á¬ážá ááá±á¬ááá¬ážáá»á¬ážááẠáá»áœááºá¯ááºááᯠáááŒá±á¬ááºáá±á¬á·áá«á áá¯ááºááᯠáá¯ááºáá¯ááºááŒááºážááá¯á·ááááºáá® á
ááºážáááºááŒá®áž áá¯ááºááᯠáá¬áá¬áá±á«áºááœáẠá¡ááá¯á¡áá»á±á¬áẠááŒáá·áºáá»ááºáá¬ážáá»áááºá¡ááœááºáž á
ááºáááºáááŒáẠáá±á«ááºážá
ááºááœááºážáááºáá
áºáá¯ááᯠáá»áœááºá¯ááºáááºáá±á¬ááºááá¯ááºáá²á·áááºá á€á¡áá¬á¡á¬ážáá¯á¶ážááẠáá»áœááºá¯ááºá¡ááœáẠá¡áá±á¬áºáá±áž á¡áá
áºá¡áááºážááŒá
áºáá±áá²ááŒá
áºááŒá®áž áá»áœááºá¯ááºá á¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±á¬ááºááŸá¯á¡ááœá¬ážá¡áá¬ááᯠááŒáŸáá·áºáááºáááºááŸáá·áº ááá¯ááá¯áááá±á¬ááºá¡á±á¬ááºááŒá¯áá¯ááºááẠáááºážáááºážáá»á¬áž ááŸááááºááᯠáá»áœááºá¯ááºáá¯á¶ááŒááºáá«áááºá áá«ááŒá±á¬áá·áº áá®ááá
á¹á
áá²á· áááºáááºááŒá®áž á¡ááŒá¶á¥á¬ááºááœá±ááŸáááẠáá»á±ážáá°ážááŒá¯ááŒá®áž ááŒá±á¬ááŒáá±ážáá«á
PS áá»áœááºáá±á¬áºááá¯á·áá²á·á¡ááœááº
áá»á áºáááºááá«áá±á¬á á¬áááºáá°áá»á¬áž! ááá·áºááá±á¬áá»ááºáá»á¬ážááœáẠCI/CD áááºážááá¬áá»á¬ážááᯠáááºá¡áá¯á¶ážááŒá¯áá«ááá¬ážá
source: www.habr.com