亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

開(kāi)源代碼評(píng)審工具open-code-review:把Code Review變成工程化流程

開(kāi)源代碼評(píng)審工具open-code-review:把Code Review變成工程化流程 現(xiàn)在很多團(tuán)隊(duì)談到 Code Review第一反應(yīng)就是又慢又煩評(píng)審人打開(kāi) PR 看一眼就 Approve或者干脆在群里吼一句誰(shuí)有空幫我看看然后一整天沒(méi)人理。我做了幾年研發(fā)管理和架構(gòu)工作見(jiàn)過(guò)太多 Review 流程從最初的嚴(yán)格把關(guān)慢慢變成了形式主義最后退化成合并代碼前的心理安慰。這個(gè)痛點(diǎn)促成了我業(yè)余時(shí)間折騰的一個(gè)開(kāi)源項(xiàng)目 open-code-review它不是那種換個(gè)皮的管理后臺(tái)而是一套把代碼審查從人肉流程變成可配置、可度量、可強(qiáng)制的工程化方案。這篇文章把我從設(shè)計(jì)思路到落地踩坑的完整過(guò)程都寫(xiě)出來(lái)適合正在搭建或者想優(yōu)化團(tuán)隊(duì)代碼評(píng)審流程的工程師、技術(shù)負(fù)責(zé)人參考。1. 明明大家知道 Code Review 有用它就是容易爛尾1.1 評(píng)審走形式不是人的問(wèn)題是流程缺約束我在很多團(tuán)隊(duì)里發(fā)現(xiàn)一個(gè)共性現(xiàn)象Code Review 在制度層面寫(xiě)在研發(fā)規(guī)范里但實(shí)際執(zhí)行質(zhì)量完全取決于個(gè)人責(zé)任心和當(dāng)天忙不忙。評(píng)審人在非工作時(shí)間收到 PR 通知大概率草草看一眼提交標(biāo)題就點(diǎn)了通過(guò)開(kāi)發(fā)者覺(jué)得評(píng)審是額外負(fù)擔(dān)挑一個(gè)最閑的同事當(dāng)吉祥物審批員整個(gè)閉環(huán)基本是失控的。我拆過(guò)一些團(tuán)隊(duì)的評(píng)審數(shù)據(jù)Pull Request 的平均評(píng)審時(shí)間從 2 小時(shí)到 72 小時(shí)不等跨度極大評(píng)論數(shù)量從 0 條到 40 多條都有說(shuō)明很多 PR 根本沒(méi)有被認(rèn)真讀過(guò)。這不是某個(gè)人的問(wèn)題而是因?yàn)闆](méi)有一套機(jī)制去約束最小評(píng)審質(zhì)量到底哪些文件必須看哪些規(guī)則變更必須指定負(fù)責(zé)人超過(guò)多長(zhǎng)時(shí)間不評(píng)審該提醒誰(shuí)通過(guò)標(biāo)準(zhǔn)是什么這些如果只靠口頭約定時(shí)間一長(zhǎng)一定走形。這也是我決定做 open-code-review 的根本原因。我需要一個(gè)東西能把這些約定固化成配置讓流程替人去記住什么必須做而不是等到代碼合并出問(wèn)題再追責(zé)。1.2 我理想中的開(kāi)源代碼評(píng)審工具長(zhǎng)什么樣在動(dòng)手之前我先列了一份需求清單明確我的工具至少要覆蓋幾件事第一能自動(dòng)識(shí)別變更文件類型針對(duì)不同目錄執(zhí)行不同規(guī)則第二能對(duì)關(guān)鍵指標(biāo)比如新增代碼量、循環(huán)復(fù)雜度、TODO 殘留做機(jī)器判斷給評(píng)審人提供明確提示第三支持把評(píng)審結(jié)果作為合入門禁不滿足條件就不允許合并第四所有評(píng)審行為要有記錄能統(tǒng)計(jì)出團(tuán)隊(duì) Review 覆蓋率。這其實(shí)比大多數(shù)人想得要復(fù)雜。市面上已有的機(jī)器人或插件大多是單點(diǎn)功能比如只做靜態(tài)檢查、只做提醒、只做統(tǒng)計(jì)很少有把規(guī)則引擎流程編排數(shù)據(jù)分析捏在一起的開(kāi)源方案。我想要的不是一個(gè)提示工具而是一個(gè)可以嵌入現(xiàn)有 Git 工作流、能自定義規(guī)則、能輸出報(bào)告的輕量化平臺(tái)。open-code-review 最終定位成了這樣一個(gè)開(kāi)源的、基于 Git 事件驅(qū)動(dòng)的代碼評(píng)審輔助系統(tǒng)。它監(jiān)聽(tīng)代碼倉(cāng)庫(kù)的 Pull Request也支持 Merge Request事件拉取變更內(nèi)容把變更信息經(jīng)過(guò)規(guī)則引擎分析后輸出評(píng)審建議和攔截結(jié)論再通過(guò) Webhook 回寫(xiě)到代碼平臺(tái)從而實(shí)現(xiàn)自動(dòng)化評(píng)審和門禁控制。2. open-code-review 的整體設(shè)計(jì)思路與核心架構(gòu)2.1 規(guī)則引擎驅(qū)動(dòng)一切把評(píng)審經(jīng)驗(yàn)沉淀成配置open-code-review 的核心不是界面多漂亮而是它的規(guī)則引擎。我把所有評(píng)審策略抽象成一個(gè)個(gè)規(guī)則對(duì)象每個(gè)規(guī)則有獨(dú)立的觸發(fā)條件、匹配范圍、嚴(yán)重級(jí)別和處置動(dòng)作。一套規(guī)則本質(zhì)上是一段可解釋、可測(cè)試的邏輯描述而不是散落在業(yè)務(wù)代碼里的 if-else。觸發(fā)條件我設(shè)計(jì)了幾個(gè)維度基于文件路徑的前綴匹配比如 backend/src 和 frontend/src 用不同規(guī)則集、基于變更規(guī)模的判斷比如單次 PR 新增超過(guò) 800 行觸發(fā)大變更提醒、基于文件類型的判斷比如只對(duì) Java/Kotlin 文件啟用空指針風(fēng)險(xiǎn)規(guī)則、基于關(guān)鍵詞的檢測(cè)比如日志中是否出現(xiàn) print 輸出、是否遺留 TODO/FIXME。規(guī)則結(jié)果分為三個(gè)等級(jí)Info 只是提示Reviewer 可以忽略Warn 會(huì)要求評(píng)審人顯式確認(rèn)才能繼續(xù)Error 則直接阻止合并除非有管理員權(quán)限強(qiáng)制放行。這套分級(jí)機(jī)制很關(guān)鍵它不搞一刀切給了團(tuán)隊(duì)根據(jù)自身容忍度做選擇的自由。規(guī)則的定義我用的是 YAML 格式理由很簡(jiǎn)單團(tuán)隊(duì)成員學(xué)習(xí)成本低、和 CI 配置風(fēng)格一致、寫(xiě)錯(cuò)了容易發(fā)現(xiàn)。每條規(guī)則文件包含元信息、match 條件、message 模板、level 等字段系統(tǒng)啟動(dòng)后加載所有規(guī)則對(duì)每個(gè) PR 事件進(jìn)行鏈?zhǔn)狡ヅ?。?guī)則引擎本身是無(wú)狀態(tài)的每次執(zhí)行只需要變更文件列表和規(guī)則集所以擴(kuò)展性很好。2.2 為什么選 Webhook 而不是定時(shí)輪詢?cè)谠O(shè)計(jì)數(shù)據(jù)采集方式時(shí)我對(duì)比了兩種主流方案定時(shí)輪詢 Git 平臺(tái)接口或者通過(guò) Webhook 接收事件推送。輪詢實(shí)現(xiàn)簡(jiǎn)單但存在延遲大、浪費(fèi) API 配額、容易漏掉中間狀態(tài)等問(wèn)題Webhook 是事件驅(qū)動(dòng)一有變更立刻觸發(fā)實(shí)時(shí)性好很多。我最終選的 Webhook 方案GitHub、GitLab、Gitea 這些平臺(tái)都原生支持配置 Webhook 地址把 open-code-review 服務(wù)部署到一個(gè)公網(wǎng)或內(nèi)網(wǎng)可達(dá)的地址在倉(cāng)庫(kù)設(shè)置里配置好 Webhook平臺(tái)就會(huì)在指定事件發(fā)生時(shí)把 JSON 請(qǐng)求發(fā)過(guò)來(lái)。收到事件后服務(wù)先做去重和冪等處理再?gòu)?Git 平臺(tái)拉取變更詳情進(jìn)入規(guī)則分析流程。這套模式的優(yōu)點(diǎn)很明顯沒(méi)有輪詢?cè)斐傻馁Y源浪費(fèi)、能實(shí)時(shí)響應(yīng)、離線也不丟事件平臺(tái)會(huì)有重試機(jī)制。代價(jià)是需要保證服務(wù)可用性并且 Webhook 接口要做簽名校驗(yàn)防止被人偽造請(qǐng)求。這部分我在后面安全加固小節(jié)里會(huì)詳細(xì)說(shuō)。2.3 方案選型為什么不用自研機(jī)器人而做獨(dú)立服務(wù)其實(shí)最開(kāi)始我試過(guò)把邏輯寫(xiě)成一個(gè) GitHub Action這樣做集成成本最低直接在倉(cāng)庫(kù)里加一個(gè) workflow 就行。但測(cè)試了幾個(gè)場(chǎng)景后我放棄了原因有三個(gè)。第一GitHub Action 的運(yùn)行環(huán)境是臨時(shí)的每次執(zhí)行完?duì)顟B(tài)就沒(méi)了團(tuán)隊(duì)想要連續(xù)的 Review 覆蓋率數(shù)據(jù)會(huì)比較困難。第二Action 的市場(chǎng)里功能齊全但規(guī)則引擎和門禁控制這種重度定制邏輯放進(jìn)去調(diào)試一次要 push 一次效率太低。第三也是最重要的我們要接的不止一個(gè)代碼平臺(tái)。團(tuán)隊(duì)里同時(shí)有 GitHub 倉(cāng)庫(kù)和 GitLab 倉(cāng)庫(kù)用 Action 就得寫(xiě)兩套東西而獨(dú)立服務(wù)可以做到一套核心邏輯多個(gè)平臺(tái)適配器。所以 open-code-review 的架構(gòu)分為三層接入層負(fù)責(zé)和代碼平臺(tái)交互通過(guò)適配器模式對(duì)接 GitHub/GitLab/Gitea核心層包含規(guī)則引擎、變更解析器、分析器輸出層負(fù)責(zé)任務(wù)分發(fā)、結(jié)果回寫(xiě)、通知發(fā)送。每層之間通過(guò)接口通信新接一個(gè)代碼平臺(tái)只需要實(shí)現(xiàn)接入層接口核心邏輯完全復(fù)用。到現(xiàn)在為止我接過(guò)的平臺(tái)包括 GitHub App、GitLab Webhook、Gitea Webhook適配成本基本在幾天以內(nèi)。3. 完整實(shí)操5 分鐘搭好一套自動(dòng)化代碼審查環(huán)境3.1 準(zhǔn)備環(huán)境的那些細(xì)節(jié)在開(kāi)始之前你需要準(zhǔn)備一臺(tái)能跑 Docker 的服務(wù)器配置不用太高我自己的測(cè)試實(shí)例是 2 核 4G 內(nèi)存同時(shí)處理十來(lái)個(gè)中小型倉(cāng)庫(kù)的評(píng)審任務(wù)完全夠用。操作系統(tǒng)建議選 Ubuntu 22.04 或 Debian 12依賴少、好維護(hù)。項(xiàng)目提供了兩種部署方式Docker Compose 和裸機(jī)運(yùn)行。Docker Compose 更適合快速驗(yàn)證一條命令就能起來(lái)還默認(rèn)帶了一個(gè) PostgreSQL 用來(lái)存統(tǒng)計(jì)數(shù)據(jù)裸機(jī)運(yùn)行適合已經(jīng)有完整運(yùn)維體系的團(tuán)隊(duì)直接把編譯好的二進(jìn)制扔到服務(wù)器上就行。我這里用 Docker Compose 演示。首先克隆項(xiàng)目代碼進(jìn)入部署目錄復(fù)制環(huán)境變量模板然后按自己倉(cāng)庫(kù)的平臺(tái)類型修改配置git clone https://github.com/yourname/open-code-review.git cd open-code-review/deploy cp .env.example .env vim .env.env 文件里最關(guān)鍵的是平臺(tái)類型和 Token 配置。GitHub 用 Personal Access Token 或者 GitHub App 的私鑰GitLab 用 Personal Access Token權(quán)限至少需要讀代碼和更新 PR 評(píng)論的權(quán)限。注意 Token 不要提交到 Git 倉(cāng)庫(kù)里用部署機(jī)的環(huán)境變量方式加載更安全。配置好之后執(zhí)行docker compose up -d日志出現(xiàn)server started at :8080就說(shuō)明服務(wù)起來(lái)了。這時(shí)用瀏覽器訪問(wèn)http://服務(wù)器IP:8080/health應(yīng)該能看到一個(gè) JSON 返回表示服務(wù)狀態(tài)正常。3.2 最小可用規(guī)則集先跑通有輸出服務(wù)跑起來(lái)后我在項(xiàng)目里預(yù)設(shè)了一套默認(rèn)規(guī)則覆蓋了最常見(jiàn)的問(wèn)題場(chǎng)景禁止在代碼中直接寫(xiě)文件絕對(duì)路徑、檢測(cè)遺留的調(diào)試輸出、禁止硬編碼數(shù)據(jù)庫(kù)連接串、識(shí)別超過(guò) 500 行的超大函數(shù)、檢查是否符合 commit message 規(guī)范。這套默認(rèn)規(guī)則的好處是開(kāi)箱即用不需要每個(gè)團(tuán)隊(duì)從零開(kāi)始寫(xiě)規(guī)則。以檢測(cè)調(diào)試輸出這個(gè)規(guī)則為例規(guī)則文件長(zhǎng)這樣name: debug_output_detector description: 檢測(cè)是否遺留 print/console.log/debugger 等調(diào)試輸出 level: warn match: files: - **/*.py - **/*.js - **/*.ts exclude: - **/tests/** - **/__tests__/** patterns: - console\\.log\\s*\\( - print\\s*\\( - logging\\.debug\\s*\\( - debugger\\s*;? message: 檢測(cè)到調(diào)試輸出語(yǔ)句請(qǐng)確認(rèn)是刻意保留還是無(wú)意遺留這個(gè)規(guī)則做了幾個(gè)關(guān)鍵設(shè)計(jì)第一通過(guò)exclude排除了測(cè)試目錄因?yàn)闇y(cè)試?yán)镉?print/console.log 輸出輔助信息是常見(jiàn)操作不該報(bào)警第二mix了多種語(yǔ)言的調(diào)試輸出模式第三把嚴(yán)重級(jí)別定成 warn給了評(píng)審人判斷空間。配置好規(guī)則后往倉(cāng)庫(kù)提交一個(gè)測(cè)試 PR在 open-code-review 的日志里會(huì)看到事件已接收、開(kāi)始解析變更、命中規(guī)則 debug_output_detector、評(píng)論已發(fā)布這樣的執(zhí)行鏈路再去 PR 頁(yè)面就能看到自動(dòng)發(fā)布的評(píng)審評(píng)論。我自己第一次跑通這個(gè)流程時(shí)看到評(píng)論出現(xiàn)在 PR 下面確實(shí)有種終于不用人肉盯著代碼的輕松感。3.3 把規(guī)則從建議升級(jí)為門禁規(guī)則能出評(píng)論只是第一步真正讓 Review 流程硬起來(lái)的是把結(jié)果做成合入門禁。open-code-review 支持在規(guī)則結(jié)果里配置block_merge: true當(dāng)命中 Error 級(jí)別規(guī)則時(shí)系統(tǒng)會(huì)調(diào)用代碼平臺(tái)的合并檢查接口把當(dāng)前 PR 標(biāo)記為未通過(guò)檢查。具體操作是在倉(cāng)庫(kù)設(shè)置里把 open-code-review 注冊(cè)為一個(gè) required check這樣開(kāi)發(fā)者即使點(diǎn)了合并按鈕平臺(tái)也會(huì)攔住只有所有 Error 規(guī)則清零后自動(dòng)放行。這種機(jī)制好處在于不是靠人自覺(jué)而是系統(tǒng)強(qiáng)制。我團(tuán)隊(duì)落地時(shí)的實(shí)際配置長(zhǎng)這樣測(cè)試覆蓋不足時(shí)只給 warn給開(kāi)發(fā)者保留解釋空間硬編碼密鑰掃描命中的直接給 Error 并阻止合并新增文件不是 UTF-8 編碼的給 warnAPI 路徑缺少鑒權(quán)中間件的給 Error。這樣分級(jí)的門禁比一刀切的必須全部通過(guò)更有利于推進(jìn)團(tuán)隊(duì)不會(huì)有反抗情緒而真正嚴(yán)重的問(wèn)題又不會(huì)被放過(guò)。3.4 寫(xiě)一個(gè)自定義規(guī)則以檢測(cè)裸 IP 地址為例為了讓讀者真正掌握自定義規(guī)則的方法我以檢測(cè)代碼中直接寫(xiě)裸 IP 地址這個(gè)實(shí)際案例拆解完整的規(guī)則開(kāi)發(fā)流程。裸 IP 地址硬編碼的問(wèn)題在微服務(wù)架構(gòu)里特別常見(jiàn)改一次環(huán)境就要改一次代碼而且容易把內(nèi)網(wǎng)拓?fù)湫孤兜酱a倉(cāng)庫(kù)。規(guī)則文件我放在rules/custom/no_hardcoded_ip.yamlname: no_hardcoded_ip description: 檢測(cè)代碼中硬編碼的 IPv4 地址建議使用配置中心或環(huán)境變量 level: warn match: files: - **/*.{py,java,go,js,ts,yml,yaml,json,properties} exclude: - **/*.md - **/test/** - **/tests/** patterns: - \\b(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b except: patterns: - 127\\.0\\.0\\.1 - 0\\.0\\.0\\.0 - localhost message: 發(fā)現(xiàn)硬編碼 IP 地址請(qǐng)改用環(huán)境變量或配置中心管理這個(gè)正則表達(dá)式看起來(lái)長(zhǎng)實(shí)際上就是 IPv4 地址的標(biāo)準(zhǔn)校驗(yàn)它把每段限制在 0-255 范圍內(nèi)避免把999.999.999.999這種無(wú)效地址誤判成 IP。這里的except字段是例外配置用來(lái)排除回環(huán)地址和測(cè)試常見(jiàn)地址減少誤報(bào)。寫(xiě)好規(guī)則文件后不需要重啟服務(wù)系統(tǒng)會(huì)以一定的間隔自動(dòng)掃描規(guī)則目錄加載新配置或者你可以手動(dòng)調(diào)用一個(gè) reload 接口。我測(cè)試時(shí)是先本地建一個(gè)小倉(cāng)庫(kù)提交一個(gè)含192.168.1.1的配置文件然后發(fā) PR看評(píng)審評(píng)論有沒(méi)有正確命中。整個(gè)流程跑通后再把規(guī)則推到團(tuán)隊(duì)公共規(guī)則庫(kù)大家就能共用一套自定義規(guī)則了。4. 把靜態(tài)判斷延伸到團(tuán)隊(duì)流程管理4.1 讓統(tǒng)計(jì)報(bào)告驅(qū)動(dòng)評(píng)審文化改進(jìn)工具如果只停留在提醒攔截層面時(shí)間久了大家還是會(huì)覺(jué)得它是個(gè)煩人的機(jī)器人。真正讓團(tuán)隊(duì)接受自動(dòng)化評(píng)審的前提是它能反過(guò)來(lái)幫助團(tuán)隊(duì)看清問(wèn)題、改進(jìn)流程。這是我后來(lái)補(bǔ)充統(tǒng)計(jì)模塊的原因。open-code-review 會(huì)把每次評(píng)審的完整數(shù)據(jù)記錄下來(lái)PR 編號(hào)、提交人、評(píng)審人、變更文件數(shù)、命中規(guī)則數(shù)、規(guī)則級(jí)別、合并耗時(shí)、是否被攔截。這些數(shù)據(jù)存到 PostgreSQL 里通過(guò)內(nèi)置接口可以查詢按周/月維度輸出團(tuán)隊(duì) Review 報(bào)表。我在實(shí)際使用中最??磶讉€(gè)指標(biāo)評(píng)審覆蓋率有多少 PR 真正走了評(píng)審流程、平均首評(píng)時(shí)間從 PR 創(chuàng)建到第一個(gè)有效評(píng)論的時(shí)間單位小時(shí)、規(guī)則命中率 Top10哪些規(guī)則最容易命中意味著團(tuán)隊(duì)哪些問(wèn)題最高發(fā)、阻斷率有多少 PR 曾被打回。舉個(gè)例子我團(tuán)隊(duì)連續(xù)三周看到硬編碼密鑰規(guī)則命中率排第一就知道這不是偶發(fā)問(wèn)題而是開(kāi)發(fā)規(guī)范里缺少配置中心使用指引。于是我在周會(huì)上專門花半小時(shí)講了一遍配置規(guī)范第二周命中率直接降了 60%。這個(gè)價(jià)值不是靠人肉盯代碼能實(shí)現(xiàn)的它讓 Review 從個(gè)人行為變成了團(tuán)隊(duì)數(shù)據(jù)資產(chǎn)。4.2 接入內(nèi)部通知PR 沒(méi)人評(píng)審機(jī)器人來(lái)催很多時(shí)候 PR 卡住不是因?yàn)榇a有問(wèn)題而是沒(méi)人響應(yīng)。我發(fā)現(xiàn)團(tuán)隊(duì)里 PR 平均等待時(shí)間最長(zhǎng)的環(huán)節(jié)不是 CI 執(zhí)行而是等人類評(píng)審人點(diǎn)開(kāi)鏈接。為了解決這個(gè)問(wèn)題我加了一個(gè) notifications 模塊支持在以下幾種情況發(fā)通知新 PR 創(chuàng)建后沒(méi)有評(píng)審人認(rèn)領(lǐng)、PR 超過(guò)設(shè)定閾值時(shí)間比如 24 小時(shí)還沒(méi)被評(píng)審、Error 規(guī)則被命中需要立即關(guān)注。通知渠道我集成了釘釘、飛書(shū)、Slack 和郵件。以飛書(shū)為例配置一個(gè)自定義機(jī)器人 Webhook然后在配置里寫(xiě)好模板PR 被創(chuàng)建或阻塞時(shí)對(duì)應(yīng)的處理人就會(huì)在群里收到一條消息。這里要注意消息模板不能太長(zhǎng)否則重要信息被淹沒(méi)我一般只保留倉(cāng)庫(kù)名、PR 標(biāo)題、變更行數(shù)、命中規(guī)則摘要和鏈接這幾個(gè)字段。這個(gè)功能上線之后效果非常顯著團(tuán)隊(duì) PR 的平均響應(yīng)時(shí)間從 26 小時(shí)降到了 7 小時(shí)。不是靠制度壓迫而是靠信息及時(shí)到達(dá)責(zé)任人解決了響應(yīng)滯后問(wèn)題。4.3 分支保護(hù)策略的配套調(diào)整如果你真的打算用 open-code-review 做強(qiáng)門禁光在工具里配置還不夠Git 平臺(tái)本身的分支保護(hù)策略必須同步調(diào)整。以 GitHub 為例進(jìn)入倉(cāng)庫(kù) Settings 的 Branches 頁(yè)面為默認(rèn)分支通常是 main/master添加保護(hù)規(guī)則勾選 Require status checks to pass before merging然后在搜索框里選中 open-code-review 上報(bào)的檢查項(xiàng)還要勾選 Require pull request reviews before merging次數(shù)建議設(shè) 1 或 2 人。這里有一個(gè)容易踩的坑如果團(tuán)隊(duì)的強(qiáng)制評(píng)審人數(shù)是 1但開(kāi)了允許作者合并自己的 PR那作者可以自己給自己 Approve 合掉門禁等于擺設(shè)。我的建議是取消允許作者合并自己的 PR同時(shí)要求至少 1 個(gè)其他人的 review。這樣配合 open-code-review 的規(guī)則檢查基本能杜絕單人自審自合的問(wèn)題。4.4 評(píng)論區(qū)交互直接在 PR 里打/review命令另一個(gè)實(shí)際使用中很有用的功能是評(píng)論命令。開(kāi)發(fā)者偶爾會(huì)遇到規(guī)則引擎誤判或者想跳過(guò)某些不適用規(guī)則的情況。open-code-review 支持在 PR 評(píng)論區(qū)發(fā)指令來(lái)控制行為比如/review skip跳過(guò)當(dāng)前 PR需要權(quán)限校驗(yàn)、/review rerun強(qiáng)制重新執(zhí)行評(píng)審、/review rule:規(guī)則名只運(yùn)行指定規(guī)則。實(shí)現(xiàn)方式是通過(guò) Webhook 接收評(píng)論事件解析文本內(nèi)容匹配到命令前綴后做權(quán)限校驗(yàn)再觸發(fā)對(duì)應(yīng)動(dòng)作。這個(gè)交互方式開(kāi)發(fā)者非常熟悉不需要去單獨(dú)的 Web 界面操作學(xué)習(xí)成本約等于零。我把常見(jiàn)命令寫(xiě)進(jìn)了項(xiàng)目 README 的醒目位置新同事加入團(tuán)隊(duì)后看到 PR 下面自動(dòng)冒出來(lái)的評(píng)論寫(xiě)著輸入 /review 命令可以管理評(píng)審流程基本就懂了大半。5. 落地過(guò)程中最常踩的坑與排查實(shí)錄5.1 誤報(bào)太多團(tuán)隊(duì)嫌吵怎么辦這是所有自動(dòng)化審查工具都會(huì)遇到的頭號(hào)問(wèn)題。規(guī)則太寬泛PR 里到處是紅字評(píng)審人一天要點(diǎn)幾十次忽略最后干脆不看評(píng)論了。我自己的解法分三步第一步把所有規(guī)則默認(rèn)調(diào)成 warn 而不是 error先觀察一段時(shí)間第二步分析忽略率高的規(guī)則用正則負(fù)向前瞻或except列表把常見(jiàn)的合法場(chǎng)景排除掉第三步允許各子團(tuán)隊(duì)維護(hù)自己的規(guī)則覆蓋文件而不是所有倉(cāng)庫(kù)共用一套全局規(guī)則。這里有個(gè)典型案例我們最初有一條規(guī)則是檢測(cè) Python 中的 assert 語(yǔ)句本意是希望用 pytest.raises 替代裸 assert 來(lái)處理預(yù)期異常。但測(cè)試文件里大量合理使用 assert 斷言導(dǎo)致誤報(bào)滿天飛。最終我們調(diào)整了匹配范圍只對(duì)src/目錄生效并排除所有test文件誤報(bào)率立刻下降了很多。這類調(diào)優(yōu)需要持續(xù)進(jìn)行不要指望一次性做到完美。5.2 Webhook 收不到事件PR 死活沒(méi)反應(yīng)這是接入階段被問(wèn)得最多的問(wèn)題。排查路徑我建議按下面幾條來(lái)先在 Git 平臺(tái)倉(cāng)庫(kù)的 Webhook 設(shè)置頁(yè)面查看最近投遞記錄確認(rèn)服務(wù)地址是否收到了請(qǐng)求如果投遞顯示失敗看返回狀態(tài)碼一般 500 說(shuō)明服務(wù)內(nèi)部有異常404 說(shuō)明路徑不對(duì)401/403 說(shuō)明簽名校驗(yàn)失敗如果壓根沒(méi)有投遞記錄檢查 Webhook 是否勾選了對(duì)應(yīng)的事件類型比如 Pull requests、Issue comments 等。簽名校驗(yàn)失敗的情況尤其常見(jiàn)。GitHub 的 Webhook 簽名是X-Hub-Signature-256用 HMAC-SHA256 對(duì)請(qǐng)求體做簽名密鑰是 Webhook Secret。open-code-review 在配置里設(shè)置webhook.secret之后會(huì)做同樣的簽名計(jì)算再做比對(duì)。如果你在 Git 平臺(tái)配置的 Secret 和本地配置不一致請(qǐng)求就會(huì)被拒絕。建議在服務(wù)里臨時(shí)打開(kāi) debug 日志看服務(wù)端收到的X-Hub-Signature-256和本地計(jì)算的簽名是否一致一步步排查。我在編寫(xiě)這塊時(shí)還特意加了一個(gè)防重放機(jī)制每收到一個(gè) Webhook 事件會(huì)把事件 ID 存到數(shù)據(jù)庫(kù)的唯一索引里重復(fù)事件直接忽略。初期調(diào)試時(shí)反復(fù)在同一 PR 上測(cè)試這個(gè)機(jī)制避免了很多臟數(shù)據(jù)。5.3 超大 PR 分析超時(shí)機(jī)器人卡住當(dāng)一個(gè) PR 改了上千個(gè)文件拉取 diff、逐文件匹配正則、生成評(píng)論整套流程跑下來(lái)可能超過(guò)平臺(tái)的 Webhook 超時(shí)限制GitHub 默認(rèn) 10 秒。這會(huì)導(dǎo)致 Git 平臺(tái)認(rèn)為 Webhook 投遞失敗反復(fù)重試服務(wù)端壓力更大。我的解法是引入異步任務(wù)隊(duì)列Webhook 收到請(qǐng)求后立即返回 200把解析和分析任務(wù)丟到后臺(tái)隊(duì)列執(zhí)行。這樣 Git 平臺(tái)的超時(shí)問(wèn)題徹底消失只是評(píng)審評(píng)論會(huì)在幾秒到十幾秒后才出現(xiàn)。如果 PR 特別大還可以配置一個(gè)大小閾值超過(guò)閾值的 PR 不逐文件分析只輸出一條該 PR 變更過(guò)大建議拆分評(píng)審的提示。這招既保護(hù)了服務(wù)性能又促進(jìn)了團(tuán)隊(duì)的合理提交習(xí)慣。具體來(lái)說(shuō)在配置里設(shè)置max_diff_files: 300當(dāng)單個(gè) PR 的變更文件數(shù)超過(guò) 300 時(shí)不執(zhí)行任何正則有匹配直接生成一條 warn 級(jí)別評(píng)論引導(dǎo)開(kāi)發(fā)者拆分提交。我遇到過(guò)幾次團(tuán)隊(duì)提交 800 多個(gè)文件的巨型 PR靠這個(gè)機(jī)制至少把問(wèn)題暴露在了評(píng)審階段而不是悄悄溜進(jìn)主干。5.4 我加了一個(gè)自檢模式把規(guī)則調(diào)優(yōu)變成日常操作為了讓規(guī)則維護(hù)不那么痛苦我專門做了一個(gè)規(guī)則自檢的子命令用來(lái)在本地快速驗(yàn)證規(guī)則是否正常工作。你可以在本地準(zhǔn)備一個(gè)測(cè)試目錄里面放幾個(gè)模擬文件分別對(duì)應(yīng)應(yīng)該命中、不應(yīng)該命中的場(chǎng)景然后執(zhí)行open-code-review check --rule rules/custom/no_hardcoded_ip.yaml --dir ./testdata如果測(cè)試文件中的正例正確命中、反例正確排除命令會(huì)顯示 PASS否則顯示 FAIL并打印匹配詳情。這相當(dāng)于給每條規(guī)則寫(xiě)了單元測(cè)試改正則的時(shí)候可以快速回歸不用每次推到遠(yuǎn)端倉(cāng)庫(kù)驗(yàn)證。我現(xiàn)在的要求是每條新規(guī)則必須附帶至少一個(gè)正例和一個(gè)反例測(cè)試文件沒(méi)有測(cè)試的規(guī)則不允許合入團(tuán)隊(duì)規(guī)則庫(kù)。這個(gè)自檢模式表面上看是個(gè)小功能但對(duì)團(tuán)隊(duì)協(xié)作幫助很大。不同后端、前端工程師維護(hù)各自領(lǐng)域的規(guī)則不需要懂整個(gè)系統(tǒng)架構(gòu)只需要知道自己這條規(guī)則的正則邏輯和測(cè)試樣例就夠了。規(guī)則庫(kù)的質(zhì)量提升了誤報(bào)自然減少團(tuán)隊(duì)的信任感也就建立起來(lái)了。6. 同類開(kāi)源方案對(duì)比與選型建議6.1 主流工具橫向?qū)Ρ仁忻嫔献龃a評(píng)審自動(dòng)化的開(kāi)源工具不少但側(cè)重點(diǎn)差異很大我梳理了幾個(gè)我實(shí)際用過(guò)的方案和 open-code-review 的定位差異。方案核心側(cè)重規(guī)則引擎門禁能力多平臺(tái)支持統(tǒng)計(jì)報(bào)表適用場(chǎng)景SonarQube代碼質(zhì)量掃描內(nèi)置插件強(qiáng)中強(qiáng)中大型項(xiàng)目持續(xù)質(zhì)量門禁CobraPR 靜態(tài)分析點(diǎn)評(píng)弱弱GitHub only弱輕量 PR 檢查Super-Linter風(fēng)格統(tǒng)一檢查基于 linter中GitHub only弱快速統(tǒng)一代碼風(fēng)格open-code-review評(píng)審流程引擎自研YAML規(guī)則強(qiáng)GitHub/GitLab/Gitea中團(tuán)隊(duì)流程定制化、跨平臺(tái)統(tǒng)一評(píng)審SonarQube 在深度靜態(tài)分析領(lǐng)域仍然是王者圈復(fù)雜度、代碼壞味道、安全漏洞掃描這些能力不是 open-code-review 的目標(biāo)我們也不想去替代它。但我們強(qiáng)在流程編排和規(guī)則定制的靈活性上SonarQube 的規(guī)則體系足夠強(qiáng)大但是要改它的規(guī)則需要用插件機(jī)制學(xué)習(xí)成本高而 open-code-review 使用 YAML 定義規(guī)則半小時(shí)就能從零寫(xiě)一條團(tuán)隊(duì)專屬規(guī)則。6.2 什么場(chǎng)景下我推薦直接用 open-code-review如果你的團(tuán)隊(duì)滿足下面幾個(gè)條件中的任意兩個(gè)我會(huì)建議試試 Open 方案第一團(tuán)隊(duì)同時(shí)維護(hù) GitHub 和 GitLab 倉(cāng)庫(kù)希望用一套體系統(tǒng)一管理評(píng)審第二現(xiàn)有的 linter 只能查風(fēng)格查不出業(yè)務(wù)規(guī)則而你們恰好有一些代碼審查要走查業(yè)務(wù)關(guān)鍵字、敏感配置這類私有規(guī)則第三你們希望對(duì)評(píng)審覆蓋率、響應(yīng)耗時(shí)做數(shù)據(jù)化管理而不是憑感覺(jué)說(shuō)我們?cè)u(píng)審做得還行。反過(guò)來(lái)如果團(tuán)隊(duì)只有非常輕量的需求只想讓 PR 自動(dòng)檢查一下 ESLint 和 Prettier 就結(jié)束那 Super-Linter 會(huì)更合適沒(méi)必要引入一套帶數(shù)據(jù)庫(kù)的服務(wù)。如果團(tuán)隊(duì)預(yù)算充足且急需深度代碼質(zhì)量分析SonarQube 依然值得投入也可以兩者配合使用SonarQube 負(fù)責(zé)代碼質(zhì)量深度掃描open-code-review 負(fù)責(zé)流程規(guī)則和評(píng)審門禁互不沖突。從投入產(chǎn)出比來(lái)說(shuō)open-code-review 的部署成本大約一個(gè)下午寫(xiě)規(guī)則和維護(hù)的成本每周大概一小時(shí)但換來(lái)的是流程可追溯、評(píng)審有數(shù)據(jù)、違規(guī)被攔截這筆賬怎么算都劃算。7. 從工具到機(jī)制幾個(gè)讓評(píng)審真正有效的經(jīng)驗(yàn)從 open-code-review 上線到現(xiàn)在我總結(jié)出幾條工具之外的心得它們和配置規(guī)則一樣重要。第一柵欄要慢慢收緊不要第一天就把所有規(guī)則都設(shè)成 error。團(tuán)隊(duì)不是機(jī)器突然被卡住會(huì)產(chǎn)生很強(qiáng)的對(duì)抗情緒我的做法先跑兩周只讀模式只有 warn 和建議不攔截讓大家看到命中提示的合理性再逐條升級(jí)成 error接受度會(huì)高很多。第二規(guī)則的作者必須吃自己的狗糧。我要求每個(gè)寫(xiě)規(guī)則的人在自己的 PR 里至少讓它命中三次親手處理自己定義的規(guī)則帶來(lái)的提示這樣才能體會(huì)到被自己規(guī)則攔住是什么感受。修改流程后你會(huì)發(fā)現(xiàn)很多不合理閾值在第一輪就被作者自己發(fā)現(xiàn)了。第三評(píng)審機(jī)器人和人類評(píng)審員的職責(zé)要有邊界。open-code-review 擅長(zhǎng)的是無(wú)腦、重復(fù)、客觀的規(guī)則檢查比如敏感信息、硬編碼、調(diào)試點(diǎn)但架構(gòu)合理性、命名是否貼切、單元測(cè)試斷言的邏輯是否嚴(yán)謹(jǐn)這些必須由人來(lái)判斷。工具做工具該做的事人做人該做的事這個(gè)邊界越清晰協(xié)作越順暢。最后關(guān)于評(píng)審效率要有一個(gè)正確的指標(biāo)觀。團(tuán)隊(duì)最容易追求的數(shù)字是評(píng)審?fù)ㄟ^(guò)速度快但過(guò)快的平均評(píng)審時(shí)間也可能意味著評(píng)審流于形式。我真正關(guān)注的是評(píng)審中有實(shí)質(zhì)評(píng)論的比例和缺陷逃逸率這兩個(gè)指標(biāo)前者代表評(píng)審質(zhì)量后者代表評(píng)審有效性。open-code-review 的統(tǒng)計(jì)模塊能幫我把這三個(gè)指標(biāo)拉出來(lái)對(duì)比觀察當(dāng)發(fā)現(xiàn)為了追求速度導(dǎo)致有意義的評(píng)論變少時(shí)就需要在流程上做干預(yù)了。我個(gè)人的經(jīng)驗(yàn)是不要把代碼評(píng)審神器化也不要因?yàn)橛龅竭^(guò)阻力就放棄自動(dòng)化。給團(tuán)隊(duì)一個(gè)能解釋、可調(diào)整、能慢慢適應(yīng)的工具遠(yuǎn)比設(shè)計(jì)一個(gè)完美卻沒(méi)人用的復(fù)雜制度有用得多。open-code-review 還在持續(xù)迭代后續(xù)我打算加入 AI 輔助的語(yǔ)義審查能力在現(xiàn)有正則規(guī)則的基礎(chǔ)上對(duì)函數(shù)邏輯做更智能的分析減少純模式匹配的誤判率。如果你也在頭疼團(tuán)隊(duì)評(píng)審怎么落地歡迎把這份經(jīng)驗(yàn)?zāi)萌ビ靡矚g迎隨時(shí)交流你們的踩坑記錄。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美91精品国产自产| 亚洲熟伦熟妇AV无码春色| 五月香婷婷| 久久人妻熟女一区二区 | 熟女自慰久久久| 免费一级欧美片片线观看| 国产美女91| 婷婷色网| 一区二区三区无卡视频在线观看| 日韩AV一起草| 亚洲97| 日本一区二区中文字幕久久| 国产第11页| 久久国产视频性吧| 99热最新| 久久天天摸| 亚洲最大无码中文字幕网站| 人人摸人人添人人操| 精品无码欧美三级| 亚洲国产成人精品女人久久久| 青草影院内射高潮| 日本顶级天天操狠狠操夜夜操中文字幕| www.五月天| 欧美亚洲| 色香伊人| 蜜桃色院一区久久| 蜜桃中文字日产乱幕4区| 天天干天天做| 日韩AV电影网站| 欧美性爱一级操| 一区二区影院| 九九在线视频| 嗯嗯啊操我| 亚洲欧美人妻| 国内成人圈中文字幕无码视频| 97视频在线免费| 97免费在线视频| 国产美女mm131爽爽爽爽| 亚洲色图超碰在线| 久久熟女嫩草成人片免费| 少妇久久久| 欧美视频中文字幕区| 日本美女性生活久久久久久久| 青青草字幕AV| 亚洲AV成人精品网站在AV| www网站黄| 亚洲欧美在线综合| 天天操天天射天天日| 五月天激情小说| 97 视频在线| 欧美乱妇狂野欧美在线视频| 国产精品天干天干综合网麻豆| 国产熟女无套内射| 东京热男人的天堂网| 日韩97精| 一区二区三区激情在线观看| 亚洲综合射| 亚洲码在线中文在线观看| 五月丁香综合啪啪| 国产97亚洲| 九九热免费视频| 国产午夜精品一区二区三区牛牛| 综合色99| 中文字幕视频在线观看| 国产又粗又又黄又猛| 中文字幕乱妇免费视频| 精品一区二区啪啪啪| 青青青在线高清视频在线一二三四区 | 色噜噜婷婷| 人妻蜜桃臀| 超碰在线91| 伊人91| 国产少妇与亚洲av| 3P乱轮视频| 青青草导航在线视频| 丰满搜索结果 -第18页- 久久高清无码| 欧美色图 人妻| 中文字幕交换人妻| 亚洲毛片基地专区| 欧美超碰人妻97| 99精品视频在线观看| 97亚洲精品超碰| 欧美亚洲影视| 红杏大香蕉| 蜜乳AV免费观看| 欧美一区二区三区黄色影视| 一区二区三区精品黑丝白丝酒店对鸡| A 在线网址| 亚州综| 神马久久69| 大香蕉伊人久久| 国内精品嫩模A∨私拍小视频| 欧美日韩97在线| 97久久精品亚洲| 久久一区二区高清免费| 欧美传媒| 色视频蜜乳| 肥臀熟女一区二区三区视频| 2020中文字幕在线| 亚洲综合一| 欧美日韩人人精品| 神马精品视频| 骚货| 婷婷三区| 伊人色综合超碰| www.99色| 成人熟女视频一区二区三区| 六六久久日韩不卡| 欧美 传媒 麻豆 日韩 偷拍| 我想要 啊 啊 啊| 久久久久久9| 国产日韩中文字幕欧美| 都市激情人妻一区二区青青操视频| 亚洲一区日韩| 欧美极度丰满熟妇hd| 久综合国内精品自在自线| 青青草无码视频| 一二三区操逼国产91| 校园春色欧美| 日本αv| 91伊人影视综合| 国内偷拍精品一区二区| 亚洲成人妻日韩在线| 97任你吞精| 精品午夜福利| 亚洲色9| 亚洲日韩美国人妻| 熟女熟妇一区二区三四区| 激情小说亚洲视频| 岛国色情视频在线观看| 精品一区二区国产日韩| 久久久九九网站| 91国产丝袜美女| 日韩性爱视频在线免费观看| 亚洲av无码成人精品国产| 国产成人主播| 狠狠色噜噜狠狠狠狠2018| 婷婷五月天激情网| 色哟哟AV| 秋霞免费AV| 狠狠躁天天躁日日躁| 三久久久四久久久久| 韩日无码在线观看| 青青操在线亚洲视频观看欧美在线| 日本一二三免费久久| 青青操综合网| 精品二999| 国产三级在线现体验区| 欧美九九爱| 神马午夜久久| 五月激情小说| 久9九综合在线| 爱射综合| 天天色图| 刺激精品视频| 91天堂视频| 黑人精品XXX一区一二区| 日韩AV电影网站| 天天综合网~91| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 97国产高清视频在线观看| 欧美精品999| 91美女视频直播| 婷婷五月天小说| 在线不欧美| AV色天香在线| 东京热男人的天堂精品| 老鸭窝在线视频播放| 色五月首页| 日韩操啪| AV久日| 久久性爱视频| 欧美一区二区三区入口| 东京热伊久| 懂色综合久久久| 精品午夜福利国产一区二区在线观看 | 后入福利| 色色色综合| 内射夫妻三片| 人人操人人色网| #NAME?| 日韩猛交| 色婷婷成人综合| 99re9在线| 久久9亚洲| 欧美久久婷婷| 亚洲精品1区| 久久宗合亚洲| 男插女青青影院| 中文字幕123| 欧美另类色| 国产风韵犹存熟妇三区| 91制服丝袜| 日韩97视频!在线| 东北操逼| 欧美色色色| 精品人妻中文字幕4399| 97精品在线视频| 中文字幕AV片| 99综合自拍| 91neishe| 天天做天天爱| 欧美特大黄一级片片免费| AAAA欧美日韩| 性猛交| 淫纸中9区| 伊人久久亚洲色欲综合网站 | 色97国产69香蕉| 91视频综合网| 欧美在线综合| 我中文字幕6区| 神马久久久久眼| 99久久久无码国产精品性男| 日韩高清黄片| 天天综合91在线| 亚洲国产尤物yw在线观看| 激情小说亚洲| 国产精品九九九| 国产美女高潮视频| 欧美色97| 九九热三级片| 2019天天干| 天天天堂影视日韩亚洲91| 白丝AV网站| 亚洲另类久操网| 天综合中文| 涩五月婷婷| 尤物一级在线免费观看| 国产精品女久久久久av爽| 黑人美精品 A片| 久久精品久久九九精品| 国产强奸乱伦xd| 视频国产欧美在线播放| 五月天婷婷在线看| 午夜无遮挡男女啪啪视频| 久久透逼视频| 国产99久久99热这里只有精品15 | 亚洲精品一区二区三区新线路| 床上啊啊啊一区二区三区| 99热欧美| 国产欧美日韩在线观看麻豆传媒公司 | 九九英色视频| 天天天天操| 激情五月天婷婷| 极品色社| 久久久神马影院| 日本色日夜干| 多乙久久久久久| 亚洲精品一区中文字幕乱码| 91色色综合| 久久免费少妇| 天美麻花大全视频| 精品999日本| 特色a在线上| 亚州操逼图| 亚洲色五月| 伊人991| 亚洲丝袜少妇在线| 欧美人人AAA| 成人综合网 欧美| 男人的天堂一区| 国产精品一级片在线看| 欧美高清性猛交| 日本男人天堂| 亚洲中文字幕精品久久久久久直播| 大香樵伊人网| 日韩在线女优天天干| 99视频只有精品| 欧美亚洲高清不卡| 污污汅18禁网站在线永久免费观看| 久久久久久AV无码免费网站| 99久久9| 中文字幕一二区二三区人妻专区| 人人摸人人干| 欧美探花网| www.婷婷| 天天欧美| 精品久久人妻成人网| 国产精品久久久蜜臀| 午夜超碰| 性色中出| 人人摸人人干人人拍97| 国产麻豆一区二三区| 人人操,操人人| 欧亚成人在线视频| 一区二区三区色综合| 91动漫操逼视频| 91精品91久久久久77777| 91精品黄在线观看| 国产AV中文| 91欧美成人色站| 亚洲中文一区二区三区| 天天夜夜rb| 日韩美女久久一区二区三区| 日本1区2区不卡视频| 亚洲网污污污污| 91精品久久久久久77777| 日韩99999| 色九月综合| 欧美激情中文字幕另类小说| 国产精选视频| 日日夜夜草草草| 婷婷久久综合久| 黄色电影在线播放综合网站| 精品人妻一区二区三区四区| 色偷偷男人的天堂麻豆| 日本欧美一区二区三区视频麻豆| 日韩美女操b| 亚洲成人色情五月天丁香花| 91五月天| 亚洲色综合| 探花一区二区三| 97精品免费视频网站| 日韩八十路老熟女| 裸体美女久久久| 91狠婷| 亚洲成人久久美女| 欧美综合娱乐久久| 免费中文综合精品| 中文字幕91页| 精品美女久久久久| 亚洲日韩美女丝袜美腿人妻视频| 爱爱动态试试看6 0秒| 蜜桃色色网站视频三区| 精品女人999| 99色热| 九九热免费视频| 99久久久99久久91熟女| AAA久久| 18禁超污无遮挡无码免费网| 日韩av无码网站| 无码人妻精品一区二区中文| 九九九只有精品| 成人区人妻精品一| 天美传媒婬乱在| 97超碰人人操人人操| 婷婷干黄色| 99re国产精品视频| 999岛国大片| 亚洲天堂久久| 日本欧美色| 天天综合站| 亚洲成成熟女人综合一区二区| 青青久久艹| www.五月天| 久久婷婷色| julia高潮后不停追击中出| 热天堂一区二区| 成人欧美日超碰| 校园春色AV天堂| 插入逼91| 嗯嗯啊啊视频在线看| 97色欧州| 青青色在线观看| 在线a v| 98色网| 午夜久久久| 国内亚洲高清无码| 91精品久久久久久综合五月天| 清清一区二区三区四区不卡视频| 热的中文 热的有码 热的国产| 精品视频一二三中文| 一级性爱aaaa| 啊啊啊不要嗯嗯在线观看| 屁股久久久久久| 无码国产精品午夜不卡(| 亚洲 se图 欧美电影| 日韩小电影| 静品嫩模一区二区| 97在线视频观看网站| 国产性感骚丝袜在线| 最新AV在线| 欧美刺激色黄片免费看| 亚洲在线A| 日本午夜精品理论片A级APP发布| 国产人妻一区二区三区欧美毛片| 欧洲黄色网| 在现视频女上位好爽| 怡春院久久| 欧美性爱精品一区二区| 干干干天天| 公司1区2区3区精产精| 国产女人与拘做受视频免费 | 国产精品制服丝袜清纯唯美| 爱妻综合网| 中文字幕日韩人妻视频一区二区三区 | 歐美性天天| 日韩人妻 中文字幕| 久久久免费高清中文视频| 久久久久国产亚洲一区欧美色图日韩 | 国产精品人妻无码久久久互動交流| 国产精品国产拍高清AV| 另类图片五月天| 91丝袜美女国产| 97操| 呻吟 欧美 日本 中出| 去干网最新版| 欧美日韩在线视频网站| 97中文综合| 亚洲日本成人动漫| 草草影院日本第一页| 久湿久久 | 男人天堂久久精品不卡| 色五月激情网| 99re热有精品视频国产| 婷婷探花久久精品一区| 亚洲s在线观看| 成人无码电影在线观看网| 曰本91情色| 人妻天堂综合网| 亚洲97成人在线观看| 午夜啊啊| 欧洲站一级二级三级h| 熟女色图在线| 日韩美女久久一区二区三区| www.99视频| 一区二区视频在线播放| 欧美1区二区三区公司| 超碰地址久久| 97免费视频在线| 超碰在线成人电影| 国产精品九九| 亚洲激情综合另类男同| 欧美A片中文字幕| 免费A片三p视频| 伊人激情五月天一区二区| 国产精品久久久久久久AV大片 | 人妻一区久久二区三区色播| 九九久久国产精品| 久久久天美| 人妻精品一区二区| 人妻81p| 色婷婷六月| 中文幕97| 亚洲色图欧美| 强奸国产在线| 97操97色| 久久久久久999| 日韩欧美俄罗斯A片| 欧美激情性爱视频网站| 大香蕉青青9| 国产 日韩 欧美 人妻 熟女 中文| 放黄片放3级黄片没穿衣服| 日韩懂色网| 久久人妻视频网| 久久五月综合| 超碰人人干| 偷拍亚洲熟女视频播放| 91国模| 视频在线观看青青99国产| 久九干| 婷色五月天| 超碰人人在线| 2017,超碰| 刺激精品视频| 极品久久久久久久久久久久久久| 人妻中文字幕日韩电影| 亚洲人综合19| 神马久久中文字幕| 97资源超碰| 国产精品自在线发布| 亚洲熟妇自偷自拍另欧美| 麻豆熟妇乱妇熟色A片在线看| 围产精品一区二区三区视频播放| 综合天天网| 亚洲一区二区三区AV无码| 久久综合婷婷| 亚洲AV噜噜狠狠网址蜜桃动漫| 美女天天干| 欧美色自拍| 麻豆成人影音在线| 日本一二区不卡| 欧美亚洲韩国视频十五区| 超碰在线日韩一区| 国产精品盗摄 偷窥盗摄| 国产超碰人人操| 美女在线H91| 大逼色网站| 国产操偷| 日韩美女高潮喷水视频| 日本精品五区| 激情小说五月天| 97久久天天综合色天天综合色电影| 久男人久久| 国产女s强制榨精视频| 亚洲欧洲综合视频在线| 久久伦理视频久久大香蕉视频| 无码人妻一区二区三区四区老鸭窝| 国产精品一区午夜福利| 欧美三级一级| TS人妖另类精品视频系列| 91日本在线观看| 一区e区三| 日韩性爱小视频在线观看| 国产美女激情| 岛国片国产成人亚洲播放| 91天美传媒精品| 亚洲中文字幕在现观看| 国产视频三区四区| 国产精品 视频| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 内射日韩大臀美女| 操屄日韩| 97一区二区三区视频| 久久久99免费| 综合激情一一91| 日韩黄色一区二区三区| 色狠狠一区二区三区香蕉| 一区二区三区精品视频| 精品人妻久久久久一区二区三区| 5月婷婷6月六月丁香| 美女性91| 久久久性爱视频| 国产女人91精品嗷嗷嗷嗷| 极品美女嘿咻| 无码人妻丰满熟妇奶水区毛片| 精品性爱| 国产又粗又长的视频| 久妇网| 干干干天天| 国产99热| 一二三四区电影| 欧美性91| 亚洲欧洲色情高清| 中文字幕三四五区| 日产操逼| A啊啊在线观看| www.天天干| 午夜AV人气不卡| 欧美激情专区| 欧美日本不卡在线| 无码操逼天堂| 精品一久久久| 亚洲欧美一区二区三区在钱蜜桃 | 久久久精品91八戒| 神马久久久久久久| 国产9l 大屁股| 舔人妻中文免费视频| 97一区二区三区视频| 国语人妻精彩刺激| 丁香五月婷婷基地| 51久久夜色精品国产麻豆| 亚洲天天操| 欧美在线天堂| 欧美色九九| 色狠狠一区二区三区香蕉| 91欧美性| 成人色女网| 欧美色图偷拍另类| 久久中文色图| 欧美韩国你懂得在线| 69精品人人人人| 啊啊啊啊二区好大| 77国产精品| 美女黄码视频午夜| 久久9精品网站| 久久久久人| 欧美熟妇精品黑人巨大91| 加勒比综合88| 九七超碰| 欧美日韩国产中文精品字幕自在自线 | 九九在线精品| 亚洲18禁| 久久精品电影| 夜夜嗨视频| 久久久久久99AV无码免费网站| 日韩免费在线观看不卡| 亚洲成人福利电影免费| 亚洲中文字幕噜噜噜久久久| 亚洲精品色| www.av不卡中文字幕| 久久精品熟妇丰满人妻99| 99久久精品欧美国产| 亚洲AV噜噜狠狠网址蜜桃动漫| 99热久| 亚洲无限观看| 色综合加勒比| 成人国产精品三级A片| 殴美,日韩国产伦精品| 男人网站婷婷| 搡老女人911熟妇老熟女| 秋霞鲁丝午夜无码一区二区三| 久久精品人妻一区二区三区| 欧天美中出| 嗯嗯啊啊好疼| 男人的天堂 在线一区| 中文字幕亚洲热播人妻| 你草精品在线视频| 超碰97中文| 久草视频分类在线| 久艹99| 亚欧成人综合影院| 中国小夫妻勾搭露脸淫荡对白| 欧美超碰97| 五月婷婷无码| 婷婷人妻激情| 九九av| 美女黄色91| 国产亚洲色婷婷久久99精品91| 97超碰巨乳| 国产一区在线观看无码AV | 玖玖久久久| 天天日少妇逼AV| 一二三区视频在线观看| 五月婷婷激情网| 网友自拍第1页| ,国产乱人伦精品一区二区三区| 天天日天天操天天射河南省| 青青色在线观看| 亚洲经典啪啪| 九九九九九九视频免费| 色偷偷色偷偷欧美日韩| 久久精品国产亚洲AV高级北京| 国产高清免费不卡av| 97这里都是精品| 欧美1区二区三区公司| 啊啊啊不要啊啊受不了了视频在线 | 亚洲天堂男人的天堂| 裸体美女免费看网站青草| TS人妖另类精品视频系列| 99爱久久视频频| 国产一区二区在线播放量| 色网1| 日韩在线76| 成人一级性爱| 久久99国产精品| 骚熟女吞| AV天堂丝袜| 97色婷| 亚洲精品国产熟女久久久久久| 亚洲91射| 国产人妻精品一区二区三区秋霞| 九九无码| 色色色999| 亚洲精品人妻在线| 欧美人体性爱互联网第一页婷婷日本| SUV一区二区在线看| 99热在线播放| 亚洲AV无码乱码| 91情色在线| 亚洲欧美黄| 婷婷精品视频| 在线国产探花| 欧美十八禁网站| 久久受www免费人成| 97超碰公开| 91黑丝美女| 欧美男女午夜啪啪| 国产操偷| 久久精品国产72国产精品福利| 立川理惠被中出无码| 96超碰网| 永久免费观看的毛片的网站| 992视频一区| 亚洲 欧美 色图| 日日不卡av| 神马久久久久久| 亚洲无码com| 国产欧美在线观看免费观看| 91操熟女| 在线看的av| 一级久久久久久久久久久| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 91国产精品熟女| 国产性刺激| 天天操人人操骚逼网站| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 国产精品无码av| 国产精品免费视频人成| 夂久色| 北条麻妃性愛视频| 人人贴人人摸| 操91| 综合网少妇| 亚洲成人激情小说视频| 艹少妇网站| 午夜激情床戏激情| 精品人妻视频一区二区在线播放| 97干在线视频| 久久精品国产亚洲AV片多多| 偷拍 精品另类 凸凹了四区| 91伊人大香蕉| 天天肏天天干| 亚洲另类电影| 日韩精品人妻中文字幕久久久| 99这里只有精品| 手机在线免费看的av| 亚洲情色91| 国产91 丝袜在线播放 | 丁香色色网| 亚洲天天精品| 久久精品国产96精品亚洲拳交| 91逼逼女人91| 人人看黄色视频| 91亚·色| 久久成人国产精品| 亚洲精品 超碰| 东北女人操逼| 天美一二三在线观看Av| 国产精品蜜臀久久久久无码AV| 欧美色图私拍91| 久久久新亚洲AV| 无码在线亚洲| 久久伊人青青草| 操逼免费视频无码国产| 日日A∨| 大香网站| 在线观看啊啊啊啊啊| 中文精品一区二去| 久久久久96| 顶级丝袜熟女一区二区三区 | 久久精品国产亚洲AV高清演员表| 亚洲天堂人妻一区二区| 女沟厕偷窥piss小便| 思思热在线观看| 久久九色| 九九九九免费高| 伊人激情五月天一区二区| 久久高清无码夜夜操| 日韩人妻播放| 色综合大香蕉| 大香蕉综合在线| 色区97| 久久av网| 十八禁成人网站在线观看| 欧美人妻熟女在线| av天堂影视中文在字幕在线中文| 91亚洲综合| 97色欧州| 狠狠干婷婷| 国产福利视频精品视频| 热热色综合网| 欧美 亚洲 制服 精品| 一区二区精品日韩欧美在线观看| 国产熟妇一区二区| 26uuu国产免费观看| 亚洲人天堂| 黄色一区三区| 午夜精品99久久久久传媒| 偷拍亚洲熟女视频播放| 久久精品国产亚洲粉嫩| 久久精品一区一起草| 亚洲一区二区三区麻豆传媒| 日韩去日本高清在| 操逼视频国产无套| 欧美日韩久久精品爱爱| 无码人妻系列少妇| 日本裸体久久色噜噜| 99自拍视频| 国内毛片国产专区二| 国产黄片精品在线| 亚洲AV无码乱码| 国产粉嫩蜜臀av一区二区三区 | 人妻AV 中文字幕的| 日韩国产成人自拍视频| 无码不卡八戒| 男女做爰猛烈动高潮A片免费应用| 青青草在线视频美女| 国产人妻精品一区二区三区秋霞| 国产精品国产自产拍高清AV| 99色在线| 久久久影院| 国语人妻精彩刺激| 午夜福利久久久噜久噜久久综合| 91无码中出人妻视频| 久久午夜伦| 日本美女性生活久久久久久久| 欧美色色色| 五月天春色激情网| 嗯阿好爽好紧| 人妻黑丝袜电影| AV中文字幕剧情1区2区3| 黄片免费日韩| 无码日韩人妻av一| 国产60区。| 久久久亚洲欧美综合| 欧美一区二区三熟女剧情| 九九久久综合| 成人a v在线播放免费| 欧美熟女妇同| 日本高清一区二区在线| 乱性AV| 天天躁夜夜躁狠狠躁AV| 97在线精品| 乱伦a片视频| 97视频在线播放| 手机av亚洲丝袜美腿日韩第一页二页| 午夜大香蕉| 国产自产自拍| 久久的免费性爱视频| 亚州五月| 欧亚久久偷拍视频| 青青草吊丝| 性色A∨91| 偷偷人人精品女女久久| 国内精品a| 九九九九九九九九九国产精品 | 天天操天天干美女网址导航| 强奸乱伦麻豆| 免费精品中文字幕| 国产精品久久久久久亚洲色欲| 久久久精品中文字幕麻豆| 国产剧情一区在线观看| 大香蕉免费乱伦视频| 国产精品91一样| 欧美大色交| 强奸乱伦动态污图免费| 翔田千里AⅤHD无码| 少妇被c 黄 免费观看| 加勒比海人人操超碰在线| 日韩电影免费网站麻豆视频| 97伪v| 五月天色电影| 97操综合| 精品久操| 久久男人| 久久国产成人精品国产成人亚洲| 香蕉99秘 一区精品蜜桃臀| 日韩精品一二三| 乱伦强奸区日韩| 亚洲精品久久久久毛片A片拉屎| 加勒比伊人| 国产毛片片精品天天看视频| 国产美女在线精品免费看| 伊人天天久久动态图| 国产日韩欧美操逼视频| 国产中文精品一区二区在线观看| 91操人| 六月婷婷综合| 中文字幕视频在线观看一区二区| 日韩国产成人自拍视频| 欧美超碰9798| 怡春苑东京热| 欧美亚洲韩国视频十五区| 亚洲欧美不卡线| 精品亚洲国产成人精品| av日韩在线观看电影| 嗯嗯,啊啊,国产精品| 国产第11页| 99999亚洲| 日韩性爱视频在线免费观看| 一区二区三区视频| 伊人青青一区成人视频在线观看区| 四虎国产成人精品免费一女五男| 日日干夜夜骑| 一中国女人毛片水真多| 九9热伊人| 精品少妇一区二区三区| 97超碰中文在线| 亚洲精品久久久久久| 亚洲毛片基地专区| 国产偷拍自拍在线视频| 91色情黑丝搞鸡在线观看一区二区三区三州 | 天天日B夜夜干B时时操B| 欧美成人A天堂片在线观看| 夜夜嗨一区二区三区三州加勒比 | 国产av激情无码久久天堂| 久久精品国产亚洲AV无码电影| 77国产精品| 黄片qw| 日韩一级二级在线| 少妇精品久久| 五月天婷婷小说| 欧美性天天影院| 国产Aα| 国产精品久久久久久久免牛肉蒲团| 亚洲97| 在线视频一区二区传媒| 91蜜臀人妻中文字幕在线| 97婷婷色| 亚州欧美在线| 人妻久久久| 亚州精品丝袜-不卡成人免费| 熟女自慰久久久| 久艹日日日| japan日本高清乱xxxx| 蜜桃丰满熟妇av无码区不卡| 欧美精品久久| 宅男影院久久久,99| 小草精彩毛片| 天天干人人乐| 欧美亚州手机在线| 亚洲 欧美综合| 91久久久视| 女人被男人桶爽视频网站| 91人妻久久久久久久久久久久久| 色欲三区| 九九九国产| 久久一二三四五六七八九区区区 | 日本不卡二三区| 亚洲欧美日韩制服另类| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 91色人妻| 色哟哟1区2区| 中文字幕在线高清男人的天堂| 婷婷性网| 久久精品小视频| 国产无马在线| 久久久久久99999国产精品| 99激情视频| 日韩人妻一区二区| 清清一区二区三区四区不卡视频| 中文字幕精品一区欧美| 九九九九九九综合| 日本日日色视频| 久操精品网| 日韩黄片视频试看| 日本操逼视频在线| 综合色欧美| 狠狠躁日日躁夜夜躁A| 最新欧洲欧美日本激情网站| 久久69| 日韩精品一二三| 91无码人妻| 91逼逼女人91| 99久热| 激情五月天社区| 一区二区精品日韩欧美在线观看| 伊人宅男大香蕉 | 成人一级性爱| 另类天堂| 99中文字幕| 校园春色 亚洲| 91模特在线观看| 男人天堂免费| 人妻素股| 日本精品久久久久久久| 亚洲限制级| 欧美人妻一区二区| 国产丁香精品露脸视频| 久久久免费懂色| 精品一二三区女同| 蜜区区视频79 | 欧美性,亚州色| 亚洲AO在线| 密臀视频一区二区三区| 中国黑人三级片网站上区| 中文字幕神马久久| AV久日| 日日AAvv| 国产激情视频一区区三区| 国产无码三级视频在线观看| 国产福利电影| 日韩激情中文字幕有码| 国产原创剧情在线丝袜| www狠狠| 尤物av网站| 97超碰人操| 黑人精品欧美一区二区蜜桃| 天美传媒AV在线| 强奸国产精品视频| 99精品久久久久久久婷婷蜜桃| 久久免费精彩视频| 亚洲美女30b| 91成人精品| 久久丁香久草综合网| 五月天婷精品激情| 亚洲情色电影网| 青青草华人在线欧美在线| 九九九九九九视频免费| 午夜福利免费福利视频| 亚洲极品| 国产午夜福利电影免费在线观看 | 亚洲精品1区| 日夜伊人网| 亚洲色图亚洲无码强奸乱伦| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 国产剧情在线| 手机在线看片免费人成视频| 日韩一级二级在线| 一级二级在线观看| AV免费在线播放一区| 久久夜色一区二区| 久久人| 国内91熟女人妻丝袜天天精品视频在线 | 校园激情狠狠四射| 日韩不卡在线一区二区| 亚洲男人天堂视频| 亚洲国产成人福利在线观看| 国产白嫩精品久久| 福利视频网站| 91在线美女| 熟女人妻一区二区三区免费看| 囯产乱伦一区二区三女| 99re在线视频| 国产一区二区欧美日本| 日韩精品国模| 九月丁香婷婷色| 亚洲大胆人体av| 国产精品呦一区二区三区| 欧美色图 人妻| 国产精品一级特黄aaa大片在线观看| 青青草伊人久久| 久久黄色性爱视频| 日韩丝袜高跟制服在线观看| 日本一级二级三级网站| 四虎884| 97天天爽| 91成人在线免费视频| 亚洲中文字幕av| 亚洲天堂人妻一区二区| 四虎精品亚洲| 一区中文字幕二区日韩| 精品毛片av一区二区| 久久久久久中文| 欧美久久毛片基地| 欧亚性爱视频免费看| 麻豆亚洲AV成人无码久久精品| AV高清一区| 三级三久久线久久99久目本WW| 97久久国产精品女不卡| 国产精品色哟哟| 久久草草欧美精品| 成人自拍三级在线观看| 在线播放欧洲免费av| 亚洲综合贴图91| 一二三啪啪专区| 亚洲日本韩国在线| 亚洲九月丁香| 日韩免费高清大片在线| 欧美性性性| 久久久久熟女| 欧美色道啊| ai欧美亚洲小说| 97超碰色屌| 大香蕉伊人亚洲| 噜噜在线| 热无码中文亚洲H一道本一区二区| 熟女人妻精品一区二区视频| 无毛精品| 亚洲天堂日本| 神马久久69| 一区二区三区四区五区高清无码永久视频| 欧美午夜视频精品久久| 看日韩操逼| 亚洲精品中文字幕一区在线视频 | 亚洲中文字幕网| 国产九九九九九九九九| 成人影院永久免费观看网址| 国产精品96| 密乳AV免费观看| 国产精品自在自拍视频| 日韩精品在线观看网站| 乱老女人一区二区视频| 女人高潮大叫一级毛片| 葡萄牙性视频一二区 | 精品一区二区啪啪啪| 在线欧美69V免费观看视频| 人人操我人人干| 国产曰批免费观看久久久| 一级黄色性爱A级片| 伊人女女资源在线观看| 婷婷五月天久久久| 少妇高潮对白在线观看| 亚洲精品天堂久久A∨51成人漫| 女同女同恋久久级三级| 亚洲av影音先锋| 中文无码一二三区| 久草资源在线视频官方总站日韩丝袜美腿 | 97伦乱| 天综合网欧美| 26uuu性| 一级性爱aaaa| 丁香六月激情| 国产精品久久久久久久久久久久久久久久久久| 国产第11页| 亚洲天堂加勒比| 国产精品白丝在线播放| 日本人体九九九九九九| 九九九九精品在线| 青娱乐国产盛宴视频| 少妇内射视频| 欧美东京热精品A∨| 久久精品无码熟妇一区二区三区视频导航| 亚洲av综合伊人久久| 96精品久久久久中文字幕| 亚洲日本激情| 60秒免费小视频| 婷婷去俺也去六月色| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 亚洲午夜未满十八勿入网站日本又色又爽又黄| 天天日天天干天天操| 97人人干人人操| 综合大香蕉美。| www.99色| 1区2区3区中文字幕日韩| 久久久久久精| 密臀在线免费观看| 性夜影院爽黄A爽免费动漫| 欧美|91色综合| 午夜精品久久久| 骚女高跟AV在线| 26uuu性| 久9爱经典视频| 亚洲欧美日韩夜夜| AV天堂因数| 精产国品一区二三产品| 天天色,天天干,天天干| 大香蕉人妻久久| 91丝袜美女| 精品无码一区二区三区| 99精品人人爽| 天天插天天干| 操高情无码| 欧美懂色综合网| 日本新免费二区三区| 插欧洲美女欧美精品| 91色香| 爱爱久久| 综合啪啪| 十八禁的黄污污免费网站| 欧洲视频在线| 992这里有精品| 污污汅18禁网站在线永久免费观看| 美女网站黄页| 99r九九| 久久久久久AV无码免费网站| 四虎国产精品永久在线囯在线 | 秋霞网—男女啪啪亚洲免费体验区| 操逼内射干逼白丝91| 国产精品国产拍高清AV| 久久人人爽爽人人爽人人片αV| 欧洲亚洲人妻无码高清久久三区四区| 人妻中文字幕日韩电影| 日本人妻一区二区| 欧美综合网在线| 97在线播放 | 97亚洲精品| 蜜桃臀一区二区三区久久| 区一二区日韩亚洲乱码av电影| 婷婷综合激情| 久久 国产精品 一区| 久久欧美性爱视频| 97精品熟女少妇一区| 久操免费电影| 国产a级精品| 啊啊啊啊啊啊在线看| 九九热免费国产视频婷婷伊人| 91天天综合在线| 中文字幕加勒比海高清无码免费视频| 口爆吞精在线观看| 欧美经典一区二区三区| 亚洲一区日韩精品中文字幕| 起碰97| 男人的天堂2018| 国产老女人久久毛| 伊人在线大香蕉视频久久| 亚洲骚男同com| 精品少妇一区二区三区| 97视频免费播放| 夜夜爽夜夜爽| 2020中文在线一区二区三区| 国产精品久久久久亚洲av| 亚洲天堂7777| 五月丁香婷婷色| 麻豆久久久久久久久丝袜 | 色老汉玖玖爱| 狠狠色一区二区中文字幕| 色网在线| 欧美黄业|