±à¼ÍƼö: |
ÎÄÕÂÖ÷Òª½éÉÜÁË
ÀûÓþµÏñ»º´æ¡¢CI »·¾³ÏµÄÓÅ»¯¡¢¶à½×¶Î¹¹½¨¡¢Ê¹ÓöÔÏó´æ´¢·þÎñ (OSS)µÈÏà¹ØÄÚÈÝ¡£
±¾ÎÄÀ´×ÔÓÚ¾ò½ð£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
Docker ±äµÃÔ½À´Ô½Á÷ÐУ¬Ëü¿ÉÒÔÇá±ãÁé»îµØ¸ôÀë»·¾³£¬½øÐÐÀ©ÈÝ£¬ÔËά¹ÜÀí¡£¶ÔÓÚÒµÎñ¿ª·¢Õß¶øÑÔ£¬Ëæ×ųÖÐø¼¯³ÉµÄ·¢Õ¹£¬¶Ô´úÂëÖÊÁ¿¼°¿ìËÙµü´úµÄÒªÇóÒ²Ô½À´Ô½¸ß¡£
¶ÔÓÚǰ¶Ë¶øÑÔ£¬ÔÚ CI »·¾³ÖÐʹÓÃÒ²¸üÈÝÒ×¼¯³É¿ª·¢£¬²âÊÔÓ벿Êð¡£±ÈÈç¿ÉÒÔΪÁ÷Ë®Ïß(Pipeline)ÉèÖÃ
Lint/Test/Security/Audit/Deploy/Artifact µÈÈÎÎñ£¬¸üºÃµØ°Ñ¿ØÏîÄ¿ÖÊÁ¿¡£
ÏÖÔÚÎÞÂÛÊÇǰ¶Ë£¬ºó¶Ë»¹ÊÇÔËά£¬¶¼ºÜÇ¿µ÷ devops µÄÀíÄ½ÓÏÂÀ´ÎÒ½«»áдһϵÁйØÓÚ
devops ÔÚǰ¶ËÖÐÓ¦ÓõÄÎÄÕ¡£Äã¿ÉÒÔÔÚÎҵIJ©¿Í¶©Ôĸü¶àÎÄÕ¡£
ÕâÀォ½éÉÜÈçºÎʹÓà Docker ²¿Êðǰ¶ËÓ¦Óã¬Ç§ÀïÖ®ÐУ¬Ê¼ÓÚ×ãÏ¡£Ê¼ÓÚ×ãϵÄÒâ˼¾ÍÊÇ£¬ÏÈÈÃËüÄܹ»ÅÜÆðÀ´¡£
ÏÈÈÃËüÅÜÆðÀ´
1.Ê×ÏÈ£¬¼òµ¥½éÉÜÒ»ÏÂÒ»¸öµäÐ͵Äǰ¶ËÓ¦Óò¿ÊðÁ÷³Ì
2.npm install, °²×°ÒÀÀµ
3.npm run build£¬±àÒ룬´ò°ü£¬Éú³É¾²Ì¬×ÊÔ´
·þÎñ»¯¾²Ì¬×ÊÔ´£¬Èç nginx
½éÉÜÍ겿ÊðÁ÷³Ìºó£¬¼òµ¥Ð´Ò»¸ö Dockerfile
FROM node:10-alpine
# ´ú±íÉú²ú»·¾³
ENV PROJECT_ENV production
# Ðí¶à package »á¸ù¾Ý´Ë»·¾³±äÁ¿£¬×ö³ö²»Í¬µÄÐÐΪ
# ÁíÍ⣬ÔÚ webpack Öдò°üÒ²»á¸ù¾Ý´Ë»·¾³±äÁ¿×ö³öÓÅ»¯£¬µ«ÊÇ create-react-app
ÔÚ´ò°üʱ»áдËÀ¸Ã»·¾³±äÁ¿
ENV NODE_ENV production
WORKDIR /code
ADD . /code
RUN npm install && npm run build &&
npm install -g http-server
EXPOSE 80
CMD http-server ./public -p 80
|
ÏÖÔÚÕâ¸öǰ¶Ë·þÎñÒѾÅÜÆðÀ´ÁË£¬½ÓÏÂÀ´Äã¿ÉÒÔÍê³É²¿ÊðµÄÆäËü½×¶ÎÁË¡£
Ò»°ãÇé¿öÏ£¬ÒÔϾͳÉÁËÔËάµÄ¹¤×÷ÁË£¬²»¹ý£¬ÍØÕ¹×Ô¼ºµÄ֪ʶ±ß½ç×ÜÊÇû´íµÄ¡£ÆäËü½×¶Î½éÉÜÈçÏÂ
ʹÓà nginx »òÕß traefik ×ö·´Ïò´úÀí¡£ÔÚÎÒÄÚ²¿¼¯ÈºÖÐʹÓÃÁË traefik£¬Ïê¼û traefik
¼òÒ×ÈëÃÅ
ʹÓà kubernetes »òÕß docker compose ×öÈÝÆ÷±àÅÅ¡£ÔÚÎÒÄÚ²¿¼¯ÈºÖÐʹÓÃÁË compose£¬Ïê¼û
docker compose ¼òÒ×ÈëÃÅ
ʹÓà gitlab ci£¬drone ci »òÕß github actions µÈ×ö CI/CD ×Ô¶¯²¿Êð¡£ÔÚÎÒÄÚ²¿¼¯ÈºÖÐʹÓÃÁË
github actions£¬Ïê¼û github actions ¼òÒ×ÈëÃÅ
Õâʱ¾µÏñ´æÔÚÁ½¸öÎÊÌ⣬µ¼ÖÂÿ´Î²¿Êðʱ¼ä¹ý³¤£¬²»ÀûÓÚ²úÆ·µÄ¿ìËÙ½»¸¶£¬Ã»ÓпìËÙ½»¸¶£¬Ò²¾ÍûÓÐÃô½Ý¿ª·¢ (Agile)
¹¹½¨¾µÏñʱ¼ä¹ý³¤
¹¹½¨¾µÏñ´óС¹ý´ó£¬¶àʱÉõÖÁ 1G+
ÀûÓþµÏñ»º´æ
ÎÒÃÇ×¢Òâµ½£¬Ïà¶ÔÓÚÏîÄ¿µÄÔ´ÎļþÀ´½²£¬package.json ÊÇÏà¶ÔÎȶ¨µÄ¡£Èç¹ûûÓÐÐµİ²×°°üÐèÒªÏÂÔØ£¬ÔòÔٴι¹½¨¾µÏñʱ£¬ÎÞÐèÖØÐ¹¹½¨ÒÀÀµ¡£Ôò¿ÉÒÔÔÚ
npm install ÉϽÚʡһ°ëµÄʱ¼ä¡£
¶ÔÓÚ ADD À´½²£¬Èç¹ûÐèÒªÌí¼ÓµÄÎļþÄÚÈÝµÄ checksum ûÓз¢Éú±ä»¯£¬Ôò¿ÉÒÔÀûÓûº´æ¡£°Ñ
package.json/package-lock.json ÓëÔ´Îļþ·Ö¸ô¿ªÐ´Èë¾µÏñÊÇÒ»¸öºÜºÃµÄÑ¡Ôñ¡£Ä¿Ç°£¬Èç¹ûûÓÐÐµİ²×°°ü¸üÐµĻ°£¬¿ÉÒÔ½Úʡһ°ëʱ¼ä
FROM node:10-alpine
ENV PROJECT_ENV production
ENV NODE_ENV production
# http-server ²»±ä¶¯Ò²¿ÉÒÔÀûÓûº´æ
RUN npm install -g http-server
WORKDIR /code
# Ê×´ÎÌí¼Ó´ËÁ½¸öÎļþ£¬³ä·ÖÀûÓûº´æ
ADD package.json package-lock.json /code
RUN npm install --production
ADD . /code
RUN npm run build
EXPOSE 80
CMD http-server ./public -p 80
|
¹ØÓÚÀûÓûº´æÓиü¶àϸ½Ú£¬ÐèÒªÌØ±ð×¢Òâһϡ£Èç RUN git clone
<repo>£¬Èç¹ûÃüÁî×Ö·û´®Ã»ÓиüУ¬Ôò½«Ê¹Óûº´æ£¬µ±ÃüÁîÊÇ·ÇÃݵÈÐÔʱ£¬Õ⽫ÓпÉÄܵ¼ÖÂÎÊÌâ¡£
¹ØÓÚ»º´æ¼°¿ÉÄܵ¼ÖµÄÎÊÌ⣬¿ÉÒԲο¼ÎÒµÄÎÄÕ Dockerfile ×î¼Ñʵ¼ù
CI »·¾³ÏµÄÓÅ»¯
FROM node:10-alpine
ENV PROJECT_ENV production
ENV NODE_ENV production
# http-server ²»±ä¶¯Ò²¿ÉÒÔÀûÓûº´æ
RUN npm install -g http-server
WORKDIR /code
# Ê×´ÎÌí¼Ó´ËÁ½¸öÎļþ£¬³ä·ÖÀûÓûº´æ
ADD package.json package-lock.json /code
RUN npm ci
ADD . /code
RUN npm run build
EXPOSE 80
CMD http-server ./public -p 80
|
ÔÚ CI »·¾³ÏÂÖ÷Òª×öÁËÒ»µã¸Ä¶¯£ºÊ¹Óà npm ci ´úÌæ npm
i£¬¾ÊµÑ飬npm ci ¿ÉÒÔ¼õÉÙ½«½üÒ»°ëµÄµÄÒÀÀµ°²×°Ê±¼ä¡£
$ npm install
added 1154 packages in 60s
$ npm ci
added 1154 packages in 35s
|
ÁíÍ⣬µ± package.json Óë package-lock.json
°æ±¾²»Æ¥Åäʱ£¬npm ci ½«»á±¨³öÒì³££¬Ìáǰ¼ì²â³ö²»°²È«ÐÅÏ¢£¬¼°Ôç·¢ÏÖÎÊÌ⣬¼°Ôç½â¾öÎÊÌâ¡£
¶à½×¶Î¹¹½¨
µÃÒæÓÚ»º´æ£¬ÏÖÔÚ¾µÏñ¹¹½¨Ê±¼äÒѾ¿ìÁ˲»ÉÙ¡£µ«ÊÇ£¬´Ëʱ¾µÏñµÄÌå»ýÒÀ¾É¹ýÓÚÅÓ´ó£¬ÕâÒ²½«»áµ¼Ö²¿Êðʱ¼äµÄ¼Ó³¤¡£ÔÒòÈçÏÂ
¿¼ÂÇÏÂÿ´Î CI/CD ²¿ÊðµÄÁ÷³Ì
ÔÚ¹¹½¨·þÎñÆ÷ (Runer) ¹¹½¨¾µÏñ
°Ñ¾µÏñÍÆÖÁ¾µÏñ²Ö¿â·þÎñÆ÷
ÔÚÉú²ú·þÎñÆ÷ÀÈ¡¾µÏñ£¬Æô¶¯ÈÝÆ÷
ÏÔ¶øÒ×¼û£¬¾µÏñÌå»ý¹ý´ó»áÔÚǰÁ½²½ÉÏ´«¼°ÏÂÔØÊ±Ôì³É´«ÊäЧÂʵÍÏ£¬Ôö¼Óÿ´Î²¿ÊðµÄÑÓʱ¡£
¼´Ê¹£¬¹¹½¨·þÎñÆ÷ÓëÉú²ú·þÎñÆ÷ÔÚͬһ½ÚµãÏ£¬Ã»ÓÐÑÓʱµÄÎÊÌâ (»ù±¾Ã»¿ÉÄÜ)¡£¼õÉÙ¾µÏñÌå»ýÒ²Äܹ»½ÚÊ¡´ÅÅ̿ռ䡣
¹ØÓÚ¾µÏñÌå»ýµÄ¹ý´ó£¬ÍêÈ«ÊÇÒòΪnode_modules ³ôÃûÕÑÖøµÄÌå»ý:

µ«×îºóÎÒÃÇÖ»ÐèÒª¹¹½¨Éú³ÉµÄ¾²Ì¬×ÊÔ´£¬¶ÔÓÚÔ´ÎļþÒÔ¼° node_modules ÏÂÎļþ£¬Õ¼ÓÃÌå»ý¹ý´óÇÒ²»±ØÒª£¬Ôì³ÉÀË·Ñ¡£
´Ëʱ¿ÉÒÔÀûÓà Docker µÄ¶à½×¶Î¹¹½¨£¬½öÀ´ÌáÈ¡±àÒëºóÎļþ£¬¼´´ò°üÉú³ÉµÄ¾²Ì¬×ÊÔ´£¬¶Ô
Dockerfile ×öÒ»¸Ä½ø
FROM node:10-alpine
as builder
ENV PROJECT_ENV production
ENV NODE_ENV production
# http-server ²»±ä¶¯Ò²¿ÉÒÔÀûÓûº´æ
WORKDIR /code
ADD package.json package-lock.json /code
RUN npm ci
ADD . /code
RUN npm run build
# Ñ¡Ôñ¸üСÌå»ýµÄ»ù´¡¾µÏñ
FROM nginx:10-alpine
COPY --from= builder /code/public /usr/share/nginx/html
|
´Ëʱ£¬¾µÏñÌå»ý´Ó 1G+ ±ä³ÉÁË 50M+¡£Èô´ËʱµÄ²¿Êð½ö½öÊÇÔÚ²âÊÔ»·¾³»òÕß¶à·ÖÖ§»·¾³ÏÂΪÁË·½±ã²âÊÔ£¬ÄǾʹ󹦸æ³É£¬ÍêÃÀ½â¾öÎÊÌâÁË¡£
ʹÓöÔÏó´æ´¢·þÎñ (OSS)
·ÖÎöһϠ50M+ µÄ¾µÏñÌå»ý£¬nginx:10-alpine µÄ¾µÏñÊÇ16M£¬Ê£ÏµÄ40MÊǾ²Ì¬×ÊÔ´¡£Éú²ú»·¾³µÄ¾²Ì¬×ÊÔ´ÍùÍù»áÔÚ¶ÀÁ¢ÓòÃûÉÏά»¤£¬²¢Ê¹ÓÃ
CDN ½øÐмÓËÙ¡£
Èç¹û°Ñ¾²Ì¬×ÊÔ´¸øÉÏ´«µ½Îļþ´æ´¢·þÎñ£¬¼´OSS£¬²¢Ê¹Óà CDN ¶Ô OSS ½øÐмÓËÙ£¬ÔòûÓбØÒª´òÈë¾µÏñÁË¡£¶øÔÚÉú²ú»·¾³ÏÂÒ²ÓжԾ²Ì¬×ÊÔ´ÉÏ
CDN µÄÇ¿ÁÒÐèÇó¡£
´Ëʱ¾µÏñ´óС»á¿ØÖÆÔÚ 20M ÒÔÏ¡£ËäÈ»¼«´óµØ¼õСÁ˾µÏñÌå»ý£¬µ«ÊÇËü»áÔö¼Ó¸´ÔÓ¶ÈÓëÔö¼Ó¾µÏñ¹¹½¨Ê±¼ä(ÈçÉÏ´«µ½OSS)£¬¶ÔÓÚ²âÊÔ»·¾³»òÕß·ÖÖ§»·¾³Ã»±ØÒªÊ¹ÓÃ
OSS¡£
¹ØÓÚ¾²Ì¬×ÊÔ´£¬¿ÉÒÔ·ÖÀà³ÉÁ½²¿·Ö£º
/build£¬´ËÀàÎļþÔÚÏîÄ¿ÖÐʹÓà require/import ÒýÓ㬻ᱻ webpack ´ò°ü²¢¼Ó
hash Öµ£¬²¢Í¨¹ý publicPath ÐÞ¸Ä×ÊÔ´µØÖ·¡£¿ÉÒÔ°Ñ´ËÀàÎļþÉÏ´«ÖÁ oss£¬²¢¼ÓÉÏÓÀ¾Ã»º´æ£¬²»ÐèÒª´òÈë¾µÏñ
/static£¬´ËÀàÎļþÔÚÏîÄ¿ÖÐÖ±½ÓÒýÓøù·¾¶£¬Ö±½Ó´òÈë¾µÏñ£¬Èç¹ûÉÏ´«ÖÁ OSS ¿ÉÄÜÔö¼Ó¸´ÔÓ¶È (ÅúÁ¿ÐÞ¸Ä
publicPath)
´Ëʱͨ¹ýÒ»¸ö½Å±¾ÃüÁî npm run uploadOss£¬À´°Ñ¾²Ì¬×ÊÔ´ÉÏ´«ÖÁ
OSS¡£¸üкóµÄ Dockerfile ÈçÏÂ
FROM node:10-alpine
as builder
ENV PROJECT_ENV production
ENV NODE_ENV production
# http-server ²»±ä¶¯Ò²¿ÉÒÔÀûÓûº´æ
WORKDIR /code
ADD package.json package-lock.json /code
RUN npm ci
ADD . /code
# npm run uploadOss ÊǰѾ²Ì¬×ÊÔ´ÉÏ´«ÖÁ oss ÉϵĽű¾Îļþ
RUN npm run build && npm run uploadOss
# Ñ¡Ôñ¸üСÌå»ýµÄ»ù´¡¾µÏñ
FROM nginx:10-alpine
COPY --from=builder code/public/index.html code/public/favicon.ico
/usr/share/nginx/html/
COPY --from=builder code/public/static /usr/share/nginx/html/static
|
С½á
¾¹ý±¾ÆªÎÄÕÂ×ܽᣬÔÚǰ¶ËÖй¹½¨¾µÏñÐèҪעÒâÒÔϼ¸µã
¾µÏñÖÐʹÓûùÓÚ alpine µÄ¾µÏñ£¬¼õС¾µÏñÌå»ý¡£
¾µÏñÖÐÐèÒªËø¶¨ node µÄ°æ±¾ºÅ£¬¾¡¿ÉÄÜÒ²Ëø¶¨ alpine µÄ°æ±¾ºÅ£¬Èç node:10.19-alpine3.11¡£(ÎÒʾÀý´úÂëÖÐδÈç´ËÏêϸµØÖ¸³ö)
Ñ¡ÔñºÏÊʵĻ·¾³±äÁ¿ NODE_ENV ¼° PROJECT_ENV£¬ÈçÔÚ²âÊÔ»·¾³Ï½øÐй¹½¨
npm ci Ìæ´ú npm i£¬±ÜÃâ°æ±¾ÎÊÌâ¼°Ìá¸ßÒÀÀµ°²×°ËÙ¶È
package.json µ¥¶ÀÌí¼Ó£¬³ä·ÖÀûÓþµÏñ»º´æ
ʹÓöà½×¶Î¹¹½¨£¬¼õС¾µÏñÌå»ý
ÈçÓбØÒª£¬¾²Ì¬×ÊÔ´ÇëÉÏ CDN
|