精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

精益求精!如何讓你的Python項目從自動化中受益

開發 后端 自動化
無論你的項目是用于開發Web應用,處理數據科學問題還是AI,使用配置良好的CI / CD,可在開發中調試且針對生產環境進行了優化的Docker鏡像,或一些其它的代碼質量工具,都能讓你受益。本文將告訴你該如何把它們加入Python項目中!

本文轉載自公眾號“讀芯術”(ID:AI_Discovery)

無論你的項目是用于開發Web應用,處理數據科學問題還是AI,使用配置良好的CI / CD,可在開發中調試且針對生產環境進行了優化的Docker鏡像,或一些其它的代碼質量工具,都能讓你受益。

本文將告訴你該如何把它們加入Python項目中!

這是我的倉庫,其中包含完整的源代碼和文檔:https://github.com/MartinHeinz/python-project-blueprint

[[323308]]

用于開發的可調試Docker容器

有些人不喜歡Docker,因為容器可能很難調試,或者因為它們的鏡像需要很長時間才能構建。因此,讓我們從構建用于開發的理想鏡像開始,它能夠快速構建且易于調試。

為了使鏡像易于調試,需要基礎鏡像,其中包括調試時可能需要的所有工具,例如bash,vim,netcat,wget,cat,find,grep等。

python:3.8.1-buster似乎是這一任務的理想選擇。它在默認情況下包含許多工具,我們可以很容易地安裝所有缺少的東西。這個基本鏡像非常厚重,但這并不重要,因為此時它將僅用于開發。

你可能已經注意到,我選擇了非常具體的鏡像:鎖定了Python版本和Debian版本。這是故意的,因為我們希望最大程度地減少由更新的,可能不兼容的Python或Debian版本引起“損壞”的可能性。

精益求精!如何讓你的Python項目從自動化中受益
圖源:techcrunch

可以使用基于Alpine的鏡像作為替代。但是,這可能會引起一些問題,因為它使用musllibc而不是Python依賴的glibc。因此,如果決定選擇此配置,請記住這一點。

至于構建的速度,我們將利用多階段構建以便緩存盡可能多的層。這樣,就可以避免下載例如gcc的依賴項和工具以及(requirements.txt中的)應用程序所需的所有庫。

因為無法將下載和安裝這些工具所需的步驟緩存到最終的運行程序鏡像中,我們將使用前面提到的python:3.8.1-buster創建自定義基本鏡像,該鏡像將包含需要的所有工具,從而進一步提升處理速度。

說了這么多,來看看Dockerfile:

  1. # dev.Dockerfile 
  2.              FROMpython:3.8.1-buster AS builder 
  3.              RUN apt-get update&& apt-get install -y --no-install-recommends --yes python3-venv gcclibpython3-dev && \ 
  4.                 python3 -m venv /venv && \ 
  5.                  /venv/bin/pip install --upgradepip 
  6.              
  7.              FROM builder ASbuilder-venv 
  8.              
  9.              COPYrequirements.txt /requirements.txt 
  10.              RUN /venv/bin/pipinstall -r /requirements.txt 
  11.              
  12.              FROM builder-venv AStester 
  13.              
  14.              COPY . /app 
  15.              WORKDIR /app 
  16.              RUN/venv/bin/pytest 
  17.              
  18.              FROMmartinheinz/python-3.8.1-buster-tools:latest AS runner 
  19.              COPY --from=tester/venv /venv 
  20.              COPY --from=tester/app /app 
  21.              
  22.              WORKDIR /app 
  23.              
  24.              ENTRYPOINT ["/venv/bin/python3", "-m", "blueprint"] 
  25.              USER 1001 
  26.              
  27.              LABEL name={NAME} 
  28.              LABELversion={VERSION} 

從上面的文檔可以看到我們將創建3個中間鏡像,然后創建最終的運行鏡像。第一個鏡像被稱為builder,它會下載構建最終應用程序所需的所有必需庫,其中包括gcc和Python虛擬環境。安裝完成后,它還會創建實際的虛擬環境以供下一個鏡像使用。

