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

如何優(yōu)雅的在 Zadig 上實踐交付物溯源流程

開發(fā) 架構(gòu)
一些常見交付物類型在 Zadig 上的溯源思路總結(jié),相比于通過原始的 Image ID 、Digest ....來反推進行追蹤,該流程可以讓用戶以及開發(fā)人員通過更簡單便捷的方式上報或者追蹤交付物問題,提高問題排查定位的效率。

背景

云原生服務(wù)的開發(fā)迭代,Docker 鏡像作為最終的交付產(chǎn)物,其生命周期中存在多個環(huán)節(jié)的流轉(zhuǎn):從鏡像構(gòu)建開始,到開發(fā)、測試環(huán)境的更新驗證,再到交付制品生成,交付到生產(chǎn)環(huán)境。在這一整套的流轉(zhuǎn)過程中,鏡像作為流轉(zhuǎn)物,只要中間的一個流程出現(xiàn)失誤,很容易導(dǎo)致交付到生產(chǎn)環(huán)境的鏡像出現(xiàn)問題。

雖然 Tag 可以讓鏡像有一定的辨識度,但其可以修改的特性,并不能作為辨識身份的標(biāo)準。 如果構(gòu)建流程中有需要人工干預(yù)修改 Tag 的操作,在交付過程中也會引入更多的風(fēng)險。鏡像 ID 和 Digests 配合可以作為唯一身份標(biāo)識確保交付物的一致性,但可讀性比較差,出現(xiàn)交付物不一致的問題,溯源的成本也比較高。

docker images --digests
REPOSITORY                                                   TAG                     DIGEST                                                                    IMAGE ID       CREATED         SIZE
koderover.tencentcloudcr.com/koderover-public/aslan          1.15.0-20220922-amd64   sha256:8af42b5dd2a8539c3a1ead4f7bcbcc0028f1ec84090ace6f853793151fc0a7d0   35331bf1ae55   22 hours ago    188MB
koderover.tencentcloudcr.com/koderover-public/zadig-portal   1.13.0-amd64            sha256:15d8207a3ab3573ea8e5a3e32be9fa9340dfb4a5fe0842d3ef848a92655c6f58   1cb89026c2c5   47 hours ago    133MB
koderover.tencentcloudcr.com/koderover-public/zadig-portal   1.14.0-amd64            sha256:1bdb47274a6cb6da12b5fb2d3a073e820a8d5a8be9dac48f8f624adb85ddcefd   63e46ebf3e11   3 weeks ago     133MB
tailscale/docker-extension                                   0.0.13                  sha256:5f957b07602dd9b8923664f9b6acf86081c5bfd60b86bf46ab56e3f323ca4de9   1ae72d777218   2 months ago    129MB
algolia/docsearch-scraper                                    latest                  sha256:7bc1cd5aa4783bf24be9ddd6ef22a629b6b43e217b3fa220b6a0acbdeb83b8f8   04e04eaa5c7d   15 months ago   1.74GB

本文將舉例說明使用 Tag 來辨識鏡像的一般痛點,以及如何借助 Zadig 的能力來解決構(gòu)建產(chǎn)物溯源的問題。

痛點

私有化交付過程中,某開發(fā)人工誤操作,不慎導(dǎo)致線上鏡像倉庫中某個服務(wù)的版本被本地推送的相同 Tag 的鏡像所覆蓋,其中包含未經(jīng)驗收測試的功能,用戶端升級服務(wù)或者重新拉取該服務(wù)鏡像后, 導(dǎo)致服務(wù)出現(xiàn)故障,比如:功能不 work、服務(wù)無法啟動...等,只通過鏡像無法追蹤具體是何種誤操作導(dǎo)致的,也不能定位到具體的代碼變更。

版本迭代過程中,難免會同時維護多個版本,用戶側(cè)使用的版本五花八門,如何進行版本和代碼信息的定位匹配,快速排查客戶端反饋的問題也是一個頭疼的工程難題。

下面將從構(gòu)建產(chǎn)物為鏡像以及非鏡像兩種場景,介紹涵蓋前后端的實踐方案:可以從構(gòu)建產(chǎn)物中直接獲取詳細的構(gòu)建鏈路流程信息,提高后續(xù)問題定位排查的效率。

