久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

open-code-review:從PR模板到合并保護(hù)的代碼評(píng)審自動(dòng)化實(shí)踐

open-code-review:從PR模板到合并保護(hù)的代碼評(píng)審自動(dòng)化實(shí)踐 1. 為什么我要做 open-code-review 這個(gè)項(xiàng)目干開發(fā)十多年我見過太多因?yàn)椤案牧艘恍写a”引發(fā)線上事故的現(xiàn)場。最典型的場景是這樣的一個(gè) PR 在 GitLab 上掛了三天沒人看第四天負(fù)責(zé)人急著發(fā)版自己點(diǎn)了個(gè) approve 就合并了結(jié)果這段代碼里的空指針異常直接打爆了生產(chǎn)日志。事后復(fù)盤的時(shí)候大家都很沉默因?yàn)檎l都清楚問題出在哪——評(píng)審環(huán)節(jié)形同虛設(shè)PR 掛在那里不是被認(rèn)真看過的只是被“路過”表態(tài)的。還有個(gè)問題更隱蔽有些人不是不想認(rèn)真評(píng)審而是根本不知道看什么。新人拿到一個(gè) PR打開 diff 看了一眼覺得“語法沒錯(cuò)、測試貌似過了”就點(diǎn)了通過。真正該關(guān)注的性能隱患、邊界條件、錯(cuò)誤處理、數(shù)據(jù)庫查詢量級(jí)、并發(fā)安全一個(gè)都沒看明白。代碼評(píng)審長期處于“有流程無標(biāo)準(zhǔn)、有系統(tǒng)無方法”的狀態(tài)。所以當(dāng)團(tuán)隊(duì)決定把代碼評(píng)審這件事認(rèn)真做起來的時(shí)候我沒有直接選一個(gè)商業(yè)工具抄作業(yè)而是動(dòng)手沉淀了一套可以跨團(tuán)隊(duì)復(fù)用的實(shí)踐方案取名叫 open-code-review。這個(gè)項(xiàng)目的定位很明確不去替代 GitHub、GitLab、Gitee 自帶的那套 Pull Request 能力而是在現(xiàn)有平臺(tái)之上把評(píng)審規(guī)則、檢查清單、自動(dòng)化攔截、效果度量全部標(biāo)準(zhǔn)化。評(píng)審靠不靠“人自覺”不再重要因?yàn)榱鞒虝?huì)幫團(tuán)隊(duì)兜底。這個(gè)項(xiàng)目適合誰我覺得所有被“評(píng)審走形式”折磨過的團(tuán)隊(duì)都值得參考。不管你是三五個(gè)人的小創(chuàng)業(yè)團(tuán)隊(duì)還是幾十上百人的研發(fā)部門核心思路是一樣的——把評(píng)審從“憑感覺”變成“按清單”把質(zhì)量把關(guān)從“事后救火”變成“過程攔截”。下面我把這套方案的設(shè)計(jì)思路、落地細(xì)節(jié)、踩過的坑完整寫出來希望能給正在折騰代碼評(píng)審流程的你一些啟發(fā)。2. 整體設(shè)計(jì)思路不造輪子而是把輪子拼成車2.1 核心痛點(diǎn)評(píng)審最大的敵人不是懶是“不知道看什么”在做 open-code-review 之前我先把團(tuán)隊(duì)過去半年的評(píng)審數(shù)據(jù)拉出來看了一遍。結(jié)果很有意思平均每個(gè) PR 的評(píng)審時(shí)長是 4.2 天其中 70% 的時(shí)間花在“等人看”上面真正閱讀代碼的時(shí)間平均不到 15 分鐘。更扎心的是評(píng)審意見里有一大半集中在代碼風(fēng)格、命名規(guī)范、注釋缺失這類基礎(chǔ)問題上真正涉及邏輯正確性、異常處理、性能隱患的評(píng)論不到三成。這個(gè)數(shù)據(jù)說明兩件事。第一評(píng)審被人為拖慢了這跟工具沒關(guān)系跟人的習(xí)慣有關(guān)系。第二評(píng)審的關(guān)注點(diǎn)跑偏了大家把寶貴的注意力浪費(fèi)在機(jī)器就能解決的問題上自然沒有精力去深挖真正要命的邏輯缺陷。所以 open-code-review 的第一個(gè)設(shè)計(jì)原則就出來了凡是機(jī)器能自動(dòng)檢查的絕對(duì)不讓人肉來做。代碼風(fēng)格讓 linter 管提交信息格式讓 commitlint 管覆蓋率變化讓覆蓋率工具管剩下的時(shí)間才能留給人類去思考那些機(jī)器想不明白的事——業(yè)務(wù)邏輯對(duì)不對(duì)、架構(gòu)設(shè)計(jì)合不合理、未來的擴(kuò)展性怎么樣。2.2 技術(shù)選型GitHub Actions Danger.js 自定義 CI 工作流技術(shù)選型這塊我糾結(jié)過很久。市面上的商業(yè)評(píng)審工具不少功能也確實(shí)強(qiáng)大但對(duì)于很多團(tuán)隊(duì)來說多一套工具就多一個(gè)賬號(hào)、多一個(gè)學(xué)習(xí)成本、多一份訂閱費(fèi)用而且代碼都托管在別人平臺(tái)上數(shù)據(jù)安全也是個(gè)顧慮。我更傾向于用團(tuán)隊(duì)已經(jīng)在用的基礎(chǔ)設(shè)施把評(píng)審能力“嵌入”進(jìn)去而不是引入一套新系統(tǒng)。最終選型組合是這樣的組件選型理由代碼托管GitHub / GitLab / Gitee團(tuán)隊(duì)已有基礎(chǔ)不額外引入平臺(tái)自動(dòng)化檢查GitHub Actions / GitLab CI平臺(tái)原生能力零額外成本智能評(píng)審輔助Danger.js一門 DSL能寫規(guī)則去自動(dòng)點(diǎn)評(píng) PR靜態(tài)掃描ESLint SonarQubeESLint 管 JS/TS 規(guī)范SonarQube 管質(zhì)量門禁提交規(guī)范commitlint husky在提交那一刻就攔截不規(guī)范行為文檔沉淀倉庫內(nèi) Markdown 模板評(píng)審清單和模板跟代碼放一起跟著版本走用 GitHub Actions 而不是單獨(dú)搭一套 Jenkins是因?yàn)榕渲煤唵?、維護(hù)成本低而且對(duì)于大多數(shù)中小團(tuán)隊(duì)來說平臺(tái)自帶的 CI 能力已經(jīng)綽綽有余。Danger.js 是這套方案里的關(guān)鍵角色它能在 CI 里跑一段腳本讀取 PR 的元數(shù)據(jù)標(biāo)題、描述、修改文件列表、評(píng)論等然后按照我寫的規(guī)則自動(dòng)發(fā)表評(píng)審意見。這么說可能有點(diǎn)抽象真實(shí)的場景是如果 PR 沒有關(guān)聯(lián) issueDanger 自動(dòng)貼一條提醒如果修改了核心模塊的代碼卻沒有新增測試Danger 自動(dòng)提出質(zhì)疑。人還沒開始看機(jī)器已經(jīng)把門檻守住了。2.3 流程設(shè)計(jì)一個(gè) PR 從創(chuàng)建到合并要走完五道檢查很多團(tuán)隊(duì)覺得評(píng)審流程就是“提 PR — 等人 approve — 合并”太簡陋了。open-code-review 把流程重新梳理成五道關(guān)卡每一道都對(duì)應(yīng)明確的檢查和職責(zé)提交前鉤子本地husky 攔截保證 commit message 格式正確、提交前自動(dòng)跑增量 lint 與單測。靜態(tài)掃描CIESLint、Stylelint 掃描代碼規(guī)范SonarQube 檢查重復(fù)代碼、圈復(fù)雜度、潛在缺陷。智能規(guī)則Danger檢查 PR 描述是否填寫、是否關(guān)聯(lián)任務(wù)單、變更規(guī)模是否過大、是否缺少測試文件。人工評(píng)審強(qiáng)制性至少一名核心維護(hù)者 approve且評(píng)審必須按模板填寫意見不能只點(diǎn)按鈕。門禁合并保護(hù)分支上述所有檢查通過后由機(jī)器人或 CI 狀態(tài)控制合并按鈕任何一環(huán)紅掉都不能合并。這五道關(guān)卡不是拍腦袋定出來的。在只有“人工 approve”的時(shí)期我們上線過一個(gè) bug起因就是有人改了公共工具函數(shù)評(píng)審的人只看了自己負(fù)責(zé)的那個(gè)模塊根本沒意識(shí)到公共函數(shù)的變更影響到了全項(xiàng)目。加了自動(dòng)化的變更影響分析后這種問題在第一道掃描就能被標(biāo)記出來。3. 核心細(xì)節(jié)拆解評(píng)審規(guī)則、模板與自動(dòng)化腳本怎么寫才有效3.1 評(píng)審清單人家不是不想看是不知道看什么代碼評(píng)審一個(gè)很現(xiàn)實(shí)的困境是評(píng)審者打開 PR 后盯著屏幕發(fā)呆不知道該從哪下手。open-code-review 的解決方案是提供一份結(jié)構(gòu)化的評(píng)審清單我把這么多年踩雷總結(jié)出來的檢查項(xiàng)全部放了進(jìn)去分門別類照著看就不會(huì)漏。我整理的評(píng)審清單核心部分長這樣功能邏輯這個(gè)改動(dòng)是否完整實(shí)現(xiàn)了需求有沒有遺漏的邊界場景用戶怎么觸發(fā)這段代碼錯(cuò)誤處理外部接口調(diào)用失敗怎么辦網(wǎng)絡(luò)超時(shí)有沒有兜底數(shù)據(jù)為空時(shí)會(huì)不會(huì)拋異常性能影響新增的循環(huán)會(huì)不會(huì)造成 O(n2) 復(fù)雜度有沒有在循環(huán)里查詢數(shù)據(jù)庫有沒有不必要的重復(fù)渲染并發(fā)安全共享變量有沒有加鎖線程池使用是否合理會(huì)不會(huì)出現(xiàn)死鎖或者競態(tài)條件兼容性數(shù)據(jù)庫遷移腳本能否回滾前端改動(dòng)是否兼容老瀏覽器接口變更是否影響舊版本客戶端可維護(hù)性:命名是否表意清晰有沒有留下注釋解釋“為什么這么做”后續(xù)維護(hù)者能看懂嗎這個(gè)清單不是讓評(píng)審者逐條回復(fù)而是引導(dǎo)他們的注意力集中在真正的風(fēng)險(xiǎn)點(diǎn)上。實(shí)踐證明給了清單之后評(píng)審意見的質(zhì)量明顯上升從“這里應(yīng)該加個(gè)空行”這種碎碎念變成了“這里如果 upstream 掛了我們?cè)趺炊档住边@種真正有價(jià)值的問題。3.2 PR 模板把“該提供的信息”變成“必須要填的字段”模板這個(gè)東西看著不起眼實(shí)際作用比想象中大得多。沒有模板的時(shí)候PR 描述五花八門有人只寫一句“修復(fù) bug”有人干脆什么都不寫評(píng)審者還得從代碼 diff 里自己猜改動(dòng)意圖非常消耗耐心。open-code-review 的 PR 模板設(shè)計(jì)成這樣的結(jié)構(gòu)### 背景 這個(gè)變更解決了什么問題為什么需要做這個(gè)改動(dòng) ### 變更內(nèi)容 本次改動(dòng)涉及哪些模塊核心邏輯是什么 ### 影響范圍 改動(dòng)影響哪些功能是否涉及公共代碼是否需要同步更新文檔 ### 測試說明 本地怎么驗(yàn)證的覆蓋了哪些用例有沒有補(bǔ)充自動(dòng)化測試 ### 自檢清單 - [ ] 代碼已通過 lint 和單元測試 - [ ] 已補(bǔ)充/更新必要的測試用例 - [ ] 已檢查性能影響和異常處理 - [ ] 無敏感信息泄露密鑰、token、個(gè)人數(shù)據(jù)看到區(qū)別沒有模板不是在增加負(fù)擔(dān)而是在幫助提交者把“腦子里的信息”顯性化。這些信息對(duì)評(píng)審者來說是必不可少的上下文沒有上下文就評(píng)審等于讓一個(gè)裁判不看比賽就打分。寫完模板的過程其實(shí)也是提交者自己重新審視一遍代碼的過程經(jīng)常有人寫著寫著就發(fā)現(xiàn)了自己的邏輯漏洞。3.3 Danger.js 規(guī)則讓機(jī)器人替你盯細(xì)節(jié)Danger.js 是這套體系里我最喜歡的一個(gè)組件。它能把很多原本靠人肉提醒的事情變成自動(dòng)化而且規(guī)則完全自己控制想怎么玩怎么玩。我在項(xiàng)目里配置的規(guī)則覆蓋了這幾個(gè)高頻場景// dangerfile.js const { danger, markdown, warn, fail, message } require(danger) // 1. PR 描述過短直接提醒 if ((danger.github.pr.body || ).length 30) { warn(PR 描述過短請(qǐng)補(bǔ)充背景、變更內(nèi)容和測試說明。) } // 2. 檢查是否關(guān)聯(lián) issue const issueRefRegex /#\d/ if (!issueRefRegex.test(danger.github.pr.body)) { warn(這個(gè) PR 沒有關(guān)聯(lián)任何 issue請(qǐng)補(bǔ)充關(guān)聯(lián)編號(hào)。) } // 3. 變更規(guī)模過大時(shí)提示拆分成小 PR const additions danger.github.pr.additions if (additions 600) { fail(本次變更新增超過 600 行建議拆分成多個(gè)小 PR 再提交。) } // 4. 修改核心模塊但沒有新增測試時(shí)提出質(zhì)疑 const changedFiles danger.git.modified_files const coreModules [src/core/, src/utils/, src/api/] const touchedCore changedFiles.some((f) coreModules.some((m) f.includes(m))) const hasTests danger.git.modified_files.some((f) f.includes(__tests__) || f.includes(.test.) || f.includes(.spec.)) if (touchedCore !hasTests) { warn(你修改了核心模塊但未發(fā)現(xiàn)對(duì)應(yīng)的測試文件更新請(qǐng)確認(rèn)是否已補(bǔ)充測試。) }這個(gè)腳本在 CI 里跑完會(huì)自動(dòng)把評(píng)論貼到 PR 下面效果等于一個(gè)不吃不喝的機(jī)器人同事每一行提醒都有明確的依據(jù)而且完全沒有情緒——你可以跟機(jī)器人吵但它不會(huì)生氣也不會(huì)記仇。當(dāng)然機(jī)器人的價(jià)值不在于替代人而在于把人的注意力從低價(jià)值問題上解放出來讓評(píng)審者可以專心做只有人類才能做的判斷。有人可能擔(dān)心規(guī)則寫多了會(huì)不會(huì)誤報(bào)太多反而把真實(shí)問題淹沒。這個(gè)擔(dān)心是對(duì)的我的經(jīng)驗(yàn)是 Danger 規(guī)則寧少勿多每條規(guī)則都要有實(shí)際的踩坑經(jīng)驗(yàn)支撐不要為了炫技寫一堆花里胡哨的規(guī)則。開頭寫 4-5 條能實(shí)打?qū)嵔鉀Q問題的就足夠了后面再根據(jù)團(tuán)隊(duì)反饋慢慢迭代。3.4 合并保護(hù)配置讓門禁真正硬起來規(guī)則寫好了CI 跑起來了但如果合并按鈕還是誰都能點(diǎn)前面做的所有工作都白費(fèi)。open-code-review 里的最后一道防線是分支保護(hù)規(guī)則這在 GitHub 里叫 Branch protection rules在 GitLab 里叫 Merge request approvals。GitHub 上我推薦的配置組合是這樣的Require a pull request before merging禁止直接推送到主分支Require approvals必須至少 1-2 個(gè)評(píng)審者批準(zhǔn)Dismiss stale pull request approvals when new commits are pushed新提交后舊 approve 自動(dòng)作廢Require status checks to pass before merging所有 CI 檢查必須通過Require conversation resolution所有評(píng)論對(duì)話必須 resolve 才能合并最后一條特別重要。很多團(tuán)隊(duì)的默認(rèn)配置是“approve 之后評(píng)論可以掛著不解決就合并”這就導(dǎo)致了一個(gè)怪現(xiàn)象評(píng)審者明明提出了問題提交者嘴上說“改好了”但評(píng)論一直掛著至于是否真的改好了沒有強(qiáng)制確認(rèn)。打開 conversation resolution 之后這個(gè)漏洞就堵上了——不解決完所有對(duì)話合并按鈕永遠(yuǎn)灰著。4. 實(shí)操落地從零到一接入 open-code-review 的完整過程4.1 倉庫初始化先把基礎(chǔ)設(shè)施搭好假設(shè)你要在一個(gè)已有代碼倉庫上落地這套流程我建議按下面的順序來操作。先別急著寫規(guī)則先把基礎(chǔ)設(shè)施搭好否則后面步步受阻。第一步創(chuàng)建目錄結(jié)構(gòu)和基礎(chǔ)文件。open-code-review 項(xiàng)目本身可以作為一個(gè)獨(dú)立倉庫管理規(guī)則和模板也可以直接把相關(guān)文件分布在你的業(yè)務(wù)倉庫里。我更推薦后者因?yàn)樵u(píng)審規(guī)則只有跟業(yè)務(wù)代碼放在一起才能跟著代碼演進(jìn)一起維護(hù)避免規(guī)則跟實(shí)際脫節(jié)。your-project/ ├── .github/ │ ├── PULL_REQUEST_TEMPLATE.md # PR 模板 │ ├── dangerfile.js # Danger 規(guī)則 │ └── workflows/ │ ├── ci.yml # CI 主流程 │ └── danger.yml # Danger 專用流程 ├── .husky/ │ ├── pre-commit # 提交前鉤子 │ └── commit-msg # 提交信息校驗(yàn) ├── commitlint.config.js # commit message 規(guī)則 └── .eslintrc.js # Lint 配置第二步配置 husky 和 commitlint。這一層的意義在于把問題攔截在源頭提交者在本地就能看到報(bào)錯(cuò)而不是等 CI 跑半天才發(fā)現(xiàn)問題。// commitlint.config.js module.exports { extends: [commitlint/config-conventional], rules: { type-enum: [2, always, [feat, fix, docs, style, refactor, test, chore]], subject-case: [0], }, }husky 側(cè)掛兩個(gè)鉤子pre-commit 跑 lint-staged 做增量 lint 和格式化commit-msg 跑 commitlint 校驗(yàn)提交信息。第三步配置 CI 主流程。GitHub Actions 的配置文件大致是這樣的結(jié)構(gòu)name: CI on: pull_request: types: [opened, synchronize, reopened] push: branches: [main] jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - uses: actions/setup-nodev3 with: node-version: 18 - run: npm ci - run: npm run lint test: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - uses: actions/setup-nodev3 with: node-version: 18 - run: npm ci - run: npm run test:coverage danger: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - uses: actions/setup-nodev3 with: node-version: 18 - run: npm ci - run: npx danger ci env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}需要注意的是Danger 在 CI 里的 token 有三個(gè)DANGER_GITHUB_API_TOKEN 或 GITHUB_TOKEN 都行GitHub Actions 會(huì)自動(dòng)注入 GITHUB_TOKEN所以不用額外配置。但如果你的倉庫是私有倉庫并且團(tuán)隊(duì)比較在意權(quán)限邊界可以單獨(dú)創(chuàng)建一個(gè)低權(quán)限 bot 賬號(hào)來發(fā)評(píng)論。4.2 規(guī)則配置從團(tuán)隊(duì)歷史事故里提煉規(guī)則這是整個(gè)項(xiàng)目里最有價(jià)值、也最需要花心思的一步。我不建議去網(wǎng)上找一份“最佳實(shí)踐清單”直接抄因?yàn)槊恐F(tuán)隊(duì)踩過的坑都不一樣。更好的做法是把過去半年線上故障和嚴(yán)重的評(píng)審漏判拉出來一個(gè)個(gè)分析當(dāng)時(shí)的評(píng)審過程中為什么漏掉了然后針對(duì)性地寫規(guī)則。舉個(gè)例子我們團(tuán)隊(duì)曾經(jīng)出過一次很嚴(yán)重的線上事故有人改了數(shù)據(jù)庫連接池的配置參數(shù)本來想加大最大連接數(shù)結(jié)果把初始化連接數(shù)寫超了導(dǎo)致服務(wù)啟動(dòng)時(shí)直接把數(shù)據(jù)庫連爆。這個(gè)改動(dòng)的 diff 只有一行而且那一行看起來人畜無害但險(xiǎn)就險(xiǎn)在配置項(xiàng)的名字非常相似。事故之后我們總結(jié)了一條規(guī)則如果你修改了配置類文件或環(huán)境變量相關(guān)代碼必須在 PR 描述里明確寫出“修改前值”和“修改后值”并說明為什么改。這條規(guī)則就變成 Danger 里的一個(gè)檢查項(xiàng)if ( danger.git.modified_files.some((f) f.includes(.env) || f.includes(config/)) ) { const body danger.github.pr.body || if (!/修改前|from:|before:/i.test(body) || !/修改后|to:|after:/i.test(body)) { warn(檢測到配置類文件變更請(qǐng)?jiān)?PR 描述中補(bǔ)充修改前后的詳細(xì)值對(duì)比。) } }類似這樣從實(shí)戰(zhàn)中長出來的規(guī)則才能讓團(tuán)隊(duì)心服口服。因?yàn)槊總€(gè)人都知道那條規(guī)則背后對(duì)應(yīng)的是一次血淚教訓(xùn)而不是某個(gè)外部專家憑空想象的教條。4.3 團(tuán)隊(duì)約定硬流程之外還需要對(duì)焦“軟共識(shí)”只有工具和規(guī)則是不夠的。open-code-review 落地之后我發(fā)現(xiàn)一個(gè)有意思的現(xiàn)象自動(dòng)化規(guī)則大家都愿意遵守因?yàn)闄C(jī)器不講情面但人工評(píng)審的質(zhì)量還是參差不齊有人習(xí)慣性點(diǎn) approve有人一句話不說直接鎖死 PR。后來我意識(shí)到問題出在缺少“軟共識(shí)”。所謂的評(píng)審文化不是一條規(guī)定能建立的。我在團(tuán)隊(duì)里推廣了幾個(gè)約定效果比預(yù)期好很多第一評(píng)審要在 24 小時(shí)內(nèi)響應(yīng)。不是要求馬上看完而是至少看一眼并回復(fù)“已開始評(píng)審”或者“今天忙不過來明天上午看”讓提交者心里有底避免 PR 石沉大海。第二評(píng)審意見要區(qū)分“必須改”和“建議改”。用前綴標(biāo)記比如[blocker]是必須要改的問題不開玩笑[suggestion]是可選優(yōu)化項(xiàng)提交者可以拒絕但要說明理由。這樣層級(jí)清晰不會(huì)因?yàn)橐欢研∫庖娧蜎]了關(guān)鍵問題。第三每個(gè) PR 必須有一個(gè)明確的第一評(píng)審人assignee。沒有第一責(zé)任人就沒有人為這個(gè) PR 的質(zhì)量負(fù)責(zé)沒人盯著的 PR 最容易爛尾。assignee 可以在創(chuàng)建 PR 時(shí)手動(dòng)指定也可以用 CODEOWNERS 文件自動(dòng)分配。# CODEOWNERS * backend-owner frontend-owner src/payment/ payment-team-lead第四定期輪換評(píng)審搭檔。長期固定一個(gè)人評(píng)審另一整個(gè)模塊容易形成思維定式看習(xí)慣了什么都覺得沒問題。輪換之后新人會(huì)問“為什么這里這么寫”這種“外行的問題”往往會(huì)暴露隱形的設(shè)計(jì)決策逼著提交者重新審視自己的代碼。4.4 度量與反饋用數(shù)據(jù)說話而不是憑感覺open-code-review 最后一塊拼圖是度量。說實(shí)話度量這件事很容易走極端有的團(tuán)隊(duì)一點(diǎn)度量不做有的團(tuán)隊(duì)把一堆亂七八糟的指標(biāo)貼墻上結(jié)果引發(fā)焦慮和攀比。我的建議是只關(guān)注幾個(gè)真正能反映結(jié)果質(zhì)量的指標(biāo)而且只用于團(tuán)隊(duì)自我改進(jìn)不用于績效考核。我目前覺得最有價(jià)值的幾個(gè)指標(biāo)評(píng)審響應(yīng)時(shí)長從 PR 創(chuàng)建到第一次有效評(píng)審意見的時(shí)間。太長了說明人手不夠或流程阻塞。PR 合并時(shí)長從創(chuàng)建到合并的完整周期。過長說明拆分粒度太大或需求太大。評(píng)審意見中被采納的比例低說明評(píng)審意見質(zhì)量有問題或者提交者太固執(zhí)兩種情況都需要介入。每千行代碼缺陷數(shù)上線后統(tǒng)計(jì)看流程改造前后是否有明顯變化。這些指標(biāo)我建議用 CI 的產(chǎn)物直接采集或者用 GitHub API 寫個(gè)小腳本定期拉取匯總# 簡單的上報(bào)腳本思路獲取合并的 PR統(tǒng)計(jì)從創(chuàng)建到合并的時(shí)長 gh pr list --repo owner/repo --state merged --limit 100 --json createdAt,mergedAt \ | jq [.[] | {title, durationHours: (((.mergedAt | fromdateiso8601) - (.createdAt | fromdateiso8601)) / 3600)}] \ | jq map(.durationHours) | add / length上面的命令輸出的就是最近 100 個(gè)合并 PR 的平均生命周期小時(shí)非常簡單但有效。度量不是目的通過數(shù)據(jù)發(fā)現(xiàn)流程瓶頸才是目的。比如我發(fā)現(xiàn)“評(píng)審響應(yīng)時(shí)長”指標(biāo)總是很高排查后才知道是 CODEOWNERS 自動(dòng)指派出了問題——某個(gè)模塊只指定了一個(gè)負(fù)責(zé)人那個(gè)人休假去了整個(gè)模塊的 PR 全都卡在他名下沒人接。后來改成每個(gè)模塊至少指定兩個(gè)負(fù)責(zé)人問題就解決了。5. 常見問題與排查實(shí)錄5.1 遇到過的典型問題速查表任何流程落地都會(huì)遇到抵抗和意外open-code-review 在實(shí)踐過程中也碰到過不少問題。我把最常見的幾個(gè)整理成了表格方便你直接對(duì)照排查。問題現(xiàn)象根本原因解決方案CI 一直不觸發(fā)Actions workflow 文件名不對(duì)或分支過濾寫錯(cuò)檢查.github/workflows目錄確認(rèn) on 配置包含目標(biāo)分支Danger 不發(fā)表評(píng)論token 權(quán)限不足或danger ci退出碼非 0確認(rèn)GITHUB_TOKEN的權(quán)限設(shè)置用danger ci --failOnErrors排查合并按鈕仍然可點(diǎn)分支保護(hù)規(guī)則未正確配置到倉庫 Settings - Branches 確認(rèn)規(guī)則已應(yīng)用注意舊 PR 不受新規(guī)則約束Lint 全量跑太慢沒有用 lint-staged 做增量檢查改用lint-staged只對(duì)暫存文件執(zhí)行 lint評(píng)審者習(xí)慣性點(diǎn) approve沒有強(qiáng)制要求填寫評(píng)審意見開啟 GitHub 的 code review 必須評(píng)論功能或在 Danger 里檢查 review 為空時(shí)提醒規(guī)則誤報(bào)太多Danger 規(guī)則寫得過于敏感對(duì)每條規(guī)則加白名單或閾值持續(xù)迭代規(guī)則提交者在本地繞過 husky--no-verify強(qiáng)行跳過鉤子靠 CI 層兜底本地鉤子是提醒不是安全屏障表格里最后一條最值得展開說。husky 本質(zhì)上是本地鉤子任何提交者都能用git commit --no-verify繞過去這是它的局限。所以完整方案里一定要有 CI 層做兜底比如在 CI 里重新跑一次 commitlint 校驗(yàn)或者 lint 檢查。本地鉤子的意義是讓大部分人少走彎路而不是防個(gè)別不守規(guī)矩的人。5.2 兩個(gè)真實(shí)問題的完整排查過程這里曬一個(gè)實(shí)際發(fā)生的排查過程幫大家建立問題處理的思路。有一次我們?cè)诮尤?Danger 的時(shí)候發(fā)現(xiàn) CI 里的 danger job 顯示綠色通過了但 PR 下面一條機(jī)器人評(píng)論都沒有。第一反應(yīng)是腳本邏輯有問題結(jié)果本地跑danger pr https://github.com/...又能正常輸出評(píng)論問題就壓縮到了 CI 環(huán)境。一步步排查先檢查了 Actions 日志發(fā)現(xiàn)danger ci這一行執(zhí)行的輸出里有一個(gè) warning提示Cannot find a danger token. Skipping message posting.。原因很清晰GitHub Actions 里雖然自動(dòng)注入了GITHUB_TOKEN但 Danger 在 ci 模式下讀取的是DANGER_GITHUB_API_TOKEN這個(gè)環(huán)境變量如果沒設(shè)置就會(huì)靜默跳過發(fā)評(píng)論的步驟。解決方式是在 workflow 里顯式加上環(huán)境變量映射env: DANGER_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}還有一個(gè)問題更隱蔽。團(tuán)隊(duì)里有位同事提交了一個(gè)純文檔改動(dòng)的 PR結(jié)果 CI 全部通過了但 Danger 卻 fail 了提示“變更規(guī)模過大”。查下來發(fā)現(xiàn)原因不是文件多而是danger.github.pr.additions統(tǒng)計(jì)的是整個(gè) PR 的增減行數(shù)而他提交的文檔里包含了一個(gè)很長的 SQL 導(dǎo)出的數(shù)據(jù)文件新增行數(shù)直接飆到了兩千多行。這個(gè) case 屬于規(guī)則設(shè)計(jì)時(shí)沒考慮到的場景我們?cè)谝?guī)則里加了一個(gè)白名單把以.sql、.lock、.min.js結(jié)尾的文件排除在統(tǒng)計(jì)范圍之外問題就解決了。5.3 避坑指南這五個(gè)坑我?guī)湍悴冗^了第一別在第一天就上全部規(guī)則??焖偕暇€會(huì)導(dǎo)致團(tuán)隊(duì)集體反感大家會(huì)覺得流程是來折騰人的。我會(huì)建議分三個(gè)階段第一周先上 PR 模板和 lint第二周上 Danger 基礎(chǔ)規(guī)則第三周開啟強(qiáng)制的合并保護(hù)。小步快跑讓團(tuán)隊(duì)逐步適應(yīng)。第二模板字段不是越多越好。字段太多會(huì)讓每個(gè) PR 的填寫成本極高最后大家都填“無”來敷衍。我的經(jīng)驗(yàn)是核心字段控制在 5 個(gè)以內(nèi)如果有信息確實(shí)需要但不想增加模板負(fù)擔(dān)可以放到 issue 模板里讓提交者提交時(shí)寫清楚。第三approve 會(huì)過期的設(shè)定必須開著。GitHub 提供了 “dismiss stale approvals” 選項(xiàng)我強(qiáng)烈建議打開。否則評(píng)審者周一 approve 了提交者周二又改了一版代碼舊 approval 依然有效等于改動(dòng)沒有經(jīng)過評(píng)審就直接合并了。這種拼配置的細(xì)節(jié)往往決定了流程的真實(shí)強(qiáng)度。第四自動(dòng)化規(guī)則不要寫得太執(zhí)著。機(jī)器判斷有天然的局限比如規(guī)則判斷“修改了測試文件”時(shí)如果一個(gè)人把測試文件重命名也算修改就會(huì)誤報(bào)。合理的策略是把自動(dòng)化當(dāng)作提醒用 warn 而不是 fail人工評(píng)審環(huán)節(jié)再?zèng)Q定是否攔截。第五記得給評(píng)審者和提交者都留出口。規(guī)則再完美也會(huì)有合理的例外。比如緊急 hotfix 需要繞過流程那就應(yīng)該提供一個(gè)明確的例外通道而不是讓人偷偷用--no-verify。我們?cè)趫F(tuán)隊(duì)里約定緊急修復(fù)可以直接在 PR 描述里加[hotfix]標(biāo)記CI 會(huì)跳過部分檢查但合并后必須在一個(gè)工作日內(nèi)補(bǔ)上測試。給規(guī)則開一個(gè)“白手套通道”反而比一刀切更容易被接受。6. 落地效果與實(shí)際數(shù)據(jù)這套流程到底改變了什么open-code-review 在我們團(tuán)隊(duì)跑了三個(gè)月的真實(shí)數(shù)據(jù)我覺得有必要曬出來。這里不是吹噓這個(gè)項(xiàng)目多厲害而是想說清楚一個(gè)樸素的道理流程本身不產(chǎn)生價(jià)值流程帶來的人們行為變化才產(chǎn)生價(jià)值。上線前我們統(tǒng)計(jì)了基線數(shù)據(jù)PR 平均合并周期 4.2 天評(píng)審中發(fā)現(xiàn)的邏輯類問題占全部問題的 12%線上事故中因評(píng)審漏判導(dǎo)致的比例約 60%。三個(gè)月后同樣的統(tǒng)計(jì)口徑下PR 平均合并周期降到 1.8 天評(píng)審中邏輯類問題占比提升到 37%線上事故中因評(píng)審漏判導(dǎo)致的比例降到 22%。有人可能會(huì)說周期變短是因?yàn)榇蠹也桓艺J(rèn)真評(píng)審了恰恰相反真正的原因是以前 70% 的等待時(shí)間被自動(dòng)化判斷消化掉了人工評(píng)審的時(shí)間反而更集中、質(zhì)量更高。邏輯類問題的占比提升反映的是評(píng)審者的注意力從格式、命名這些瑣碎問題上轉(zhuǎn)移到了真正影響系統(tǒng)健壯性的核心問題上。自動(dòng)化兜住了底線人力才敢往高處看。還有個(gè)隱藏收益是新人培養(yǎng)速度變快了。新同學(xué)以前要看老代碼怎么寫的、看評(píng)審意見猜團(tuán)隊(duì)風(fēng)格現(xiàn)在直接看 PR 模板、看 Danger 提示、看評(píng)審清單就能快速理解團(tuán)隊(duì)對(duì)代碼質(zhì)量的底線要求。這比請(qǐng)老同學(xué)講一個(gè)小時(shí)的“代碼規(guī)范”高效得多。7. 如果你想在自己團(tuán)隊(duì)落地我的幾點(diǎn)真心建議整個(gè) open-code-review 項(xiàng)目寫到這里我一直盡量避免把它包裝成一套“標(biāo)準(zhǔn)答案”。代碼評(píng)審這件事沒有銀彈不同團(tuán)隊(duì)的業(yè)務(wù)節(jié)奏、技術(shù)棧、人員構(gòu)成差別太大照搬任何方案都會(huì)水土不服。但如果要說有什么共性的東西值得借鑒我會(huì)總結(jié)成這樣幾句話。第一先診斷再開方。不要一上來就急著配工具先把團(tuán)隊(duì)最近兩三個(gè)月的 PR 瀏覽一遍看看時(shí)間都消耗在哪里問題主要集中在哪些類型上。有了數(shù)據(jù)基礎(chǔ)你才知道規(guī)則的優(yōu)先級(jí)怎么排。第二自動(dòng)化是解放評(píng)審者不是替代評(píng)審者。機(jī)器檢查、機(jī)器人評(píng)論、CI 門禁這些機(jī)制的價(jià)值在于把低價(jià)值勞動(dòng)從人類身上移走讓評(píng)審者把腦力用在高價(jià)值的判斷上。如果有一天我們發(fā)現(xiàn)機(jī)器人已經(jīng)能完全替代人類評(píng)審那我也舉雙手歡迎——不過至少目前代碼評(píng)審還是個(gè)需要人味兒的活。第三規(guī)則的迭代邏輯是“事故驅(qū)動(dòng) 數(shù)據(jù)驅(qū)動(dòng)”。每出一個(gè)線上事故就回顧評(píng)審環(huán)節(jié)能不能攔住每發(fā)現(xiàn)一個(gè)高頻誤報(bào)就調(diào)整規(guī)則閾值。這套機(jī)制跑起來之后規(guī)則不是越堆越多而是越來越精準(zhǔn)。最后再分享一個(gè)小技巧。如果你想讓團(tuán)隊(duì)愿意配合這套流程最好的辦法不是發(fā)全員郵件通知而是找一個(gè)大家公認(rèn)的質(zhì)量標(biāo)桿項(xiàng)目先試點(diǎn)等效果出來后讓數(shù)據(jù)說話。三個(gè)月后把“接入前后對(duì)比圖”扔到群里不需要你多解釋什么其他項(xiàng)目的同事會(huì)主動(dòng)來問你是怎么做的。我在實(shí)際推行過程中的體會(huì)是改變?nèi)说牧?xí)慣最好的工具不是制度而是可感知的價(jià)值。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 天天干人妻视频| 国产农村妇女精品一二区| 日本成a人v网站在线观看| 精品久久在线区一区| 中文字幕欧美丝袜07资源| 欧美性天天影视| 欧美性性性| 日韩pv中文| 丰满人妻被猛烈进入中| 精品国产乱子伦一区二区三区,精品一| 天美国产三级传媒| 黄色av一区二区在线| 天久久久噜噜噜久久国产精品爽爽| www.色婷婷| 91青青草| 欧美青青视频| 性色一线| 91色艳| 久久精视频美日韩在线视频| 国产操伦| 亚洲色吧网| 东亚亚洲无码高清| 69麻豆天美| 天天影视91看看| 自拍欧美| 久久一二三四五六七八九区区区| 岛国黄| 超碰9 7女人| 亚洲欧美伦综合| 97色在线观看| 国产精品 久久久精品一牛| 婷婷五月天激情四射| 精品少妇一区二区| 91爱啪| 97操B| 国产人伦精品一区二区三区| 亚洲欧美日韩综合在线尤物 | 麻花豆传媒剧国产MV出差| 91熟女在线| 亚洲宗合网| 精品久久視頻在线| 色人久久| 探花一区在线| 日本成人A片免费看| 亚洲综合另类小说色区亚洲成av人片在www | 九九九热精品| 老熟女乱伦片| 中文字幕乱在线伦视频中文字幕乱码在线 | 试看福利| 九一综合精品视品av| 天堂九九九九九九九九九| 日本媚薬中文字幕在线| 首页亚洲国产高跟丝袜诱惑视频| 综合激情五月天| 99热这里只有精品18| 久久久久久久9| 另类图片欧美激情综合| 7777奇米影视久久| 天天干人人看综合| 欧美天天干| 自拍六区| 1769一区| 日韩黄色成人性爱| 色999;丁香五月| 人妻加勒比东京热| 美女网站黄页| 超碰在线第一页| 青青草中日韩在线| 国产精品久久蜜乳av| 1级黄色夫妻对换性交免费看| 被操高清无码视频| 日本在线视频导航| 蜜臀在线免费观看在线免费观看| 精吧天堂| 99热在线观看| 成人无码影片视频在线| 精品人妻夜夜草| 夜夜嗨AV蜜臀av| 搡老女人老91妇女熟女| 一本大道青青| 操逼日韩无码 | julia高潮后不停追击中出| 97亚洲资源| 麻豆区99999| 日韩内射视频| 久久区| 国产精品亚洲一级av第二区| 色性综合| 亚洲自拍小说| 免费A V在线播放| 爱媛媛久久国产福利| 性高潮久久久| 国产熟女自拍| 狠狠入| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 日韩啊V| 国产精品久久久久久久毛片1| 亚洲 日本 国产 综合| 先锋精品av色鲁| 久久九操在线观看| 一起草日韩| caopeng97| 97超碰久久| 亚洲天堂99| 色综合超碰超| 大香蕉AV在线| 色九色久| 3p国产欧美99热| 日韩久草| 精品国产人成在线| 熟女欧美日韩综合婷婷| 91久久久亚洲| 欧美九九爱| 在线中文字幕| 99久久婷婷国产综合| 欧美在线 亚洲| 中国少妇XXXX做受| 色臀aV| 很黄很色的视频在线观看| 色综合加勒比四四季| 一起草三级AV电影在线观看 | 免费观看的av| 亚洲吊色| 久久久亚洲| 日韩av女优在线免费一区| 丰满人妻-区二区三区免费看| 996热| 日韩无码人妻中字久久三区四区| 怡红院视频在线| 在线综合网| 亚洲性爱无码乱伦av| 欧美aⅴ99久久黑人专区| 国产AAAAAABBBBB| 五月天婷婷激情| 久久同城AV| 翔田千里AV无码秘 三区| 蜜乳AV一区二区三区四| 日韩91网| 欧美激情精品久久久| 亚洲最大的综合性av| 熟女91网| 夜夜高潮夜夜爽高清视频一| 国产免a费看黄片在线| 精品久久九| 超碰无码五月97| 国产欧美亚洲精品a第2页| 人妻夜爽夜夜爽| 久久婷婷国产一区二区色| 97在线观看免费视频| 强上我不卡卡| 久久女同性恋一二区| 乱伦AVxx| 天天爽爽爽爽| 日韩综合色网| 国产精品激情久久久久久久| 久久久专区| 婬女免费一二三区A片| 99热伊人| 91色插| 中文字幕一区 二 区 三 四 五 区日 日 骚| 丁香七月婷婷| 久操av在线| 久jiu久神马影院| 91 丝袜在线观看| 国产精品91ai| 久草午夜| 亚洲色图自拍| 好看的91视频| 翘臀vidoes| 肉嘟嘟www视频在线观看高清| 欧洲亚洲人妻无码久久三区四区| 精爱久久| 天天欧美欧美亚洲网| 404操逼福利视频| 国产精品一区二区久久精品| 欧美一级专区免费大片| 免费看黄视频亚洲网站| 男人天堂新| 曰本熟女视频| 日欧毛片久久| 97一区二区蜜臀| 免费看欧美美女黄色大片| 免费啪啪av| 欧美精品三区| 97天堂| 日韩 女同 综合| 2019天天操天天爽天天拍| 亚洲 图片 综合91| 啊啊啊操一区| 91在线免费观看处女| 秋霞一集毛片观看| 久久鲁夜| 亚洲欧美中日韩| 99亚洲精品| 欧美精品自慰系列寂寞少妇| 伦伦成年午夜免费视频| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 熟妇乱伦一区二区| 91制服丝袜中文字幕| 91亚洲欧美综合高清在线| 久久久性爱视频| 91 手机在线播放 绯色| 色五月激情综合网| 久草成人福利导航| 久久久久久亚洲精品不卡人乳| 新版天堂中文资源8在线| 国产偷拍自拍在线视频| 欧美日韩性爱精品| www色日本| 麻花传媒免费网站在线观看| 99精品成人免费看| 色色色综合网| 先锋精品av色鲁| 婷婷99| 欧美丝袜制服久久| 国产精品午夜高潮呻吟久久av| 青娱乐国产盛宴视频| 插穴性爱视频在线观看| AV免费在线播放一区| 久久成人国产| 亚洲人妻爽爽爽| 五十路熟女,国产欧美精品区一区二区三区| 久久久久9999妇女| www.高清无码诱惑一区.com | 强奸乱伦大香蕉网| 伊人网在线点播| 偷偷人人精品女女久久| av东京热男人的天堂| 亚州高清色综合| 啊啊啊啊啊好舒服视频| 97超碰站| 日韩不卡av一二三| 96免费视频在线| 大香蕉琪琪日本女优不卡| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 男人的天堂久久久| 国产色综合亚洲色综合吹潮| 日韩丰满熟妇| 人妻激情另类| 欧洲小说色图视频另类| 97在线免费看视频| 人人看人人摸人人色| 日本超碰在线国产一区| 好屌色综合| 91岛国动作片| 狠狠中文字幕| 免费农村成人少妇人妻Aa一区二区视频 | 日韩av色图| 青青草原av| 欧美gv在线观看| 久久久97| 婷婷视频在线免费观看| 日韩三级网址| 日本在线999| 国产在线能看的你懂的| 日本女人操逼| 人妻大香蕉| 欧美 精品国产制服第一页| 国产探花精品在线| 一区二区首页| 友优传媒精品在线一区二区| 日本熟妇人妻中出视频| 97se综合网| juliaann欧美丝袜办公室| 日本性爰一道本| 一本正道久久熟女| 男人的天堂va| 久久最新免费视频23| 大屁股熟女一区二区三区| 日本人妻中文字幕| 青青色综合| 欧美色青| 丁香六月综合激情| 97在线观看视频| 欧美顶级黄色大片免费| 久久久久ab| 黑人娇小av在线播放| 丁香五月电影| 日韩欧美久久婷婷网站| 欧美午夜视频精品久久| 免费看污网址| 久久精品国产亚洲AV成人直播| 久久久久久中文版| 精品国产一区二区三区四区在线看| 日日干日日| 亚洲色天堂九9| 玖玖玖玖精品国产剧情| 97中文字幕一区| 亚洲 欧美 手机在线观看| 日韩电影天堂视频一区二区| 欧美18 在线观看| 超碰97资源大奶| 可免费观看的av毛片中日美韩| 亚洲国产第一页综合视频| 9美女超碰在线免费观看| 乱伦AVxx| 91n处女在线观看| 九九久久99| 亚洲成人在线乱码色午夜| 搡老熟女老女人老熟妇免费视频| 亚洲麻豆18发?| 日韩不卡a级视频专区| 中文日韩欧美熟| 秋霞影音一区二区三区| 台湾佬中文娱乐网久久久久久久久久com | 成人a大片在线观看| 国产精品天干天干综合网麻豆| 91av一区二区在线观看| 天天天天天超碰| 亚洲中文国际强奸字幕| 丝袜视频网国产90| 97人人中文网| 乱伦Av网| 亚洲男人的天堂va亚洲男人社| 91在线页| 操逼视频色| 老熟女中文字幕高清| 在线观看日韩av不卡| 日韩九九九| 人妻在线臀日韩| 天天躁日日躁AAAAXXXX国产 | 天天弄天天操| 九九热精品视频六| 国产午夜福利视频在线| 国产色精品午夜大片| 97在线视频免费看| 诱惑人妻欧美一区在线播放| 欧美特大黄一级片片免费| 9丨久久九九九| 厕所偷拍在线| 欧美日韩性爱视屏免费看了| 少妇厨房愉情理伦片bd在线观看| 中国国产精品一区视频| av资源在线播放天堂| 国产一区二区二区按摩精品啪视频| 欧美色66| 懂色AV一区二区三区| 大香蕉免费3| 欧美另类天堂| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 26uuu国产成人综合| 密臀成人视频久久久| 美日韩一卡二卡三卡免费人妻精品| 久操网视频| 91伊人| 伊人网在线视频| 欧洲综合视频| 色99在线| 少妇xx精品| 亚洲成a人v欧美综合天堂下载| 色爽——AV| 精品无吗久久| 久久亚洲天天做| 丁香九月婷婷| 影音先锋中文字幕日本好一区二区| 欧美精品二区视频在线| 日本色日夜干| 久久尹人大香焦视| 欧美专区17页| 亚洲国产亚洲天堂| 欧美高清无码免费视频高清版| 伊人色综合欧美| 日本精品人妻少妇一区二区| 午夜精品99久久久久传媒| 图片区小说区| 亚洲97久久精品亚洲| 看免费一级在线播放毛片| 97超碰欧美精品| 欧美小说区视频区| 夜夜高潮夜夜爽国产伦精品| 欧洲大香蕉| 久色99999| 欧洲亚洲人妻无码中字久久三区四区 | 天天做日日爱夜夜爽| 亚洲欧洲自拍图片专区满春格| 欧美97色| 91丨人妻丨国产丨丝袜| 久久久久久久强迫| 国产成人欧美精品在线| 成人免费性爱视视| 26uuu最新| 亚洲国产精品无码AV久久| 日韩一级二级三级免费看完整版| 蜜臀久久99精品久久久久久酒店 | 懂色中文一区二区三区| 国产精品一区二区亚洲人成毛片| 婷婷在线视频在线观看| 欧美一级美片在线观看免费| 天天躁日日躁AAAAXXXX国产| 99re国产精品视频| 亚洲无码AV九九九| 综合欧美日本三级| 欧美综合骚| 人妻精品综合中文字幕在线| 国产精品在线网站| 少妇精品久久久八区九区| 男人的天堂三级| 乱伦熟女区| 色综合久久888| 久久久人体| 射欧美综合| 97精品国产精品免费观看| 精品妇操一区二区三区| 啊啊啊好大好深| 97天天摸天天爽| 激情婷婷综合久久| 尤物一级在线免费观看| 理论久久婷婷网 8| 一区二区视频你懂的| 999熟女精品| 黑人在线91| 日本一级特级毛片视频| 欧美午夜一区二区三区| 蜜桃成人1区2区3区| 亚洲视频小说| 日本精品一区二区不卡| 最新av网站在线观看| 国产一级作爱毛片| julia在线观看久久| 久久宗合亚洲| 蜜臀99久久| 亚洲av综合色区无码一| 香蕉一区二区三区在线视频| 无码九九| 国产精品久久aV| 在免费jIzzjIzz在线视频| 国产女人高潮视频| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 亚洲性天堂| 国产女人和拘做爰视频 | 91天天综合| 国产 热久久久久国产精品| 香蕉综合网| 无码久久国产 | 欧美在线亚洲| 日韩一级成人毛片免费观看| 1956日韩精品| 肥佬影院91| 91精品微拍福利| 色婷婷视频| 日本顶级天天操狠狠操夜夜操中文字幕| 中文久久久| 国产精品自拍欧美在线| 日韩久久艹| 亚洲精品97| 日本人妻A片成人免费看片| 亚欧美综合网。| 亚洲 欧美 日韩 国产一区二区| 五月香婷婷| 91激情国产| 日韩无码黄色片| 国产黄色动态精品| 国内偷拍精品一区二区| 亚洲综合小说另类图欧美视频激情小说色五月天 | 中文字幕一区二区三四五区日日骚| 亚洲无992tv| 操碰97| 欧美综合色综合| 国产精品久久久久亚洲av| 亚洲精品骚逼| 亚洲无线码欧洲精品区别| 九九九九九九九九九九九免费国产| 亚洲图片 欧美电影| 99久久久无码国产精品性男| 日韩av电影网站| 国产女乱淫真高清免费视频| 午夜久久久| 久久久国产成人一区二区三区在线| 欧美影音在线| 久操视频资源站公开| 天美传媒av在线| 日韩国产在线观看av| 国产传媒午夜理伦精品| 97在线观视频免费观看| 国产三区免费在线观看| 久久精品女同亚洲女同13| 91天堂色男人的天堂| 亚洲亚洲亚洲天堂天堂| 日本精品高清一二区一本到| 成人资源中文字幕在线观看| 在线日韩视频| 欧美色999| 综合激情97 | 亚洲情色一区综合| 久久性爱精品一区| 国产乱子伦一区二区三区免看| 日本一区二区不卡精品| 老熟女阿 国产91| 清柠毛片| 无码操逼视频一下| 亚洲 欧美 综合 91| 国模精品娜娜一二三区| 男人天堂欧美| 欧美亚洲美少妇一区二区| 成人免费在线网站| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 亚洲中文字幕久久无码精品| 欧美日韩高潮喷水91| 国产拍偷精品网站| 日韩二区三四区五区六区在线看| 婷婷色五月激情| 欧美精品宗合| 国产成人啪一区二区| 不卡在线一区,精品一区二区三区中| 国产 日韩,欧美 自拍| 好看的久久不射无码影视影院| 日韩不卡av一二三| 亚洲春色欧美激情自拍| 亚欧洲日韩国产精品| 99热精品国产| 91九色网| 多毛小伙内射老太婆| 就去色综合| 午夜精品久久久久久久99热影院| 丁香六月啪| 日韩欧美大力操| 久草新在线| 久久久禁| 九九热免费在线国产视频伊人五月| 思思在线免费视频| 国产在线能看的你懂的| 亚洲欧美综合网| AV在线资源| 国产久久一区二区午夜| 丁香六月啪| 青青伊人这里只有精品| 中文?日韩?免费?精品| 欧日韩一二三f区| AV中文字幕剧情1区2区3| 美女尤物福利视频| 午夜男人一级A片7777| 日本免费人成视频播放120秒| 69精品| 人妻喷水| 啊啊啊轻点在线观看| 久9久9精品| 久久人人爽爽爽人久久久| 六月丁香啪啪啪| 天天天天天天天天天天干美女| 欧美18老人禁| 久久久久久久一级黄色打同平台| 色综合天天| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 久久受www免费人成| 日韩三级伊人| 2020中文字幕| 亚洲在线A| 日韩av性爱在线播放| 国产自产自拍| 人人搡人人肉久久精品| 999久久久国产精品| 日韩一级特黄av毛片| 极品另类| 亚洲欧美小说| 亚洲无线观看久久| 白丝一区| 综合伊人网12色| a片在线播放| 国产资源中文字幕在线| 成人av在线播放| 黄色香蕉视频网站一区| 俄罗斯一区二区视频在线观看| 在线αⅴ| 精品人妻一区| 国产亚洲日本精品在线| 大香蕉综合网| 黄色污污污污污污网站| 亚洲情色一区三区| 久久久久久久久久久999| 伊人玖玖网| 91美女视频电影| 久久久女人| 欧美在线91| 精品国产乱码| 天天色播亚洲综合网站| 青草视频在线看看看看看看看看看| 激情综合网激情五月天| 欧美熟妇乱码在线一区| 综合激情一一91| 情色大香蕉| 久久97| 亚洲AV麻豆Aⅴ无码电影一| 性爱视频免费网址| 国产吞精a级片激情电影| 资源在线观一 二| 久久神马影院| 国际精品久久久| 亚洲不卡三级手机播放| 欧美十八禁网站| 欧美后进式| 九九九精品一区二区无码| 四虎精品永久在线观看| 亚洲 欧美 日韩 国产一区二区 | 成年女人18级毛片毛片免费观看| 青青草视频这里只有精品| 夜夜騷av、一區二區| 亚洲脚交| 无码免费在线观看黄色片| 亚欧高清v| 夜夜操av亚洲一区二区| 91亚洲黄色网| 三级AV入口| 丝袜美腿诱惑亚洲欧美视频在线观看| 天天插夜夜爽| 三上悠亚在线毛片91| 日韩精品黄片免费观看| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 熟女高潮合集-永久久久-成人AV | 婷婷综合网站| 69久久久久久久久久久久久| 亚洲色人| 9l视频自拍9l九色成人| 欧美久久人妻少妇一区二区| 亚洲伊人成综合成人网| 综合网色| 91n.欧美| 国产 无码 一区二区| 超碰在线974| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 欧美精品三级黄片| 99热官网| 国产一区二区在线看| 无码天天操| 二对二中文字幕。| 百度百度日本操逼| 欧美亚洲综合色| 欧美啪啪啪91| 立川理惠无码一区二区| 九七人妻在线| 2019天天干天天操| 国产亚洲日本| 大黄片做爱的大的| 9999亚洲电影| 色就色综合| 国产精品欧美激在线| 欧美性爽xyxOOOO| 欧美另类色| 97视频在线免费观看| 大香蕉免费中文| 伊人九九九| 色婷婷丁香五月| 粉嫩av一区二区三区天美传媒 | 夜夜高潮夜夜爽夜夜爱爱一区| 日本一本道A级黄色毛片试看60分钟| 操逼999| 在线一道啪| 久久精品电影| 亚洲最大无码中文字幕网站 | 欧美国产伊人久久久久| 职场同事知名国产国产精品久久欧美日韩 | 国产亚洲色婷婷久久99精品91| 亚洲天堂电影网99999| 亚洲天堂久久| 91天美| 久热69九色熟妇97| 蜜乳成人AV| 色制服丝袜夫妻av一区| 无码聚合| 蜜臀AV午夜精品久| 色蜜AV| 人人爱人人乐人人操| a人欧美综合天堂麻豆| 日韩 欧美 另类 人妻| 中日韩久久久免费看| www.色婷婷.com| 色呦呦国产精品免费看| 91激情综合| 亚洲成人免费电影| 国产无马在线| 一摸二插三插| 亚洲 欧美 中文 日韩超碰| 人妻干天天| 另类图片五月天| 日韩人妻操B| 国产99精品一区二区三区免费| 午夜精品久久久久久久| 国产亚洲 中文欧美久久| 性暴力欧美猛交在线直播| 亚洲91综合| 91xingse| 日韩精品黄片免费观看| 91丝袜在线观看| 小骚逼被操的爽不爽| 九九AV| 嫩草美女久久| 欧美亚洲特P| 亚州色图欧美| 91oumei| 无码最新| 少妇久久久| 91精品人妻五十路| 很黄很污的免费网站| 亚洲无码一区二区三区三州| 一级性爱视频免费在线| 日韩无码服务区| 久久AV无码1区2区3区| 九九性视频| 国产51色综合久久免费| 亚洲精品97| 五月天精品| 青青草五月天| 99re6国产精品99re在线| 精品国产www久久| 91啦人妻| 亚洲丝袜诱惑| 国产后入式在线观看| 区二区亚洲婷| 福利风月五月天影院| 欧美视频在线视频免费va| 99久国产精品午夜性色福利| 91久久久久久久久18| 成年在线视频日本亚洲在线视频区精品江靖宇公司| 久久久久9久久久久| 国产精品亚洲免费| 黑人无码一区二区| 人人潮人人摸| 看免费一级在线播放毛片| 国产日韩久久| 久草免费在线视频| 精品视频一区二区| 丝袜狠狠草尤物 91| 亚热日本熟女| 天天干天天中出av| 九九九九九九成人| 一区中文字幕二区日韩| 厕所偷拍在线| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 视频在线观看一二三区| 超碰调教97| 偷拍 精品另类 凸凹了四区| 激情五月天综合网| 五月天啪啪| 日本福利社| 天天干少妇| 国产av尤物| 久久一二三四五六七八九区区区 | 亚洲美女色图| 国产熟妇一区二区| 欧美熟妇亚洲版| 蘋果手機免費看成人Av| 超碰97亚洲区| 日日日日做夜夜夜夜做无码97| 4虎在线视频| 国产亚热在线久久| 亚洲一区二区中文字幕| 91欧美色| 人人爱人人乐人人操| 国产精品4p在线观看| 国产一区二区三三视频| 日韩欧美aⅴ综合网站发布| 黄片色区软件| 久久色情| 一二三啪啪专区| 操逼精品视频| 韩国毛片一区二区三区| 91色夜| 国产91影院| xxxx网站亚洲精品| AV综合中文字幕干| 无码99| 97在线无精品| 96国产精品| 大象AV在线| 思思热久久成人| 日韩性爱网址| 高清不卡一二三区视频......| 污污污8888| 超碰天天去日穴| 欧美一区二区男人天堂| 熟女五十路一区二区三| 激情av| 操香逼| nuu12国产麻豆精品| 欧美资源| 乱伦3P视频| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 中文字幕老熟妇黄色视频| 91中文精品日韩欧美在线| 亚洲脚交| 欧美一级美片在线观看免费| 国产亚州日韩欧美看片| 九九十八精品| 99久久久| 人妻 丝袜美腿 中文字幕| 思思99热| 亚洲一区制服诱惑| 丁香婷婷五月| 色色色综合网| 久久久久久久六六| 国产一区二区三区高清视频| 国产动漫操逼视频| 成人五月天色网| 久操免费观看| 亚洲AV无码成人精品久久| 九九成人精品| 亚洲色天| 99热精品免费| 久久久一区二区| .精品人妻一区二区三| 99这里有精品视频| 国产精品乱码久久久久久| 一级性爱视频免费在线| 国产玖玖| 清纯唯美综合| 国产精品久久成人免费| www.高清无码诱惑一区.com| 97在线免费| 丁香激情网| 中出91视频| 国产精品一二三在线看| 欧美白嫩在线放| 成人免费性爱视视| 天天综合亚在线| 国产sv美女内射| 国产吞精a级片激情电影| 欧美亚洲成人在线一区二区三区| 摸奶性爱视频网站在线免费播放| 啪啪91| 天天影视亚洲| 人妻少妇久久久| 超碰97日韩| 日韩999| 天堂亚洲精品| 日本高清久久| 密臀在线一区尤物| www.狠狠操| 日韩精品啪啪啪| 久/久精品99看9| 久久久久女教师免费一区| 国产精品久久久久久久久AV大片| 欧美91久久久久| 91丨熟女丨丰满熟女| 91欧美性| 日本精品高清一二区一本到| 午夜精品久久久久久久| av婷婷色婷婷色六月| 激情情色五月天| 国产 v乱码一区二| 凹凸 69堂 在线播放| 夜夜草网站| 91久久国产精品| 国产原创自拍| 久久久精品| 99操| 国产AV久久野战精品| 国产精品第一页国产大屁股视频免费区i | 性色高清在线| 无码丰满熟妇一区二区浪潮AV| 伦在线97| 5月婷婷6月六月丁香| 99AV| 97蜜桃综合| 欧美午夜视频免费观看| 女上位精品在线| 伊人久久88国产女| 超碰日韩人妻| 很狠操| 超碰人人妻| 男插女青青影院| 国产第11页| 99久热| 亚洲欧洲自拍图片专区满春格| 久色99999| 色色色综合网| 狠狠操官网| 色与欲影视天天看综合网| 热久久91婷婷| 欧美日韩 强奸乱伦| 久九九九九九九九热| 精品久久99| 国产精品无套内谢| 国产白丝AV| 欧美亚洲se91| 天天干一干| 操逼免费视频无码国产| 好爽视频在线观看| oumeizonghese,www| 亚洲综合九九| 欧洲综合无码| juliaann欧美丝袜办公室| 超碰99热中文字幕| 99热综合| 国产精品一级特黄aaa大片在线观看| 91欧美情色| 亚洲日产专区婷婷| 亚洲色吧网| 国产亲戚伦亲在线| 肉动漫无遮挡h在线观看| 麻豆区久久久久亚| 色眯眯射| 久久超碰爱| 女人高潮抽搐喷水视频网站| 国产一区二区三区白丝| juliaann欧美丝袜办公室| 999 久久久| 男人的天堂.com| 九九热超碰| 亚洲国产午夜真人一级片中文字幕精品黄网站| 91美女视频在线观看| 亚洲成人AB| 色偷综合| 精品九九九九九九九| 婷婷香蕉欧美在线一区二区三区| www.色婷婷色综合| 操逼www.| 国产久久成人| 国产亚洲福利第一页丝袜| 97超碰9| 后入日本1234| 国产1727欧美| 日本不卡二三区| av在线人气| 亚欧精品久久久久久久久久久| 日韩乱插| 3p国产色噜噜一区| 国产亲戚伦亲在线| 少妇高潮对白在线观看| 日韩色欲久久一二三四区| 欧美特大AA级黄片| 操b在线观看| 手机看片91人妻| 亚洲av噜噜噜噜噜噜| 免费国产视频| 啪啪啪亚欧美视频| 2017天天插| 大香蕉淫人网| 啊啊啊啊好多水| 午夜啊啊| 久艹日日日| 黄骗免费网站| 精品视频一二三中文| 神马麻豆福利院| 丰满人妻一区二区三区免费 | 久久久久久电影| 欧美日韩大黄片| 一区不卡在线观看av| 天天干天天燥| 亚洲国产欧美另类自拍| 久操com| 亚洲日韩美女中文字幕乱| 欧美日韩激情无码专区| 久久九九国产精品| 亚洲偷拍自拍在线视频| 色丁香五月婷婷| 欧美毛片在线网| 操穴国产| 色五月天AV| 色哟哟av网址| 竹菊一区二区三区AV线| 日韩啪啪视频| 国产美女在线精品免费看| 在线人成亚洲视频免费观看| 俄罗斯一区二区视频在线观看| 思思热久久成人| 美女被艹尤物视频| 91久久久久免| 强上我不卡卡| 91影视亚洲| 亚洲男人在线观看天堂| 97久久超碰| 18禁免费视频| 9l视频自拍9l九色成人| 91色碰| 色噜噜人妻丝袜AV资源| 啊啊啊啊好大好硬啊啊啊啊啊| 99草精| 91久久青青草原精品| 午夜国产乱伦视频| 天天躁日日躁AAAXX| 日韩女优中文字幕| 大香蕉之青青草原| 91丝袜| xxxx网站亚洲精品| 激情综合五月婷婷| 久久久久久久久久黄色网| 久草老司机| 国产精品不卡av免费在线观看| 日本天天操| 91精品国产综合久久久蜜臀| 成熟熟女国产精品一区二区| 日韩猛交| 国产午夜激片Av毛片不卡| 男人的天堂亚洲| 96久久久精品| 久久久久亚洲Av无码专区老牛影视| 淫荡少妇免费| 人妻夜夜爽天天爽麻豆三区网站 | 亚洲av性爱电影| 久久久 国产精品| 99爱久久视频频| 久久久亚洲熟妇资源| 国产又黄又粗的视频| 色五月亚洲| AV色五月天| 自拍内地三级在线观看| 日韩中文欧美| 夜夜免费视频| 亚洲啪啪视频免费| 欧美亚性天堂| 亚洲熟女一区二区| 激情网色| 青青操少妇| 日日夜夜精品视频| 色婷婷丁香五月天| 亚洲少妇激情一区二区三区| 成人免费毛片| av婷婷色网| 成人怡红院| www久久99| WWW美腿丝袜香蕉中文| 中文精品一区二去| 亚洲五区熟女| 亚洲中字幕日本一区二区三区 | 日韩视频中文字幕| www.超碰| 91热| 久久草在线综合视频| 亚洲综合69| 黄色AAAAA欧美| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 超碰97男人| 一二三区操逼国产91| 视频二区美腿丝袜制服人妻欧美| 婷婷性网| 色综合久久888| 精品人妻一区二区蜜桃视频| 国产色呦呦| 日韩丨制服丨中文|在线| blacked精品一区国产| 很很很很操| 久久综合资源一区二区| 97超级欧美| 日韩欧美成人性爱在线| 久操在97| 成人午夜小视频手机在线看| a片亚洲一本通视频| 奇米狠999| 天天爽入口| 久久综合激情| 99夜夜操| 亚洲中文字幕妇伦久久| 免费视频在线一区二区不卡| 精产国品一区二三产品| 国产免费内射视频| 久久久久久久久久黄色网 | 91人妻爽爽人人做人人澡| 日天天九九天堂666| 日韩性爱视频免费在线| 色天天野狼综合社区| 极品极品色影院| 天天干人人乐| 久久熟女人| 青草草免费网站av| 九九九九一级| www.yw尤物| 久久精品| 欧美国产有色电影| 影音先锋中文字幕日本好一区二区| 四虎免费在线播放| 日本有码久久| 啪啪啪东京| 欧亚日本情色| 青青草原人妻| 伊人久久在线视频观看| 国产精品午夜精品| 日本高清电影欧美色图| 国产精品盗摄 偷窥盗摄| 国产欧美黑人丰满在线| 日本人妻A片成人免费看片| 性天堂| 热久日综合| 色墦五月丁香| 综合av社区| 熟女熟妇伦久久影院毛片一区二区 | 国产超碰国产97| 亚洲国产精品9999在线观看| 欧美色图99| 97色诱| 91狠狠综合久久| 国产黄色小视频网站| 久久久涩| 999综合色| 男人的天堂2010| 国产综合网站在线播放 | 日本精品五区| 91精品免费| 在线女人91| 青草av在线| 亚洲无码成人精品| 狠狠爱夜夜| 射丝袜大香蕉| 久久久久骚| 国产女人成人精品视频| 中文字幕高清精品一区| 男人的天堂久久| 国产av波波国产精品| 伊人久久艹| 人人艹亚洲| 91bbb| 亚洲精品白丝| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 婷婷色网| 射 色综合| 久热91| 看一级特黄a大一片| 人人看黄色视频| 99精品九九九九九九| 色在线69堂| 男生女生啊啊啊啊| 97亚洲性爱| 99亚洲天堂| 久久精品亚洲成a人天堂| 八戒无码国产午夜福利| 97综合网| 久久啊啊啊| 综合亚州欧美| 亚洲人人夜夜澡人人爽| 人人妻人人色| 97干色天堂| 欧美中文字幕男人天堂久久精品 | 亚洲小说视频| 99视频自拍区| 国模91| 男人的亚洲天堂| 蜜臀久久久| 美女91在线观看| 亚洲日韩青青草色月| 久妇网| 韩国久久97| 黑丝少妇| 伊人久久88国产女| 国产精品色| 婷婷五月天补不补| 亚洲天堂男人在线| 综合影院亚洲| 日韩三四五区| 日本天天吊| 丰满人妻一区二区三区在线| 国产av白丝| 精品福利视频| 欧美午夜色妇色鬼| 日韩欧美丝袜诱惑| 伊人 俄罗斯 a v| 欧美青青视频| 后入式视频国产自| 免费草草草草草视频| 女同性恋中文字幕| 在线洲亚线| 日韩猛交| 色哟哟 日韩精品| 摸奶性爱视频网站在线免费播放| 高清在线不卡一区二区 视频| 亚洲欧洲自拍图片专区满春格| 青草草免费网站av| α√在线| 伊人久久婷婷| 狼人综合婷婷激情四射 | 日日夜夜精品视频| 人人做天天爱|