接著是builder-venv鏡像,該鏡像將依賴項列表(requirements.txt)復制到鏡像中,然后進行安裝。緩存需要此中間鏡像,因為僅在requirements.txt更改時才會安裝庫,否則僅使用緩存。

在創建最終鏡像之前,首先要針對應用程序運行測試。這就是tester鏡像做的工作。我們將源代碼復制到鏡像中并運行測試。如果通過了,程序就會運行至runner。

對于runner鏡像,我們使用的是自定義鏡像,其中包括普通Debian鏡像中不存在的一些額外功能,例如vim或netcat。你可以在Docker Hub上的這里找到此鏡像,還可以通過這里在base.Dockerfile中檢驗這個非常簡單的Dockerfile。

因此,在最終鏡像中的工作有這些:首先復制虛擬環境,該環境保留了tester鏡像中所有已安裝的依賴項,接下來復制經過測試的應用程序。

現在,鏡像已經擁有了所有源,移至應用程序所在的目錄設置ENTRYPOINT,以便在鏡像啟動時運行應用程序。出于安全原因將USER設置為1001,因為最佳實踐告訴我們,永遠不要在root用戶下運行容器。

最后2行設置鏡像的標簽。當使用make 命令指向構建并運行時,這些將被替換或填充,這一點稍后我們會看到。

為產品優化的Docker容器

談及產品級鏡像時,我們想確保它們小巧,安全且快速。我個人最喜歡的是Distroless項目中的Python鏡像。那么什么是Distroless?

可以這樣形容它:在理想的世界中,每個人都將使用FROM scratch作為其基本鏡像(即空鏡像)來構建其鏡像。

但這不是大多數人想要做的,因為它要求靜態連接二進制文件等。這就是Distroless發揮作用的地方了,它是為每個人設計的FROM scratch。

Distroless是由Google制作的一組鏡像,包含應用所需的最低要求,這意味著沒有殼(shell),程序包管理器或任何其他工具會使鏡像膨脹并給安全掃描器(例如CVE)造成信號噪聲,從而使其變得更難建立規則。

知道了要解決的問題,讓我們看一下生產型Dockerfile ...... 實際上,在這里不需要做太多更改,只有兩行:

  1. # prod.Dockerfile 
  2.               #  1. Line - Change builder image 
  3.               FROMdebian:buster-slim AS builder 
  4.               #  ... 
  5.               #  17. Line - Switch to Distroless image 
  6.               FROMgcr.io/distroless/python3-debian10 AS runner 
  7.               #  ... Rest of the Dockefile 

需要更改的只是用于構建和運行應用程序的基本鏡像!

但是差別是巨大的:我們的開發鏡像為1.03GB,而這個鏡像僅為103MB,這是完全不一樣的!

我知道你會說“但是Alpine可以變得更小”是的,沒錯,但是大小的差距并不那么重要。你只會在下載/上傳鏡像時注意鏡像的大小,這種情況并不常見。當鏡像運行時,大小完全不重要。比大小更重要的是安全性,就這一點而言,Distroless肯定具有優勢,因為Alpine(這是一個很好的替代)具有許多額外的程序包,可以增加攻擊面。

關于Distroless值得一提的最后一件事是調試鏡像。考慮到Distroless不包含任何殼(甚至不包括sh),這使得需要調試和檢查時非常棘手。為此,所有Distroless鏡像都有調試版本。

因此,當遇到麻煩時,可以使用debug標簽構建生產鏡像,并將其部署到常規鏡像旁邊,在其中執行并且進行如線程轉儲的操作。可以像這樣使用python3鏡像的調試版本:

  1. docker run --entrypoint=sh -tigcr.io/distroless/python3-debian10:debug 

適用一切情況的單一命令

