Webhooksallowyoutobuildorsetintegrations鍦ㄦ棩甯哥殑寮€鍙戣繃绋嬩腑锛屼綘鑲畾浼氶亣鍒拌繖鏍风殑鐑︽伡锛氫竴浜涙祦绋嬪伐浣滐紝鐢氳嚦鏄竴浜涘皬鏀瑰姩锛岄兘浼氱粡鍘嗭細寮€鍙?娴嬭瘯-鎻愪氦-鎵撳寘-涓婁紶-缂栬瘧-鍙戝竷绛夎繃绋嬮绻侀噸澶嶏紝澶уぇ闄嶄綆浜嗘垜浠紑鍙戠殑涔愯叮锛佷负姝わ紝Git閫氳繃鎻愪緵webhook浣挎垜浠兘澶熻繘琛岄泦鎴愩€傞€氫織鍦拌锛孏ithub涓轰綘鐨勪竴绯诲垪娲诲姩鎻愪緵浜嗕竴浜涒€滈挬瀛愨€濄€傚綋浣犳墽琛屼竴涓椿鍔紙渚嬪锛氬垱寤轰竴涓柊鏍囩锛夋椂锛孏ithub浼氫富鍔ㄥ悜浣犵殑鏈嶅姟鍣ㄥ彂閫佽姹傦紝閫氱煡浣犳寚瀹氱殑浜嬩欢姝e湪瑙﹀彂锛岄€氳繃鎹曡幏鍜屽垎鏋愯璇锋眰锛屼綘鍙互鍦ㄨ璇锋眰涓婃墽琛屽悗缁楠ゆ湇鍔″櫒閫氳繃鑴氭湰鍜屽叾浠栨柟娉曘€傞噸鐐癸細閰嶇疆webhooks.PayloadURL鏃讹紝娉ㄦ剰Github鐩墠涓嶆敮鎸佽浆鍙戞湇鍔★紙Redirect锛夈€傚鏋滃湪鏈嶅姟绔€氳繃nginx閰嶇疆杞彂锛岄厤缃甈ayloadURL涓鸿浆鍙戝煙鍚嶏紝Github浼氳繑鍥?02瑙e喅鏂规硶锛氭毚闇瞙ost:port/path娉ㄦ剰Github瀵箂ecret鐨勫姞瀵嗘柟寮忥紝瀵规瘮楠岃瘉Configwebhooks棣栧厛锛屾垜浠渶瑕佸湪Github涓婅缃細鏈嶅姟鍣ㄥ湴鍧€銆佸弬鏁扮被鍨嬨€乻ecret銆佽Е鍙戜簨浠朵互鍙婃槸鍚︽縺娲诲湪娣诲姞鏈嶅姟鍣ㄤ腑鐨勮矾鐢辨帴鍙楀拰澶勭悊webhooks鍔犺浇锛堣姹傦級涓缃瓽it闇€瑕佺洃鍚摢浜涗簨浠舵潵瑙﹀彂webhooks銆傛敞鎰忥細webhooksPayloadURL鏆備笉鏀寔鍩熷悕杞彂銆備綘鍙互浣跨敤host:port鑰屼笉鏄疭ecret涔嬬被鐨則oken鏉ュ憡璇夋湇鍔″櫒褰撳墠璇锋眰鏉ヨ嚜Github銆傝缃畇ecret鍚庯紝POST璇锋眰浼氬甫涓奨-Hub-Signature鍜孹-Hub-Signature-256鐨勮姹傚ご銆傚缓璁娇鐢╔-Hub-Signature-256鏉ユ彁楂樺畨鍏ㄦ€с€傚湪鏈嶅姟鍣ㄤ笂杩愯涓€涓湇鍔″櫒锛岄渶瑕佸悜GitHub鏆撮湶涓€涓狿OST鎺ュ彛銆備富瑕佸仛浜嗕笁浠朵簨锛氭帴鍙楁潵鑷狦ithub鐨勮姹傦紝鑾峰彇璇锋眰鏁版嵁鏍¢獙绉橀挜鍜屼粨搴撲俊鎭墽琛岃剼鏈瘽涓嶅璇达紝涓婁唬鐮侊紒//鍏抽敭浠g爜//common.ts锛屽弬瑙乭ttps://docs.github銆俢om/cn/developers/webhooks-and-events/securing-your-webhooks浜嗚В璇︽儏exportfunctionverifyToken(bodyString:string,secret:string,signature:string){//缂栫爜绉樺瘑constverifyToken=HmacSHA256(bodyString,secret).toString()杩斿洖绛惧悕===`sha256=${verifyToken}`}//hooks.control.ts@Controller('/hooks')exportclassHooksController{constructor(privatehooksService:HooksService){}@Post()asyncreciveHooks(@Body()data:any,@Headers()h:any){constsignature=h['x-hub-signature-256']||h['X-Hub-Signature-256']//楠岃瘉閫氳繃if(verifyToken(JSON.stringify(data),hooksSecret,signature)){const{repository}=data//濡傛灉鏄寚瀹氫粨搴擄紝鍒欐墽琛岀浉搴旂殑鎵撳寘鍛戒护if(repository&&repository.name==='cms-apis'){try{//鎵ц鍚庣画姝ラthis.hooksService.build('release')returnthis.hooksService.successful()}catch(error){Logger.error(error)returnthis.hooksService.failed()}}}returnthis.hooksService.failed('VerifyFailed!')}}娴嬭瘯webhooks涓€鍒囧氨缁悗锛屾垜浠繕濡傛灉闇€瑕侀獙璇佽嚜宸辨惌寤虹殑娴佺▼鏄惁鍙锛屽彲浠ョ洿鎺ュ湪Github涓婃煡鐪嬨€傛垜浠彲浠ユ煡鐪婫ithub鍙戣捣鐨勮姹傜殑鍏蜂綋淇℃伅锛圚eaders鍜宐ody锛夊拰鏈嶅姟鍣ㄨ繑鍥炵殑缁撴灉馃敟鐙韩浠g爜锛侌煍?/p>