場景一:鏡像構(gòu)建產(chǎn)物

核心原理:修改 Dockerfile 添加 LABEL,利用 Zadig 內(nèi)置構(gòu)建變量的能力,構(gòu)建鏡像時將其動態(tài)注入。

背景知識

關(guān)于 Docker 鏡像構(gòu)建、LABEL 能力以及構(gòu)建參數(shù)相關(guān)可閱讀以下資料:

Docker object labels[1]

Docker label / OCI image annotation metadata types[2]

Dockerfile LABEL[3]

Docker build ARG[4]

第一步:編寫 Dockerfile

修改 Dockfile 動態(tài)注入 Zadig 提供的構(gòu)建變量,這里以開源的 zadig-portal[5] 為例,主要注入如下信息:

  • 構(gòu)建時間
  • 構(gòu)建任務(wù)的 URL
  • 代碼信息(代碼庫/分支/PR/Tag/Commit ID)

如果需要注入其他參數(shù),可以根據(jù)實際的項目需求進行自定義。核心代碼如下:

ARG repoName="zadig-portal"
ARG branch=""
ARG pr=""
ARG tag=""
ARG commit=""
ARG buildTime=""
ARG buildURL=""


LABEL maintainer="Zadig Maintainers" \
    description="Zadig is a cloud native, distributed, developer-oriented continuous delivery product." \
    repoName=${repoName} \
    branch=${branch} \
    pr=${pr} \
    tag=${tag} \
    commit=${commit} \
    buildTime=${buildTime} \
    buildURL=${buildURL}

第二步:完成構(gòu)建配置

將 Zadig 提供的內(nèi)置構(gòu)建變量,透傳到 docker build --build-arg,主要使用以下變量:

  • $BUILD_URL 構(gòu)建任務(wù)的 URL
  • $<REPO>_PR 構(gòu)建時使用的代碼 Pull Request 信息
  • $<REPO>_BRANCH 構(gòu)建時使用的代碼分支信息
  • $<REPO>_TAG 構(gòu)建時使用代碼 Tag 信息
  • $<REPO>_COMMIT_ID 構(gòu)建時使用代碼 Commit 信息

圖片

由于 zadig-portal 使用的鏡像構(gòu)建,這里配置鏡像構(gòu)建的構(gòu)建參數(shù),將變量透傳到 Docker build ARG 。如果不使用鏡像構(gòu)建也可以根據(jù)實際構(gòu)建需求,在腳本中手動拼接 docker build 參數(shù)。

構(gòu)建參數(shù)中內(nèi)容如下:

--build-arg branch=$zadig_portal_BRANCH --build-arg pr=$zadig_portal_PR --build-arg tag=$zadig_portal_TAG --build-arg commit=$zadig_portal_COMMIT_ID --build-arg buildTime=$(date +%s) --build-arg buildURL=$BUILD_URL

圖片

第三步:效果驗證

至此,所有通過 Zadig 運行工作流產(chǎn)生的交付鏡像,都會被打上自定義的 Label。

圖片

可以通過 docker pull 之后 docker inspect 查看注入的 Label。

圖片

嘗試進行 docker tag 后,重新查看 Label,Label 并不會因為 Retag 而發(fā)生變化。

圖片

場景二:其他構(gòu)建產(chǎn)物

核心原理:利用 Zadig 的構(gòu)建參數(shù)能力,動態(tài)傳入來源信息。

對于暫時不便于遷移容器部署的場景,比如基礎(chǔ)設(shè)施本身是可網(wǎng)絡(luò)互通的設(shè)備:IoT 物聯(lián)網(wǎng)場景下自動駕駛車輛主機端、工廠可連接設(shè)備...等,交付物可能是二進制或者是前端靜態(tài)文件。上述通過鏡像做追蹤溯源的實踐方法也就不再適用。下面分別介紹前端靜態(tài)文件以及后端二進制程序的溯源方法。

前端靜態(tài)文件