在準備好所有Dockerfile后,不妨使用Makefile將其自動化吧!要做的第一件事是使用Docker構建應用程序。因此,為了構建開發鏡像,我們可以執行make build-dev命令來運行以下目標文件:

  1. # The binary to build (just the basename). 
  2.          MODULE :blueprint 
  3.          
  4.          # Where to push the docker image. 
  5.          REGISTRY ?=docker.pkg.github.com/martinheinz/python-project-blueprint 
  6.          
  7.          IMAGE := $(REGISTRY)/$(MODULE) 
  8.          
  9.          # This version-strategy uses git tagsto set the version string 
  10.          TAG := $(shell git describe --tags--always --dirty) 
  11.          
  12.          build-dev: 
  13.             @echo "\n${BLUE}BuildingDevelopment image with labels:\n" 
  14.             @echo "name: $(MODULE)" 
  15.             @echo "version: $(TAG)${NC}\n" 
  16.             @sed                                 \ 
  17.                 -e's|{NAME}|$(MODULE)|g'        \ 
  18.                -e 's|{VERSION}|$(TAG)|g'        \ 
  19.                dev.Dockerfile | docker build -t $(IMAGE):$(TAG) -f- . 

該目標文件首先通過在dev.Dockerfile的底部用標簽替換鏡像的名稱和標簽來構建鏡像,該標簽是通過運行git describe然后運行docker build來創建的。

下一步——使用make build-prod VERSION = 1.0.0構建生產版本:

  1. build-prod: 
  2.         @echo "\n${BLUE}Building Productionimage with labels:\n" 
  3.         @echo "name: $(MODULE)" 
  4.         @echo "version: $(VERSION)${NC}\n" 
  5.         @sed                                     \ 
  6.             -e's|{NAME}|$(MODULE)|g'            \ 
  7.            -e 's|{VERSION}|$(VERSION)|g'       \ 
  8.            prod.Dockerfile | docker build -t $(IMAGE):$(VERSION) -f- .. 

這個與先前的目標文件非常相似,但是在1.0.0版本上的示例中,我們將把版本作為參數傳遞,而不是使用git標簽作為版本。

當在Docker中運行所有內容時,有時需要在Docker中對其進行調試,為此,有以下目標文件:

  1. # Example: make shell CMD="-c 'date> datefile'" 
  2.          shell: build-dev 
  3.             @echo "\n${BLUE}Launching a shellin the containerized build environment...${NC}\n" 
  4.                 @docker run                                                    \ 
  5.                     -ti                                                    \ 
  6.                     --rm                                                   \ 
  7.                     --entrypoint /bin/bash                                  \ 
  8.                     -u $$(id -u):$$(id -g)                                  \ 
  9.                     $(IMAGE):$(TAG)                      \ 
  10.                     $(CMD) 

從上面可以看出,bash覆蓋了入口點,而參數則覆蓋了容器命令。這樣,我們可以像上面的示例那樣直接進入容器并進行調試或運行一個關閉命令。

當完成編碼并想將鏡像推送到Docker注冊表時,可以使用makepush VERSION = 0.0.2。來看看目標文件的功能:

  1. REGISTRY ?=docker.pkg.github.com/martinheinz/python-project-blueprint 
  2.                                        push:build-prod 
  3.                                         @echo"\n${BLUE}Pushing image to GitHub Docker Registry...${NC}\n" 
  4.                                         @dockerpush $(IMAGE):$(VERSION) 

它首先運行之前看過的build-prod文件,然后運行docker push。這里假設已登錄Docker注冊表,因此在運行此注冊表之前,需要運行docker login。

最后一個目標文件用來清理Docker工件。它使用替換為Dockerfiles的name標簽來過濾和查找需要刪除的工件:

  1. docker-clean: 
  2.        @docker system prune -f --filter "label=name=$(MODULE)" 

使用GitHub Actions的CI / CD

