免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

Python項目CI/CD流水線實戰(zhàn):從依賴管理到自動化發(fā)布

Python項目CI/CD流水線實戰(zhàn):從依賴管理到自動化發(fā)布 很多Python項目團(tuán)隊有個通病代碼寫完本地一跑就完事測試敲一遍就推了等合并到主分支、上線出故障才開始手忙腳亂。我在過去的實戰(zhàn)里給不同類型Python項目——從依賴復(fù)雜的算法服務(wù)到快速迭代的Web后端——都配過一套持續(xù)集成/持續(xù)部署CI/CD流水線今天把沉淀的思路、工具選擇和實操細(xì)節(jié)完整攤開說一遍。這篇內(nèi)容適合剛接觸CI/CD的初級開發(fā)者也適合已經(jīng)跑了Jenkins或GitHub Actions但總被緩存和依賴問題折磨的團(tuán)隊哪怕你現(xiàn)在還沒準(zhǔn)備好上完整的持續(xù)部署只要能先把“提交代碼后自動跑測試和檢查”這一件事做好這篇文章就能給你省下大量時間。我一直覺得CI/CD對于Python項目有一種獨特的厚重感。Java和Go有成熟的構(gòu)建工具編譯自己會兜底錯誤但Python是動態(tài)語言環(huán)境的差異、依賴的版本、解釋器的行為每一個環(huán)節(jié)都可能讓“我電腦上明明能跑”變成一句讓人頭疼的話。所以我的思路從來不是“把CI/CD當(dāng)成上線按鈕”而是把它當(dāng)成一套完整的“代碼體檢和心理護(hù)欄”下面從設(shè)計拆解開始說起。1. 整體設(shè)計與思路拆解1.1 先搞懂CI/CD是在解決什么痛點持續(xù)集成Continuous Integration的核心含義是讓團(tuán)隊所有成員的代碼頻繁合并到一個主干上并在合并之后第一時間通過自動化腳本驗證這套代碼是否還能正常運行。持續(xù)部署/持續(xù)交付Continuous Delivery/Deployment則進(jìn)一步把通過驗證的產(chǎn)物自動推到測試環(huán)境甚至生產(chǎn)環(huán)境。用生活類比來說CI就像是每天下班前的例行體檢CD則是體檢合格后直接給你開好第二天的通行證。但我看到太多團(tuán)隊把CI/CD做成了“自我感動”。流水線里跑了一堆步驟真實能攔截的問題卻沒幾個最后大家只想快速跳過紅叉。問題通常出在設(shè)計上把CI/CD當(dāng)成一個靈丹妙藥而不是當(dāng)成一個需要結(jié)合自己項目特性去量身定做的流程。我的建議是先想清楚三個問題再動手你的項目有哪些“必須在合并前明確的紅線”你的依賴和運行環(huán)境有多少種組合需要同時驗證你的發(fā)布流程是人工審批多還是全自動多1.2 Python項目做CI/CD的三個特殊難點第一個難點是環(huán)境隔離。Python的依賴真的很容易變成依賴地獄系統(tǒng)自帶Python、虛擬環(huán)境、Docker和不同包管理器之間的版本糾纏足以把一個簡單的測試跑得稀碎。第二個難點是構(gòu)建產(chǎn)物并不像編譯型語言那樣有清晰邊界Python打包成wheel和sdist之后還要做安裝驗證否則很容易出現(xiàn)“構(gòu)建成功但裝不上”的情況。第三個難點是動態(tài)類型的“表面繁榮”沒有編譯器的檢查只有靠靜態(tài)分析、類型標(biāo)注和測試覆蓋去守住質(zhì)量線。正是因為這三點我在設(shè)計流水線時從來不會把全部壓力放在某一個環(huán)節(jié)上。常規(guī)思路是分四層守護(hù)語法和風(fēng)格檢查負(fù)責(zé)基礎(chǔ)動作類型檢查負(fù)責(zé)隱性問題單元測試加覆蓋度負(fù)責(zé)行為驗證復(fù)雜度度和集成測試負(fù)責(zé)跨模塊可靠性。這四層會在每次提交時都跑一遍有任意一層失敗直接從源頭堵住代碼合并。1.3 一切設(shè)計圍繞“快速失敗”和“可重復(fù)執(zhí)行”我踩過最大的一次坑是一套跑完所有測試要半個小時的流水線。半小時看著不長但一旦團(tuán)隊有幾十個分支同時活躍等待時間會拖垮所有人的開發(fā)節(jié)奏然后大家開始想辦法繞過CI整個流程就形同虛設(shè)。所以后來我給自己定了一條原則分支級流水線的核心目標(biāo)不是把所有事情都做完而是在5到10分鐘內(nèi)快速給出“能不能合”的信號更重的集成測試、發(fā)布流程和端到端驗證交給合并到主干或者打好版本標(biāo)簽之后再觸發(fā)??芍貜?fù)執(zhí)行這一點也非常核心。如果一段流水線跑十次有九個結(jié)果那它就沒有參考價值。為了保證可重復(fù)性我通常會盯住三個東西依賴鎖定必須做到哈希級別不要裸跑pip install requirements.txt而不用約束文件Python解釋器指定明確版本和補丁版本不要只寫python-version: 3.12這樣的大版本號所有外網(wǎng)調(diào)用和數(shù)據(jù)源必須有明確的mock策略不能讓測試結(jié)果取決于網(wǎng)絡(luò)心情。1.4 拆解一套流水線的標(biāo)準(zhǔn)階段我習(xí)慣把Python項目的流水線分成六個標(biāo)準(zhǔn)階段準(zhǔn)備階段檢出代碼、安裝解釋器、緩存恢復(fù)、依賴階段安裝鎖定依賴并做完整性校驗、檢查階段靜態(tài)分析、類型檢查、格式檢查、測試階段單元測試、覆蓋率、并行策略、構(gòu)建階段構(gòu)建wheel、sdist并做可安裝性驗證、發(fā)布階段打標(biāo)簽、推送到制品庫或執(zhí)行部署腳本。每個階段之間盡量做成無狀態(tài)也就是上一個階段產(chǎn)生的緩存和產(chǎn)物要能明確傳給下一階段不留隱式的全局狀態(tài)。有人可能覺得這個劃分太“重”了一個小工具項目沒必要弄這么多。但我的實際經(jīng)驗是階段的分層其實不增加多少配置成本卻能讓你在故障排查時瞬間定位到底卡在哪一環(huán)。后面第4部分里我會用一套GitHub Actions的完整例子把每個階段變成可跑的真實配置。2. 工具選型解析不要一上來就跟風(fēng)2.1 托管平臺CI的橫評與真實體驗市面上主流的托管CI大概分成三波以GitHub Actions為代表的平臺內(nèi)嵌型以GitLab CI為代表的DevOps全流程型以Jenkins為代表的自托管老將型。另外CircleCI、Azure DevOps、Travis CI甚至部分團(tuán)隊自己寫一套基于飛書的流水線也都有一定的用戶基礎(chǔ)。我不打算寫一篇工具夸夸文只說我實際接觸下來最直觀的感受。GitHub Actions是目前Python生態(tài)里接入最順滑的選擇。項目就在GitHub上托管工作流文件直接藏在倉庫的.github/workflows目錄里拉取請求和分支合并都能自動觸發(fā)官方維護(hù)的actions/setup-python在解釋器安裝和緩存處理上確實省心。缺點是如果你所在團(tuán)隊的網(wǎng)絡(luò)環(huán)境訪問公共倉庫不穩(wěn)定下載action和安裝包的體驗會打折扣需要配置鏡像或者私有化部署。GitLab CI給我的感覺是配置結(jié)構(gòu)更統(tǒng)一。所有流水線定義在.gitlab-ci.yml里Runner可以運行在Kubernetes集群上做動態(tài)擴(kuò)容而且內(nèi)置了環(huán)境管理、部署審批和監(jiān)控面板適合那種一條龍需求很強(qiáng)的團(tuán)隊。缺點是中小型Python項目用起來偶爾會讓人覺得配置還挺復(fù)雜純碎為了跑測試而引入GitLab全家桶有點重。Jenkins適合什么場景呢適合那些已經(jīng)跑在自有機(jī)房、有合規(guī)要求、需要深度自定義插件的傳統(tǒng)團(tuán)隊。我見過不少老項目Jenkins里積攢了幾十甚至上百個插件看起來功能強(qiáng)大但一旦有人離職流水線就成了誰都不敢碰的黑盒子。我的建議是優(yōu)先選擇托管平臺的集成支持只有真有過硬的自部署需求再考慮Jenkins。附一個簡單的對比表工具托管方式配置產(chǎn)物適合場景主要成本GitHub Actions云托管workflow YAMLGitHub倉庫項目快速上手分鐘數(shù)計費需要網(wǎng)絡(luò)暢通GitLab CI云/自托管.gitlab-ci.yml需要一站式DevOps閉環(huán)配置復(fù)雜度較高Jenkins自托管Jenkinsfile大規(guī)模自運維體系維護(hù)成本高插件歷史債本地腳本 act本地運行本地命令還不準(zhǔn)備引入平臺CI時過度功能邊界有限2.2 本地輔助工具pre-commit、tox和poetry真正讓我愛上這套流程的其實是本地端的輔助工具。pre-commit幫你在提交之前就攔掉明顯的低級問題相當(dāng)于在CI前面加了一道道閘tox能讓你在本地一鍵模擬多種Python版本和依賴組合的測試環(huán)境在代碼還沒推到遠(yuǎn)端之前就把兼容性問題暴露出來poetry或者pdm則承擔(dān)依賴解析和鎖定的職能。關(guān)于pre-commit有一個常見的誤解以為它只是做統(tǒng)一代碼風(fēng)格。其實它的能力邊界遠(yuǎn)不止于此修復(fù)混用制表符和空格、檢查調(diào)試代碼殘留、校驗配置文件格式、掃描敏感信息、在GitHub Actions里看到我無意間提交的密鑰文件時救了我好幾次。它通過鉤子機(jī)制綁定到git的commit階段如果某個檢查點失敗git提交會被直接攔下。tox這類工具更專業(yè)一點它會為每個目標(biāo)環(huán)境創(chuàng)建獨立的虛擬環(huán)境執(zhí)行你在tox.ini里定義好的測試命令。你只要在本地跑一遍tox就等于是把CI里的關(guān)鍵測試動作提前模擬了一次。把CI的一部分流程下放到本地聽著有點“脫褲子放屁”但實際上能極大縮短反饋鏈路因為本地環(huán)境錯誤提示比CI日志更直觀。2.3 工具選型的三條經(jīng)驗第一條經(jīng)驗是從最小可用開始。任何工具能先用一條最簡單的流水線跑通測試就不要第一天就追求多階段多環(huán)境的大而全。第二條經(jīng)驗是工具必須可被代碼化。如果團(tuán)隊的CI配置只能通過網(wǎng)頁界面點點點去改那一定走不遠(yuǎn)一定要把定義文件放在倉庫里用版本管理去追變更。第三條經(jīng)驗是計算資源要能彈性伸縮。托管平臺的容器化機(jī)制天然適合Python項目這種用完即走的模式比維護(hù)一臺永遠(yuǎn)在跑的Jenkins節(jié)點要省心得多。3. 核心細(xì)節(jié)剖析與實操要點3.1 依賴管理從requirements鎖定到鎖定文件Python依賴管理是CI/CD里最陰險的坑。你本地昨天裝好的包版本和今天CI里解析出來的包版本可能就不一樣然后就會出現(xiàn)那種最無語的“我這邊能過為什么CI掛了”事件。我的標(biāo)準(zhǔn)做法是使用約束文件requirements.in里只寫頂層依賴再用pip-tools或者poetry生成一份完全鎖定的requirements.txt其中每個包都帶上固定版本號如果條件允許盡量還帶上對應(yīng)的哈希值用來校驗完整性。對于使用poetry的項目我會確保提交poetry.lock文件并建議在CI里使用poetry install --no-root --no-interaction。注意--no-root這個細(xì)節(jié)它在依賴不完整或者根項目有問題時會跳過安裝項目本身的流程更貼合CI里去“驗證依賴是否能安裝”的目標(biāo)。哪怕是玩票性質(zhì)的小項目只要切到CI環(huán)境中我都不建議直接裸跑pip install -r requirements.txt因為你無法保證今天裝上來的包和昨天是一致的。另外我見過不少團(tuán)隊在流水線里執(zhí)行版本升級pip install --upgrade -r requirements.txt這是一個很隱蔽的坑。這個命令會將鎖定的版本全部升級CI結(jié)果和開發(fā)手里的結(jié)果完全脫節(jié)。正確姿勢是如果確實需要升級先在開發(fā)環(huán)境里用依賴解析工具更新鎖定文件再把這個文件提交到倉庫之后由CI去做干凈的全新安裝。3.2 緩存策略怎么不出錯怎么避坑緩存是CI/CD性能的關(guān)鍵但緩存錯誤配置引發(fā)的干擾故障也最多。Python的依賴緩存目前主要圍繞兩個層面一是pip本身的下載緩存二是整個虛擬環(huán)境目錄。GitHub Actions里可以使用自帶的actions/setup-python配置cache: pip它會在執(zhí)行期間自動處理pip緩存目錄按鍵生成緩存并自動恢復(fù)。GitLab CI則可以用cache關(guān)鍵字配合key規(guī)則將requirements.txt的哈希值作為識別標(biāo)識。這里有一個非常關(guān)鍵的經(jīng)驗如果鎖定文件沒有變化就不要強(qiáng)行重新安裝全部依賴。通過緩存恢復(fù)之后通??梢灾苯訌?fù)用虛擬環(huán)境然后僅增量執(zhí)行必要的安裝步驟。但如果某個依賴涉及系統(tǒng)動態(tài)庫比如基于PyTorch或者某些編譯型擴(kuò)展單純緩存Python虛擬環(huán)境偶爾會遇到底層庫文件不匹配的情況。這種時候?qū)幙删彺鎝ip下載源也不要緩存venv把安裝這一步每次老老實實跑一遍往往比折騰半天找莫名報錯要快。緩存失效時間也是一個值得關(guān)注的設(shè)置。GitHub Actions里緩存最長可以保留數(shù)天但如果你的項目頻繁更新依賴一份過期緩存反而會拖慢任務(wù)。我把策略定為常規(guī)更新不作為破壞性變更只有依賴哈希發(fā)生變更時才強(qiáng)制刷新緩存但如果發(fā)現(xiàn)CI任務(wù)因為緩存錯誤導(dǎo)致異常要果斷刪除緩存重新完整安裝。手動加一個緩存清理工作流或者直接清緩存面板都是論壇里常用的應(yīng)急手段。3.3 測試與覆蓋率的正確姿勢測試是CI的核心但跑測試的方式很能體現(xiàn)細(xì)節(jié)差異。我的基礎(chǔ)配置是用pytest加pytest-xdist實現(xiàn)并行測試數(shù)量少的時候直接一把梭測試較龐大時按CPU核心數(shù)或者按目錄拆分調(diào)度器。值得注意的是pytest-xdist不保證測試函數(shù)行的執(zhí)行順序所以一旦項目里的測試有全局狀態(tài)相互依賴并行時很容易出現(xiàn)隨機(jī)失敗。解決方案分兩步離不開的全局狀態(tài)必須用fixture正確隔離然后把不適合并行的集成測試單獨放到另一個目錄或者用標(biāo)記排除。比如在pyproject.toml里這樣配置[tool.pytest.ini_options] testpaths [tests] addopts -n auto --dist loadgroup markers [integration: 集成測試不參與默認(rèn)并行]覆蓋率這塊我建議你不要過度追求100%。90%以上的覆蓋率如果只是靠mock刷上去那它對質(zhì)量的保護(hù)作用其實是虛假的。我更關(guān)注兩個指標(biāo)新增代碼是否有對應(yīng)的測試覆蓋被修改的核心模塊是否有覆蓋。CI里設(shè)置一個最低閾值比如整體低于80%直接失敗新增文件必須達(dá)到90%防止團(tuán)隊在提交代碼時“裸奔”。同時需要避免一個常見的坑就是發(fā)現(xiàn)覆蓋率報告里出現(xiàn)很多不需要關(guān)心的解釋器分支。這通常是因為測試的進(jìn)程繼承了一些環(huán)境變量而導(dǎo)致的意外路徑需要你在收集覆蓋率時指定好source參數(shù)只統(tǒng)計自己項目的代碼目錄不要去統(tǒng)計第三方庫和測試樁文件。3.4 靜態(tài)分析、類型檢查和格式門禁Python代碼在動態(tài)語義上太過自由所以靜態(tài)工具就成了我的“人工代碼審查助手”?,F(xiàn)階段我主力推薦ruff來替代flake8、isort和pyupgrade因為它速度快到幾乎感覺不到存在配置統(tǒng)一在pyproject.toml里避免了一堆分散的配置文件。格式方面用black或者ruff format都可以選擇團(tuán)隊能接受的一種并嚴(yán)格執(zhí)行。類型檢查我建議用mypy設(shè)置嚴(yán)格模式后在每次提交時作為質(zhì)量門禁的一部分。很多人覺得mypy煩人因為它會不停對第三方庫報錯產(chǎn)生大量無效錯誤。我的解法是顯式配置第三方庫的類型情況并且在接口邊界處多使用# type: ignore[code]而不是裸的# type: ignore這樣以后回顧時還能明白當(dāng)時為什么忽略而不是留下一堆“玄學(xué)標(biāo)記”。這些工具最好是配合pre-commit在本地先跑一遍CI再去跑一遍作為強(qiáng)約束。兩者的區(qū)別在于本地的pre-commit具有教促作用發(fā)現(xiàn)問題時你可以及時修復(fù)CI的嚴(yán)格檢查負(fù)責(zé)最后一道裁判責(zé)任不通過就不合并。配置pre-commit時我強(qiáng)烈建議把hook的pass_filenames屬性搞清楚有些鉤子適合單文件處理有些更適合全局執(zhí)行弄錯了會出現(xiàn)本地通過但CI檢查失敗后又一個來回。3.5 構(gòu)建與打包不只是python -m build很多人以為構(gòu)建和打包就是把源代碼用wheel壓一遍。這個環(huán)節(jié)最容易出現(xiàn)的問題是你在CI里構(gòu)建成功了但在一臺干凈機(jī)器上安裝后運行時卻缺少某些數(shù)據(jù)文件或資源目錄。這是因為Python包默認(rèn)只打包腳本和包內(nèi)文件靜態(tài)資源、版本號信息、入口點聲明都需要在打包配置中顯式寫明。我會在流水線的構(gòu)建階段做三件事第一件是用python -m build生成sdist和wheel第二件事是新建一個干凈的虛擬環(huán)境安裝生成的wheel文件并嘗試運行一個最基本的命令入口第三件事是檢查wheel包里的文件清單確定沒有丟失資源文件。這三件事全通過才認(rèn)為構(gòu)建產(chǎn)物是可信的。關(guān)于構(gòu)建工具新項目我推薦用hatchling或者flit配置非常簡潔如果是老項目還在用setuptools也還可以先用著但盡量在遷移時順手升級一次。重點是所有元數(shù)據(jù)不要重復(fù)手動維護(hù)我的習(xí)慣是把版本號放在一個單一來源中通過importlib.metadata或者構(gòu)建工具動態(tài)讀取Git標(biāo)簽避免__version__、pyproject.toml和README三處不一致的情況。3.6 發(fā)布與部署部署前必做的三件套發(fā)布階段是持續(xù)部署的臨門一腳。我的發(fā)布流水線里至少會包含三個動作語義化版本檢查、發(fā)布說明生成和制品推送。語義化版本靠Git標(biāo)簽管理每次都從最新的tag遞增patch、minor還是major應(yīng)該有清晰規(guī)則不能“亂打”和“亂發(fā)”。發(fā)布說明可以從Git提交記錄中自動提取但人工潤色仍然是必要的用戶看到的是有價值的內(nèi)容而不是一堆雜亂提交消息。推送制品時私有倉庫和公共PyPI的憑證都建議放在CI平臺的secret管理里不要直接寫死在工作流文件中。GitHub Actions天然有secrets機(jī)制GitLab CI也有protected variable合理使用這些能力能把賬號信息泄漏風(fēng)險降到最低。再不同的場景下部署階段會補充額外步驟如果是Web服務(wù)可能是運行數(shù)據(jù)庫遷移腳本和服務(wù)滾動更新如果是庫項目則可能是觸發(fā)下游的依賴構(gòu)建??傊苋詣拥陌l(fā)就一定不要讓人手動執(zhí)行但“人工審批門”該留的還是應(yīng)該留著例如發(fā)布到生產(chǎn)這種動作我始終保留一個手動確認(rèn)的步驟。4. 實操過程用GitHub Actions搭一條完整流水線4.1 初始化項目結(jié)構(gòu)和基礎(chǔ)配置文件為了直接抄作業(yè)我用一個名為demo-py-service的假設(shè)服務(wù)項目做示例。項目的結(jié)構(gòu)大概是這樣的demo-py-service/ ├── .github/ │ └── workflows/ │ ├── ci.yml │ └── release.yml ├── src/ │ └── demo_py_service/ │ ├── __init__.py │ └── app.py ├── tests/ │ └── test_app.py ├── pyproject.toml ├── poetry.lock ├── README.md └── .pre-commit-config.yaml我習(xí)慣用src/布局而不是根目錄布局這樣能更早發(fā)現(xiàn)打包時的路徑問題。pyproject.toml里集中配置工具鏈避免散落多個配置文件。4.2 寫出一條最基礎(chǔ)的CI工作流一條最基礎(chǔ)的CI工作流目標(biāo)是完成“安裝依賴、靜態(tài)檢查、跑測試、構(gòu)建產(chǎn)物”四步。下面這個配置可以直接放到ci.yml里name: ci on: push: branches: [ main ] pull_request: env: PYTHON_VERSION: 3.12.5 jobs: verify: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkoutv4 - name: Set up Python uses: actions/setup-pythonv5 with: python-version: ${{ env.PYTHON_VERSION }} cache: pip - name: Install dependencies run: | pip install --upgrade pip pip install -r requirements-dev.txt -r requirements.txt這個文件里的第一個重點是把Python版本明確寫為3.12.5。我曾經(jīng)遇到過只寫3.12結(jié)果今天跑在3.12.3、下周跑在3.12.7的情況隨后某個底層庫行為突變導(dǎo)致一道隨機(jī)失敗排查了大半天。明確到補丁版本就能避免這種鬧劇。cache: pip這個參數(shù)是setup-python內(nèi)置的它會根據(jù)runner上鎖定的文件生成緩存。但我有自己的依賴文件習(xí)慣所以后面會更喜歡用更強(qiáng)的緩存步驟去緩存整個.venv目錄。4.3 分步解析測試、靜態(tài)檢查和類型檢查繼續(xù)完善驗證階段。習(xí)慣上我會把質(zhì)量檢查分成三個steplint、typecheck和test。這樣做的目的是讓失敗日志清晰你能一眼看出是哪個環(huán)節(jié)出了問題而不是“安裝依賴失敗”的報錯把所有信息壓在最底下。- name: Lint with ruff run: ruff check src tests - name: Type check with mypy run: mypy src - name: Test with pytest run: | pytest -n auto tests這三個step放在同一個job里好處是復(fù)用同一個Python緩存環(huán)境避免了反復(fù)安裝解釋器和依賴。如果希望不同檢查各自拆開并行就需要承擔(dān)多次安裝依賴的額外時間開銷。對于中小項目我建議保持在同一job里省時省事。4.4 矩陣測試多版本、多依賴組合一次跑通矩陣測試是PythonCI里性價比極高的一個功能。它會對多組組合做叉積驗證比如同時驗證Python 3.10、3.11、3.12三個版本以及可選依賴的有無兩種情況。配置大概是這樣的strategy: fail-fast: false matrix: python-version: [3.10, 3.11, 3.12] dependency-profile: [minimal, latest]我會設(shè)置fail-fast: false。默認(rèn)的fail-fast: true會在第一個組合失敗時取消其他所有還在運行的任務(wù)表面上節(jié)省了資源實際上會丟失很多關(guān)于兼容性邊界的反饋信息。取消之后即使某一版本掛了其他組合還會繼續(xù)跑完很快能看出是全掛還是一個版本單獨掛這在排查Python版本兼容問題時真的能救命。4.5 緩存優(yōu)化把venv放進(jìn)去setup-python的cache: pip對大多數(shù)項目夠用但如果依賴較多安裝過程依然耗時。我的優(yōu)化策略是加入一個顯式緩存步驟緩存虛擬環(huán)境目錄。示例配置- name: Cache virtualenv uses: actions/cachev4 with: path: .venv key: ${{ runner.os }}-venv-${{ env.PYTHON_VERSION }}-${{ hashFiles(requirements*.txt) }} restore-keys: | ${{ runner.os }}-venv-${{ env.PYTHON_VERSION }}這里將緩存鍵和依賴鎖定文件的哈希值綁定。哈希變了就會重新創(chuàng)建緩存哈希不變則直接恢復(fù)命中后依賴安裝速度快得離譜。要注意如果緩存命中的是半個舊環(huán)境某些字段會殘留做好重建策略很重要。我在requirements-dev.txt里的依賴變更比較頻繁所以會把requirements文件和鎖定文件一起計入哈希盡量提高緩存匹配精度。還有一點值得提醒如果用的是poetry緩存的就是~/.cache/pypoetry或者項目的.venv鍵中最好也加上poetry.lock的哈希因為鎖定文件才是真正決定依賴集合的東西pyproject.toml影響相對間接。4.6 合并門禁與自動發(fā)布流程CI跑完只是第一步想讓流水線真正發(fā)揮作用就要在GitHub分支保護(hù)規(guī)則里把CI設(shè)為必過檢查。具體是在倉庫的Settings里針對目標(biāo)分支啟用“Require status checks to pass before merging”勾選verify這個job并禁止跳過。這一步非常關(guān)鍵因為只要沒有強(qiáng)制總會有人想把代碼“先合上再說”。發(fā)布階段我單獨寫在release.yml中用Git標(biāo)簽來觸發(fā)name: release on: push: tags: - v* jobs: build-and-publish: runs-on: ubuntu-latest environment: production steps: - name: Checkout uses: actions/checkoutv4 - name: Set up Python uses: actions/setup-pythonv5 with: python-version: 3.12.5 - name: Build package run: python -m build - name: Install from built package run: | python -m venv /tmp/check-env /tmp/check-env/bin/pip install dist/demo_py_service-*.whl /tmp/check-env/bin/demo-service --help - name: Publish to PyPI env: TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} run: twine upload dist/*這個工作流里我最看重的是“從構(gòu)建產(chǎn)物安裝并冒煙驗證”這一步。很多人構(gòu)建完就直接上傳結(jié)果用戶在安裝時才發(fā)現(xiàn)包的元數(shù)據(jù)有問題。加一個干凈環(huán)境安裝驗證能擋住大量低級錯誤。發(fā)布時通過環(huán)境變量讀取secret比在命令行里傳明文密碼安全得多。4.7 用act在本地模擬GitHub Actions雖然GitHub Actions已經(jīng)在云端托管但迭代測試工作流本身偶爾還是要在本地跑一下。act是一個在Docker容器里模擬GitHub Actions運行環(huán)境的開源工具。用它調(diào)試工作流文件非常方便不用每次測試配置都推一個commit到遠(yuǎn)端去觸發(fā)CI。使用方式也很簡單act -j verify它會自動讀取.github/workflows/ci.yml在本地容器中按步驟執(zhí)行。需要注意act需要在本地能正常拉取Docker鏡像且部分action如actions/github-script或涉及secrets的操作需要額外配置。不過用它調(diào)試語法錯誤、確認(rèn)緩存策略、觀察依賴安裝過程確實能顯著提高效率。5. 常見問題與排查技巧實錄5.1 我踩過的六個典型坑第一個坑是“本地成功CI失敗”。這類問題90%都出在依賴或環(huán)境的差異上。排查時我會先在本地執(zhí)行一個和自己構(gòu)建環(huán)境幾乎平行的虛擬環(huán)境然后逐步對比pip freeze的差異。這個過程中的小技巧是查看CI日志里的安裝步驟GitHub Actions日志會完整記錄解析出的依賴版本能直接幫你快速看出差距。第二個坑是“測試隨機(jī)失敗”。大多數(shù)和并行或全局狀態(tài)有關(guān)。解決思路是按上一節(jié)提過的方法先加--dist loadgroup或者在代碼里清理資源上下文。我還會在pytest里啟用--strict-markers防止有些標(biāo)記被悄悄吃掉而不生效。第三個坑是“緩存永遠(yuǎn)不命中”。這種情況通常是哈希匹配邏輯寫錯了。檢查一下當(dāng)前分支對比默認(rèn)分支的哈希是否變化以及緩存鍵里的文件路徑是否正確。還有一個容易被忽略的點restore-keys不會自動把最新緩存存回去如果你希望每次執(zhí)行后更新緩存需要額外調(diào)用actions/cache/save。第四個坑是“Docker鏡像拉取超時”。這部分受網(wǎng)絡(luò)影響很大我能給的建議是盡量優(yōu)先使用托管平臺官方鏡像和自帶action把中國區(qū)團(tuán)隊的網(wǎng)絡(luò)情況納入考量之后選擇更合適的鏡像源或者配置鏡像地址。這里不便展開主要是靈活處理。第五個坑是“發(fā)布時忘記了測試”。有很多團(tuán)隊把release流水線和ci流水線完全打成了兩套發(fā)布時只跑構(gòu)建和推送結(jié)果發(fā)布出去的代碼沒經(jīng)過測試驗證。我的建議是發(fā)布job里第一步先調(diào)用CI里的測試job或者直接把完整的驗證步驟復(fù)制進(jìn)來寧可慢一點也要保證發(fā)出去的產(chǎn)物是經(jīng)過全套檢查的。第六個坑是“環(huán)境變量和密鑰泄漏”。這種問題的破壞性很大。風(fēng)險主要來自兩個地方一是日志打印時不小心輸出密鑰二是把密鑰寫在倉庫文件里。我的對策是在CI配置中禁用調(diào)試模式所有密鑰都用secret管理并且在pre-commit里加一條鉤子掃描類似BEGIN PRIVATE KEY的內(nèi)容。5.2 排查方法從日志到最小復(fù)現(xiàn)排查CI問題時我們最大的利器其實是日志但不是只會翻日志而是要會看日志。第一步先定位是在哪個階段掛掉。第二步看這個階段里的具體命令返回碼以及它前后幾行輸出。第三步嘗試在本地復(fù)現(xiàn)常用的命令就是act或者本地docker容器。如果還不行就在CI里臨時追加一個debug步驟把當(dāng)時的目錄結(jié)構(gòu)、環(huán)境變量和依賴信息全部打印一遍排查完成后記得刪掉。有一個經(jīng)驗我覺得很值得講排查問題時不要只關(guān)注報錯的那一行還要關(guān)注報錯之前環(huán)境發(fā)生的變化。很多Python依賴錯誤都是系統(tǒng)底層庫發(fā)生變化導(dǎo)致的間接結(jié)果比如某個二進(jìn)制擴(kuò)展依賴了新版本的GLIBC而基礎(chǔ)鏡像太舊。這種時候alias到個pip check往往比警告本身更有用。5.3 一些關(guān)于成本和安全性的額外提醒托管CI按分鐘數(shù)計費所以我們要學(xué)會把重活拆分。每天跑全套測試的成本是極高的可以在PR事件上跑快速測試矩陣在合并到主分支后跑完整且耗時的集成測試。這樣既保證了開發(fā)反饋速度又控制了賬單。同時建議定期清理失效的分支和工作流有些團(tuán)隊幾十年不清理CI任務(wù)列表一眼望不到盡頭排查問題的時候很受罪。安全方面除開密鑰泄漏之外還有兩個容易被忽視的點依賴供應(yīng)鏈漏洞掃描和自動化流水線自身的權(quán)限最小化。依賴掃描可以用pip-audit在CI里定期跑開頭如果發(fā)現(xiàn)高危漏洞就讓流水線失敗。自托管Runner更要注意權(quán)限隔離每個Runner的令牌范圍要最小化不要讓部署墻擋不住一個漏洞。5.4 常見問題速查表現(xiàn)象常見原因快速處置本地通過CI失敗依賴版本不一致或環(huán)境差異對比pip freeze鎖定版本測試并行隨機(jī)失敗全局狀態(tài)或資源爭用用fixture隔離關(guān)閉并行或歸類文件緩存永遠(yuǎn)不命中緩存鍵哈?;蚵窂綄戝e檢查哈希文件與path字段安裝依賴極慢外網(wǎng)源延遲或鏡像配置問題配置國內(nèi)鏡像源或調(diào)整緩存策略構(gòu)建成功安裝失敗包配置缺少資源文件在干凈環(huán)境安裝驗證wheel流水線一直等待Runner隊列擁塞查看Runner日志擴(kuò)容或清理任務(wù)CI結(jié)果和本地不一致測試依賴額外包未鎖定檢查dev依賴是否完整鎖定6. 心得自動化解決的是信任問題我在實際操作中最深的體會是CI/CD真正的價值并不是把測試自動化了那么簡單而是它建立了一種“可復(fù)現(xiàn)的信任”。當(dāng)團(tuán)隊每天面對幾十次提交和合并每一個綠色勾號背后都有同一套標(biāo)準(zhǔn)在兜底時大家才會放心大膽地重構(gòu)、升級依賴、調(diào)整架構(gòu)而不是每一步都緊張兮兮地祈禱不要搞壞東西。最后再分享一個我慣用的小技巧流水線本身也是需要測試和審查的。工作流文件的變更也要走PR不要把CI配置當(dāng)成只能維護(hù)一次的化石。我會定期檢查每個job的作用域、緩存命中率和運行時長每過一段時間就把那些只漲經(jīng)驗不動手的步驟砍掉。越是成熟的流水線越應(yīng)該保持簡潔不要讓工具本身變成項目的負(fù)擔(dān)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色狠狠999综合| 国产AV一区二区三区日韩| 99精品视频推荐| 欧美成人A片AAA片在线播放 | 成年AAAA色情| 成人电影在线免费试看| 日韩三十六页| www.狠狠| 亚洲超碰在线| 欧美色色色色色| 伊人婷婷激情| 99久久a线观| 亚洲视频在线网| 色五月婷婷五月天| 九九精品免费| AV人人操| 五月丁香啪啪网| 国产美女视频久| 五月色欧洲| 婷婷丁香九月| 秋霞成人毛片一级A片| 亚洲愉拍99热成人精品| 婷婷91视频| 五月丁香操婷逼| 色色网五月激情| 久久五月天合网| 97丁香五月| 丁香五月天天久久综合小说| 超碰国产在线播放| 色婷婷伊人激情在线观看| 97操操操| 97婷婷五月| 999久久久国产精品| 玖玖99福利| 婷婷综合亚洲| 日韩色久| 香蕉婷婷| 人人操Av| 狠狠色五月| 99热只有精品在线播放| 久久激情综合| 五月丁香六月婷婷亚洲激情综合| 天天插天天草人人玩| 中文精品在| 1024在线视频| 五月丁香综合成人社区| 久操热线| 色黑鬼导航| 99色激| 丁香婷婷91在线观看视频| 久久久久97| 综合网精品99| 久久玖玖综合| 九九热欧美| 97丁香五月| 中文字幕五月久久婷婷| 丁香婷色| 色婷婷丁香五月丁香| 亚洲丁香五月深爱五月| 色综合激情| 久久婷婷五月天蜜桃| 五月丁香婷在线| 日日噜狠狠色综合久久| 五月丁香色| 激情五月天色婷婷| 丁香五月欧美成人| aV直接看| 99热草草| 久久久.COM| 色色色色色色色色色色色色色色,网站| 少妇高潮呻吟A片免费看软件| 色五月激情五月开心五月| 激情综合色网| 九九九九精品精| 无码成人播放器| 男人大jjc女人免费视频| 亚洲精品字幕| 日韩久操婷婷| 少妇2做爰HD韩国电影| 国产又色又爽又黄又免费| 亚洲丁香五冃97色| 香蕉国产2013| 欧洲第一久色| 激情综合网色播五月| www色色色com| 五月天激情网址| 日本久久网| 26uuu视频欧美| 久久之人妻| 蜜桃婷婷五月| 精品人妻一区二区三区四区不卡在| 丁香五月开心亚洲| 91av传媒高清在线视频网| 伊人五月婷| 丁香六月婷婷社区| 涩涩涩婷婷| 99热这里精品| 少妇大叫太大太粗太爽了A片 | 停停综合色色| 五月婷婷这里都是精品| 婷婷色在线视频| 激情五月丁香综合网站| 人妻中文在线| 日日夜夜天天综合| 欧美日韩国产一区二区| 2025天天爽天天摸| 五月丁香六月情| 1024人妻无码中文字幕| 婷婷五月天六月综合| 噜噜在线| 五月婷婷性爱视频| 狠狠狠狠狠狠狠狠草| 色色色色网| 欧美交换配乱吟粗大25P| 五月色婷婷AV| 五月天激情网开心网| 99在线播放视频| 日韩在线看AV| 99视频精品8 | 99re在线免费视频| 99色热综合| 成人一级片| 99国产在线精品视频| 超碰免费99| 激情五月亚洲| 亚洲人操亚洲人| 婷婷在线免费| 99在线精品观看99| 天天干天天曰天天射| 婷婷丁香视频在线观看免费 | 中字幕视频在线永久在线观看免费| 伊人喵咪a V| 99久久精| 99啪啪视频| 五月婷婷熟女| 久久综合九九| 国产成人网| 日日天天干| 综合99在线| 91精品国产色猫| 婷婷成人五月天一区| 亚洲最大在线| 青草网在线观看| 99性爱| 狠狠色色色| 女人天堂av| 色婷婷久久| AV在线观看网站| 综合噜噜| 亚洲AV人人操| 亚洲热视频在线| 亚洲精品国产成人AV在线| 五月天伊人久久久久| www.超碰| 五月天在线视频尤物视频在线看| 久草婷| 99成人无码| 九九色婷婷五月天| 99免费热视频在线| 成人国产综合| 亚洲另类在线观看| 激情六月一二| 91艹人| 综合久久久| 国产午夜精品一区二区| 超碰久热| 性爱动图国产麻豆一区二区三区| 久久人妻少妇嫩草AV| 色五月 激情婷婷 综合五月天| 丁香五月天激情综合| 99热国产国产| 碰久久精品w| http://www.sd-xiangsu.com/| 久久99人人| 激情综合网 激情五月天| 香蕉影院色| 毛片色五月| 久久码久久无清| 久操97| 超碰在线免费| 久久久婷婷五月天| 91精品无码| 日本片日本片祼观看网站在线看中文版网页在线看| 欧美电影在线播放| 九九热免费视频| 91大神操美女| 99伊人婷婷在线| 91精品国产综合久久密臀| 色婷婷成人久久| 草一草avb| 色之综合网| 日本色色色色色色色色一色二色| 久久超级碰碰| 亚洲国产色色| 激情小说五月天| 国产AV影片| 天天摸天天透天天舔| 国产操碰| 亚洲激情五月| 91色呦哟| 天天操天天曰| 色色五月婷婷丁香| 日本一级黄色电影| 亚洲国产另类av| 色六月婷婷| 日韩成人无码人妻| 天堂网亚洲色图| 色噜噜狠狠色综合成人99| 青青草原中文字幕| 色婷婷影| 亚洲AV成人精品网站在线播放| 九九热re99re6在线精品| 激情 五月 婷婷 丁香| 99久久婷婷五月综合| 四色 爱 婷婷 精品 亚洲 五月天| 丁香五月婷婷影院| 亚洲日韩成人三级av| 8区视频在线| 玖玖精品资源| 丁香婷婷激情五月色| 日韩国产在线免费观看| 99九九99九九九视频精品| 婷婷激情五月| 九九色色网| 激情五月狠狠| 五月丁香花激情综合网| 五月伊人视频在线看| 99在线69| 色五月xxx| 五月婷在线| 啪啪色区| 五月婷婷激情久久| 欧美日韩成人在线观看| 国产精品电影网| 亚洲激情精品| 五月婷婷免费看| A一级操| 五月天激情网址| www.99.色| 99爱视频在线观看| 精品人妻久久久久久| 综合网五月| 99成人小视频| www,天天干| 色在线视频网2025| 狠狠看狠狠| 99碰网站| 69精品人人人人| 99九九热视频| 任你日视频| 亚洲免费av在线| 婷婷五月欧美| 超级碰碰碰碰视频| 大香蕉五月天婷婷| 色久播播| 色欲丁香久久| 色色cOm| 先锋av性爱成人电影| va婷婷在线| 丁香五月六月久久综合 | 99,色| 亚洲激情综| 五月天基地| 综合久久综合五月天婷婷| 北京熟妇搡BBBB搡BBBB| 久久艹 五月天| 天天射网站| 欧美成人猛片AAAAAAA| 久久99久久99久久99| 五月婷精品| 碰97久久| 可以看的av| 五月天六月色| 三日本无码| 激情五月狠狠喔| 9 大屁股在线视频精品| 日本一级| 激情五月天之五月婷婷| 99热在线只有精品| 亚洲色热| 色综合99无码| 久久9视频欧美| wWwCom夜操wwW| 婷婷天天插天天爱| 久久激情网| 五月丁香久久久久| 丁香性爱在线视频| 色婷操逼| 久久五月婷天天干| 99热99在线| 九九色热| 国产婷婷久久| 五月天五月色| 熟女人妻一区二区三区免费看| 色你久久| 九九热最新| 久99999热视频在线观看免费| 操操综合网婷婷| 日韩AV中文字幕在线| 成人在线日韩欧美| 激情婷婷丁香色情五月天| 五月丁香色婷婷熟女| 色婷婷丁香五月天在线观看| 99热66| 色情网综合| 婷婷丁香激情综合色情| 就爱射中文字幕资源网| 99色在线| 色色九区| 狠狠草综合网| 激情综合网五月婷婷| 开心五月深爱五月| 三人荫蒂添的好舒服A片| 五月丁香色色色| 91久久久久久| 欧洲色色| 久久五月天影院| 成人在线精品| 天天干夜晚夜操| 五月婷婷六月丁香| 丁香六月激情| 9999三级片| 五月丁香婷婷啪啪综合| 综合亚洲五月天| 中文字幕乱轮| 国产精产国品一二三在观看 | 精品久久婷婷五月天| 久久九九视频| 久综合4| 天天插轮理| 综合久久影院| www99在线观看视频| 色婷婷丁香花五月天| 婷婷四色五月| 色久九| 欧美日韩国产一二区| 五月婷婷六月丁香激情深爱| 曰曰久久| 9精品视频在线| A久网| 婷婷丁香六月| 色5在线| 婷婷六月色| 婷婷伊人五月天| 嫩草AV久久伊人妇女超级A| 国产这里只有精品| 色情五月婷婷| 天天日,天天插| 午夜性爱影视一区77| 久久久久久人妻| 天天日综合| 综合超碰熟| 激情黄色五月天| 九九在线精品| 五月丁香美女| 女人高潮内射99精品| 青青草色在线视频观看| 深爱激情小说五月婷婷| 丰满少妇乱A片无码| 狠狠干综合| 五月丁香婷婷基地| .操區COm| 亚洲乱码日产精品BD| 天天性视频| 色婷婷成人五月| aaaaa不卡| 色~性~乱~伦~噜| 涩 五月 婷婷 狠狠| 99热无码首页| 欧美在线视频免费播放| www.久久久久| 思思热久在线观看视频| 亚洲妇女熟BBW| 无码网| 久久激情五月| 亚洲综合99| 九九精品热| 激情丁香五月天综合| 操97| 激情网狠狠干| 日韩天堂久久| 丁香六月婷婷综合激情欧美| 99热免费网站| www.婷婷com| 六月合五月婷| 久久99久久99精品免视看婷婷| 色五月婷婷久久| www.夜夜操.con| 国外亚洲成AV人片在线观看| 色婷婷婷婷五月天| 久久综合中文| 久久五月天激情| 成人精品99| 国产综合久久久777777| www.minyis.com【JT】实力收量可预付QQ2101460746 | 六月丁香视频网站| 热久91| 五月激情婷婷综合| 日韩AAA| 色婷婷综合在线| 天天模,夜夜模夜夜爽| 天天日色情| 婷婷综合成人| 天堂婷婷五月色| 日韩成人电泉AV| 亚洲天堂爱爱| 成人性爱精品视频| 亚洲欧美成人在线| 91在线人| 久久综合爱| 囯产精品久久欠久久久久久九大| 亚洲小视频免费播放| 欧美成人AAA片一区国产精品| www.99成人视频| 九九99九九99九九99视频网| 97超碰,人人舔,人人操,人人摸 | 久久六月综合| 国产伦亲子伦亲子视频观看| 99热精品观看| 99热99热99热99热| 日本天天综合| 色5月婷婷| 九月停停| 久久综合婷婷| 激情色播| 91狠狠色| 六月婷婷综合| 日韩欧美一级大黄网站| 久久亚洲婷婷综合色五月| 丁香五月婷婷影院| 国产成人综合亚洲| 婷婷综合激情| 久久综合五月| www天堂99| 99热12| 久久网站免费亚洲| 五月天丁香婷| 超碰人人操| 免费碰碰视频久| 激情网五月天| 五月丁香六月在线| 99操视频| 9久精品视频| 色综合激情| 一二三区视频韩国| 丁香五月激情站| 激情六| 九色91国产| 色色色色区| 3DAV亚洲香蕉久久 一区二区| 69精品人人人人| 91蜜桃婷婷狠狠久久综合9色| 色色亚洲视频| 人人摸人人| 91丁香五月| 五月丁香综合在线| 大香蕉网站,大香蕉综合| 九九精品re免费视频| 婷婷色色欧美综合网| 国产精品99久久久久久久女警| 色婷婷av在线观看| 伊人五月天| 亚洲激情四射| 婷婷色婷婷| 亚洲成人免费电影| 国产又黄又爽又色的免费| 开心激情婷婷| 熟妇无码乱子成人精品| 中文字幕无码人妻少妇免费视频 | 思思热这里只有精品视频666| 五月天婷婷香蕉狠狠超碰综合| 91日精品| 亚洲操逼片| www婷婷| 亚洲色婷婷| 五月天激情图片| 五月丁香免费视频| 在线只有精品| 嫩模草| 996黄色片| 激情啪啪五月天| 97人操| 99精品一二三四视频| 91婷婷丁香五月| 五月丁香婷婷在线| 青青五月天婷婷| 丁香六月视频免费观看| 五月天成人在线视频网站| xx久久| 大香蕉婷婷| 欧美激情综合色综合啪啪五月| 被强行糟蹋的女人A片| 久草热8精品视频在线观看| 婷婷丁香无码专区| 精品亚洲国产成AV人片传媒| 亚洲人成网亚洲欧洲无码久久| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 丁香五月综合激情啪啪| 狠狠精品干练久久久无码中文字幕| 野战J办公桌椅H| 第四色色色色色丁香五月天 | 三级三久久线久久99久目本WW| 丁香五月激情宗合网| www.爱操com.| 操逼巨乳91| 26uuu欧美| 婷婷婷婷婷婷婷婷婷婷丁香| 五月婷婷婷综合网| www.com操| 色噜噜狠噜噜视频| 精品夜夜澡人妻无码AV| 97热久久五月婷婷| 天天干天天干天天干天天干天天干天天| 久色欧美| 亚洲精品无码一区二区| 9l视频自拍9l九色9l成人| 激情深爱婷婷网| 天天高潮夜夜爽| 大香蕉手机视频| 五月停亭久久电影| 五月天婷婷一起草| www.五月天色色.com| 最近中文字幕2019视频1| 色婷婷AⅤ| 这里只有精品视频国产| 99综合自拍| 日韩一级一片内射视频4K| 天天久久狠狠色综合| 国产精品激情AV久久久青桔| 五月丁香久人妻中文| 五月丁香色狠狠干大屄| 开心激情综合| 182TV亚洲| 我要射综合| 午夜五月天| 狠狠九九婷婷韩| 欧美一区二区三区不卡影视| 五月丁香天堂网| 五月天丁香综合在线| 婷婷激情六月综合| 久久人妻精品| 538午夜激情| 噜噜狠狠色综合久| 欧美婷婷综合网| 天天插轮理| 五月丁香偷拍| 色综合色色| 五月天婷婷免费| 久久这里只有欧美| 男人大jjc女人免费视频| 色色操| 日韩 中文 欧美| 伊人久久大香线蕉综合网站| 欧美色五月天| 伊人激情综合| 亚洲aV写真天天综合网久久| 嫩草免费视频| 日韩操逼小电影| 成人在线观看精品| 91大屁股| 九九精品9| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 97在线碰| 色综合久久综合中文综合网| 天天肏在线观看| 97丁香五月| 婷婷婷婷婷婷婷婷| 欧美性久| 91超碰在线播放| 99毛片| 生活片五区| 99热在线精品观看| 可以看的av网站| 久热久| 久久久人妻| 婷婷第六色| 1024人妻| 五月丁香激情深爱婷婷| 男人的天堂99| 人人摸人人干| 欧美情月伍月天| 色噜噜狠狠色综无码久久合欧美| 婷婷五月天视| 激情五月天久久| 婷婷丁香激情综合色情| 亚洲性视频| 色婷婷久久| 婷婷五月四狠狠| 色综合99| 五月丁香淫淫婷婷婷| 欧美啪啪网| 日本色图综合| 精品国产va久| 六月丁香开心婷婷欧美| 超碰在线人人| 噜噜噜噜在线| 色婷婷综合影院| 日韩成人综合网| 日韩黄黄| 久久99精品久久久| 丁香六月婷婷久久综合| 激情丁香五月婷婷啪啪| 久操干| 99久久网站| 开心激情久久久久久久| 国产精品国产| 五月花婷婷| 99热这里只有精品免费观看| 9久久婷婷国产综合精品性色| 婷婷五月天电影网| 丁香六月伊人| 婷婷八月激情| 婷婷久久婷婷色五月| 色色吧综合| 婷婷五月天影视| 欧美亚洲成人在线| 内射人妻视频国内| 丁香婷婷色九月| 怡红院院久久| 色婷操逼| 毛片九九九九九九| 色五月av| 日韩高清成人| 婷婷五月丁香六月天亚洲综合| 国产三级片91| 99热最新国内| 婷婷色导航| 五月丁香婷婷深深爱| 精品人妻伦| 超级碰碰碰碰视频| 97luluse| 欧美色五月| 影音先锋91资源站| 五月天婷婷高清无码| 婷婷激情五月| 国产免费一区二区三区三州老师F1F1.CC| 黑人糟蹋人妻HD中文字幕| 欧美丁香五月夫妻天| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 大波美女VA网站| 五月婷婷深深爱| av在线免费播放观看| 五月丁香网站| 99色婷婷| 丁香五月欧美激情| 丁香婷婷六月男男| 丁香婷婷中文字幕| 婷婷中文字幕版| aaaaa不卡| 亚洲不卡欧洲| 色99免费视频中文| 啪啪五月婷婷| 亚韩精品视频1区| 久综合网| 天天影院色| 久久婷婷国产| 成人一级片| 久久精品人妻| 日本五月天网站| 五月丁香六月婷婷的女人| 26uuu欧美亚洲日韩| 丁香五月婷婷久久久| 人妻AV在线| 色欲九区| 91爱操| 久久丁香五月| 超碰免费人妻| 亚洲欧洲另类| 婷五月丁香俺| 五月激激网w'w'w| 同性gv国产精品一区二区| wWwCom夜操wwW| 天天情天天狠天天透| 婷婷中文字幕| 另类五月婷婷| 婷婷五月色影视先锋| 久草五月天电影网| 日日激情网| 26uuu国产激情视频| 热99只有里视频| 久热网在线视频| 丁香五月成人社区| 超碰高清在线| 九月激情网| 天天玩夜夜操| 国产精品第一国产精品| 日本三级99人妇网站| 亚洲成人日韩无码精品| 97婷婷丁香五月综合| 狠狠综合区| 欧美超级视频97| 国产成人av在线播放| 婷婷色网| 久久成人天| 精品无吗va视频免费观看| 婷婷五月天天爽| 丁香九月婷| 99精品在线观看| 激婷网| 亚洲成Av人片乱码色第1集| 色www.con| 九九日本视频| 激情5月天天天| 色色色com| 欧美一级色| 国产无遮挡又黄又爽免费网站| 亚洲久久天堂| 六月撸婷婷| 碰碰91| 婷婷亚洲影院| 六月丁香婷婷网| 91色情播放| 97在线综合| 成 人片 黄 色 大 片| 美女视频图片久久91| 大香蕉五月| 亚洲激情图文小说| 丁香五月婷婷在线观看| 婷婷香五月天| 免费色婷婷| 99久视频| 天天天天色天天天天天干| 曰曰久久| 伊人五月婷| 丁香五月香蕉| 亚洲综合色棒| 色色五月天激情| 久久九九re热| 婷婷亚洲五月丁香综合在线| 天天干天天插| 久久久国产精品黄毛片| 九九99九九99九九99视频网| 激情亚洲婷婷六月| www超碰| 国产精品 的国产| 婷婷在线五月天观看| 亚洲人人操| 91919191919久久成人视频| 国産精品| 亚洲av骚货| 亚洲乱码日产精品BD| www.久久久久久久| 熟女激情五月天| 日本熟妇乱妇熟色A片蜜桃| 久久香蕉福利| 婷婷色基地| 99热在线观看| 婷婷五月天成人娱乐| WWW,五月| 色月丁| 少妇人妻凹凸视频| 五月天激情国产综合婷婷婷| 91色综合网| 开心五月网| 综合久久婷婷99| 六月激情婷婷综合| 成人在线99| 欧美婷婷日本| 超碰二区| 在线不卡中文字幕| 五月婷婷婷婷| 碰久久精品w| 五月婷婷丁香五月婷婷| 99国产精品久久久久久久久久久| 在线观看熟女少妇| 天天狠天天叉| 狠狠色综合网| 小视频久久久aaa| 欧美色宗和激情| 欧美丁香五月| 欧洲不卡视频| 草草影院爱爱| 婷婷六月亚洲综合| 99热国产婷婷| 亚洲va综合va国产va中文| 丁香九色不卡aaa| 丁香五月,激情五月,深爱五月| 国产成人精品一区二区三区视频 | 九九AV| 色五月激情问网站| 91蜜桃婷婷狠狠久久综合9色| 九热视频| 五月香婷婷| WWW·天天操·视频?| 国产欧洲欧洲精品久久| 天天曰夜夜爽| 少妇AB又爽又紧无码网站| 五月丁香婷色| 丁香五月婷婷激情97| 久久九九蜜| 丁香社92视频| 五月综合激情网| 夜夜资源站| 深爱激情五月婷婷| 亚洲 日韩色色| 久久综合久色欧美综合狠狠| 综合激情深爱| 久久网婷婷| 91凹凸在线| 99re99在线看| 疯狂做受XXXX高潮A片动画| 五月婷婷色丁香| 伊人大香蕉爱聚| 99色视频| 五月丁香婷婷综合网| 久久九精品| yw国产AV| 97色色综合| 五月婷婷基地| 少妇人妻丰满做爰XXX| 色欲五月婷婷| 激情av在线| 日本狠狠干| 色小说五月婷婷| 色一情一乱一乱一区9| 日韩成人免费电影| 9久热这里只有精品视频| 色色色宗合网| 色综合色五月| 99久久综合网| 丁香密臀AV激情网| 99色在线视频| 五月婷亚洲精品| 久草A片| 国产黄色在线观看| 综合网啪| 玖玖精品视频99| 在线视频99| 日日影院 | 能看的AV| 日本特黄aaaaa| 欧美色色色色色色色色色色| 极品人妻VIDEOSSS人妻| 五月激情婷婷播播开心| 五月丁香六月激情综合啪啪| 婷婷五月色情| 激情五月婷婷| 天天射综合网站| m色激情网| 91天天操天天干天天射| 亚洲综合视频八| jiZZdr| 久久这里只有精品热在99| 婷婷五月深深的爱| 成人色图情色成人网 www.5b5b5bcom 五月天 | 色色aⅤ網| 超碰av在线| 丁香婷婷久久综合在线| 久99| 亚洲99综合| 这里只有精品网| 亚洲精品操一操、噜一噜、摸一摸、爽 | www.99在线| 丁香婷婷成人网| 欧美va视频不用播放器的va视频网| 国产色99| 综合网精品99| 激情综合网五月| 婷婷五月综合基地| 天天摸天天肏| 欧美成人性爱网| 丁香五月在线观看综合| 色色色色色热| www.91九色| a片在线免费观看一区| 国产肥白大熟妇BBBB视频| 狠狠狠狠狠狠狠狠| 久久婷丁香五月| 五月婷婷色五月| 99热这里只有在线| 97久久香草精品视频| 色欧洲| www.97碰碰com| 偷拍五月丁香| 丁香五月婷婷色偷偷| 久久这里只有精品视频26| 色情·com| 国产亚洲99| 97极品在线| 五月丁香美女| 婷婷丁香五月天婷婷| 91黄操| 色婷婷偷拍| 看全色黄大色大片| 在线超碰免费| 99ER热精品视频| 婷婷五月天色播| 99精品在线播放| 大香蕉五月丁香| 日韩在线视频中文字幕| 99热天堂| 五月天婷婷网站888| 日韩 中文 欧美| 任你搞网站| 激情综合网址| 欧美操人| 99只有精品| 琪琪理论片| 另类国产区| 99精品国产在热久久| 99精品视频在线观看| 日本色五月| 五月丁香六月婷| 激情综合五月| 91打屁股免费看| 丁香婷婷九月| 婷婷丁香社区| AA久久| 97精品综合| 日韩人妻无码一区二区| 欧美久久五月婷婷| 久色五月| 九九热这里只有精品6| xx久久| 亚洲超碰在线| 色婷五月天| 8050一级网| 色九九一二| 久久丝袜婷婷| 第四色色六月色综合| 就爱操www com| 9久热这里只有精品| 狠狠干夜夜干| 91综合国免费久入| 熟妇无码乱子成人精品| 91久久久久| 国产亚洲99久久| 一区色色色色网| 丁香五月天婷婷久久| 99视频只有这里精品| 九九热re99re6在线精品| 亚洲无码色色| 狠狠操狠狠色| 久久久久8888| www.色窝| pom538精品视频| 五月丁香六月婷| 国产九月婷婷| 日本色婷婷| 大伊久久| 九热精品| 玖玖色综合色| 久久精品9| 精品成人无码A片观看香草视频| 五月天色影院| 五月丁香婷婷综合| 97碰在线免费观看| 六月丁香啪啪啪| 丁香97综合| 久久永久网址| 99热在这里只有精品| 天天做天天爱天天高潮| 婷婷激情综合色五月久久91| 亚洲日韩国产黑丝黑丝AVAV一区二区三区| 日逼免费视频 | 五月天色社区| 9久久精品| 成人网站av免费网站推荐| 五月婷婷视频啪啪美女| 五月天精品| 日本不卡一区二区三区| 久久婷婷人人| 久久这里99| 99这里只有精品视频| 色99超碰| 精品福利911| 九九黄色网| 久久久久久久久久婷婷| 综合xx网| 久久综合中文| 欧美一线视频| 99热这里只有精品热| 久久xxxx| 日亚二欧美| 婷婷综合五月色播| 婷婷亚洲综合| 亚洲综合婷婷五月| 国产无套精品一区二区| 免费看欧美成人A片无码| 色色丁香婷婷综合| 激情五月天综合婷婷网| 精品成人在线| 99久久国产成人精品| 激情久久久久久| 久久人操-久草婷婷-成人AV| 色婷婷a三区麻| 蜜臀九九九九| 26uuu在线观看| 伊人狠狠丁香婷婷综合尤物| 日日爽日日爽| 97伦乱| 色视五月天婷婷| 超碰免费人人| www.激情.com.| www.99婷婷| 欧美天天搞| 色婷婷婷婷五月天| 五月丁香婷婷激情图片| 欧洲亚洲欧洲99久久| 99精品网| 久久6这里只有精品| 天天插天天射| 99 r热| 欧美25p| www超碰| 色五月婷婷影院| 深夜男女福利刺激影院一区完整| 五月丁香花视频| 国产激情在线| 超碰在线观看9| 人人操人人操919999| 国产三级片91| 超碰激情网| 九九色影视| 亚洲中文字幕网| 永久精品| 日韩一区二区在线播放| 操91| 先锋资源 996| 91五月花丁香| 婷婷六月啪啪| www.97干视频| 色五月综合在线| 婷婷五月天AV| 色色色热| 五月丁香久久激情网| 中文超碰视在线| 狠狠色综合精品视频在线| 丁香九月综合在线| 夜夜爱伊人| 性爱综合网| 性做爰1一7伦| 播五月丁香六月| 五月丁香最新| 婷婷综合色| 色综合久久五月| 字幕网AV中文字幕| 五月婷婷啪| 久久久大香蕉| 日本久久99| www.激情五月天| 密乳Va| 99色热| 九九热短视频在线观看| 六月婷婷最新网址| 婷婷久久欧美| 成人网址在线观看| VA国产在线综合网站| 日本久久九| 日韩黄色电影| 综合激情开心五月| 另类婷婷五月天啪帕帕| 丁香五月在线自慰| 亭亭丁香久久五月| 五月婷婷亚洲综合在线| 亚洲不卡| 伊人五月人妻精品| 97精品在线| 婷婷狠狠久久| 五月婷婷六月丁香首页| 99热国产免费| 五月婷婷激情综合视频| 久热91精品| 国产古装妇女野外A片| 99热在线观看免费精品| a色色片| 91精品国产综合久久蜜芽解析速度| 精品婷婷| 丁香五月婷婷手机| 狠狠色综合网| 亚洲情欲久久| 五月丁香色综合| 五月天综合视频网| 婷婷成人综合免费视频| 99久久精品国产色欲| 国产精品第一国产精品| 色色无码| 五月婷婷久久网| 日韩无码专区| 婷久久久| 亚洲激情av| 激情深爱五月天| 五月天成人伊人| 天堂中文国产| 亚洲区1| 丁香五月综合| 91九色|疯狂|高潮|对白|| 射久久丁香五月| 狠色综合网| 丁香密臀AV激情网| 黄网在线免费观| 亚洲国产精品VA在线看黑人| www夜夜| 天天日夜夜操五月| 色婷婷五月开心六月综合| av线电影| 激情影院69| 丰满老熟妇BBBBB搡BBB| 在线色色| 在线只有精品| 天天色综合图片| 午夜丁香六月婷| 九九热这里只有精品7| 久久综合色五月| www.激情五月天.com| 中文字幕无码人妻少妇免费视频| 99热伊人| 天天综合五月| 亚洲精品永久久久久久| 99亚洲色| 激情综合网激情五月欧美| 色综合色婷婷色伊人| 欧美性生交XXXXX无码小说| 久久99久久99久久99人受| 婷婷色五月开心五月| 婷婷丁香五月,狠狠综合| 色综合夜夜| 亚洲天堂热| 91狠狠色色丁香婷婷综合久久| 五月天激情黄色网址| 婷婷色五月91啪啪| 久色精品| 中文字幕日本最新乱码视频| 亚洲人妻av| 婷婷久久五月| 久热91| 丁香五月在线观看| 五月综合无码| 五月丁香六月色| 97啪啪| 日日干夜夜干| 嫩草AV久久伊人妇女超级A | 夜夜夜夜操| 五月丁香婷婷久久| 色五月激情五月丁香五月婷婷啪啪综合 | 久草婷婷网| 婷婷色色综合| 久热A片| 综合激情九月婷婷,激情综合婷婷中文字| 综合久久十三| 激情碰碰碰| 激情无码网| 激情五月天色网站| 婷婷五月天综合激情| 国产99美少妇| 六月婷婷色五月| 五月天婷婷激情春色小说| 丁香六月无码| 五月婷婷在线视频| 亚洲网站999| 亚州色色色| 大香蕉520| 青青久在线视频免费观看| 97色五月丁香婷婷| 中文字幕黄色电影网址| 婷婷99中文字幕| 99热99在线| 五月丁香六月婷婷综合伊人| 亚洲欧州色情在线观看| 26uuu成人网| 国产精品久久久久久白浆色欲| 色五月丁香婷婷| 99精品国产乱码久久久人妻| 久久开心五月婷婷| 久久这里有精品视频| 在线中文亚洲| 色五月av| 天堂美国久久| 色婷婷久久综| 99re这里只有精品免费| 五月WWW| 五月丁香婷草| 99ER热精品视频| 亚洲9久久精品| 97色片| 六月丁香综合网| 亚洲人成色A777777在线观看| 国产成人综合网| 97在线观视频免费观看| 五月天婷婷色色首页| 婷婷综合欧美| 26uuuuuuuu国产| 丁香婷婷免费| 色丁香五月天| 四色 爱 婷婷 精品 亚洲 五月天| 大陆肏屄视频| 亚洲在线综合| 婷婷五月在线影院| 色色色婷| 米奇影视资源777狠狠色婷婷五月天激情网| 韩国激情五月天综合网| 婷婷久热| 丁香五月性爱爱五月| 日日操夜夜爽白洁| 真实亲子乱子伦高清在线观看| 小视频久久久aaa| 亚洲99一级无嗎特制在线| 狠狠干婷婷| 99热99日天天干| 婷婷放心五日爱| 精品乱码久久久久| 国产乱子轮XXX农村| 婷婷色五月天色| 91婷婷五月天综合视频| 综合激情在线| 超碰妻人人| 色婷婷综合久色AV五色最新| 天天爽天天摸天天爱| 影音先锋女人AA鲁色资源| 欧美日韩国产伦精品日韩人妻一| 五月丁香六月婷婷综合网| 99久久99久久| 免费在线观看av网站| 成人五月天在线观看| 欧美影院| 日韩中出视频| 翔田千里aV中文字幕| 伊人久久大香线蕉av最新| 婷婷丁香五月视频| 99超在线| 婷婷激情综合| 五月婷婷日本| 色五狠狠| 99国产精品久久久久久久久久久 | 日日夜夜狠狠干| 少妇AB又爽又紧无码网站| 97干免费视频| 婷婷五月激情六月| 亞洲自怕| 亚洲综合色丁香五月天| 九九热视频这里只有精品| 五月丁香色综合| 婷婷五月综合视频免费播放| 江苏少妇性BBB搡BBB爽爽爽| 久久五月丁香婷婷| 丁香蜜臀黄色婷婷五月天| 99色视| 五月丁香操亭亭网| 伊人99久久| 天天射综合网天天插| 五月天综合| 99精品在线观看| 99热都是精品| 九九婷婷综合| 97碰碰在线观看视频| 大香蕉75线| 婷婷五月天综合在线| 在线不卡的视频| 久热网在线视频| 五月天啪啪网| 五月丁香婷婷开心| wwww.9免费视频| 欧美性爱5月天天天看| www久视频com| 成人欧美Va| 五月停视频天堂| 五月丁香激情欧洲啪啪| 99国产在线精品视频| www.五月天。com| 狠狠干最新地址| 五月天伊人手机在线播放AV| 婷婷色五月91啪啪| 五月婷婷开心亚州在线| 亚洲激情Av| 婷婷六月色开| 伊人综合色干|