現(xiàn)代化前端應(yīng)用離不開模塊打包工具,這里以 Webpack 為例,介紹一種通過環(huán)境變量透傳的溯源方法。其他的工具 Vite、Parcel ...... 也可以參照該思路進行實踐,具體配置可以參照相關(guān)打包工具的文檔。

背景知識

  • Webpack Define Plugin[6]
  • Webpack Environment Plugin[7]
  • Process Env[8]

第一步:代碼實現(xiàn)

1. 構(gòu)建模板代碼實現(xiàn)

該步驟主要依賴 Webpack Define Plugin ,創(chuàng)建一個需要的構(gòu)建環(huán)境變量模板,方便后續(xù)構(gòu)建時動態(tài)替換參數(shù)。

const env = require('./config/prod.env');
.......//其他配置
    plugins: [
      new webpack.DefinePlugin({
        'BUILDINFO': env
      }),
    ]

prod.env 文件內(nèi)容如下:

'use strict'
module.exports = {
  VERSION: '"${VERSION}"',
  BUILD_TIME: '"${BUILD_TIME}"',
  TAG: '"${TAG}"',
  COMMIT_ID: '"${COMMIT_ID}"',
  BRANCH: '"${BRANCH}"',
  PR: '"${PR}"',
}

這里主要暴露以下參數(shù),可以根據(jù)實際需求進行自定義。

  • VERSION
  • BUILD_TIME
  • TAG
  • COMMIT_ID
  • BRANCH
  • PR

2.在業(yè)務(wù)代碼中讀取并展示構(gòu)建變量

這里以 Vue 項目為例,實現(xiàn)在終端中打印構(gòu)建信息,其他項目可自行調(diào)整。核心代碼如下:

computed: {
    processEnv () {
      return process.env
    },
  },
  mounted () {
    if (this.processEnv && this.processEnv.NODE_ENV === 'production' && BUILDINFO) {
      console.log('%cHello ZADIG!', 'color: #e20382;font-size: 13px;')
      const buildInfo = []
      if (BUILDINFO.VERSION) {
        buildInfo.push(`${BUILDINFO.VERSION}`)
      }
      if (BUILDINFO.TAG) {
        buildInfo.push(`Tag-${BUILDINFO.TAG}`)
      }
      if (BUILDINFO.BRANCH) {
        buildInfo.push(`Branch-${BUILDINFO.BRANCH}`)
      }
      if (BUILDINFO.PR) {
        buildInfo.push(`PR-${BUILDINFO.PR}`)
      }
      if (BUILDINFO.COMMIT_ID) {
        buildInfo.push(`${BUILDINFO.COMMIT_ID.substring(0, 7)}`)
      }
      console.log(
        `%cBuild:${buildInfo.join(' ')}`,
        'color: #e20382;font-size: 13px;'
      )
      if (BUILDINFO.BUILD_TIME) {
        console.log(
          `%cTime:${moment
            .unix(BUILDINFO.BUILD_TIME)
            .format('YYYYMMDDHHmm')}`,
          'color: #e20382;font-size: 13px;'
        )
      }
    }
  }

第二步:完成構(gòu)建配置

將 Zadig 提供的內(nèi)置構(gòu)建變量,通過腳本實現(xiàn)動態(tài)替換 prod.env 的內(nèi)容,主要使用以下變量:

  • $<REPO>_PR 構(gòu)建時使用的代碼 Pull Request 信息
  • $<REPO>_BRANCH 構(gòu)建時使用的代碼分支信息
  • $<REPO>_TAG 構(gòu)建時使用代碼 Tag 信息
  • $<REPO>_COMMIT_ID 構(gòu)建時使用代碼 Commit 信息

圖片

第三步:效果驗證

運行工作流,可以看到構(gòu)建變量已經(jīng)成功的透傳,并且替換了預(yù)設(shè)的變量模板。

圖片

部署后查看控制臺,可以看到 Zadig 的構(gòu)建信息已經(jīng)可以在 console 中顯示。

圖片

后端二進制產(chǎn)物

由于后端二進制交付物背后的項目類型比較多,這里主要介紹 Golang 項目一種實現(xiàn)思路,該部分涉及到的源碼可以點擊 鏈接[9] 查看,其他項目類型可以根據(jù)實際情況進行參考和配置。