現在開始使用所有這些方便的make目標命令來設置CI / CD。我們將使用GitHub Actions和GitHub Package Registry來構建管道(工作)并存儲鏡像。那么這兩個東西到底是什么呢?

  • Github Actions是可以幫助自動化開發工作流程的作業/管道。可以使用它們來創建單個任務,然后將它們組合到自定義的工作流程中,然后在諸如每次推送到倉庫或創建發行版的時候執行這些工作流程。
  • GitHub Package Registry是與GitHub完全集成的軟件包托管服務。它可以存儲各種類型的軟件包,例如:Ruby gems或npm軟件包。我們將使用它來存儲Docker鏡像。
  • 如果你不熟悉GitHub Package Registry,并且想要了解更多相關信息,可以查看我的博客文章:https://martinheinz.dev/blog/6
[[323310]]
圖源:unsplash

現在,為了使用GitHub Action,需要創建工作流,這些工作流將根據選擇的觸發器(例如,推送到倉庫)執行。這些工作流是YAML文件,位于倉庫中的.github / workflows目錄中:

  1. .github       
  2.        └── workflows         
  3.           ├── build-test.yml           
  4.           └── push.yml 

第一項工作名為build,它通過運行make build-dev命令來驗證是否可以構建應用程序。但在運行它之前,它首先通過執行在GitHub上發布的名為checkout的操作來檢索倉庫。

  1. jobs:        
  2.        test:         
  3.          runs-on: ubuntu-latest           
  4.          steps:           
  5.          - uses: actions/checkout@v1           
  6.          - uses: actions/setup-python@v1            
  7.           with:            
  8.              python-version: '3.8'           
  9.          - name: Install Dependencies            
  10.           run: |             
  11.             python -m pip install --upgrade pip               
  12.             pip install -r requirements.txt           
  13.          - name: Run Makefile test            
  14.             run: make test           
  15.          - name: Install Linters           
  16.             run: |              
  17.              pip install pylint               
  18.              pip install flake8               
  19.              pip install bandit           
  20.          - name: Run Linters            
  21.           run: make lint 

第二項工作稍微復雜一些。它針對應用程序以及3個linter(代碼質量檢查器)運行測試。

與上一項工作相同,我們使用checkout@v1操作獲取源代碼。之后,運行另一個名為setup-python@v1的已發布操作,該操作幫助設置了python環境(你可以在此處找到有關它的詳細信息)。

現在有了python環境,還需要使用pip安裝的requirements.txt中的應用程序依賴項。此時可以繼續運行make test命令,這將觸發Pytest套件。如果測試套件通過,將繼續安裝前面提到的linters,即pylint,flake8和bandit。最后運行make lint命令,這將觸發每個linter。

這就是構建/測試工作的全部流程,但是應該如何推送呢?來看一下:

  1. on:    
  2.   push:      
  3.     tags:       
  4.      - '*'    
  5.   jobs:    
  6.     push:       
  7.      runs-on: ubuntu-latest        
  8.      steps:        
  9.      - uses: actions/checkout@v1        
  10.      - name: Set env         
  11.       run: echo ::set-envname=RELEASE_VERSION::$(echo ${GITHUB_REF:10})        
  12.      - name: Log intoRegistry         
  13.       run: echo "${{secrets.REGISTRY_TOKEN }}" |  
  14. docker login docker.pkg.github.com -u ${{github.actor }} --password-stdin     
  15.      - name: Push to GitHubPackage Registry         
  16.       run: make pushVERSION=${{ env.RELEASE_VERSION }} 

前4行定義了何時觸發這項工作。我們指定僅當將標簽推送到倉庫時才開始該工作(*在這種情況下指定標簽名稱可以是任何模式),因此不會在每次推送到倉庫時都將Docker鏡像推送到GitHub Package Registry,而僅在推送指定應用程序新版本的標簽時才推送到GitHubPackage Registry。

現在到了工作的主體,它是從檢索源代碼并將RELEASE_VERSION的環境變量設置為推送的git標簽開始的。這是通過GitHub Actions的內置:: setenv功能完成的。

接下來,它使用存儲在repository secrets中的REGISTRY_TOKEN登錄到Docker注冊表,并登錄啟動工作流的用戶(github.actor)。最后,在最后一行中,它運行push命令,該命令構建生產鏡像并將其推送到注冊表,并以先前推送的git標簽作為鏡像標簽。

此處可以檢索出完整的代碼清單:

https://github.com/MartinHeinz/python-project-blueprint/tree/master/.github/workflows

使用CodeClimate進行代碼質量檢查

最后但并非最不重要的一點是,還要使用CodeClimate和SonarCloud來添加代碼質量檢查。這些將與上面展示的test工作一起觸發。因此,我們在其中添加幾行:

  1. # test, lint... 
  2.            - name: Send report toCodeClimate 
  3.                        run: |             
  4.                          export GIT_BRANCH="${GITHUB_REF/refs\/heads\//}"               
  5.                          curl -Lhttps://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64> ./cc-test-reporter               
  6.                          chmod +x ./cc-test-reporter               
  7.                          ./cc-test-reporter format-coverage -t coverage.py coverage.xml               
  8.                          ./cc-test-reporter upload-coverage -r "${{secrets.CC_TEST_REPORTER_ID }}"                 
  9.                          - name: SonarCloudscanner             
  10.                            uses: sonarsource/sonarcloud-github-action@master             
  11.                            env:            
  12.                               GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}               
  13.                               SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} 

從CodeClimate開始,首先導出GIT_BRANCH變量,然后使用GITHUB_REF環境變量進行檢索。其次,下載CodeClimate測試報告程序并使其可執行。然后,使用它來格式化由測試套件生成的覆蓋率報告,并在最后一行將其發送到帶有測試報告器ID的CodeClimate中,該ID存儲在repository secrets中。

至于SonarCloud,我們需要在倉庫中創建如下所示的sonar-project.properties文件(文件中的值可以在SonarCloud儀表板的右下角找到):

  1. .organization=martinheinz-github 
  2.                          sonar.projectKey=MartinHeinz_python-project-blueprint                         
  3.                              sonar.sources=blueprint 

除此之外,只需使用已有的sonarcloud-github-action就可以幫我們完成所有工作。要做的就是提供2個令牌:GitHub令牌(默認情況下位于倉庫中)和SonarCloud令牌(可從SonarCloud網站獲得)。

注意:有關如何獲取和設置所有上述令牌和密鑰的步驟,請參見README文件:

https://github.com/MartinHeinz/python-project-blueprint/blob/master/README.md

[[323311]]
圖源:unsplash

有了上述的工具、配置和代碼,你就可以構建和自動化下一個Python項目的方各個方面了。快去試試吧!

 

責任編輯:趙寧寧 來源: 讀芯術
相關推薦

2022-06-26 09:55:00

接口自動化項目

2022-07-12 14:31:55

機器學習人工智能工具

2021-10-14 06:52:47

自動化開發環境

2020-11-25 10:42:57

Python代碼工具

2019-06-04 08:54:56

Python數據驅動腳本

2024-08-02 17:23:12

2022-12-08 10:55:12

5G倉庫自動化

2018-02-10 18:35:09

LinuxAnsible系統管理

2022-11-04 19:00:00

Python自動化

2011-03-02 14:15:06

Pureftpd

2013-11-27 11:34:43

自動化部署Python

2020-02-14 20:49:33

設施管理物聯網IOT

2016-11-07 08:40:51

天池腳本自動化

2025-11-10 09:14:26

PythonExcel自動化

2018-02-25 19:29:49

自動化數字化IT

2015-02-04 09:17:38

亞馬遜AWS云自動化

2024-12-31 09:46:45

2019-11-05 15:40:41

網絡安全跳槽那些事兒軟件

2024-11-21 15:24:49

2020-03-18 09:23:24

Python數據SQL
點贊
收藏

51CTO技術棧公眾號

