ç§ãæåã®ãŠã§ããµã€ããæžããã®ã¯ 90 幎代åŸåã§ããã åœæãããããæ£åžžã«åäœãããã®ã¯éåžžã«ç°¡åã§ããã ããã€ãã®å
±æãã¹ãã£ã³ã°äžã« Apache ãµãŒããŒãããã次ã®ããã«èšè¿°ããããšã§ FTP çµç±ã§ãã®ãµãŒããŒã«ãã°ã€ã³ã§ããŸãã ftp://ftp.example.com
ã 次ã«ãååãšãã¹ã¯ãŒããå
¥åãããã¡ã€ã«ããµãŒããŒã«ã¢ããããŒãããå¿
èŠããããŸããã ããŸããŸãªæ代ããããåœæã¯ä»ããããã¹ãŠãã·ã³ãã«ã§ããã
ãããã XNUMX 幎ãçµã¡ããã¹ãŠã倧ããå€ãããŸããã Web ãµã€ãã¯ããè€éã«ãªã£ãŠãããéçšç°å¢ã«ãªãªãŒã¹ããåã«çµã¿ç«ãŠãå¿ èŠããããŸãã XNUMX ã€ã®ãµãŒããŒãããŒã ãã©ã³ãµãŒã®èåŸã§å®è¡ãããå€æ°ã®ãµãŒããŒã«ãªããããŒãžã§ã³ç®¡çã·ã¹ãã ã®äœ¿çšãäžè¬çã«ãªããŸããã
ç§ã®å人çãªãããžã§ã¯ãã§ã¯ãç¹å¥ãªæ§æã䜿çšããŸããã ãããŠããã©ã³ãã«ã³ãŒããæžã蟌ããšãã XNUMX ã€ã®ã¢ã¯ã·ã§ã³ãå®è¡ããã ãã§ãµã€ããéçšç°å¢ã«ãããã€ã§ããæ©èœãå¿
èŠã§ããããšãããã£ãŠããŸããã master
GitHub äžã§ã ããã«ãå°èŠæš¡ãª Web ã¢ããªã±ãŒã·ã§ã³ã確å®ã«åäœãããããã«ã¯ã巚倧㪠Kubernetes ã¯ã©ã¹ã¿ãŒã管çããããDocker Swarm ãã¯ãããžãŒã䜿çšãããããããããšãŒãžã§ã³ãããã®ä»ããããçš®é¡ã®ãµãŒããŒãç¶æãããããããªãããšãããã£ãŠããŸãããè€éãã äœæ¥ãã§ããã ãç°¡åã«ãããšããç®æšãéæããã«ã¯ãCI/CD ã«æ
£ããå¿
èŠããããŸããã
å°èŠæš¡ãªãããžã§ã¯ã (ãã®å Žå㯠Node.js ãããžã§ã¯ã) ãããããªããžããªã«ä¿åãããŠããå
容ãéçšç°å¢ã§åäœããå
容ãšæ£ç¢ºã«äžèŽããŠããããšã確èªããªããããã®ãããžã§ã¯ãã®ãããã€ã¡ã³ããèªååããæ¹æ³ãç¥ãããå Žåã¯ã次ã®ããã«ããŸãããã®èšäºã«èå³ããããããããŸããã
åææ¡ä»¶
ãã®èšäºã®èªè
ã¯ãã³ãã³ã ã©ã€ã³ãš Bash ã¹ã¯ãªããã®äœæã«ã€ããŠã®åºæ¬ãç解ããŠããããšãæåŸ
ãããŸãã ããã«ãã¢ã«ãŠã³ããå¿
èŠã«ãªããŸã
ç®æš
ãã®èšäºãç¡æ¡ä»¶ã«ããã¥ãŒããªã¢ã«ããšèšãããšã¯èšããŸããã ããã¯ãç§ãåŠãã ããšã«ã€ããŠè©±ããã³ãŒãããã¹ãããŠéçšç°å¢ã«ãããã€ããããã®ãXNUMX ã€ã®èªååããããã¹ã§å®è¡ããããç§ã«é©ããããã»ã¹ã«ã€ããŠèª¬æããããã¥ã¡ã³ãã§ãã
ãããç§ã®ã¯ãŒã¯ãããŒã«ãªããŸããã
ãé€ããªããžã㪠ãã©ã³ãã«æçš¿ãããã³ãŒãã®å Žå master
ã次ã®ã¢ã¯ã·ã§ã³ãå®è¡ãããŸãã
- Travis CI äžã§ã®ãããžã§ã¯ãã®ãã«ããéå§ãããŸãã
- ãã¹ãŠã®åäœãã¹ããçµ±åãã¹ããããã³ãšã³ãããŒãšã³ãã®ãã¹ããå®è¡ãããŸãã
ã«è©²åœããã³ãŒãã®ã¿ master
ã®å Žåã次ã®åŠçãå®è¡ãããŸãã
- äžèšã®ãã¹ãŠã«å ããŠ...
- çŸåšã®ã³ãŒããèšå®ãç°å¢ã«åºã¥ã㊠Docker ã€ã¡ãŒãžãæ§ç¯ããŸãã
- ã€ã¡ãŒãžã Docker Hub ã«ãããã€ããŸãã
- éçšãµãŒããŒãžã®æ¥ç¶ã
- Docker Hub ãããµãŒããŒãžã®ã€ã¡ãŒãžã®ã¢ããããŒãã
- çŸåšã®ã³ã³ãããåæ¢ããæ°ããã€ã¡ãŒãžã«åºã¥ããŠæ°ããã³ã³ãããéå§ããŸãã
Dockerãã€ã¡ãŒãžãã³ã³ãããŒã«ã€ããŠãŸã£ããç¥ããªããŠããå¿é ããå¿ èŠã¯ãããŸããã ããã«ã€ããŠãã¹ãŠã話ããŸãã
CI/CDãšã¯äœã§ãã?
CI/CD ã®ç¥èªã¯ããç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³/ç¶ç¶çãããã€ã¡ã³ãããè¡šããŸãã
âç¶ç¶ççµ±å
ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã¯ãéçºè
ãããââãžã§ã¯ãã®ã¡ã€ã³ ãœãŒã¹ ã³ãŒã ãªããžã㪠(éåžžã¯ãã©ã³ã) ã«ã³ãããããããã»ã¹ã§ãã master
ïŒã åæã«ãã³ãŒãã®å質ã¯èªåãã¹ãã«ãã£ãŠä¿èšŒãããŸãã
âç¶ç¶çãªå°å ¥
ç¶ç¶çãããã€ã¡ã³ããšã¯ãã³ãŒããå®çšŒåç°å¢ã«é »ç¹ã«èªåçã«ãããã€ããããšã§ãã CI/CD ã®é åèªã® XNUMX çªç®ã®éšåã¯ããç¶ç¶çããªããªãŒããšè¡šèšãããããšããããŸãã ããã¯åºæ¬çã«ãç¶ç¶çãããã€ã¡ã³ãããšåãã§ããããç¶ç¶çããªããªãŒãã¯ãããžã§ã¯ãã®ãããã€ã¡ã³ãããã»ã¹ãéå§ããåã«å€æŽãæåã§ç¢ºèªããå¿ èŠãããããšãæå³ããŸãã
ã¯ããã«
ããããã¹ãŠãåŠã¶ããã«ç§ã䜿çšããã¢ããªã¯æ¬¡ã®ãšããã§ã
ç§ã®å Žåãã¢ããªã±ãŒã·ã§ã³ã¯ Node.js ç°å¢ã§å®è¡ãããŠãã Express ãµãŒããŒã§ãããåäžããŒãžã® React ã¢ããªã±ãŒã·ã§ã³ãæäŸããå®å
šãªãµãŒããŒåŽ API ããµããŒãããŠããŸãã ãã®ã¢ãŒããã¯ãã£ã¯ã次ã®æŠç¥ã«åŸã£ãŠããŸãã
ãšçžè«ããŸãã
ããã«ãŒ
Docker ã¯ãã³ã³ããåãã¯ãããžãŒã®ãããã§ãDocker ãã©ãããã©ãŒã èªäœãç°ãªãç°å¢ã§å®è¡ãããŠããå Žåã§ããã¢ããªã±ãŒã·ã§ã³ãåãç°å¢ã§ç°¡åã«é
åžããããã€ãå®è¡ã§ããããã«ããããŒã«ã§ãã ãŸããDocker ã³ãã³ã ã©ã€ã³ ããŒã« (CLI) ãæã«å
¥ããå¿
èŠããããŸããã
Docker Hub ã¯ã»ãŒåããã®ã§ã
ãããã£ãŠãDocker ã䜿ãå§ããã«ã¯ã次㮠XNUMX ã€ã®ããšãè¡ãå¿ èŠããããŸãã
- ã»ãã
Dockerãã¹ã¯ããã . - ç»é²ããŸã
Dockerãã .
ãã®åŸã次ã®ã³ãã³ããå®è¡ã㊠Docker ã®ããŒãžã§ã³ã確èªããããšã§ãDocker CLI ãåäœããŠãããã©ããã確èªã§ããŸãã
docker -v
次ã«ãèŠæ±ãããããŠãŒã¶ãŒåãšãã¹ã¯ãŒããå ¥åã㊠Docker Hub ã«ãã°ã€ã³ããŸãã
docker login
Docker ã䜿çšããã«ã¯ãã€ã¡ãŒãžãšã³ã³ãããŒã®æŠå¿µãç解ããå¿ èŠããããŸãã
âç»å
ã€ã¡ãŒãžã¯ãã³ã³ãããŒãçµã¿ç«ãŠãããã®æ瀺ãå«ãŸããèšèšå³ã®ãããªãã®ã§ãã ããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãã¡ã€ã« ã·ã¹ãã ãšèšå®ã®äžå€ã®ã¹ãããã·ã§ããã§ãã éçºè ã¯ç»åãç°¡åã«å ±æã§ããŸãã
# ÐÑвПЎ ÑвеЎеМОй ПбП вÑеÑ
ПбÑазаÑ
docker images
ãã®ã³ãã³ãã¯ã次ã®ããããŒãæã€ããŒãã«ãåºåããŸãã
REPOSITORY TAG IMAGE ID CREATED SIZE
---
次ã«ãåã圢åŒã®ã³ãã³ãã®äŸãããã€ãèŠãŠãããŸããæåã«ã³ã¡ã³ãä»ãã®ã³ãã³ããããã次ã«ãããåºåã§ãããã®ã®äŸããããŸãã
âã³ã³ãã
ã³ã³ããã¯ãã¢ããªã±ãŒã·ã§ã³ã®å®è¡ã«å¿ èŠãªãã®ããã¹ãŠå«ãŸããå®è¡å¯èœããã±ãŒãžã§ãã ãã®ã¢ãããŒããæ¡çšããã¢ããªã±ãŒã·ã§ã³ã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ã«é¢ä¿ãªããåé¢ãããç°å¢ã§ãåãç°å¢ã§ãåžžã«åãããã«åäœããŸãã éèŠãªã®ã¯ãåãã€ã¡ãŒãžã®ã€ã³ã¹ã¿ã³ã¹ãç°ãªãç°å¢ã§èµ·åããããšããããšã§ãã
# ÐеÑеÑОÑлеМОе вÑеÑ
кПМÑейМеÑПв
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
---
âã¿ã°
ã¿ã°ã¯ãã€ã¡ãŒãžã®ç¹å®ã®ããŒãžã§ã³ã瀺ããŸãã
âDocker ã³ãã³ãã®ã¯ã€ãã¯ãªãã¡ã¬ã³ã¹
ããã§ã¯ãäžè¬çã«äœ¿çšãããããã€ãã® Docker ã³ãã³ãã®æŠèŠã瀺ããŸãã
ããŒã
ã³ã³ããã¹ã
ã¢ã¯ã·ã§ã³
ã€ã¡ãŒãž
Dockerfile ããã€ã¡ãŒãžãæ§ç¯ãã
ã€ã¡ãŒãž
ç»åã®ã¿ã°ä»ã
ã€ã¡ãŒãž
ç»åã®äžèŠ§è¡šç€º
ã³ã³ãã
ã€ã¡ãŒãžã«åºã¥ããŠã³ã³ãããå®è¡ãã
ã€ã¡ãŒãž
ã¬ãžã¹ããªãžã®ã€ã¡ãŒãžã®ã¢ããããŒã
ã€ã¡ãŒãž
ã¬ãžã¹ããªããã€ã¡ãŒãžãããŒããã
ã³ã³ãã
ã³ã³ããã®ãªã¹ã衚瀺
ã€ã¡ãŒãž/ã³ã³ãã
䜿çšãããŠããªãã³ã³ãããšã€ã¡ãŒãžã®åé€
âDockerfile
æ¬çªã¢ããªã±ãŒã·ã§ã³ãããŒã«ã«ã§å®è¡ããæ¹æ³ãç¥ã£ãŠããŸãã æ¢è£œã® React ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«èšèšããã Webpack æ§æããããŸãã 次ã«ãããŒãäžã§ Node.js ããŒã¹ã®ãµãŒããŒãèµ·åããã³ãã³ãããããŸãã 5000
ã 次ã®ããã«ãªããŸãã
npm i # ÑÑÑаМПвка завОÑОЌПÑÑей
npm run build # ÑбПÑка React-пÑОлПжеМОÑ
npm run start # запÑÑк Node-ÑеÑвеÑа
ãã®è³æã®å¿çšäŸã¯ãªãããšã«æ³šæããŠãã ããã ãã ããããã§ã¯å®éšã®ãããåçŽãª Node ã¢ããªã±ãŒã·ã§ã³ã§ååã§ãã
ã³ã³ããã䜿çšããã«ã¯ãDocker ã«æ瀺ãäžããå¿
èŠããããŸãã ããã¯ããšãããã¡ã€ã«ãéããŠè¡ãããŸãã Dockerfile
ããããžã§ã¯ãã®ã«ãŒã ãã£ã¬ã¯ããªã«ãããŸãã ãã®ãã¡ã€ã«ã¯ãæåã¯ãŸã£ããç解ã§ããªãããã«æããŸãã
ãã ããããã«å«ãŸããã®ã¯ãç¹å¥ãªã³ãã³ãã䜿çšããŠãäœæ¥ç°å¢ã®ã»ããã¢ããã«äŒŒãå 容ã説æããã ãã§ãã ãããã®ã³ãã³ãã®äžéšã次ã«ç€ºããŸãã
FROM â ãã®ã³ãã³ãã¯ãã¡ã€ã«ãéå§ããŸãã ã³ã³ãããŒãæ§ç¯ãããããŒã¹ã€ã¡ãŒãžãæå®ããŸããCOPY â ããŒã«ã« ãœãŒã¹ããã³ã³ãããžã®ãã¡ã€ã«ã®ã³ããŒãäœæ¥ãã£ã¬ã¯ã㪠â 次ã®ã³ãã³ãã®äœæ¥ãã£ã¬ã¯ããªãèšå®ããŸããRUN - ã³ãã³ãã®å®è¡ãé²åº â ããŒãèšå®ããšã³ããªãŒãã€ã³ã â å®è¡ããã³ãã³ãã瀺ããŸãã
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>
ãã«ãã«ã¯æ°åãããå ŽåããããŸãããã¹ãŠã¯äŸåé¢ä¿ã®æ°ã«ãã£ãŠç°ãªããŸãã ãã«ããå®äºãããã次ã®ã³ãã³ããå®è¡ã§ããŸãã docker images
ãããŠãæ°ããã€ã¡ãŒãžã®èª¬æãèŠãŠãã ããã
REPOSITORY TAG IMAGE ID CREATED SIZE
<image> latest 123456789123 About a minute ago x.xxGB
âèµ·å
ç»åãäœæãããŸããã ããã¯ãããã«åºã¥ããŠã³ã³ãããŒãå®è¡ã§ããããšãæå³ããŸãã ã³ã³ããå
ã§å®è¡ãããŠããã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ã§ããããã«ãããããã§ãã localhost:5000
ãã¢ã®å·ŠåŽãç§ã§ã 5000:5000
次ã«ã€ã³ã¹ããŒã«ãããã³ãã³ã㧠5000
ã å³åŽãã³ã³ããããŒãã§ãã
# ÐапÑÑк Ñ ÐžÑпПлÑзПваМОеЌ лПкалÑМПгП пПÑÑа 5000 О пПÑÑа кПМÑейМеÑа 5000
docker run -p 5000:5000 <image>:<tag>
ã³ã³ãããäœæããå®è¡ãããŠããã®ã§ã次ã®ã³ãã³ãã䜿çšã§ããŸãã docker ps
ãã®ã³ã³ããã«é¢ããæ
å ±ã確èªããã«ã¯ (ãŸãã¯ã次ã®ã³ãã³ãã䜿çšã§ããŸã) 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
â éçšç°å¢ã§å®è¡ãããŠããã¢ããªã±ãŒã·ã§ã³ã®ããŒãžãšãŸã£ããåãããã«èŠãããå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã®ããŒãžã衚瀺ãããŸãã
âã¿ã°ä»ããšå ¬é
å®çšŒåãµãŒããŒäžã§äœæãããã€ã¡ãŒãžã® XNUMX ã€ã䜿çšããã«ã¯ããã®ã€ã¡ãŒãžã Docker Hub ããããŠã³ããŒãã§ããå¿ èŠããããŸãã ããã¯ããŸã Docker Hub äžã«ãããžã§ã¯ãã®ãªããžããªãäœæããå¿ èŠãããããšãæå³ããŸãã ãã®åŸãç»åãéãå Žæãã§ããŸãã ã€ã¡ãŒãžã®ååã Docker Hub ãŠãŒã¶ãŒåã§å§ãŸãããã«ååãå€æŽããå¿ èŠããããŸãã ãã®åŸã«ãªããžããªã®ååãç¶ããå¿ èŠããããŸãã ååã®æåŸã«ã¯ä»»æã®ã¿ã°ãé 眮ã§ããŸãã 以äžã¯ããã®ã¹ããŒã ã䜿çšããŠã€ã¡ãŒãžã«ååãä»ããäŸã§ãã
ããã§ãæ°ããååã§ã€ã¡ãŒãžããã«ãããã³ãã³ããå®è¡ã§ããããã«ãªããŸãã docker push
ããã Docker Hub ãªããžããªã«ããã·ã¥ããŸãã
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 ã§å©çšã§ããããã«ãªãããµãŒããŒã«ç°¡åã«ã¢ããããŒãããããä»ã®éçºè ã«è»¢éãããã§ããŸãã
次ã®ã¹ããã
ãããŸã§ã§ãã¢ããªã±ãŒã·ã§ã³ã Docker ã³ã³ããã®åœ¢åŒã§ããŒã«ã«ã§å®è¡ãããŠããããšã確èªããŸããã ã³ã³ããã Docker Hub ã«ã¢ããããŒãããŸããã ããããã¹ãŠã¯ãç§ãã¡ããã§ã«ç®æšã«åãã£ãŠéåžžã«è¯ãé²æ©ãéããŠããããšãæå³ããŸãã ããã§ãããã« XNUMX ã€ã®è³ªåã解決ããå¿ èŠããããŸãã
- ã³ãŒãã®ãã¹ããšãããã€ã®ããã® CI ããŒã«ã®ã»ããã¢ããã
- ã³ãŒããããŠã³ããŒãããŠå®è¡ã§ããããã«å®çšŒåãµãŒããŒãã»ããã¢ããããŸãã
ç§ãã¡ã®å Žåã䜿çšããã®ã¯ã
ããã§ã¯ããµãŒãã¹ã®å¥ã®çµã¿åããã䜿çšã§ããããšã«æ³šæããŠãã ããã ããšãã°ãTravis CI ã®ä»£ããã«ãCircleCI ãŸã㯠Github Actions ã䜿çšã§ããŸãã DigitalOcean ã®ä»£ããã«ãAWS ãŸã㯠Linode ã䜿çšããŸãã
Travis CI ã䜿çšããããšã«æ±ºããŸãããããã®ãµãŒãã¹ã«ã¯ãã§ã«äœããèšå®ãããŠããŸãã ãããã£ãŠãããã§ã¯ä»äºã®ããã«ãããæºåããæ¹æ³ã«ã€ããŠç°¡åã«èª¬æããŸãã
ãã©ãã¹CI
Travis CI ã¯ãã³ãŒãããã¹ãããã³ãããã€ããããã®ããŒã«ã§ãã Travis CI ã®èšå®ã®è€éãã«ã€ããŠã¯è§ŠããããããŸãããåãããžã§ã¯ãã¯ç¬èªã§ãããããŸãã¡ãªããããããŸããã ãã ããTravis CI ã䜿çšããããšã«æ±ºããå Žåã«ãéå§ããããã®åºæ¬ã«ã€ããŠèª¬æããŸãã Travis CIãCircleCIãJenkinsããŸãã¯ãã®ä»ã®ãã®ãéžæããå Žåã§ããåæ§ã®æ§ææ¹æ³ãã©ãã§ã䜿çšãããŸãã
Travis CI ã®äœ¿çšãéå§ããã«ã¯ã次ã®ãµã€ãã«ã¢ã¯ã»ã¹ããŠãã ããã
Travis CI ãèµ·åããããã³ã«ã察å¿ãããªããžã㪠ãã©ã³ãã®ãããã€ãªã©ãæ§æãã¡ã€ã«ã§æå®ãããã³ãã³ããå®è¡ãããµãŒããŒãèµ·åãããŸãã
âãžã§ãã®ã©ã€ããµã€ã¯ã«
Travis CI æ§æãã¡ã€ã«ãšåŒã°ãã .travis.yml
ãããžã§ã¯ãã®ã«ãŒã ãã£ã¬ã¯ããªã«ä¿åãããã€ãã³ãã®æŠå¿µããµããŒãããŸã
apt addons
cache components
before_install
install
before_script
script
before_cache
after_success ОлО after_failure
before_deploy
deploy
after_deploy
after_script
âãã¹ã
æ§æãã¡ã€ã«ã§ã¯ãããŒã«ã«ã® Travis CI ãµãŒããŒãæ§æããŸãã èšèªãšããŠããŒã 12 ãéžæããDocker ã䜿çšããããã«å¿ èŠãªäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããããã«ã·ã¹ãã ã«æ瀺ããŸããã
ã«èšèŒãããŠãããã®ã¯ãã¹ãŠã .travis.yml
ãç¹ã«æå®ãããŠããªãéãããã¹ãŠã®ãã« ãªã¯ãšã¹ãããªããžããªã®ãã¹ãŠã®ãã©ã³ãã«å¯ŸããŠè¡ããããšãã«å®è¡ãããŸãã ããã¯ããªããžããªã«å
¥ããã¹ãŠã®ã³ãŒãããã¹ãã§ããããšãæå³ããããã䟿å©ãªæ©èœã§ãã ããã«ãããã³ãŒãããã©ã³ãã«æžã蟌ãæºåãã§ããŠãããã©ãããããããŸãã master
ããããžã§ã¯ãã®ãã«ãããã»ã¹ãäžæããããã©ããã ãã®ã°ããŒãã«æ§æã§ã¯ããã¹ãŠãããŒã«ã«ã«ã€ã³ã¹ããŒã«ããWebpack éçºãµãŒããŒãããã¯ã°ã©ãŠã³ãã§å®è¡ã (ãããç§ã®ã¯ãŒã¯ãããŒã®æ©èœã§ã)ããã¹ããå®è¡ããŸãã
ãªããžããªã«ãã¹ã ã«ãã¬ããž ã¢ã€ã³ã³ã衚瀺ãããå Žåã¯ã
ãã¡ã€ã«ã®å
容ã¯æ¬¡ã®ãšããã§ã .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
ããã§ããªããžããªã®ãã¹ãŠã®ãã©ã³ããšãã« ãªã¯ãšã¹ãã«å¯ŸããŠå®è¡ãããã¢ã¯ã·ã§ã³ãçµäºããŸãã
âå±é
ãã¹ãŠã®èªåãã¹ããæ£åžžã«å®äºãããšããåæã«åºã¥ããŠããªãã·ã§ã³ã§ã³ãŒããå®çšŒåãµãŒããŒã«ãããã€ã§ããŸãã ãã©ã³ãã®ã³ãŒãã«å¯ŸããŠã®ã¿ãããå®è¡ãããã®ã§ã master
ãå±éèšå®ã§ã·ã¹ãã ã«é©åãªæ瀺ãäžããŸãã 次ã«èª¬æããã³ãŒãããããžã§ã¯ãã§äœ¿çšããåã«ããããã€ã¡ã³ãçšã«å®éã®ã¹ã¯ãªãããåŒã³åºãå¿
èŠãããããšãèŠåããããšæããŸãã
deploy:
# СПбÑаÑÑ Docker-кПМÑÐµÐ¹ÐœÐµÑ Ðž ПÑпÑавОÑÑ ÐµÐ³ÐŸ Ма Docker Hub
provider: script
script: bash deploy.sh
on:
branch: master
ãããã€ã¡ã³ã ã¹ã¯ãªããã¯ã次㮠XNUMX ã€ã®åé¡ã解決ããŸãã
- CI ããŒã« (ãã®å Žå㯠Travis CI) ã䜿çšããŠãã€ã¡ãŒãžããã«ãããã¿ã°ä»ãããDocker Hub ã«éä¿¡ããŸãã
- ãµãŒããŒã«ã€ã¡ãŒãžãããŒãããå€ãã³ã³ãããŒãåæ¢ããŠãæ°ããã³ã³ãããŒãéå§ããŸã (ãã®å ŽåããµãŒããŒã¯ DigitalOcean ãã©ãããã©ãŒã ã§å®è¡ãããŸã)ã
ãŸããã€ã¡ãŒãžããã«ããã¿ã°ä»ããDocker Hub ã«ããã·ã¥ããããã®èªåããã»ã¹ãèšå®ããå¿ èŠããããŸãã ããã¯ãã¹ãŠãç»åã«äžæã®ã¿ã°ãå²ãåœãŠããã°ã€ã³ãèªååããæŠç¥ãå¿ èŠã§ããããšãé€ããŠããã§ã«æåã§è¡ã£ãããšãšéåžžã«äŒŒãŠããŸãã ã¿ã°ä»ãæŠç¥ããã°ã€ã³ãSSH ããŒã®ãšã³ã³ãŒããSSH æ¥ç¶ã®ç¢ºç«ãªã©ããããã€ã¡ã³ã ã¹ã¯ãªããã®è©³çŽ°ã®ããã€ãã«åé¡ããããŸããã ããã幞ããªããšã«ãç§ã®ããŒã€ãã¬ã³ãã¯ãä»ã®å€ãã®ããšãšåæ§ã«ãbash ã«ã€ããŠãéåžžã«äžæã§ãã 圌ã¯ç§ããã®èæ¬ãæžãã®ãæäŒã£ãŠãããŸããã
ãããã£ãŠãã¹ã¯ãªããã®æåã®éšåã¯ãã€ã¡ãŒãžã Docker Hub ã«ã¢ããããŒãããããšã§ãã ããã¯éåžžã«ç°¡åã§ãã ç§ã䜿çšããã¿ã°ä»ãã¹ããŒã ã§ã¯ãgit ããã·ã¥ãš git ã¿ã° (ååšããå Žå) ãçµã¿åãããŸãã ããã«ãããã¿ã°ãäžæã§ããããšãä¿èšŒããããã®ã¿ã°ã®åºã«ãªã£ãŠããã¢ã»ã³ããªãèå¥ãããããªããŸãã 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}
ã¹ã¯ãªããã® XNUMX çªç®ã®éšåãã©ã®ããã«ãªããã¯ã䜿çšããŠãããã¹ããšããã®ãã¹ããžã®æ¥ç¶ãã©ã®ããã«æ§æãããŠãããã«ãã£ãŠå®å
šã«ç°ãªããŸãã ç§ã®å ŽåãDigital Oceanã䜿çšããŠããã®ã§ãã³ãã³ãã䜿çšããŠãµãŒããŒã«æ¥ç¶ããŸã aws
ããªã©
ãµãŒããŒã®ã»ããã¢ããã¯ç¹ã«é£ãããããŸããã§ããã ããã§ãããŒã¹ç»åãåºã«ããããã¬ãããèšå®ããŸããã ç§ãéžæããã·ã¹ãã ã§ã¯ãDocker ã®æåã€ã³ã¹ããŒã«ãš Docker ã®æåèµ·åã 18.04 åã ãè¡ãå¿
èŠãããããšã«æ³šæããŠãã ããã Docker ã®ã€ã³ã¹ããŒã«ã«ã¯ Ubuntu XNUMX ã䜿çšãããããUbuntu ã䜿çšããŠåãããšãè¡ã£ãŠããå Žåã¯ã次ã®ããã«ããŠãã ããã
ãã®åŽé¢ã¯ã±ãŒã¹ã«ãã£ãŠå€§ããç°ãªãå¯èœæ§ããããããããã§ã¯ãµãŒãã¹ã®ç¹å®ã®ã³ãã³ãã«ã€ããŠã¯è©±ããŠããŸããã ãããžã§ã¯ãããããã€ããããµãŒããŒã« 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)?
æååããŒã䟿å©ãã€ç¢ºå®ã«æäœã§ãã圢åŒã§ä¿åããã«ã¯ãbase64 ã§ãšã³ã³ãŒãã§ããããšãåŠã³ãŸããã ã€ã³ã¹ããŒã«æ®µéã§ãå
¬éããŒããã³ãŒãããŠãã¡ã€ã«ã«æžã蟌ãããšãã§ããŸãã known_hosts
äžèšã®ãšã©ãŒãåãé€ãããã«ã
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 ã§ãšã³ã³ãŒããããæååã§ãã
MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==
äžèšã®ã³ãã³ãã¯æ¬¡ã®ãšããã§ã
install:
- echo < пÑблОÑÐœÑй клÑÑ, закПЎОÑПваММÑй в base64> | base64 -d >> $HOME/.ssh/known_hosts
ãµãŒããŒã«ã¢ã¯ã»ã¹ããã«ã¯ç§å¯ããŒãå¿ èŠã«ãªãå Žåããããããæ¥ç¶ã確ç«ãããšãã«åãã¢ãããŒããç§å¯ããŒã§äœ¿çšã§ããŸãã ããŒãæäœãããšãã¯ãããŒã Travis CI ç°å¢å€æ°ã«å®å šã«ä¿åãããŠããŠãã©ãã«ã衚瀺ãããŠããªãããšã確èªããã ãã§æžã¿ãŸãã
ãã XNUMX ã€æ³šæãã¹ãç¹ã¯ãå±éã¹ã¯ãªããå
šäœã XNUMX è¡ãšããŠå®è¡ããå¿
èŠãããå Žåãããããšã§ããããšãã°ã doctl
ã ããã«ã¯è¿œå ã®åªåãå¿
èŠã«ãªãå ŽåããããŸãã
doctl compute ssh <droplet> --ssh-command "вÑе ÐºÐŸÐŒÐ°ÐœÐŽÑ Ð±ÑÐŽÑÑ Ð·ÐŽÐµÑÑ && зЎеÑÑ"
TLS/SSL ãšããŒã ãã©ã³ã·ã³ã°
äžèšã®ãã¹ãŠãè¡ã£ãåŸãæåŸã«ééããåé¡ã¯ããµãŒããŒã« SSL ãæèŒãããŠããªããšããããšã§ããã Node.jsãµãŒããŒã䜿çšããŠããã®ã§ã匷å¶çã«
ãã® SSL æ§æããã¹ãŠæåã§è¡ãã®ã¯æ¬åœã«å«ã ã£ãã®ã§ãããŒã ãã©ã³ãµãŒãäœæãããã®è©³çŽ°ã DNS ã«èšé²ããããšã«ããŸããã ããšãã°ãDigitalOcean ã®å ŽåãããŒã ãã©ã³ãµãŒäžã§èªåæŽæ°ã®èªå·±çœ²å蚌ææžãäœæããã®ã¯ãç°¡åãã€ç¡æã§è¿
éãªæé ã§ãã ãã®ã¢ãããŒãã«ã¯ãå¿
èŠã«å¿ããŠããŒã ãã©ã³ãµãŒã®èåŸã§å®è¡ãããŠããè€æ°ã®ãµãŒããŒäžã§ SSL ãã»ããã¢ããããã®ãéåžžã«ç°¡åã«ãªããšããè¿œå ã®å©ç¹ããããŸãã ããã«ããããµãŒããŒèªäœã¯ SSL ã«ã€ããŠãŸã£ãããèãããå¿
èŠããªããåæã«éåžžã©ããããŒãã䜿çšã§ããŸãã 80
ã ãããã£ãŠãããŒã ãã©ã³ãµãŒã§ã® SSL ã®ã»ããã¢ããã¯ãSSL ãã»ããã¢ããããä»ã®æ¹æ³ãããã¯ããã«ç°¡åã§äŸ¿å©ã§ãã
ããã§ãåä¿¡æ¥ç¶ãåãå
¥ãããµãŒããŒäžã®ãã¹ãŠã®ããŒã (ããŒããé€ã) ãéããããšãã§ããŸãã 80
ãããŒããã©ã³ãµãŒãšã®éä¿¡ã«äœ¿çšãããããŒã 22
SSHçšã ãã®çµæãããã XNUMX ã€ä»¥å€ã®ããŒãã§ãµãŒããŒã«çŽæ¥ã¢ã¯ã»ã¹ããããšãããšå€±æããŸãã
çµæ
ãã®è³æã§èª¬æããããšããã¹ãŠå®è¡ããåŸã¯ãDocker ãã©ãããã©ãŒã ãèªååããã CI/CD ãã§ãŒã³ã®æŠå¿µãæããªããªããŸããã ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ ãã§ãŒã³ãã»ããã¢ããããããšãã§ããŸããããã®ãã§ãŒã³ã§ã¯ãå®çšŒåç°å¢ã«å
¥ãåã«ã³ãŒãããã¹ããããã³ãŒããèªåçã«ãµãŒããŒã«ãããã€ãããŸãã ããã¯ç§ã«ãšã£ãŠãŸã æ¯èŒçæ°ããããšã§ãããèªååãããã¯ãŒã¯ãããŒãæ¹åããŠããå¹ççã«ããæ¹æ³ããããšç¢ºä¿¡ããŠããŸãã ãããã£ãŠããã®ä»¶ã«é¢ããŠäœãã¢ã€ãã¢ããããŸãããããã²ãç¥ãããã ããã
PS ÐМаÑеЌ
芪æãªãèªè ïŒ ãããžã§ã¯ã㧠CI/CD ãã¯ãããžãŒã䜿çšããŠããŸãã?
åºæïŒ habr.com