背景知識

  • go build -ldflags -X[10]
  • Kubectl version[11]
  • K8s version[12]
  • Golang 中管理程序的版本信息[13]

第一步:代碼實現(xiàn)

1. 定義版本信息

這里在項目中維護一份 version.go 文件,根據(jù)實際需求,定義需要暴露的參數(shù)。

package utils


import (
    "fmt"
    "runtime"
)


var (
    version      string
    gitBranch    string
    gitTag       string
    gitCommit    string
    gitPR        string
    gitTreeState string
    buildDate    string
    buildURL      string
)


// Info contains versioning information.
type Info struct {
    Version      string `json:"version"`
    GitBranch    string `json:"gitBranch"`
    GitTag       string `json:"gitTag"`
    GitCommit    string `json:"gitCommit"`
    GitPR        string `json:"gitPR"`
    GitTreeState string `json:"gitTreeState"`
    BuildDate    string `json:"buildDate"`
    BuildURL     string `json:"buildURL"`
    GoVersion    string `json:"goVersion"`
    Compiler     string `json:"compiler"`
    Platform     string `json:"platform"`
}


// String returns info as a human-friendly version string.
func (info Info) String() string {
    return info.Platform
}


func GetVersion() Info {
    return Info{
        Version:      version,
        GitBranch:    gitBranch,
        GitTag:       gitTag,
        GitCommit:    gitCommit,
        GitPR:        gitPR,
        GitTreeState: gitTreeState,
        BuildDate:    buildDate,
        BuildURL:     buildURL,
        GoVersion:    runtime.Version(),
        Compiler:     runtime.Compiler,
        Platform:     fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH),
    }
}

2. main 函數(shù)調(diào)用

在入口處設(shè)置傳入 version 參數(shù)調(diào)用 GetVersion 函數(shù):

package main


import (
    "fmt"
    "os"


    "version/utils"
)


func main() {


    args := os.Args
    if len(args) >= 2 && args[1] == "version" {
        v := utils.GetVersion()
        fmt.Printf("Version: %s\nBranch: %s\nCommit: %s\nPR: %s\nBuild Time: %s\nGo Version: %s\nOS/Arch: %s\nBuild URL: %s\n", v.Version, v.GitBranch, v.GitCommit,v.GitPR, v.BuildDate, v.GoVersion, v.Platform,v.BuildURL)
    } else {
        fmt.Printf("Version(hard code): %s\n", "0.1")
    }
}

3. 構(gòu)建工程文件編寫

這里新建一個 Makefile 進行構(gòu)建,使用 ldflags -X 透傳 Zadig 構(gòu)建內(nèi)置變量,核心邏輯如下:

# build with verison infos
versinotallow="version/utils"
gitTag=$(version_TAG)
gitBranch=$(version_BRANCH)
gitPR=$(version_PR)
buildDate=$(shell TZ=Asia/Shanghai date +%FT%T%z)
gitCommit=$(version_COMMIT_ID)
gitTreeState=$(shell if git status|grep -q 'clean';then echo clean; else echo dirty; fi)
buildURL=$(BUILD_URL)


ldflags="-s -w -X ${versionDir}.gitTag=${gitTag} -X ${versionDir}.buildDate=${buildDate} -X ${versionDir}.gitCommit=${gitCommit} -X ${versionDir}.gitPR=${gitPR} -X ${versionDir}.gitTreeState=${gitTreeState} -X ${versionDir}.versinotallow=${VERSION} -X ${versionDir}.gitBranch=${gitBranch} -X ${versionDir}.buildURL=${buildURL}"


PACKAGES=`go list ./... | grep -v /vendor/`
VETPACKAGES=`go list ./... | grep -v /vendor/ | grep -v /examples/`
GOFILES=`find . -name "*.go" -type f -not -path "./vendor/*"`


default:
    @echo "build the ${BINARY}"
    @GOOS=linux GOARCH=amd64 go build -ldflags ${ldflags} -o  build/${BINARY}.linux  -tags=jsoniter
    @go build -ldflags ${ldflags} -o  build/${BINARY}.mac  -tags=jsoniter
    @echo "build done."

第二步:完成構(gòu)建配置

