鍓嶈█瑕佹眰鏄細gitlab椤圭洰鍙戝竷鏃跺甫鏈夋柊鐨則ag銆傝剼鏈嚜鍔ㄦ墦鍖呮垚鍘嬬缉鍖咃紝鎻愪緵http涓嬭浇銆傞」鐩湁鏂扮増鏈彂甯冩椂锛岀敤鎴峰彲浠ョ洿鎺ラ€氳繃url涓嬭浇娴佺▼鍥撅細鏈嶅姟鍣ㄩ厤缃洰鍓嶇敤浜庡疄鐜癶ttp鏈嶅姟鐨勮蒋浠舵湁寰堝锛屽寘鎷富娴佺殑Apache銆丯ginx銆佸井杞殑IIS銆傝繖閲屼娇鐢ˋpache銆傚湪瀛︿範HTTP鍗忚鐨勬椂鍊欙紝鎴戜滑鐭ラ亾URL鍏跺疄鏄寚瀹氫簡鏈嶅姟鍣ㄤ笂鐨勪竴涓壒瀹氭枃浠讹紝鎵€浠ヤ娇鐢╝pche涓殑杞婚噺绾TTP鏈嶅姟鍣╤ttpd鏉ュ疄鐜扮畝鍗曠殑鏂囦欢涓嬭浇鏈嶅姟鏄潪甯稿悎閫傜殑銆?銆佸畨瑁卆pt-getinstallapache2濡傛灉鏈夊垎鍖呴€夐」锛岄€夋嫨httpd2銆傚惎鍔?etc/init.d/apache2start3銆傛煡鐪嬪惎鍔ㄧ姸鎬侊細/etc/init.d/apache2status4銆傚皾璇曡闂紝鐒跺悗璁块棶鏈嶅姟鍣ㄥ叕缃慽p鎴栧煙鍚嶏紝鍙互鐪嬪埌绫讳技濡備笅鐨勭晫闈紝璇存槑Apache姝e父宸ヤ綔锛氬鏋滈渶瑕佹洿鏀圭鍙o紝鍙互鐪嬭繖绡囨枃绔犱慨鏀筧pache2port5.涓嬭浇锛屾渶鍚庡垹闄?var/www/html璺緞涓嬬殑绱㈠紩銆俬tml锛屼笂浼犱綘瑕佷笅杞界殑鏂囦欢锛屽啀娆¤闂紝灏卞彲浠ヤ笅杞戒簡銆傚鏋滀笉鎯宠鎵€鏈変汉閮藉彲浠ラ€氳繃杩欎釜url璁块棶鏈嶅姟鍣紝杩樺彲浠ユ坊鍔犺处鍙峰瘑鐮侀獙璇併€傚彲浠ュ弬鑰冭处鍙峰瘑鐮侀獙璇併€傛渶鍚庡彲浠ラ€氳繃鍩熷悕/鏂囦欢鍚嶇洿鎺ョ粰鍒汉閾炬帴涓嬭浇銆備緥濡傦細xxxxx.com:port/20230214_myTestProject.zip锛岃闂缃戝潃涓嬭浇銆傝剼鏈紑鍙戦鍏堥渶瑕佸€熷姪gitlab鐨凜I/CDGitLabCI/CDCI锛圕ontinuousIntegration锛夛紝涓枃鎰忔€濇槸鎸佺画闆嗘垚銆侰D锛圕ontinuousDelivery/ContinuousDeployment锛夋寔缁氦浠樻垨鎸佺画閮ㄧ讲銆傚畼鏂规枃妗i鍏堥渶瑕佸畨瑁単itlab-runner锛屽畼鏂瑰畨瑁呮枃妗f槸杩欐牱鍐欑殑銆俫itlab-ci.yml璁剧疆鎵ц瑙勫垯宸ヤ綔娴佺▼锛?褰撴湁鏍囩鎴栧悎骞惰姹傛椂鎵ц瑙勫垯锛?if:'$CI_PIPELINE_SOURCE=="merge_request_event"||$CI_COMMIT_TAG!=null'#璁剧疆姝ラ锛堟楠や箣闂翠覆琛岋級stages:-pack-web鍛戒护琛屽啓娉曚竴寮€濮嬫垜鍐欑殑鏄洿鎺ュ懡浠よ鐨勫舰寮忥細angular-pack:tags:-dockerstage:pack-web#鎵句竴涓彁渚沶ode鐨勯暅鍍忥細registry.cn-beijing.aliyuncs.com/mengyunzhi/node-chrome:14.16.0variables:#瀹氫箟鍘嬬缉鍖呯殑鍚嶇О锛屼互鏃ユ湡涓哄墠缂€锛岄」鐩悕绉颁綔涓哄悗缂€ZIP_NAME:"`date+%Y-%m-%d-%H-%M-%S`$CI_PROJECT_NAME"before_script:-cdwebscript:-env-npminstall-dd-npmrunbuild-aptinstallzip-zip-r$ZIP_NAME.zipdist-aptinstallsshpass-y-sshpass-pscp-P5022-oStrictHostKeyChecking=no$ZIP_NAME.zip@:/var/www/html瑙勫垯锛?if:$CI_COMMIT_TAG!=null閫氳繃npminstall鍜宯pmrunbuild鎵撳寘鏋勫缓锛岀敓鎴恉ist鏂囦欢澶瑰畨瑁厇ip锛屼娇鐢▃ip鍛戒护灏哾ist鏂囦欢澶瑰帇缂╂垚鍘嬬缉鍖呭畨瑁卻shpass鍖咃紝杩欐牱scp灏变笉闇€瑕佷氦浜掕緭鍏ュ瘑鐮佷簡銆備娇鐢╯cp鍛戒护灏嗘枃浠跺す鍙戦€佸埌鏈嶅姟鍣ㄣ€傚~鍐欐湇鍔″櫒鐨刬p銆乻sh绔彛銆佺敤鎴峰悕鍜屽瘑鐮侊紝浠ュ強浼犺緭鐨勭洰鐨勫湴銆傜洿鎺ヤ娇鐢ㄥ懡浠や笉鏂逛究銆傛垜浠彲浠ョ紪鍐欒剼鏈潵缂栧啓node.js鑴氭湰銆?.寮曞叆绗笁鏂规ā鍧?鎻愪緵ssh杩炴帴const{NodeSSH}=require('node-ssh');//鎻愪緵ssh杩炴帴constcompressing=require('compressing');//鏂囦欢鍘嬬缉constChatBot=require('dingtalk-robot-sender');//鎻愪緵閽夐拤鎺ㄩ€?.鍒濆鍖栧彉閲?/鍒濆鍖栧彉閲廲onstprojectName=process.env.CI_PROJECT_NAME;//浠庣幆澧冨彉閲忎腑鑾峰彇鐨勯」鐩悕绉癱onstappDir=`/var/www/html`;//搴旂敤绋嬪簭鏍逛綅缃甤onsthost=process.env.HOST;//鏈嶅姟鍣╥pconstsshPort=process.env.SSHPORT;//ssh绔彛constport=process.env.PORT;//http涓嬭浇绔彛constusername=process.env.USERNAME;//鏈嶅姟鍣ㄧ敤鎴峰悕constpassword=process.env.瀵嗙爜;//鏈嶅姟鍣ㄥ瘑鐮乧onstbashUrl="https://oapi.dingtalk.com/robot/send?access_token=";constdingToken=process.env.DINGTOKEN;//閽夐拤鏈哄櫒浜簍oken3.杩炴帴鍒版湇鍔″櫒console.log('Attempttoconnecttotheproductionserver');constssh=newNodeSSH();awaitssh.connect({host:`${host}`,port:`${sshPort}`,鐢ㄦ埛鍚嶏細`${username}`锛屽瘑鐮侊細`${password}`});4.鍘嬬缉鏂囦欢//瀹氫箟鍘嬬缉鍖呭悕绉颁负date_projectnameconstd_t=newDate();letyear=d_t.getFullYear();璁炬湀=("0"+(d_t.getMonth()+1)).slice(-2);璁炬棩=("0"+d_t.getDate()).slice(-2);constzipName=year+month+day+"_"+projectName;//鍘嬬缉鏂囦欢锛屽弬鏁?锛氳鍘嬬缉鐨勬枃浠跺す锛屽弬鏁?锛氬帇缂╁悕绉癮waitcompressing.zip.compressDir('dist',`${zipName}.zip`).then(()=>{console.log('鍘嬬缉鎴愬姛');}).catch(err=>{console.error(err);});5.涓婁紶鍒癝erverconsole.log('寮€濮嬩笂浼犲帇缂╁寘');//鍙傛暟涓€锛氫笂浼犵殑鏂囦欢鍚嶏紝鍙傛暟浜岋細鏈嶅姟鍣ㄨ矾寰勫拰鏂囦欢鍚峚waitssh.putFile(`${zipName}.zip`,`${appDir}/${zipName}.zip`)6.閽夐拤鎺ㄩ€佷笅杞藉湴鍧€awaitdingSendSuccess(zipName);constdingSendSuccess=asyncfunction(zipName){try{constrobot=newChatBot({webhook:bashUrl+dingToken});璁ヾownloadUrl=host+":"+port+"/"+zipName+".zip";lettitle="####馃榾馃槃馃榿馃槅";lettext="##馃榾馃槂馃槃馃榿馃槅\n"+`>###${projectName}鎵撳寘鎴愬姛锛乕涓嬭浇鍦板潃](http://${downloadUrl})\n`;绛夊緟鏈哄櫒浜?markdown(title,text,{}).then((res)=>{console.log("鍝嶅簲淇℃伅锛?+res.data);});}catch(e){console.log('鎺ㄩ€侀敊璇?,e);}鏈€鍚巤process.exit(0);}}涓嬭浇鍦板潃涓猴細鏈嶅姟鍣╥p+http绔彛+鏂囦欢鍚?.鍐欓拤閽夋帹閫佸け璐ettitle="####馃槩馃懣馃槯馃挃";lettext="##馃槩馃懣馃槯馃挃\n"+`>###${projectName}鍖呭け璐ワ紒\n`+`>####閿欒淇℃伅锛?{error}\n`;awaitrobot.markdown(title,text,{}).then((res)=>{console.log("responseInformation:"+res);});}catch(e){console.log('鎺ㄩ€侀敊璇?,e);}鏈€鍚巤process.exit(0);}}8.瀹屾暣浠g爜//寮曞叆绗笁鏂规ā鍧梒onst{NodesSH}=require('node-ssh');constcompressing=require('compressing');constChatBot=require('dingtalk-robot-sender');//鍒濆鍖栧彉閲廲onstprojectName=process.env.CI_PROJECT_NAME;//浠庣幆澧冨彉閲忎腑鑾峰彇鐨勯」鐩悕绉癱onstappDir=`/var/www/html`;//搴旂敤鏍逛綅缃甤onsthost=process.env.HOST;constsshPort=process.env.SSHPORT;//涓嬭浇绔彛constport=process.env.PORT;//涓嬭浇绔彛constusername=process.env.USERNAME;constpassword=process.env.PASSWORD;constbashUrl="https://oapi.dingtalk.com/robot/send?access_token=";constdingToken=process.env.DINGTOKEN;//瀹氫箟start鍑芥暟骞跺湪鏂囦欢缁撳熬conststart=asyncfunction(){try{console.log('灏濊瘯杩炴帴鍒扮敓浜ф湇鍔″櫒');constssh=newNodeSSH();绛夊緟ssh.connect({涓绘満锛歚${host}`锛岀鍙o細`${sshPort}`锛岀敤鎴峰悕锛歚${username}`锛屽瘑鐮侊細`${password}`});constd_t=newDate();璁╁勾浠?d_t.getFullYear();璁╂湀=("0"+(d_t.getMonth()+1).slice(-2);璁╂棩=("0"+d_t.getDate()).slice(-2);constzipName=year+month+day+"_"+projectName;awaitcompressing.zip.compressDir('dist',`${zipName}.zip`).then(()=>{console.log('鍘嬬缉鎴愬姛');}).catch(閿欒=>{console.error(err);});console.log('寮€濮嬩笂浼爖ip鏂囦欢');awaitssh.putFile(`${zipName}.zip`,`${appDir}/${zipName}.zip`)awaitdingSendSuccess(zipName);}catch(e){console.log('鍙戠敓鎵撳寘閿欒',e);绛夊緟dingSendError锛坋.message锛夛紱}鏈€鍚巤process.exit(0);}}constdingSendSuccess=asyncfunction(zipName){try{constrobot=newChatBot({webhook:bashUrl+dingToken});璁ヾownloadUrl=host+":"+port+"/"+zipName+".zip";lettitle="####馃榾馃槃馃榿馃槅";lettext="##馃榾馃槂馃槃馃榿馃槅\n"+`>###${projectName}鎵撳寘鎴愬姛锛乕涓嬭浇鍦板潃](http://${downloadUrl})\n`;awaitrobot.markdown(title,text,{}).then((res)=>{console.log("鍝嶅簲淇℃伅锛?+res.data);});}catch(e){console.log('鎺ㄩ€侀敊璇?,e);}鏈€鍚巤process.exit(0);}}constdingSendError=寮傛鍑芥暟锛堥敊璇級{try{constrobot=newChatBot({webhook:bashUrl+dingToken});lettitle="####馃槩馃懣馃槯馃挃";lettext="##馃槩馃懣馃槯馃挃\n"+`>###${projectName}鎵撳寘澶辫触锛乗n`+`>####閿欒淇℃伅锛?{error}\n`;awaitrobot.markdown(title,text,{}).then((res)=>{console.log("responsemessage:"+res);});}catch(e){console.log('鎺ㄩ€侀敊璇?,e);}鏈€鍚巤process.exit(0);}}start().then().catch(function(error){console.log('鍙戠敓閿欒',error);process.exit(1);});9.浣跨敤灏嗘枃浠朵紶杈撳埌椤圭洰鏂囦欢澶癸紝鐒跺悗灏卞彲浠ラ€氳繃nodepack.js浣跨敤angular-pack浜嗭細tags:-dockerstage:pack-webimage:registry.cn-beijing.aliyuncs.com/mengyunzhi/node-chrome:14.16.0before_script:-cdwebscript:-env-npminstall-dd-npmrunbuild-nodepack.jsrules:-if:$CI_COMMIT_TAG!=null10.娓叉煋鏃堕亣鍒扮殑闂閫夋嫨鏃秇ttp鍖呯殑鍒朵綔鏄湪閽夐拤涓婂畬鎴愮殑锛屾湰鏉ユ兂鐢╮equest鍖呭彂閫佽姹傜劧鍚庝笅杞藉涓嬶細constrequest=require('request');request('http://www.google.com',function(error,response,body){鎺у埗鍙?error('閿欒:',閿欒);//濡傛灉鍙戠敓閿欒鍒欐墦鍗伴敊璇痗onsole.log('statusCode:',response&&response.statusCode);//濡傛灉鏀跺埌鍝嶅簲鍒欐墦鍗板搷搴旂姸鎬佺爜console.log('body:',body);//鎵撳嵃Google涓婚〉鐨凥TML銆倉);浣嗘槸鍙戠幇锛歳equestdependencypackageisdeprecated瀹樼綉璇?020骞?鏈?1鏃ワ紝npm渚濊禆鍖呭凡缁忓畬鍏ㄥ簾寮冧娇鐢ㄤ簡锛堜篃灏辨槸涓嶄細鏈夋柊鐨勫彉鍖栵級锛涚浉鍙嶏紝鎴戞壘鍒颁簡鍑犱釜鎺ㄨ崘鐨勶細Axios锛孉xios鐨勬瘡鏃?姣忓懆/姣忔湀涓嬭浇閲忔洿澶氾紝github涓婄殑鏄熸槦鏇村锛沠ollowers澶氾紝fork澶氾紝鏀寔鍦ㄦ祻瑙堝櫒涓婁娇鐢紝浣嗘槸杩涘害鏄剧ず鍙敮鎸佸湪娴忚鍣ㄤ笂鏄剧ずGot锛岀増鏈锛屾洿鏂伴绻丯ode.js鏍囧噯搴撲腑鐨凥TTP鍜孒TTPS妯″潡锛屾棤闇€瀹夎澶栭儴杞欢鍖咃紝浣嗕篃甯︽潵浜嗕娇鐢ㄤ笂涓嶅弸濂界殑缂虹偣锛岃€屼笖浼氱箒鐞愬緢澶氥€傜涓€绉嶇敤鐨勪汉澶氾紝鎺ㄨ崘锛屼絾鏄鏋滃彧鏄仛閽夐拤鎺ㄩ€佺殑璇濓紝杩樻湁涓洿鏂逛究鐨勫寘dingtalk-robot-sender:document鐢ㄨ捣鏉ヤ篃寰堟柟渚縧etcontent='Iamme锛屼笉涓€鏍风殑鐑熻姳'锛沴etat={"atMobiles":["156xxxx8827","189xxxx8325"],"isAtAll":false};//蹇€熷彂閫佺煭淇obot.text(content,at);閰嶇疆node.js鐜涓篸ocker闀滃儚锛屽彲浠ュ弬鑰僪ttps://segmentfault.com/a/11...