当前位置: 首页 > Web前端 > JavaScript

GitlabCI-CD教程和npm包构建和发布实践

时间:2023-03-26 21:18:02 JavaScript

锛侊紒锛佺粌涔犺繃绋嬩腑璇锋敞鎰忔枃妗g殑鐗堟湰鍙峰拰浣犲疄闄呬娇鐢ㄧ殑Gitlab鐨勭増鏈彿銆傪煈夝煆讳腑鏂囨枃妗?14.8-preyaml璇硶銆佹暀绋嬸煈夝煆籝AML鍏ラ棬鏁欑▼Docker鐩稿叧鐭ヨ瘑銆佹暀绋嬸煈夝煆籇ocker鏁欑▼linux鍛戒护銆佹暀绋嬸煈夝煆籐inux鍛戒护闆嗗悎鑷畾涔夐厤缃洰褰曢粯璁ら厤缃枃浠剁洰褰曞湪鏍圭洰褰曚笅monorepo锛屾枃浠跺悕涓?gitlab-ci.yml銆傚鏋滈渶瑕佽嚜瀹氫箟CI鑴氭湰鏂囦欢鐨勮矾寰勶紝濡備笅锛歱ipelineconfiguration.gitlab-ci.yml鏂囦欢涓殑pipeline閰嶇疆澶ц嚧鍙互鍒嗕负涓や釜鐜妭锛氬叏灞€閰嶇疆锛屽湪鍗曚釜涔嬪墠鎴栦箣鍚庤繍琛岄樁娈点€傚崟stage鐨勯厤缃粨鏋勫彲浠ュぇ鑷村涓嬶細#鎸囧畾鑴氭湰鎵ц鐨勯暅鍍忕幆澧冿紝濡備笅锛宯ode鐜涓?4.17.1image:node:14.17.1#executebefore_scriptbeforeexecutingasinglejob:-echo'======鍑嗗鏋勫缓========='#閰嶇疆鍗曢樁娈垫墽琛岄『搴忥紝涓茶闃舵锛?install-build#鍗曢樁娈甸厤缃?瀹夎渚濊禆npm_install:only:-masterstage:installscript:-yarn-ls-al#Singlestageconfiguration#Buildwebpack_build:only:-masterstage:buildscript:-yarnbuild#鎵ц瀹屾墍鏈夊崟浣滀笟鍚庢墽琛宎fter_script:-echo"======Buildend=========銆嬮噸瑕佹蹇礟ipeline绠¢亾锛屼竴涓閬撶浉褰撲簬涓€涓瀯寤轰换鍔★紝鍙互鍖呭惈澶氫釜闃舵锛屾瘮濡俰nstall->eslint->build->deploy绛夎繃绋嬶紱stages浠h〃鏋勫缓闃舵锛屾瘡涓樁娈典覆琛屽悓姝ユ墽琛屻€備竴鏃︽煇涓樁娈电殑浣滀笟澶辫触锛屽垯涓嶄細鎵ц涓嬩竴闃舵鐨勪换鍔°€傚鏋滃綋鍓嶉樁娈靛畾涔変簡澶氫釜浠诲姟锛屽鏋滃叾涓竴涓换鍔″け璐ワ紝鍙︿竴涓换鍔′粛鐒朵細琚墽琛屻€備絾鏄瀯寤轰换鍔★紙绠¢亾锛夊彧鏈夊湪鎵€鏈夐樁娈甸兘鎴愬姛瀹屾垚鏃舵墠琚涓烘槸鎴愬姛鐨勩€俲objob琛ㄧず涓€涓猻tage鎵ц鐨勫伐浣滐紝涓€涓猻tage鍙互瀹氫箟澶氫釜job銆備綔涓氬叿鏈変互涓嬬壒鐐癸細鍚屼竴闃舵鐨勪綔涓氫細骞惰鎵ц銆傚綋鍚屼竴涓猻tage涓殑job閮芥墽琛屾垚鍔燂紝stage灏辨垚鍔熶簡銆備换浣曚竴涓猨ob澶辫触锛宻tage閮戒細澶辫触锛屽嵆鏋勫缓浠诲姟锛圥ipeline锛夊け璐ワ紝鐢眊itlabrunner鎵ц銆傛瀯寤轰换鍔$殑鏈嶅姟锛屽寘鍚寔缁泦鎴愮幆澧冿紝涓€鑸敱docker鍒涘缓銆傚彲浠ラ儴缃插湪涓嶅悓鐨勪富鏈轰笂锛屼篃鍙互鍦ㄥ悓涓€鍙颁富鏈轰笂璁剧疆澶氫釜gitlab-runner锛屾牴鎹笉鍚岀殑鐜璁剧疆涓嶅悓鐨勭幆澧冦€傛瘮濡傛垜浠渶瑕佸尯鍒嗙爺鍙戠幆澧冦€佹祴璇曠幆澧冨拰姝e紡鐜銆傚叧閿瓧imageCI/CD灏辨槸鑴氭湰杩愯鐜鐨刣ocker闀滃儚銆傞暅鍍忔槸鏂囦欢瀛樺偍鐨勪竴绉嶅舰寮忥紝鍙互鐞嗚В涓哄寘鍚悇绉嶆枃浠剁殑鐜闆嗗悎銆傚鎸囧畾node鐜image:#latestversionnodeenvironmentimage:node:@latesttags鎸囧畾gitlab鍦ㄦ墽琛岃剼鏈椂浣跨敤鍝釜runner銆俠efore_script鏄墽琛屽崟涓樁娈典箣鍓嶆墽琛岀殑鑴氭湰鍐呭銆傚唴瀹逛互鏁扮粍褰㈠紡閰嶇疆锛屽涓婁緥锛歜efore_script:-echo'======Readytobuild========='stagesCI鍏佽鎴戜滑杩涜鑷垜閰嶇疆鐨勫畾涔夋祦姘寸嚎闃舵閰嶇疆鍙互灏嗕竴涓祦姘寸嚎鎷嗗垎鎴愬涓樁娈碉紙stages锛夛紝杩欎簺闃舵浼氫緷娆℃墽琛屻€俿tages:-install-buildscript鎵ц鑴氭湰锛岃剼鏈唴瀹逛互鏁扮粍褰㈠紡閰嶇疆銆傚湪涓婇潰鐨勪緥瀛愪腑锛宻tage灏辨槸鍦╪pm_install闃舵鎵ц鐨勮剼鏈細script:-yarn-ls-al棣栧厛鎵цyarn鍛戒护瀹夎渚濊禆锛岀劧鍚庢煡鐪嬪綋鍓嶇洰褰曚笅鐨勬枃浠跺拰鐩綍鐨勫叿浣撲俊鎭€傚畠鏄竴涓覆琛屾墽琛岃繃绋嬨€傜紦瀛樼紦瀛樺涓祦姘寸嚎浠诲姟涔嬮棿鍏变韩鐨勬枃浠跺拰鐩綍锛屼笅闈㈣缁嗕粙缁嶇紦瀛樼殑鐩稿叧姒傚康銆俹nly&except璁剧疆娴佹按绾夸换鍔$殑鎵ц鏃舵満锛歰nly鐢ㄦ潵瀹氫箟job杩愯鐨勬椂闂达紝except鐢ㄦ潵瀹氫箟job涓嶈繍琛岀殑鏃堕棿銆傛寚瀹氬垎鏀Е鍙戞墽琛屽畾鏃秊ob:only:-branches@gitlab-org/gitlabexcept:-main@gitlab-org/gitlab-/^release/.*$/@gitlab-org/gitlab鏈緥涓篻itlab-org/gitlab鍦ㄩ櫎main鍜屼互release/寮€澶寸殑鍒嗘敮涔嬪鐨勬墍鏈夊垎鏀笂杩愯浣滀笟銆傚悎骞惰姹傛椂瑙﹀彂job1锛歴cript:-echo"Thisjobrunsinmergerequestpipelines"only:-merge_requests褰撲綘鐐瑰嚮runpipeline鏃惰Е鍙慾ob1:only:-webtriggerexecutiontimingbasedongitcommitmessageorjudgingbranchbuild:script:-绾辩嚎鏋勫缓闄ゅ锛氬彉閲忥細-$CI_COMMIT_MESSAGE=~/test/||$CI_COMMIT_BRANCH=="main"甯︽湁git鎻愪氦娑堟伅鈥渢est鈥濈殑鎺ㄩ€佸拰甯︽湁鎻愪氦鍒嗘敮鈥渕ain鈥濈殑鎺ㄩ€佷笉浼氳Е鍙戞浣滀笟銆傛牴鎹枃浠朵慨鏀瑰垽鏂墽琛屾椂鏈篵uild:script:yarnbuildexcept:changes:-"*.md"鍙鏈塵d鏂囦欢淇敼锛岃繖涓猨ob灏变笉浼氭墽琛屻€俽etryjob鐨勯噸璇曟鏁帮紝榛樿涓?娆★紝鏈€澶ч噸璇曟鏁颁负2娆★紝鍏朵腑鍙互璁剧疆鍦ㄧ壒瀹氬け璐ュ師鍥犵殑鎯呭喌涓嬫墽琛屻€俽ules:if璇ュ瓧娈靛彲浠ュ湪鍗曚釜绠¢亾浣滀笟鎴栧伐浣滄祦瀛楁涓嬮厤缃€俽ules鍏抽敭瀛椾笅鍙互閰嶇疆if璇彞锛屽鏋滄弧瓒砳f灏卞彲浠ユ墽琛屼竴浜涜嚜瀹氫箟鐨勯厤缃€俽ules:-if:$CI_COMMIT_REF_NAME=~/feature/娉ㄦ剰锛氬彧鏈?except鍜宺ules:if鐢ㄤ簬鍒ゆ柇鍗曚釜job鐨勬墽琛屾椂鏈猴紝閰嶇疆鏃跺彧鑳藉瓨鍦ㄤ竴涓紝鍚﹀垯浼氭姤閿欍€傚伐浣滄祦鍜岃鍒欎竴璧风敤浜庢帶鍒舵祦姘寸嚎鐨勬墽琛岋紝閰嶇疆鍦ㄦ渶澶栧眰銆倃orkflow:rules鎺ュ彈杩欎簺鍏抽敭瀛楋細if:妫€鏌ユ瑙勫垯浠ョ‘瀹氫綍鏃惰繍琛岀閬撱€倃hen锛氭寚瀹氬綋if涓虹湡鏃惰鍋氫粈涔堛€傝杩愯绠¢亾锛岃璁剧疆涓哄缁堛€傝闃绘绠¢亾杩愯锛岃璁剧疆涓轰粠涓嶃€倂ariables锛氬鏋滄湭瀹氫箟锛屽垯浣跨敤鍒瀹氫箟鐨勫彉閲忋€傚浜庣増鏈?3.11~14.0锛屽綋娌℃湁瑙勫垯涓虹湡鏃讹紝绠¢亾灏嗕笉浼氳繍琛屻€傚湪涓嬮潰鐨勪緥瀛愪腑锛屽墠涓ゅぉ鐨勮鍒欏尮閰嶅埌涓嶆墽琛岀殑鏃舵満锛宔lse鏃讹紝绠¢亾鎵ц銆倃orkflow:rules:-if:'$CI_PIPELINE_SOURCE=="schedule"'when:never-if:'$CI_PIPELINE_SOURCE=="push"'when:never-when:alwayswhen鎺у埗涓婁竴闃舵鐨勬垚鍔熸垨澶辫触锛屽綋鍓嶉樁娈佃涓恒€俹n_success锛堥粯璁ゅ€硷級锛氬綋鍓嶉樁娈电殑浠诲姟鍙湁鍦ㄤ笂涓€闃舵鎴愬姛鏃舵墠浼氭墽琛岋紝鎴栬€呬箣鍓嶅け璐ョ殑浠诲姟閰嶇疆浜哸llow_failure:true銆俹n_failure锛氬彧鏈夊墠涓€闃舵浠诲姟澶辫触鎵嶄細鎵ц褰撳墠浠诲姟銆俛lways锛氭棤璁轰笂涓€闃舵鐨勪綔涓氱姸鎬佸浣曪紝閮戒細瑙﹀彂褰撳墠闃舵鐨勪换鍔°€俷ever锛氫笉杩愯褰撳墠浠诲姟銆俶anual锛氬湪gitlab缃戦〉涓婃墜鍔ㄧ偣鍑昏Е鍙戙€傛ā鍧楀寲浣跨敤鍏抽敭瀛梚nclude鍦ㄥ叾浠杫ml鏂囦欢涓紩鍏ラ厤缃€俰nclude:-'/yml/job1_install.yml'-'/yml/job2_lint.yml'-'/yml/job3_build.yml'-'/yml/job4_deploy.yml'缂撳瓨閲嶈姒傚康鍦℅itLabCI/CD涓紝鎴戜滑閮戒娇鐢ㄧ殑runner鏄互docker鐨勫舰寮忚繍琛屼笉鍚岀殑浠诲姟銆傛櫘閫氱紦瀛樻満鍒讹紙鍗虫病鏈夋寚瀹歎RL锛孨oURLprovided锛屼笉浼氫粠鍏变韩缂撳瓨鏈嶅姟鍣ㄤ笅杞界紦瀛樸€傝€屾槸浼氭彁鍙栨湰鍦扮増鏈殑缂撳瓨銆傦級锛岀紦瀛樺瓨鍌ㄥ湪鏈湴锛屾墍浠ュ鏋滀袱涓綔涓氬疄闄呰繍琛岃浣嶇疆涓嶅湪瀹夸富鏈轰笂锛屽畠浠箣闂寸殑缂撳瓨鏃犳硶鍏变韩銆傚垎甯冨紡缂撳瓨鍒嗗竷寮忕紦瀛橀渶瑕佽繍琛屽櫒閰嶇疆鏀寔銆傚惎鐢ㄥ悗锛岄渶瑕佸湪缂撳瓨涓厤缃畇3ServerAddress銆乻3BucketName绛変俊鎭紝瀹炵幇璺ㄨ窇鑰呭叡浜紦瀛樸€傜紦瀛樿矾寰勯厤缃紦瀛樻椂锛岃矾寰勫拰鏂囦欢鐨勬枃浠?鐩綍鏄浉瀵逛簬椤圭洰鏍圭洰褰曠殑銆傚瓨鍌ㄧ紦瀛樻椂锛岀紦瀛樿矾寰勪篃鏄互椤圭洰鍚嶆潵鍖哄垎鐨勩€傚湪鐢宠缂撳瓨鐨勬椂鍊欙紝浼氶厤鍚坧rojectvalue涓嬬殑key鐢宠缂撳瓨锛屽嵆浣挎槸鍒嗗竷寮忕紦瀛樹篃鏄噰鐢ㄨ繖绉嶇瓥鐣ャ€傜紦瀛樻枃浠朵俊鎭細鏈夋渶鍚庢洿鏂版椂闂达紙閲嶈淇℃伅锛夈€佹枃浠舵潈闄愩€佺紦瀛樹腑璁剧疆鐨刱ey绛夛紝鏇存柊鏃堕棿涓庣紦瀛樼瓥鐣ユ湁鍏炽€傚鏋滄湇鍔″櫒鏃堕棿琚伓鎰忕鏀癸紝鍙兘浼氬嚭鐜颁緷璧栧叧绯讳笉涓€鑷村鑷存墦鍑虹殑鍖呬笉绗﹀悎棰勬湡鐨勬儏鍐点€傜紦瀛樼粦瀹氭枃浠剁紦瀛樼粦瀹氬埌鏂囦欢鐨勫綋鍓嶇増鏈€傚綋鍏朵腑涓€涓枃浠跺彂鐢熸洿鏀规椂锛屽皢璁$畻涓€涓柊鐨勭紦瀛橀敭骞跺垱寤轰竴涓柊鐨勭紦瀛橈紝濡備笅鎵€绀猴細cache-job:script:-echo"Thisjobusesacache."缂撳瓨锛氶敭锛氭枃浠讹細-Gemfile銆俵ock-package.json璺緞锛?vendor/ruby-node_modules姝ゆ椂鐨勫叧閿槸鏍规嵁鏇存敼姣忎釜鍒楀嚭鐨勬枃浠剁殑鏈€杩戞彁浜よ绠楃殑SHA銆傚鏋滃湪浠讳綍鎻愪氦涓兘娌℃湁鏇存敼浠讳綍鏂囦欢锛屽垯璇ュ瘑閽ユ槸榛樿鐨勩€傚鏂囦欢缂撳瓨缂撳瓨鍙互閰嶇疆澶氫釜key锛岄€傜敤浜?3.10~13.12鐗堟湰銆傚湪鍏朵粬鐗堟湰涓紝key涓嬬殑鏂囦欢鍜岃矾寰勫彲浠ラ厤缃涓矾寰?鏂囦欢銆傜鐢ㄧ紦瀛樹娇鐢╟ache:{}绂佺敤缂撳瓨銆傜户鎵跨紦瀛樺綋缂撳瓨閰嶇疆鍙噸鐢ㄦ椂锛屽彲浠ヤ娇鐢ㄧ户鎵挎柟寮忋€傛偍鍙互瑕嗙洊锛堥噸鍐欙級鏌愪釜绛栫暐鎴栧湪褰撳墠浣滀笟涓嬭缃紭鍏堢骇銆俢ache:&global_cachekey:$CI_COMMIT_REF_SLUGpaths:-node_modules/-public/-vendor/policy:pull-pushjob:cache:#缁ф壙鍏ㄥ眬缂撳瓨<<:*global_cache#閲嶅啓缂撳瓨绛栫暐policy:pullfallbackcachekey鍥為€€缂撳瓨key鍦?3.4鍙婁互涓婄増鏈彲浠ヤ娇鐢紝鍔熻兘绫讳技缂撳瓨澶囦唤銆傛偍鍙互浣跨敤CACHE_FALLBACK_KEY鍙橀噺鎸囧畾澶囦唤缂撳瓨閿紝褰撳叿鏈夋寚瀹氶敭鐨勭紦瀛樹笉瀛樺湪鏃讹紝瀹冨皢鏌ユ壘搴旂敤绋嬪簭澶囦唤缂撳瓨銆倂ariables:CACHE_FALLBACK_KEY:fallback-keyjob1:script:-echocache:key:"$CI_COMMIT_REF_SLUG"paths:-binaries/clearingthecachemanually鎮ㄥ彲浠ュ湪GitLabUI涓竻闄ょ紦瀛橈細鍦ㄩ《閮ㄦ爮涓婏紝閫夋嫨鑿滃崟>椤圭洰骞舵壘鍒颁綘鐨勯」鐩€傚湪宸︿晶杈规爮涓紝閫夋嫨CI/CD>绠¢亾椤甸潰銆傚湪鍙充笂瑙掞紝閫夋嫨ClearRunnerCache銆傚湪涓嬩竴娆℃彁浜ゆ椂锛屾偍鐨凜I/CD浣滀笟灏嗕娇鐢ㄦ柊鐨勭紦瀛樸€傚疄鎴橈細鏋勫缓鍙戝竷缁勪欢搴撳埌npm浠撳簱缂栧啓.gitlab-ci.yml鐨勫熀鏈繃绋嬶紝濡備笅锛歩mage:node:14.17.1before_script:-echo'======鍑嗗鏋勫缓========='stages:-install-lint-build-deploy###閰嶇疆缂撳瓨cache:key:files:-package.json-packages/ghost-weapp-ui/package.jsonpaths:-node_modules/-packages/ghost-weapp-ui/node_modules/###鐩存帴缂撳瓨.npm锛屾墍鏈変緷璧栭兘缂撳瓨鍦?npm涓紝鍥犱负gitlab缂撳瓨鏄垎椤圭洰鐨勶紝鎵€浠ヤ釜浜鸿涓鸿繖涓ょ鏂瑰紡娌℃湁鍖哄埆#-.npm/#eslint妫€娴媕ob_lint:only:-masterstage:lintbefore_script:-echo'eslintdetection'-ls-ascript:-cdpackages/ghost-weapp-ui-ls-a-yarnlint-echo'eslintdetectioncomplete'retry:0when:'on_success'#瀹夎渚濊禆job_install:only:-masterstage:installbefore_script:-echo'installdependencies'script:-yarnconfigsetregistryhttps://registry.npm.taobao.org/-yarninstall-cdpackages/ghost-weapp-ui-ls-a-yarninstall-ls-a-echo'渚濊禆瀹夎瀹屾垚'retry:0#packageandcompilejob_build:only:-masterstage:buildbefore_script:-echoo'寮€濮嬫墦鍖?鑴氭湰锛?cdpackages/ghost-weapp-ui-ls-a-yarn-ls-a-yarnbuild-echo'Buildcomplete'when:'on_success'retry:0#publishjob_deploy:only:-master闃舵锛氶儴缃瞓efore_script:-echo'鏇存柊琛ヤ竵鐗堟湰锛屽噯澶囧彂甯?script:-cdpackages/ghost-weapp-ui-nodedeploy.js${CI_COMMIT_REF_NAME}when:'on_success'retry:0after_script:-echo"======鍙戝竷瀹屾垚==============================================================================================================================================================constfs=require('fs')constpath=require('path')constos=require('os')const{exec}=require('child_process')//鏇挎崲涓轰綘鐨刵pm鐨刟uthToken//tokenaccount鑾峰彇鏂瑰紡锛歷im~/.npmrcconstnpmrcText=`registry=https://registry.npmjs.org/home=https://www.npmjs.org//registry.npmjs.org/:_authToken=${authToken}`//鑾峰彇鍛戒护涓殑绗笁涓弬鏁帮紝鏈緥涓?master'//nodedeploy.js${CI_COMMIT_REF_NAME}锛屽垎鏀悕绉颁负masterconstenv=process.argv[2]//鎷兼帴鍛戒护锛屾墽琛宯pm鍙戝竷锛宼agfunctiondeploy(){fs.writeFileSync(path.resolve(os.homedir(),'.npmrc'),npmrcText)constargsArray=['publish'].concat(['--tag',env==='master'?'latest':'beta'])execa('npm',argsArray);}asyncfunctionexeca(a,arry=[]){returnnewPromise((resolve,reject)=>{exec(`${a}${arry.join('')}`,(err,stdout,stderr)=>{if(err){console.error(err);reject(err);}resolve(stdout)}锛墋锛墋閮ㄧ讲锛堬級;鎵ц缁撴灉锛氭敹鍒皀pm鍙戝竷鎴愬姛鍙嶉閭欢锛氫笂闈㈡槸gitlabCI/CD鐨勭浉鍏崇煡璇嗙偣鍜屽彂甯僴pm鍖呯殑瀹炰緥锛屾劅璋㈤槄璇伙紒