在 Zadig 中配置構(gòu)建,在構(gòu)建腳本中構(gòu)建并打印輸出,詳細信息如下:

  • 依賴的軟件包 go 1.16.13
  • 自定義構(gòu)建變量 配置 VERSION 變量
  • 構(gòu)建腳本 內(nèi)容如下:
set -e
cd $WORKSPACE/zadig/examples/version-demo
env
make default
cd build
./version.linux version

圖片

第三步:效果驗證

運行工作流,可以看到構(gòu)建變量已經(jīng)成功的透傳,并且該二進制程序通過 version 參數(shù)可以打印詳細的構(gòu)建來源信息。

圖片

結(jié)語

以上,就是一些常見交付物類型在 Zadig 上的溯源思路總結(jié),相比于通過原始的 Image ID 、Digest ....來反推進行追蹤,該流程可以讓用戶以及開發(fā)人員通過更簡單便捷的方式上報或者追蹤交付物問題,提高問題排查定位的效率。

參考鏈接

[1] https://docs.docker.com/config/labels-custom-metadata/

[2] https://github.com/opencontainers/image-spec/blob/main/annotations.md

[3] https://docs.docker.com/engine/reference/builder/#label

[4] https://docs.docker.com/engine/reference/builder/#arg

[5] https://github.com/koderover/zadig-portal/blob/main/Dockerfile

[6] https://webpack.js.org/plugins/define-plugin/

[7] https://webpack.js.org/plugins/environment-plugin/#root

[8] https://nodejs.org/api/process.html#process_process_env

[9] https://github.com/koderover/zadig/tree/main/examples/version-demo

[10] https://pkg.go.dev/cmd/link

[11] https://github.com/kubernetes/kubectl/blob/master/pkg/cmd/version/version.go

[12] https://github.com/kubernetes/component-base/blob/master/version/version.go

[13] https://zhuanlan.zhihu.com/p/150991555

責(zé)任編輯:武曉燕 來源: KodeRover
相關(guān)推薦

2022-07-26 08:23:17

Zadig微服務(wù)

2022-07-26 11:08:14

ZadigIAST持續(xù)交付

2022-06-13 07:02:02

Zadig平臺自動化

2017-08-19 14:54:34

DevOps持續(xù)交付IT

2022-10-20 15:28:20

物聯(lián)網(wǎng)LTE-M

2019-12-18 14:32:52

物聯(lián)網(wǎng)項目物聯(lián)網(wǎng)IOT

2015-07-29 15:21:43

數(shù)字水印數(shù)據(jù)泄露數(shù)據(jù)安全

2024-03-05 09:39:03

Zadig版本管理版本

2022-07-12 08:27:18

Zadig開源

2021-09-27 13:16:24

LinuxWindows游戲

2020-11-26 18:30:33

機器學(xué)習(xí)Kubernetes開發(fā)

2016-07-12 17:29:40

Docker阿里云技術(shù)峰會

2019-02-19 14:52:01

微軟開源Windows

2021-06-05 06:52:16

Kubernetes

2021-08-09 10:21:42

云原生Dubbo3.0 服務(wù)治理

2016-12-23 09:09:54

TensorFlowKubernetes框架

2017-12-10 20:53:56

Docker持續(xù)交付容器

2021-10-12 10:28:00

物聯(lián)網(wǎng)人工智能IoT

2023-06-12 14:31:54

物聯(lián)網(wǎng)優(yōu)化農(nóng)業(yè)

2022-08-22 10:29:16