国产成人精品亚洲线观看| hd国产人妖ts另类视频| 国产一区二区三区综合| 高清欧美电影在线| 五月婷婷婷婷婷| 视频亚洲一区二区| 91久久免费观看| www.一区二区.com| 嫩草影院国产精品| 日韩视频在线观看一区| 免费国产在线视频| 亚洲啪啪91| 中文字幕亚洲欧美在线| xxxx视频在线观看| 日韩三级免费| 日本一二三四高清不卡| 国产精品三区四区| 国产精品福利电影| 日韩精彩视频在线观看| 亚洲欧美一区二区激情| 亚洲AV无码久久精品国产一区| 中文在线最新版地址| 亚洲欧美另类久久久精品| 91精品久久久久久综合乱菊| 日韩免费观看一区二区| 国产电影一区二区在线观看| 日韩精品极品在线观看播放免费视频| 91亚洲精品久久久蜜桃借种| 一区一区三区| 午夜精品一区二区三区三上悠亚| 中文字幕在线中文字幕日亚韩一区| 天堂影院在线| 成人avav影音| 51精品国产人成在线观看| 538精品在线观看| 成人同人动漫免费观看| 欧美日韩国产123区| 欧美日韩在线一| 国产乱码在线| 洋洋成人永久网站入口| 黄瓜视频免费观看在线观看www | 日韩精品一区二区在线| 在线综合视频网站| 成年人视频在线免费观看| www久久久久| 久久久久网址| 青青久草在线| 国偷自产视频一区二区久| 七七婷婷婷婷精品国产| 亚洲欧洲日产国码av系列天堂| 91福利视频免费观看| 亚洲香蕉久久| 777色狠狠一区二区三区| 欧美日韩在线观看不卡| jvid一区二区三区| 欧美三级电影精品| 久久人人爽av| 成人国产精品久久| 欧美一区二区三区色| 国产精品一色哟哟| 日韩激情美女| 亚洲成av人在线观看| 青青青青草视频| 欧美aaaaa性bbbbb小妇| 欧美性猛交xxxx偷拍洗澡| 亚洲免费视频一区| 人妻精品无码一区二区| 免费观看久久久4p| 国产精品免费久久久久久| 中文字幕人妻一区二区三区视频| 蜜桃视频一区二区| 亚洲xxxxx性| 欧美 日韩 人妻 高清 中文| www.欧美亚洲| 日本高清一区| 黄色网址在线免费播放| 亚洲精品高清在线观看| 成年人网站免费视频| 日韩在线观看www| 亚洲色图在线播放| 日本免费a视频| 在线天堂新版最新版在线8| 欧美性受xxxx| 国产xxx在线观看| 少妇久久久久| 亚洲成年人在线| 成人网站免费观看| 国产韩日影视精品| 欧美交受高潮1| 天天干天天色综合| 国产精品一区在线| 亚洲国产精品va在线| 日韩精品伦理第一区| 三区四区在线视频| 午夜视黄欧洲亚洲| 男女视频在线看| 欧美成人视屏| 亚洲一本大道在线| 天堂av在线中文| av资源在线播放| 欧美日韩高清影院| 国内精品久久99人妻无码| 久久神马影院| 97国产一区二区精品久久呦| 中文字幕人妻一区二区三区视频| 福利一区二区在线| 亚洲视频电影| 美女视频在线免费| 欧美一级日韩一级| 超薄肉色丝袜一二三| 美女毛片一区二区三区四区最新中文字幕亚洲 | 韩国精品美女www爽爽爽视频| 性色av免费观看| 国产白丝精品91爽爽久久| 亚洲7777| 手机看片久久| 亚洲国产成人精品一区二区 | 你懂的在线视频| 亚洲激情图片小说视频| 黄色片视频在线| 亚洲最好看的视频| 国内精品久久影院| 性生交生活影碟片| 国产一区二区调教| 先锋影音网一区| 亚洲人体视频| 亚洲精品suv精品一区二区| 欧美日韩在线视频免费播放| 免费观看成人av| 日韩欧美亚洲日产国| 色吧亚洲日本| 亚洲精品720p| 日韩成人在线免费视频| 国产精品一区二区你懂的| 久久亚洲精品成人| 中国丰满人妻videoshd| 手机在线免费av| 欧美日韩国产欧美日美国产精品| 亚洲第一页av| 久久国产日韩| 久久久一本精品99久久精品| 爱啪啪综合导航| 欧美本精品男人aⅴ天堂| 97精品在线播放| 极品少妇一区二区| 在线观看免费黄色片| 青青草国产一区二区三区| 91精品国产全国免费观看| 国产精品美女高潮无套| 媚黑女一区二区| 麻豆成人av| 日本精品一区二区三区在线播放| 91极品美女在线| www久久久久久久| 久久www免费人成看片高清| 亚洲精品永久www嫩草| 精品国产黄a∨片高清在线| 少妇av一区二区三区| 97国产精品久久久| 尤物视频一区二区| 成年人小视频在线观看| 亚洲精品欧美| 欧美一区视久久| 成人免费黄色| 久久精品国产亚洲精品2020| 日韩成人在线免费视频| 99精品黄色片免费大全| 妺妺窝人体色www在线小说| 嫩草国产精品入口| 国产成人亚洲综合91精品| 2019中文字幕在线视频| 69p69国产精品| 日韩精品一区二区亚洲av性色| 国产精品123区| 99视频在线免费播放| 欧美女优在线视频| 成人午夜在线观看| 国产夫妻在线播放| 亚洲天堂网在线观看| 97人妻精品一区二区三区软件| 亚洲精品乱码久久久久久| 荫蒂被男人添免费视频| 全部av―极品视觉盛宴亚洲| 国产奶头好大揉着好爽视频| 99久热这里只有精品视频免费观看| 国产精品丝袜一区| 欧美18视频| 欧美久久久网站| 国语自产偷拍精品视频偷| 国产视频网址在线| 日韩丝袜美女视频| 手机在线看片1024| 日韩理论片一区二区| 北岛玲一区二区| 欧美福利网址| 欧美精品人人做人人爱视频| 亚洲精品伊人| 欧美孕妇孕交黑巨大网站| 日本三级视频在线观看| 亚洲国产一区二区三区在线观看| 亚洲视频在线免费播放| 亚欧色一区w666天堂| 久久一级免费视频| 99久久综合精品| 色偷偷中文字幕| 91精品国产自产拍在线观看蜜| 国产麻豆日韩| 91精品一区| 国产不卡av在线免费观看| 免费影视亚洲| 精品国产第一区二区三区观看体验| 国产精品嫩草影院俄罗斯| 99久久综合99久久综合网站| 中文字幕线观看| 首页国产欧美日韩丝袜| 国产黄色片免费在线观看| 国产精品伦理久久久久久| 免费观看成人高| 精品视频高潮| 999热视频| www.久久热| 国产欧美一区二区三区在线看| 欧产日产国产精品视频 | 亚洲色婷婷一区二区三区| 久久久99久久| 性欧美成人播放77777| 粉嫩绯色av一区二区在线观看| 手机av在线网| 美国毛片一区二区| 亚洲性生活网站| 久久黄色网页| 一本大道熟女人妻中文字幕在线 | 成人精品小视频| 亚洲女同同性videoxma| 全黄性性激高免费视频| 伊人久久成人| 日韩精品在线中文字幕| 欧美色图首页| 日韩精品在线一区| 国产福利拍拍拍| 午夜精品一区二区三区三上悠亚| 国产一级淫片免费| 亚洲综合久久av| 国产一级做a爱免费视频| 亚洲综合丝袜美腿| 国产一级在线视频| 午夜国产精品影院在线观看| 日韩精品一区二区av| 亚洲国产精品久久久久婷婷884 | 成人av资源网| 日韩精品一区二区三区中文| 亚洲自拍小视频免费观看| 精品视频一区二区三区| 999国产视频| 精品视频自拍| 女同一区二区| 欧美顶级大胆免费视频| 国产大尺度在线观看| 女主播福利一区| 国产无限制自拍| 亚洲欧美大片| 中文字幕在线综合| 国产精品羞羞答答xxdd| 人妻 丝袜美腿 中文字幕| av成人老司机| 国产精品久久久久久久av| 中文一区二区完整视频在线观看 | 999国产在线视频| 精品国产欧美一区二区三区成人| 日韩精品亚洲人成在线观看| 91av在线免费观看| 高清电影一区| 97超级在线观看免费高清完整版电视剧| 96sao在线精品免费视频| 麻豆成人在线播放| 66国产精品| 国产精品又粗又长| 日本中文字幕一区二区视频| 日韩va在线观看| 91在线丨porny丨国产| 亚洲精品国产精品国自| 亚洲伦在线观看| 在线能看的av| 欧美一区二区三区系列电影| 国精产品乱码一区一区三区四区| 亚洲欧美在线免费| 18视频在线观看网站| 亚洲日韩中文字幕| 蜜桃视频网站在线观看| 97在线免费观看视频| 国产精品成人国产| 国产乱人伦精品一区二区| 成人同人动漫免费观看| 黄页免费在线观看视频| 黄色在线网站| 亚洲精品在线观看www| www在线观看播放免费视频日本| 97免费视频在线播放| 国产成人免费精品| 久久国产一区| 欧美日韩国内| 中文字幕22页| 国产网红主播福利一区二区| 玖玖爱免费视频| 欧美色爱综合网| 欧美xxx.com| 欧美国产第一页| 日韩免费大片| 日产精品久久久一区二区| 激情久久综合| 男插女视频网站| 中文av一区二区| 激情五月婷婷网| 亚洲а∨天堂久久精品9966| 黄视频网站在线看| 国产精品免费一区豆花| 亚洲深夜福利在线观看| 人人妻人人澡人人爽欧美一区| 日本va欧美va精品| 性久久久久久久久久| 亚洲第一久久影院| 国产极品999| 久久av在线看| 亚洲欧洲二区| 一本色道久久99精品综合| 国产一区二区精品| 国产伦精品一区二区免费| 一区二区三区日韩欧美| 国产一区二区波多野结衣 | 超碰在线免费播放| 国产精品综合网站| 欧美日韩一二| 无码aⅴ精品一区二区三区浪潮| 不卡av电影在线播放| 久久综合综合久久| 精品成人a区在线观看| 羞羞的视频在线观看| 亚洲xxxxx性| 午夜视频精品| 性猛交╳xxx乱大交| 亚洲综合视频在线| 国产 欧美 自拍| 欧美激情第一页xxx| 国产suv精品一区二区四区视频| 大荫蒂性生交片| 成人精品在线视频观看| 国产在线观看免费视频今夜| 精品国产乱码久久久久久图片 | 999久久久91| 九九九久久久久久久| 亚洲精品第一国产综合野| www.com在线观看| 国外视频精品毛片| 蜜桃一区二区三区| 国产精品视频黄色| 国产精品你懂的| 国产成人毛毛毛片| 午夜伦理精品一区| 国产不卡一二三区| 91超碰caoporn97人人| 日本一级理论片在线大全| 国产高清一区二区三区| 宅男噜噜噜66一区二区| 免费观看成人网| 国产精品免费丝袜| 国产成人久久精品77777综合 | 日韩a**中文字幕| 一本色道久久99精品综合| 国产福利精品导航| 久久久久久91亚洲精品中文字幕| 亚洲欧洲成视频免费观看| 久久电影天堂| 蜜臀av色欲a片无码精品一区| 91色|porny| 国产精品久久久久久免费播放| 久久99精品久久久久久噜噜| 欧美性生活一级片| 午夜精品在线免费观看| 亚洲黄色小说网站| 国产精品资源网站| 日本丰满大乳奶| 国产成人亚洲精品青草天美| 欧美成人aaaaⅴ片在线看| 亚洲欧美成人精品| 亚洲精品成人一区| 一二三四视频社区在线| 亚洲国产精品激情在线观看| 国产色片在线观看| 日韩av大片在线| 视频一区在线免费看| www亚洲国产| 337p粉嫩大胆噜噜噜噜噜91av| 久久久999久久久| 久久久久国色av免费观看性色 | 国产一区二区三区亚洲| 国产在线精品一区二区中文| 欧美综合国产| 中文字幕在线有码| 亚洲色在线视频| 亚洲精品一区国产|