APT溯源反溯源APT攻擊
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲中文字幕无码av| 分分操这里只有精品| 亚洲手机在线观看| 91精品国产91久久久久久密臀| 日韩写真欧美这视频| 美女日批免费视频| 岛国在线视频| 国产精品综合av一区二区国产馆| 欧美床上激情在线观看| 中文人妻一区二区三区| jizz久久久久久| 一区二区三区不卡视频| 欧美一区二区影视| 国产露脸无套对白在线播放| 99日韩精品| 久久久999精品| 中文字幕人妻一区二区三区| 国产第一精品| 五月天一区二区三区| 亚洲午夜精品国产| 天天干天天插天天操| 久久精品国产免费看久久精品| 欧美激情女人20p| 快灬快灬一下爽蜜桃在线观看| 成人h动漫免费观看网站| 在线欧美日韩精品| 黄色一级视频片| 久操视频在线免费播放| 久久亚洲捆绑美女| 91文字幕巨乱亚洲香蕉| 中文字幕日韩国产| 在线视频精品| 高清欧美性猛交xxxx黑人猛交| 青青青视频在线播放| 清纯唯美亚洲经典中文字幕| 日韩亚洲国产中文字幕欧美| jizz大全欧美jizzcom| 新版的欧美在线视频| 亚洲最新视频在线观看| 精品少妇人妻av一区二区| 高清毛片在线看| 久久综合久久久久88| 国产精品一区二区三区四区五区 | 亚洲乱码国产乱码精品精可以看 | 成人影院免费观看| 91小视频免费观看| 国产精品一国产精品最新章节| 一区二区日韩视频| 免费人成在线不卡| 国产成人a亚洲精品| 国产精品xxxx喷水欧美| 亚洲午夜久久久久久尤物 | 日韩黄色中文字幕| 天堂99x99es久久精品免费| 精品99一区二区三区| 奇米777在线视频| 自拍偷拍欧美日韩| 欧美日韩一区在线| 校园春色 亚洲色图| 日韩三区免费| 欧美影片第一页| 波多野结衣作品集| 日韩av福利| 日本道色综合久久| 冲田杏梨av在线| 国产成人a视频高清在线观看| 欧美亚洲动漫制服丝袜| 国产九九在线观看| 久久婷婷五月综合色丁香| 欧美色图在线观看| 热久久久久久久久| 欧美日本三级| 亚洲第一网站免费视频| 国产精品无码专区| 国产一区二区三区四区| 中文字幕亚洲欧美在线| 成人无码精品1区2区3区免费看 | 欧美精品久久久久久久自慰| aa级大片免费在线观看| 欧美午夜精品久久久久久浪潮| 91免费视频网站在线观看| 成人免费看视频网站| 欧美三级欧美一级| 国产探花在线观看视频| 51亚洲精品| 亚洲免费视频网站| 青青青视频在线免费观看| 中文字幕一区二区精品区| 久久久久久亚洲精品中文字幕 | 天堂а√在线资源在线| 一区二区三区在线观看欧美| 波多野结衣家庭教师在线| 色老太综合网| 欧美一区二区高清| 亚洲精品乱码久久| 日韩欧美大片| 午夜精品在线观看| 成人黄色激情视频| 国产精品一区二区在线播放 | 三级黄色片播放| 麻豆成人入口| 色噜噜国产精品视频一区二区| 麻豆changesxxx国产| 三级影片在线观看欧美日韩一区二区 | 日本vs亚洲vs韩国一区三区二区| 亚洲va欧美va在线观看| 免费毛片在线| 亚洲激情一二三区| 国产精品无码av无码| 秋霞影院一区| 中文字幕日本精品| 日韩精品久久久久久久酒店| 老司机精品视频导航| 国产一区二区三区奇米久涩| 午夜视频在线免费观看| 精品久久久久久久久久ntr影视| 鲁一鲁一鲁一鲁一av| 欧美深夜视频| 久久国产精品久久久久久| 日韩精品一区不卡| 成人精品国产一区二区4080| 艳色歌舞团一区二区三区| 黄色aa久久| 欧美成人一区二区| 网爆门在线观看| 日韩精品一卡二卡三卡四卡无卡| 国产伦精品一区二区三毛| 欧美性猛交xxx乱大交3蜜桃| 欧美日韩在线免费观看| 91精品国产高清91久久久久久 | 一区二区中文字幕| 日本一级片免费看| 成人动漫一区二区三区| 一级特黄妇女高潮| 色综合视频一区二区三区44| 亚洲人成电影网| 可以免费在线观看的av| 成人激情av网| 亚洲熟妇无码av在线播放| 亚洲精品成人一区| 中文字幕精品在线| 草莓视频18免费观看| 96av麻豆蜜桃一区二区| 美女扒开大腿让男人桶| 美女精品久久| 九九久久久久99精品| 国产又粗又猛又黄| 一色屋精品亚洲香蕉网站| 日韩一级片播放| 免费视频亚洲| 国产成人精品日本亚洲专区61| 亚洲日本国产精品| 精品色蜜蜜精品视频在线观看| 午夜免费福利影院| 亚洲第一黄网| 国产三级精品在线不卡| а√天堂中文资源在线bt| 精品国产自在久精品国产| 无码人妻精品一区二区三区夜夜嗨| 久久精品国产免费看久久精品| 亚洲综合第一| 看亚洲a级一级毛片| 欧美成人黑人xx视频免费观看| 97人妻精品一区二区三区| 亚洲麻豆国产自偷在线| 伊人av在线播放| 亚洲区一区二| 久久久一本精品99久久精品| 欧美电影免费观看高清完整| 国产一区二区三区毛片| 亚洲天堂狠狠干| 亚洲嫩草精品久久| 亚洲成年人在线观看| 亚洲欧美不卡| 四虎一区二区| 成人久久精品| 97国产精品视频人人做人人爱| 无码国产精品高潮久久99| 色哟哟精品一区| 91视频最新网址| 国产69精品久久777的优势| 欧美久久久久久久久久久久久| 思热99re视热频这里只精品| 国产精品久久久久7777婷婷| 免费人成在线观看播放视频| 欧美成人国产一区二区| 一级片视频在线观看| 国产欧美日韩三区| 亚欧美一区二区三区| 日韩视频二区| 亚洲国产一区二区三区在线| 日韩欧美中文字幕一区二区三区| 97视频网站入口| 色视频在线免费观看| 日韩女优毛片在线| 天天爱天天做天天爽| 亚洲视频在线观看三级| 7788色淫网站小说| 久久精品国产亚洲aⅴ| 黄网站欧美内射| 爽成人777777婷婷| 国产一区二区自拍| 亚洲午夜剧场| 秋霞成人午夜鲁丝一区二区三区| 免费超碰在线| 亚洲欧美激情在线视频| www.国产精品视频| 日本道在线观看一区二区| 久久午夜无码鲁丝片| 亚洲国产精品国自产拍av| 亚洲av人人澡人人爽人人夜夜| 免费成人你懂的| 日日橹狠狠爱欧美超碰| 在线国产一区二区| 日本黄网免费一区二区精品| jizz国产精品| 91天堂在线视频| 激情亚洲影院在线观看| 欧美精品videos另类日本| 77777影视视频在线观看| 日韩成人黄色av| 精品国产亚洲av麻豆| 欧美亚洲综合在线| 六月丁香在线视频| 亚洲一卡二卡三卡四卡| 亚洲欧美精品aaaaaa片| 欧美国产一区二区| 欧美无人区码suv| 国产999精品久久久久久| 亚洲欧美偷拍另类| 日韩av一区二区在线影视| 精品少妇一区二区三区在线| 亚洲高清资源| 激情五月六月婷婷| 国产精品毛片一区二区在线看| 日韩av电影免费播放| 欧美三级电影在线| 国产亚洲精品久久飘花| 亚洲精品v亚洲精品v日韩精品| 91精品国产综合久久男男| 成人免费毛片嘿嘿连载视频…| 69国产精品成人在线播放| 丰满大乳少妇在线观看网站| 久久国产精品久久久久| 成人在线观看免费网站| 日韩中文字幕免费看| eeuss影院www在线观看| 亚洲天堂av综合网| 欧美大片aaa| 亚洲欧美日韩一区二区在线| 青青草在线免费视频| 国产视频精品免费播放| 水中色av综合| 亚洲欧美国产精品专区久久| 美女毛片在线看| 国产一区二区三区毛片| 91精品大全| 精品国产一区二区三区久久久狼 | 一级特黄aaaaaa大片| 欧美日韩中文另类| 91女人18毛片水多国产| 69久久99精品久久久久婷婷| 国产农村老头老太视频| 欧美成人三级电影在线| 熟妇人妻中文av无码| 亚洲欧美日韩一区二区在线| 国产精品影院在线| 中文字幕自拍vr一区二区三区| 日本中文在线| 欧美二区在线播放| 高清在线视频不卡| 欧美专区在线播放| 国产91精品在线| 91久久精品美女高潮| 91成人福利| 久久资源av| 久久一区二区三区喷水| 在线观看17c| 日韩一级在线| 国产三级国产精品国产专区50| 国产米奇在线777精品观看| 欧美做受高潮中文字幕| 久久亚洲二区三区| 97在线观看视频免费| 午夜精品一区二区三区电影天堂| 在线天堂中文字幕| 欧美日韩国产综合视频在线观看| 精品黑人一区二区三区在线观看| 亚洲第一精品自拍| 国产69精品久久app免费版| 欧美成人午夜激情| 成人免费影院| 亚洲一区国产精品| 伊人久久大香线蕉| 偷拍盗摄高潮叫床对白清晰| 99热免费精品在线观看| 日韩av自拍偷拍| 91在线国内视频| 亚洲色图综合区| 欧美色视频日本高清在线观看| ,亚洲人成毛片在线播放| 亚洲福利小视频| 午夜小视频在线| 欧美一区二粉嫩精品国产一线天| 国产亚洲人成a在线v网站| 精品国产91亚洲一区二区三区www| 欧美亚洲在线日韩| 日本欧美视频在线观看| 久久99热这里只有精品| 亚洲国产综合视频| 亚洲免费观看高清完整版在线观看熊| 天天操夜夜操视频| 精品美女一区二区三区| 91xxx在线观看| 欧美综合第一页| 一区中文字幕| 一区二区三区我不卡| 久久成人一区| 麻豆精品国产传媒av| 成人免费在线播放视频| 久久久999久久久| 亚洲精品一区二三区不卡| 动漫一区二区| 91精品视频在线免费观看| 黑人操亚洲人| 国产视频一视频二| 国产xxx精品视频大全| 91麻豆精品成人一区二区| 色8久久人人97超碰香蕉987| 天堂在线资源库| 欧美高清自拍一区| 国产在线视频欧美一区| www.午夜色| 老司机免费视频一区二区三区| 国产高清一区二区三区四区| 欧美日韩在线第一页| 五月天丁香视频| 久久久噜噜噜久久中文字免| 视频一区中文字幕精品| 国产大尺度在线观看| 美女网站色91| 中文字幕第69页| 欧美日韩第一区日日骚| 在线看免费av| 国产精品入口免费视| 精品国产不卡| 婷婷六月天在线| 国产日韩亚洲欧美综合| 懂色av蜜臀av粉嫩av喷吹| 中文在线不卡视频| 免费成人毛片| 黄色网zhan| 国产乱理伦片在线观看夜一区| 亚洲熟女毛茸茸| 欧美一级在线视频| 1区2区在线观看| 国产传媒一区二区| 亚洲国产婷婷| 深爱五月激情网| 在线欧美小视频| 欧美尤物美女在线| 91精品久久久久久蜜桃| 国产精品xvideos88| 国产白袜脚足j棉袜在线观看 | 亚洲欧美一二三区| 一区二区三区在线播放欧美| 久久亚洲国产精品尤物| mm131午夜| 不卡的av网站| 日韩欧美国产另类| 日韩中文字幕在线| 日韩精品免费视频一区二区三区 | 亚洲欧美精品久久| 欧美一区二区三区的| heyzo在线播放| 日本高清久久一区二区三区| 久久er99热精品一区二区| 国产女人被狂躁到高潮小说| 欧美精品一区二区精品网| 成人欧美大片| 亚洲小说欧美另类激情| 99视频在线精品| 最近中文字幕在线视频| 欧美精品在线免费| 亚洲涩涩av| 想看黄色一级片| 天天综合天天综合色| 国产一区电影| 99视频免费观看蜜桃视频| 老鸭窝毛片一区二区三区| 日韩三级久久久| 亚洲国产高清福利视频| 992tv国产精品成人影院| 精品一区二区三区毛片| 国产香蕉久久精品综合网| 国产xxxxxx| 国产精品美乳在线观看| 亚洲电影在线| 欧美色视频一区二区三区在线观看| 亚洲成年人在线播放|