日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

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

服務(wù)器自動(dòng)拉取Git代碼:Cron、Webhook與CI/CD全方案實(shí)操

服務(wù)器自動(dòng)拉取Git代碼:Cron、Webhook與CI/CD全方案實(shí)操 代碼寫(xiě)完了push 到倉(cāng)庫(kù)然后呢如果線上服務(wù)器還得你手動(dòng) SSH 進(jìn)去 pull 一把那這自動(dòng)化就算斷了最后一環(huán)。尤其是現(xiàn)在前后端分離、多環(huán)境部署開(kāi)發(fā)機(jī)、測(cè)試機(jī)、生產(chǎn)機(jī)好幾套環(huán)境每次上線都要跑一遍git pull或者git pull --rebase看著沒(méi)啥成本真遇到線上問(wèn)題急著修復(fù)的時(shí)候那就全是心梗時(shí)刻——你剛寫(xiě)完 fix老板在背后看著線上用戶在罵結(jié)果你卡在登錄服務(wù)器、輸密碼、切目錄、拉代碼這條鏈路里每一步都像在跑馬拉松。所以服務(wù)器上自動(dòng)拉取 git 倉(cāng)庫(kù)代碼這件事不是省一點(diǎn)事情的問(wèn)題它是讓整個(gè)發(fā)布流程真正閉環(huán)的最后一道閘門(mén)。我在這塊折騰過(guò)不少方案從最簡(jiǎn)單的定時(shí)腳本到后來(lái)接 Webhook 做事件驅(qū)動(dòng)再到再后來(lái)把整套流程納入現(xiàn)有 CI 體系里作為構(gòu)建前的一個(gè)前置觸發(fā)器。這里面的原理、選型、坑說(shuō)實(shí)話都不少我踩過(guò)很多次整理一篇實(shí)操總結(jié)希望能幫你把這條路走順。1. 自動(dòng)拉取方案的選型與適用場(chǎng)景拆解先說(shuō)思路。服務(wù)器自動(dòng)拉取代碼本質(zhì)上就是把人肉觸發(fā)變成事件觸發(fā)或定時(shí)觸發(fā)。核心就兩個(gè)問(wèn)題什么時(shí)間拉以及怎么知道有沒(méi)有新代碼。1.1 三種主流方案的心智模型方案一Cron 定時(shí)輪詢。服務(wù)器每隔一段時(shí)間比如每分鐘或每五分鐘去執(zhí)行一次git pull。這種方式最直接沒(méi)有任何外部依賴服務(wù)器主動(dòng)去遠(yuǎn)端檢查。方案二Webhook 事件驅(qū)動(dòng)。遠(yuǎn)端倉(cāng)庫(kù)GitHub/GitLab/Gitea 等在收到 push 事件后向服務(wù)器上的一個(gè)接收端發(fā)送 HTTP 請(qǐng)求服務(wù)器收到請(qǐng)求后執(zhí)行拉取腳本。方案三CI/CD 流水線內(nèi)置。代碼拉取不再是服務(wù)器自己完成而是交給 CI 系統(tǒng)某常見(jiàn)的開(kāi)源CI系統(tǒng)或某團(tuán)隊(duì)使用的構(gòu)建平臺(tái)在一個(gè)節(jié)點(diǎn)上執(zhí)行拉取成功后繼續(xù)構(gòu)建部署。關(guān)于方案選型我個(gè)人的判斷維度有三個(gè)環(huán)境規(guī)模、網(wǎng)絡(luò)可達(dá)性、實(shí)時(shí)性要求。如果你只有一臺(tái)服務(wù)器且內(nèi)網(wǎng)部署實(shí)時(shí)性要求又不高Cron 方案最簡(jiǎn)單直接。如果需要分鐘級(jí)甚至秒級(jí)生效且服務(wù)器有公網(wǎng)端口或可以通過(guò)內(nèi)網(wǎng)穿透打通Webhook 是最自然的選擇。如果團(tuán)隊(duì)已經(jīng)有 CI 流水線那就不要再自己造定時(shí)任務(wù)了直接讓 CI 來(lái)跑代碼拉取保證所有環(huán)境使用的代碼版本一致。1.2 為什么要關(guān)注觸發(fā)方式而不僅僅是能拉代碼很多教程只告訴你寫(xiě)一個(gè)git pull然后掛到 Cron 里就完事了但實(shí)際工程里自動(dòng)拉取只是第一步拉完之后你還需要考慮要不要自動(dòng)重啟服務(wù)要不要自動(dòng)執(zhí)行數(shù)據(jù)庫(kù)遷移要不要回滾策略。這些需求的復(fù)雜度直接決定了你選擇哪一種觸發(fā)方式。Cron 的優(yōu)點(diǎn)是穩(wěn)定、簡(jiǎn)單、可控缺點(diǎn)是無(wú)法感知事件即使沒(méi)有新提交也會(huì)白跑一趟。Webhook 的優(yōu)點(diǎn)是精確、實(shí)時(shí)缺點(diǎn)是必須處理網(wǎng)絡(luò)可達(dá)性問(wèn)題和事件重試機(jī)制。CI 的優(yōu)點(diǎn)是全鏈路自動(dòng)化缺點(diǎn)是需要有 CI 基礎(chǔ)設(shè)施并且拉代碼這個(gè)動(dòng)作被托管了有時(shí)候定位問(wèn)題反而多一層。下面這張表格列出我在選型時(shí)的對(duì)比維度你可以直接拿去用方案觸發(fā)精度實(shí)時(shí)性外部依賴適用規(guī)模運(yùn)維復(fù)雜度Cron 定時(shí)輪詢分鐘級(jí)一般無(wú)單機(jī)/小規(guī)模低Webhook 事件驅(qū)動(dòng)精確到事件秒級(jí)需要網(wǎng)絡(luò)打通多機(jī)/公網(wǎng)部署中CI/CD 流水線內(nèi)置精確到事件秒級(jí)依賴 CI 系統(tǒng)多環(huán)境/多分支中高提示如果你的服務(wù)器有靜態(tài)公網(wǎng) IP且所在網(wǎng)絡(luò)環(huán)境比較穩(wěn)定Webhook 方案是長(zhǎng)期性價(jià)比最高的。如果服務(wù)器只在辦公內(nèi)網(wǎng)里那要么做內(nèi)網(wǎng)穿透要么干脆用 Cron。別本末倒置為了用 Webhook 去折騰復(fù)雜的網(wǎng)絡(luò)通道得不償失。2. 核心細(xì)節(jié)解析密鑰配置與倉(cāng)庫(kù)鎖定這塊是自動(dòng)拉取方案里最容易被忽略、但一旦出了問(wèn)題又最難排查的地方。我把它單獨(dú)拆成一章說(shuō)。2.1 服務(wù)器密鑰配置為什么禁用 HTTPS 方式很多新手第一次配置自動(dòng)拉取時(shí)直接在服務(wù)器上git clone https://github.com/xxx/repo.git然后發(fā)現(xiàn)每次 pull 都要輸入賬號(hào)密碼。這是因?yàn)?HTTPS 方式的憑據(jù)沒(méi)有被安全保存或者保存了但存在權(quán)限過(guò)寬的問(wèn)題。在自動(dòng)化場(chǎng)景里這是絕對(duì)不能接受的——腳本里不能寫(xiě)密碼交互式輸入密碼又會(huì)讓自動(dòng)拉取失效。所以正確做法是使用 SSH 方式。具體步驟如下在服務(wù)器上生成部署專(zhuān)用密鑰。注意這個(gè)密鑰是給服務(wù)器拉取代碼用的不要隨便添加到你個(gè)人的賬號(hào)里建議做成單獨(dú)只讀的 Deploy Key部署密鑰。ssh-keygen -t ed25519 -C server-deploy-$(hostname) -f ~/.ssh/deploy_key -N 這里我用了 ed25519比 RSA 短且安全兼容性也足夠好。-N 表示空密碼因?yàn)樽詣?dòng)化任務(wù)里沒(méi)人幫你輸密碼。然后在倉(cāng)庫(kù)設(shè)置里添加公鑰。GitHub 叫 Deploy KeyGitLab 叫 Deploy Key 或 Access Token??傊砑觺/.ssh/deploy_key.pub的內(nèi)容進(jìn)去。接下來(lái)在~/.ssh/config里配置這個(gè)密鑰專(zhuān)門(mén)用于那個(gè)倉(cāng)庫(kù)的域名避免多個(gè)密鑰時(shí)匹配錯(cuò)誤Host github.com HostName github.com User git IdentityFile ~/.ssh/deploy_key IdentitiesOnly yes這步很關(guān)鍵。IdentitiesOnly yes的意思是只使用顯式指定的密鑰不要嘗試默認(rèn)id_rsa等其他密鑰。否則即使你配了deploy_key系統(tǒng)也可能先嘗試其他密鑰報(bào)錯(cuò)后才會(huì)跳過(guò)導(dǎo)致拉取過(guò)程變慢甚至失敗。還有一點(diǎn)要注意服務(wù)器上的~/.ssh目錄權(quán)限和~/.ssh/deploy_key文件權(quán)限必須正確。目錄是 700密鑰文件是 600。我見(jiàn)過(guò)太多因?yàn)闄?quán)限太寬松導(dǎo)致 SSH 直接忽略密鑰的情況。chmod 700 ~/.ssh chmod 600 ~/.ssh/deploy_key chmod 644 ~/.ssh/deploy_key.pub2.2 倉(cāng)庫(kù)目錄的狀態(tài)鎖定避免dirty陷阱自動(dòng)拉取代碼有個(gè)典型問(wèn)題如果服務(wù)器上的工作目錄里有未提交的修改git pull會(huì)直接失敗提示你本地有沖突。這在手動(dòng)操作時(shí)可以現(xiàn)場(chǎng)處理但自動(dòng)化任務(wù)完全沒(méi)有交互能力一旦遇到就可能一直失敗下去直到有人發(fā)現(xiàn)。為了避免這個(gè)問(wèn)題我的經(jīng)驗(yàn)有三層處理策略。第一層盡量保持倉(cāng)庫(kù)目錄干凈。部署用的目錄不要直接當(dāng)開(kāi)發(fā)目錄用不要在服務(wù)器上改代碼。如果你確實(shí)需要臨時(shí)修改務(wù)必及時(shí)提交或 stash。第二層在自動(dòng)拉取腳本里加防御性邏輯。cd /var/www/myapp if ! git diff --quiet; then git stash push -m auto-stash-before-pull-$(date %F-%T) fi這樣如果有未提交的修改腳本會(huì)先暫存然后拉取減少失敗概率。第三層做超時(shí)處理和重試機(jī)制。git pull如果遇到網(wǎng)絡(luò)抖動(dòng)會(huì)卡住或者失敗。建議在腳本里設(shè)置超時(shí)時(shí)間并做多次重試。timeout 30 git pull origin main || sleep 5 timeout 30 git pull origin main如果倉(cāng)庫(kù)已經(jīng)處于無(wú)法自動(dòng)恢復(fù)的狀態(tài)那就只能人工介入了。所以建議腳本在多次拉取失敗后發(fā)一條告警通知比如通過(guò)釘釘/企業(yè)微信機(jī)器人或者郵件。2.3 分支和強(qiáng)制同步的取舍策略自動(dòng)拉取還有一個(gè)陷阱git pull默認(rèn)是 fetch merge。如果服務(wù)器上有人在提交歷史里做了 rebase 或者 force pushmerge 可能會(huì)失敗或產(chǎn)生不必要的合并節(jié)點(diǎn)。部署場(chǎng)景下我們通常希望服務(wù)器上是干凈的、和遠(yuǎn)端完全一致的代碼。這時(shí)我會(huì)用git fetch origin git reset --hard origin/main代替git pull。這么做的好處是不管服務(wù)器上有什么歷史偏差最終都會(huì)硬同步到遠(yuǎn)端分支的最新?tīng)顟B(tài)。壞處也很明顯本地任何未提交修改都會(huì)被丟棄。所以務(wù)必要確認(rèn)服務(wù)器目錄不使用git reset --hard以外的方案來(lái)保留修改。針對(duì)這個(gè)沖突我建議分環(huán)境處理。測(cè)試/預(yù)發(fā)布環(huán)境可以用reset --hard保證代碼版本一致生產(chǎn)環(huán)境則要慎用最好用git pull --ff-only先確保當(dāng)前目錄沒(méi)有本地提交再用 Fast-forward-only 模式同步。否則直接 hard reset 有風(fēng)險(xiǎn)因?yàn)槟憧赡懿⒉恢婪?wù)器上為什么會(huì)多出一個(gè)提交。3. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)這部分我直接給出可以直接抄的配置和腳本覆蓋 Cron 和 Webhook 兩個(gè)主路徑。3.1 Cron 定時(shí)輪詢的完整配置先寫(xiě)一個(gè)拉取腳本放在/usr/local/bin/git-sync.sh。#!/bin/bash set -euo pipefail LOG_FILE/var/log/git-sync/git-sync.log MAX_RETRY3 sync_repo() { local repo_dir$1 local branch$2 cd $repo_dir for ((i1; iMAX_RETRY; i)); do if timeout 60 git fetch origin $branch; then break else echo [$(date %Y-%m-%d %H:%M:%S)] fetch failed, retry $i/3 $LOG_FILE sleep 5 fi done if timeout 60 git reset --hard origin/$branch; then echo [$(date %Y-%m-%d %H:%M:%S)] $repo_dir synced to $branch $LOG_FILE else echo [$(date %Y-%m-%d %H:%M:%S)] ERROR: $repo_dir sync failed $LOG_FILE exit 1 fi } sync_repo /var/www/project-a main sync_repo /var/www/project-b release解釋幾個(gè)細(xì)節(jié)set -euo pipefail任何命令失敗或變量未定義都會(huì)讓腳本退出避免靜默錯(cuò)誤。timeout 60防止網(wǎng)絡(luò)掛起導(dǎo)致腳本永久阻塞。每個(gè)倉(cāng)庫(kù)獨(dú)立同步一個(gè)失敗不至于影響其他倉(cāng)庫(kù)。然后配置 Cron編輯/var/lib/systemd/cron/crontabs/root或用crontab -e* * * * * /usr/local/bin/git-sync.sh /dev/null 21每分鐘執(zhí)行一次??紤]到git fetch的耗時(shí)建議把腳本內(nèi)部盡量精簡(jiǎn)不要在拉取前做太多無(wú)用操作。注意Cron 的執(zhí)行環(huán)境是非交互式的PATH等環(huán)境變量和登錄 shell 不同。建議在腳本開(kāi)頭顯式聲明PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin否則有些系統(tǒng)下常見(jiàn)命令可能找不到。3.2 Webhook 接收端的輕量實(shí)現(xiàn)如果選擇 Webhook服務(wù)端需要有一個(gè)接收 HTTP 請(qǐng)求的接口收到請(qǐng)求后執(zhí)行拉取腳本。這里我給出一個(gè)基于 Python Flask 的極簡(jiǎn)實(shí)現(xiàn)適合服務(wù)器上還沒(méi)有現(xiàn)成框架的情況。from flask import Flask, request, jsonify, abort import hmac import hashlib import os import subprocess app Flask(__name__) # 這里的 secret 要和 Git 倉(cāng)庫(kù)管理端配置的保持一致 WEBHOOK_SECRET os.environ.get(WEBHOOK_SECRET, your-secret-here) def verify_signature(payload_body, signature_header): if not signature_header: return False mac hmac.new(WEBHOOK_SECRET.encode(utf-8), payload_body, hashlib.sha256) return hmac.compare_digest(fsha256{mac.hexdigest()}, signature_header) app.route(/webhook/git-pull, methods[POST]) def git_pull(): body request.get_data() signature request.headers.get(X-Hub-Signature-256, ) if not verify_signature(body, signature): abort(401, Invalid signature) # 可以按事件類(lèi)型過(guò)濾 event request.headers.get(X-GitHub-Event) if event not in [push, ping]: return jsonify({status: ignored}) # 遠(yuǎn)程倉(cāng)庫(kù)管理平臺(tái)發(fā)的 ping 事件用于測(cè)試連通性 if event ping: return jsonify({status: pong}) # 這里應(yīng)該根據(jù)倉(cāng)庫(kù)名映射到本地目錄 repo_map { project-a: /var/www/project-a, project-b: /var/www/project-b, } payload request.get_json() repo_name payload.get(repository, {}).get(name) repo_path repo_map.get(repo_name) if not repo_path: return jsonify({status: repo not found}), 404 branch payload.get(ref, ).replace(refs/heads/, ) subprocess.Popen( [/usr/local/bin/git-sync.sh, repo_path, branch], stdoutsubprocess.DEVNULL, stderrsubprocess.DEVNULL, ) return jsonify({status: accepted}) if __name__ __main__: app.run(host0.0.0.0, port9000)這里我做了幾個(gè)安全設(shè)計(jì)一是使用 HMAC 簽名校驗(yàn)。GitHub 在配置 Webhook 時(shí)可以填 Secret每次請(qǐng)求都會(huì)在 Header 帶簽名。服務(wù)器端用同一個(gè) Secret 計(jì)算簽名并比較能有效防止別人隨便往你的接口發(fā) POST 就能觸發(fā)拉取。GitLab 的簽名機(jī)制略有不同但思路相同需要改成它們自定義的 Header 和加密方式。二是把拉取動(dòng)作丟到后臺(tái)進(jìn)程執(zhí)行subprocess.Popen讓 Webhook 接口立即返回accepted。因?yàn)檎嬲睦】赡芎臅r(shí)幾秒如果同步執(zhí)行客戶端會(huì)等待長(zhǎng)耗時(shí)還可能被網(wǎng)關(guān)超時(shí)干掉。三是按倉(cāng)庫(kù)名和分支做映射避免無(wú)關(guān)事件誤觸。如果你不想自己維護(hù)一個(gè) Flask 服務(wù)也可以用一個(gè)更成熟的工具比如直接用 Git 倉(cāng)庫(kù)管理平臺(tái)自帶的 runner 機(jī)制或在服務(wù)器上啟用某開(kāi)源 Webhook 代理服務(wù)它們往往內(nèi)置了線程池、重試、日志等能力。3.3 部署開(kāi)機(jī)自啟和守護(hù)進(jìn)程不管是 Cron 還是 Webhook 接收端都建議用 systemd 管起來(lái)。Webhook 服務(wù)尤其需要因?yàn)橐坏┓?wù)器重啟接收端沒(méi)啟動(dòng)自動(dòng)拉取就失效了。創(chuàng)建一個(gè) systemd 單元文件/etc/systemd/system/git-webhook.service[Unit] DescriptionGit Webhook Receiver Afternetwork-online.target [Service] Userwww-data WorkingDirectory/opt/git-webhook EnvironmentWEBHOOK_SECRETyour-secret-here ExecStart/usr/local/bin/gunicorn -w 2 -b 0.0.0.0:9000 wsgi:app Restartalways RestartSec3 [Install] WantedBymulti-user.target這里我用 gunicorn 而不是 flask 自帶的開(kāi)發(fā)服務(wù)器因?yàn)樽詭У姆?wù)器只適合調(diào)試頂不住實(shí)際并發(fā)。如果你不想引入 gunicorn也可以直接用nohup python app.py 然后配一個(gè) systemd 來(lái)守護(hù)但多進(jìn)程管理、優(yōu)雅重啟、日志輪轉(zhuǎn)這些機(jī)制都沒(méi)有 gunicorn 成熟。啟用和啟動(dòng)systemctl daemon-reload systemctl enable --now git-webhook3.4 權(quán)限設(shè)計(jì)不要用 root 跑腳本關(guān)于權(quán)限我這里尤其想強(qiáng)調(diào)一點(diǎn)。很多人在真實(shí)服務(wù)器上圖省事直接用 root 用戶去執(zhí)行拉取或者 Webhook 服務(wù)用 root 啟動(dòng)。這樣做有兩個(gè)問(wèn)題一是倉(cāng)庫(kù)目錄一旦被 Webhook 接收端可寫(xiě)而接收端又有任何注入點(diǎn)整個(gè)服務(wù)器就裸奔了。你用 root 跑等于所有風(fēng)險(xiǎn)都被無(wú)限放大。二是部署的代碼一般歸屬于某個(gè)普通用戶如www-data或deployer如果用 root 拉代碼生成的對(duì)象文件 owner 會(huì)變成 root后續(xù)如果你想在服務(wù)器上臨時(shí)改點(diǎn)什么會(huì)遇到權(quán)限困擾。我建議的做法是單獨(dú)建一個(gè)系統(tǒng)用戶比如deployer用它來(lái)執(zhí)行拉取和部署。Webhook 接收端也在這個(gè)用戶下運(yùn)行。服務(wù)器上各應(yīng)用代碼目錄的 owner 設(shè)為該用戶這樣拉取后文件權(quán)限統(tǒng)一后面用chown調(diào)整給 Web 服務(wù)用戶時(shí)也不會(huì)亂。useradd -r -s /bin/bash -m deployer su - deployer -c mkdir -p ~/.ssh chmod 700 ~/.ssh4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄這部分我整理幾個(gè)實(shí)際運(yùn)營(yíng)中大概率會(huì)遇到的問(wèn)題。每個(gè)問(wèn)題背后我都加了排查思路這些問(wèn)題我自己全踩過(guò)。4.1 Permission denied (publickey) 的排查順序這是自動(dòng)拉取里最常見(jiàn)的報(bào)錯(cuò)。很多人第一反應(yīng)是密鑰沒(méi)加對(duì)但其實(shí)這個(gè)問(wèn)題背后有四種可能一是密鑰確實(shí)沒(méi)加到倉(cāng)庫(kù)后臺(tái)。這種情況直接去管理平臺(tái)確認(rèn) Deploy Key 的指紋和服務(wù)器公鑰是否一致。二是~/.ssh/config里的IdentityFile寫(xiě)錯(cuò)或目標(biāo)域名匹配不上。比如 Git 倉(cāng)庫(kù)地址里寫(xiě)的域名是github.com但你的 config 里針對(duì)的是gist.github.com那就不會(huì)命中。三是文件權(quán)限問(wèn)題。前面提過(guò).ssh目錄必須是 700私鑰必須是 600。很多系統(tǒng)對(duì) SSH 密鑰的權(quán)限要求很?chē)?yán)格group或other有讀權(quán)限都會(huì)拒絕使用。四是 SSH agent 緩存了錯(cuò)誤的密鑰。如果你在服務(wù)器上手動(dòng)命中過(guò)其他密鑰agent 可能已經(jīng)緩存了導(dǎo)致 SSH 優(yōu)先用緩存密鑰而不是 config 里指定的。排查思維可以先用這個(gè)命令驗(yàn)證不要直接跑腳本ssh -vT gitgithub.com觀察 Stderr 輸出重點(diǎn)看 Offering public key 和 Authentications that did not match 這兩步立刻能定位是哪一環(huán)節(jié)在拒絕。4.2 Please commit your changes or stash them 的處理這個(gè)報(bào)錯(cuò)在 Cron 自動(dòng)拉取中很典型。倉(cāng)庫(kù)目錄可能被程序運(yùn)行時(shí)修改了文件比如日志文件、緩存文件在代碼目錄內(nèi)導(dǎo)致git pull直接失敗。我踩過(guò)這個(gè)坑想提醒各位的是永遠(yuǎn)不要把日志或緩存寫(xiě)在項(xiàng)目目錄里更不要讓它們被 git 跟蹤。正確做法是日志寫(xiě)到/var/log用系統(tǒng)的日志服務(wù)管理。緩存寫(xiě)到/tmp或?qū)iT(mén)的緩存目錄。臨時(shí)文件寫(xiě)到/dev/shm或者/tmp。如果已經(jīng)出現(xiàn)這個(gè)報(bào)錯(cuò)臨時(shí)解救命令cd /var/www/project-a git stash list git stash apply這只是臨時(shí)處理真正要根治還是要把 config 里的core.fileMode檢查關(guān)閉。很多文件被改但并不需要提交純粹是權(quán)限位變了。git config core.fileMode false開(kāi)啟后git 會(huì)忽略文件模式變化減少很多偽 dirty 狀態(tài)。4.3 拉取成功但服務(wù)沒(méi)生效問(wèn)題出在哪自動(dòng)拉取代碼之后服務(wù)本身可能不會(huì)自動(dòng) reload。尤其是 Java 應(yīng)用、Go 應(yīng)用、Node 應(yīng)用這類(lèi)需要重新編譯或重啟的。如果腳本只做了git reset --hard那代碼是更新了但進(jìn)程還在跑舊版本。我的做法是把拉取 構(gòu)建 重啟設(shè)計(jì)成同一個(gè)腳本并且在關(guān)鍵步驟之間加狀態(tài)檢查。sync_repo() { local repo_dir$1 local branch$2 cd $repo_dir timeout 60 git fetch origin $branch timeout 60 git reset --hard origin/$branch # 如果是 Node 項(xiàng)目裝依賴 if [ -f package.json ]; then npm ci --omitdev || npm install --omitdev fi # 如果是 Java 項(xiàng)目構(gòu)建 if [ -f pom.xml ]; then mvn -q -DskipTests package fi # 重啟服務(wù) systemctl restart myapp }這么做的好處是代碼同步之后立刻做配套操作不會(huì)出現(xiàn)代碼和運(yùn)行狀態(tài)不匹配的情況。壞處是腳本變長(zhǎng)出錯(cuò)的概率也增大。所以才需要給每一步加日志。提示npm ci和npm install有區(qū)別。npm ci依賴package-lock.json安裝速度快且版本鎖定嚴(yán)格適合自動(dòng)化部署。但如果 lock 文件沒(méi)有同步提交就會(huì)報(bào)錯(cuò)。所以優(yōu)先保證 lock 文件入庫(kù)然后默認(rèn)用npm ci。4.4 高并發(fā)或頻繁推代碼時(shí)Webhook 重復(fù)觸發(fā)的去重問(wèn)題有些團(tuán)隊(duì)開(kāi)發(fā)活躍幾分鐘內(nèi)幾十次 pushWebhook 就會(huì)觸發(fā)幾十次腳本。如果腳本里沒(méi)有鎖機(jī)制可能同時(shí)有兩個(gè)git fetch在跑同一個(gè)倉(cāng)庫(kù)導(dǎo)致索引鎖定或文件沖突。解決辦法是在腳本里加一個(gè)簡(jiǎn)單的目錄鎖LOCKFILE/tmp/git-sync-$(echo $repo_dir | md5sum | cut -c1-8).lock if ! mkdir $LOCKFILE 2/dev/null; then echo Another instance is running, skipped. exit 0 fi trap rm -rf $LOCKFILE EXIT這樣同一時(shí)刻只有一個(gè)同步進(jìn)程能操作一個(gè)倉(cāng)庫(kù)其他的直接跳過(guò)。4.5 Cron 環(huán)境變量缺失導(dǎo)致命令找不到很多服務(wù)器上用crontab -e配置的定時(shí)任務(wù)執(zhí)行時(shí)PATH非常精簡(jiǎn)可能連/usr/local/bin都不在路徑里。如果你腳本里用了git、node、npm這些命令就會(huì)出現(xiàn) command not found。排查方法在腳本開(kāi)頭echo $PATH /tmp/cron_debug.log然后看一次執(zhí)行日志立刻確認(rèn)。根治方法是顯式設(shè)置 PATH。export PATH$PATH:/usr/local/bin:/usr/bin:/bin另外Cron 的 HOME 變量也可能和預(yù)期不同。很多 git 全局配置在/tmp或邏輯卷里找不到導(dǎo)致 git 行為變更。建議在腳本里顯式export HOME/home/deployer。5. 進(jìn)階技巧從拉取代碼走向完整發(fā)布編排到這里服務(wù)器自動(dòng)拉取 git 倉(cāng)庫(kù)代碼這個(gè)需求已經(jīng)解決了而且應(yīng)該能穩(wěn)定運(yùn)行。但我個(gè)人在實(shí)踐中體會(huì)最深的一點(diǎn)是只做代碼拉取其實(shí)離真正的自動(dòng)化部署還差得很遠(yuǎn)這中間還需要考慮串聯(lián)整個(gè)發(fā)布鏈路的各個(gè)環(huán)節(jié)。很多人覺(jué)得自動(dòng)化部署很遙遠(yuǎn)其實(shí)只要把第一步做扎實(shí)了后面都是順勢(shì)的事。5.1 版本指紋與回滾錨點(diǎn)每次拉取代碼后把當(dāng)前 commit hash 記錄下來(lái)這是回滾的關(guān)鍵??梢杂靡粋€(gè)文件保存也可以直接打到部署記錄數(shù)據(jù)庫(kù)里。commit_hash$(git rev-parse HEAD) echo {\time\:\$(date -Iseconds)\,\repo\:\$repo_dir\,\commit\:\$commit_hash\} /var/log/deploy-history.json有了 commit hash 錨點(diǎn)如果發(fā)布后出問(wèn)題只需要把服務(wù)器拉回上一個(gè) hash 就能快速回滾不需要翻 git log 找半天。5.2 按分支映射不同環(huán)境如果你有多套環(huán)境建議在腳本里維護(hù)一個(gè)倉(cāng)庫(kù)分支 → 環(huán)境的映射表而不是寫(xiě)死。這樣以后加環(huán)境只需要改配置文件。case $repo:$branch in project-a:main) ENVproduction ;; project-a:develop) ENVstaging ;; project-b:release/*) ENVproduction ;; esac配合分支保護(hù)策略可以做到develop 分支推到測(cè)試環(huán)境main 分支推到生產(chǎn)環(huán)境誰(shuí) merge 了 main生產(chǎn)環(huán)境就自動(dòng)更新。這個(gè)流程跑順了團(tuán)隊(duì)里日常發(fā)布的人工操作就只剩下點(diǎn)擊 merge。5.3 拉取后的健康檢查自動(dòng)化最后一步也是最容易被忽略的拉取并重啟服務(wù)后一定要做健康檢查。不要讓服務(wù)拉起了但沒(méi)起來(lái)的狀態(tài)被默認(rèn)當(dāng)成成功。比如對(duì)于 HTTP 服務(wù)for i in {1..12}; do status$(curl -s -o /dev/null -w %{http_code} http://127.0.0.1:8080/healthz) if [ $status 200 ]; then echo health check passed exit 0 fi sleep 5 done echo health check failed systemctl restart myapp # 再試一次 exit 1健康檢查應(yīng)該作為部署腳本的一部分而不是外部檢查。只有通過(guò)了健康檢查才意味著這次自動(dòng)拉取真正完成了它的使命。這也是我后來(lái)做多環(huán)境發(fā)布時(shí)堅(jiān)持的一個(gè)原則。6. 經(jīng)驗(yàn)總結(jié)從能拉到穩(wěn)拉的必要條件做技術(shù)這么久我越來(lái)越覺(jué)得所謂自動(dòng)化不是寫(xiě)幾個(gè)命令掛上去就完了而是要把可能出錯(cuò)的地方都提前設(shè)計(jì)好兜底。代碼自動(dòng)拉取這件事看起來(lái)非常簡(jiǎn)單但真正跑到生產(chǎn)環(huán)境還不出問(wèn)題需要具備的幾個(gè)必要條件我覺(jué)得非常值得再單獨(dú)梳理一下這也是大量閱讀官方文檔和源碼后逐漸形成的認(rèn)知。第一密鑰和權(quán)限是根。沒(méi)有正確的 SSH 密鑰和目錄權(quán)限一切自動(dòng)化都是空談。我見(jiàn)過(guò)很多團(tuán)隊(duì)把這一步寄希望于網(wǎng)上教程復(fù)制粘貼結(jié)果換一臺(tái)機(jī)器就翻車(chē)。第二倉(cāng)庫(kù)狀態(tài)可預(yù)期。服務(wù)器上的代碼庫(kù)必須是只讀的若有改動(dòng)必須走 stash 或單獨(dú)的分支策略。部署目錄混亂是自動(dòng)化最大的敵人。第三觸發(fā)鏈路有監(jiān)控。不管是 Cron 還是 Webhook觸發(fā)鏈路必須能感知失敗必須能告警。否則沒(méi)有人知道系統(tǒng)開(kāi)始靜默失效。第四腳本要可重入。加鎖、冪等、超時(shí)。這三個(gè)特性缺一個(gè)腳本遲早在某一天凌晨三點(diǎn)炸掉。第五回滾可執(zhí)行。代碼拉到最新了如果線上有問(wèn)題能不能一鍵回滾沒(méi)有回滾機(jī)制的自動(dòng)化本質(zhì)上是一種賭博。我自己在實(shí)踐中最受益的一點(diǎn)就是為自動(dòng)拉取腳本建立了完整的日志體系。每一段拉取記錄、每一次失敗重試、每一次健康檢查結(jié)果都明確寫(xiě)出時(shí)間和倉(cāng)庫(kù)名。這樣出了問(wèn)題可以從日志倒推整個(gè)流程定位根因的時(shí)間大幅縮短。建議你也從第一天就建立起來(lái)不要等那個(gè)凌晨三點(diǎn)出現(xiàn)后才想起來(lái)加。希望這篇總結(jié)對(duì)你有參考價(jià)值。我踩過(guò)的這些坑你如果能避開(kāi)三分之一自動(dòng)拉取這件事就算成功一半了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
超碰在线国产| 久久思思热| 美女天天干| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 中文字日本乱码| 综合久久六月久久婷婷| 亚洲色宗合| 丝袜美腿91| 亚洲中文字幕日产无码久久| 欧美一级三级| 极品尤物在线观看| 97色色婷婷| 人人操人人干xxx| 日本道人妻久久久在线不卡色视频| 97色色色综合网站| 亚州成人a∨| 无码色| 色操逼网| 国产毛片毛片4p懂色| 精品欧美乱码久| 99RE在线视频精品,这里只有精品| 国产 日韩 另类 视频一区爱| 四虎午夜影院| 免费观看性欧美一级| 欧美亚洲手机在线| 亚洲熟妇A V黑人| 色香91| 日韩精品9999| jiujiujiujingpin| 亚洲涩涩| 亚洲视频二区| 91天美传媒在线观看| 天天添天天干电影| 中文字幕亚洲欧美在线不卡| 久久国产精品一级二级三级| 国产女上位好爽在线| 日韩九区| 99热色精品| 国产免费一区二区在线A片视频| 久久男女激情视频网站| 欧美日韩第一页| 亚洲一欧洲中文字幕在线| 国产精品久久久久久亚洲色欲| 欧美熟妇精品黑人巨大91| 偷拍新久久| 日本道日本道中文字幕日本道最新日本道在线观看 | 亚洲久久东京热一二三四五区视频| 男人的天堂VA在线| 好舒服视频| 黄色不卡视频| 尤物视频网 刘玥| 超碰无码五月97| 97精品第3页| 中国小夫妻勾搭露脸淫荡对白| 国产传媒美日韩av| 亚洲黄a三级三级三级看三级| 欧美视频第二页| 欧美色图亚洲色图成人在在线| 一本道综合色图| 婷婷五月天丁香| 国产原创自拍| 99xav| 久久久久96| 乱操9999| 极品另类| 日本中文字幕在线电影| 精彩视频日韩| 97se亚洲| 91精品无码久久久久久久| 免费看黄片现成| 亚洲自拍天堂| 国产丝袜美女诱惑| 天天做天天爱| 欧亚性爱视频免费看| 67194国产| 久久综合乱子伦国产免费| 欧美丝袜激情| aV中文麻| 欧美一级特黄淫片在线观看| 亚洲天堂性爱| 嫩草黄页| 国产中出内射一区二区| 色五月综合| 青娱乐 成人娱乐在线| 一区中文字幕二区日韩| 骚日日av| 国产网红精品| 97 九色| av橘色网站| 岛国激情视频在线观看| 激情综合五月婷婷| 97精选久久| 中文字幕第2页| 欧美呦呦性爱| 国产av高清版| 曰韩av中文字幕专区| 和协影院中文字幕三区| 日本综合色图| av天堂5| 中文字暮97| 久久久免费懂色| 极品少妇99| 麻豆一区二区AV天美| 国产精品久久泡妞网站| 99啪啪| 2019AV天堂| 女生91网站| 欧洲一级性爱视频在线观看| 中 文字幕一区二区三四 五 区日 日 骚 | 国产精品久久久久久无码红治院| 99久久久无码| 综合伊人激情| 嗯嗯嗯好爽| 清纯唯美综合| 婷婷导航| 亚洲性高潮| 青娱乐久久艹| 色麻豆AV| 视频分类 国内精品| 成人一区二区三区四区| 无码高清少妇久久| 日韩在线97| 国产精品高潮呻吟av久久4虎| 99久久婷婷| 2017天天操天天日| 九九九九九九九九九九九免费国产| 91热色| 亚洲精品无码成人久久久99| 欧美日韩大陆黑人少妇99| 丁香色狠狠色综合久久小说| 久久国产视频性吧 | 17c在线成人免费A片观看| 97国产色综合| 韩国午夜理伦三级好看| 丰满美女一级毛片在线播放| 天天综合网91入口| 中文字幕,人妻,日韩| 亭亭丁香激情| 欧美日韩国产三级黄色| 国产97/欧美| 久久亚洲精品成人av| www.av不卡中文字幕| 国产强奸超碰AV| 日本三级韩国三级美三级91| 欧美大香蕉专区网| 天天综合91入口| 激情视频网址| 88xx成人精品视频| 2017超碰| 九九九午夜| 国产精品人妻无码久久久老鸭窝| 有码免费观看| 久久久国产亚洲精品系列| 一区二区三区色综合| 青草av在线| 韩国三级色呦呦| 情色AV电影| 欧美片第一页| 一区二区国产视频在线观看| 亚洲AV永久无码一区仙野| 天堂性色| 国产天天看| 欧美视频一区二区在线| 亚州性9| 国产偷仑| 2020视频1区2区3区| 粉嫩av平台| 免费强奸av| 蜜臀久久99精品久久久久电影| 日韩精品国产精品五码一区二区| 欧美高清无码免费视频高清版| 青女在线| 亚欧精品久久久久久久久久久| 天天上日日上日韩精品| 欧亚韩国999| 九九久久一区二区三区| 爱我干综合| 成人性爱免费播放| 青娱乐淫乱1314| 久久精品电影| 国产九区| 久久亚码| 亚洲永久AV无码精品秋霞| 欧美日韩91| 国产精品亚洲高清在线| 蜜乳成人AV| 91久久婷婷| 日本中文字幕一区| 久操 高清| 日韩欧美视频青青| 亚洲偷拍自拍在线视频| 午夜激情成人在线观看| 一级婬片120分钟试看| 亚洲欧美内射| 精品美女少妇一区二区| 60秒免费视频| 和协影院中文字幕三区| 天堂资源欧美| 性感女人网页在线观看视频| 狠狠操夜夜操蜜桃视频三区| 99热精品在线观看| 国产亚洲国产超碰| 日韩一级片| 亚洲一区二区三区AV无码| 亚洲AV无码乱码| 久久人人爽人人爽人人片Ⅴ| 免费精品中文字幕| 午夜AV人气不卡| 综合网亚洲| 蜜臀久久99精品久久久久久婷婷 | 无码九九九九| 97jingpin| 屌妞视频久久久久久久 | 亚洲天堂AV在线播放| 夜夜骑夜夜操| 久干9操| 精品亚洲国产成人精品| av天堂5| 欧美午夜一区二区三区| 熟女突然公开看18禁影片| 美女AV一区二区| 色婷亚洲五月在线观看| 国产传媒一区二区三区| 欧美久久人体| 国产精品99精品视频网站| 久久久久久久久久久999| 午夜视频黄| 9色国产精品一区粉嫩 | 丰满人妻无码一区二区三区| 97精品熟女少妇一区| 亚洲色图欧美色图日韩色图| 欧美91精彩| 自拍欧美| 日韩人妻精品| 91岛国动作片| 伊人一级免费黄片| 久久久久极品| 黄色av网站在线播放| 国产一区自拍欧美日韩| 强奸乱伦大香蕉网| 青青草密桃在线播放| 暖暖精品二区三区观看| 亚洲欧美91√| 麻豆精品一区二区三区四区免费观看| 男啪女色黄无遮挡免费观看| 日韩 欧美 视频 在线 一区| 欧美成人9797| 嗯嗯啊在线视频| 日韩乱码av| 99青青草国产视频| 乱操9999| 七月丁香婷婷| 激情综合网五月婷婷五月天| 情侣开房子拍 日韩无码 女的很漂亮| 欧美日动态视频| 欧美成人国产精品| 午夜小电影在线插入淫高潮| 国产精点久久久成人| 精品视频久久久久九九九九9999| 躁躁日曰躁2020| 色色青青久久| 91福利网在线观看| 婷婷中文字幕| 91丝袜在线视频| 男生通女生屁股| 久久精品久久久久久久久| 思思热影视| 日本天天吊| 欧美洲精品一级| 人妻铁牛TV| 欧美日韩国产高清在线一二三区 | 东北丰满熟女国产一区| 97青青操视频| 色97干| 人干人人人操人人摸| 99这里有精品视频| 五月天精品| 一级黄色视频网| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 亚洲日韩电影| 国产67194| 天天日天天舔东京热| 国产综合久久久麻桃个| av资源在线播放天堂| 啊啊啊啊二区好大| 桃花色综合影院| 天天综合91在线| 九九亚洲色在线观看| 日韩综合成人免费视频| 中文字幕av久久爽Av| 欧美激情在线观看视频| 亚洲一卡2卡3卡4卡乱码网站| 天天影视射综合网| 欧美一区二区一级岛国大片| 久久综合日韩亚洲欧美| 我要色综合网| 国产老熟女| 美女啊啊啊啊啊| 狠狠爱综合| 久久久久久99999国产精品| 一类av片在线看| 精品999日本| 性暴力欧美猛交在线直播| 日本人妻一区二区| 爱爱啊啊啊| 这里只有精品视频在线| 清纯唯美第一页| 日韩性爱视频免费在线| 国产精品网址| 九九视品黄色| 乱伦一二三| 久久久久久久久久久久黄色 | 亚洲aw毛茸茸在线| 翔田千里无码一区| 久男人久久| 亚欧高清在线| 91少妇人妻| 天天干天天操天天拍| 亚洲春色一区二区三区| 欧美少妇色综合| 国产AV超爽| 亚洲高清综合网| 偷拍网站久久男女男| 超碰欧美| 黑人精品久久97| 爱做久久久久久| 国产美女自拍视频| 亚热日本熟女| 色狠狠色| 思思热在线视频免费| 九九九九九九九九九九九九九九九女| 国产又色又爽又舒服的三级视频| 色香欲综合| WWW4虎| 亚欧无码在线| 乱伦强奸区日韩| 日韩精品操少妇| 99精品久久久久久久婷婷蜜桃| 久久久偷拍| 歐美一級亂黃99在綫精品| 曰韩操B| 久久久月天| 热久久91婷婷| 97国产高清视频在线观看| 91 天天综合| 东京成人一区| 99热这里是精品| 国产精品久久久久无码Av网曝门| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 精品婷婷| 欧美性爱日韩性爱| 91人人操| 四虎影视 亚洲无码| 欧美日韩色图片| 无码操逼网| 91美女在线观看| 麻豆区久久久久亚| 人妻密肉在线观看| 久久草草欧美精品| 亚洲强奸乱伦影视网| 人人操人人摸人人骑| 啊啊啊啊啊舒服| 亚洲。日韩。欧美| 天天日少妇逼AV| 日本色色色视频| 国产精品久久久久无码Av网曝门| 麻豆成人影音在线| 亚洲做性| 欧美综合狠| 330dv亚洲成年视频网| 久7色| 亚洲日韩成人性爱视频| 乱伦图av| 国产日产精品久久快鸭的功能介绍| 欧美日韩另类激情图片| 国产精品69久久久久久久| 美女的肌被草喷水视频| 啊啊啊啊啊操我视频| 殴美牲| 欧美精品999| 日本三级R| 婷婷丁香五月天综合东京热| 先锋激情∨在线视频播放| 日韩精品在线视频,日韩精品……| 曰本道人妻久久久在线不卡色视频| 久久欧洲| 无码视频一区二区| 亚洲区限制级| 襙一襙| 97超碰超碰| 九九九九九九视频免费| 精品国产Av无码久久久伦古装| 人妻娇喘 激情视频| 日本黄色XXX| 欧洲一区二区三区四区在线观看| 国产精品高朝久久久久久久| 最新9久久久9免费视频| 欧美第二页午夜| 色777999综合| 变态综合色| 中文字幕第2页| 香蕉综合网| 日韩人妻丝袜中文字幕| 蜜乳AV免费观看| 日韩免费在线视频观看| 日韩人妻中文视频| 依人大香蕉| 日韩伦理视频| 韩日精品福利视频一区不卡在线免| 91综合国产精品| 91国产在线精品| 91精品国| 亚洲国产丝袜熟女av| 秋霞一级鲁丝片A片| 26uuu偷拍亚洲欧洲综合| 天天操夜夜嗨| 97视频网站在线观看| 曰韩欧美国产传媒麻豆第一区| av婷婷色网| 国产盗摄美女如厕大神作品在线观看| 国产少妇内射| 欧美日韩97| 国产亚洲欧美每日在线| 黄色av一区二区在线| 欧美综合站| 久久啊啊啊视频| 骚鸭AV| 久久久久久九九九| 欧美激情中文字幕另类小说| 91中出视频| 国内偷自视频区视频综合| 日韩av在线播放不卡| 综合网欧美在线| 99xav| 欧美成人性活片| 亞洲久久直播| 宗合情欲网| 国产精品久久久午夜夜伦鲁鲁| 黄色视频高清无码网站| 国产97色在线| 情侣操 逼视频99| www欧美91| 伊人久久综合精品欧美| 人妻精品综合中文字幕在线 | 国产夫妻性生活视频| 手机看片91人妻| 国产AV久久久蜜爱影集| 抽插爽| 黄页av| 日本在线不卡v二区| http://qxhbdz.com| 99后入| 十八禁视频一区二区| 色情综合| 男人的天堂kva| 无码最新| 秋霞午夜视频一区二区| 黄片免费日韩| 69精品少妇一区二区三区蜜桃| 欧美在线|亚洲| 一级日本牲交大片好爽在线看| 亚洲精品 大香蕉| 婷婷久久久精品| 成人5码视频| 人人澡综合涩| 日韩精品在线放| 日本一区二区电影网站| 97干97色| 国产精品制服丝袜中文字幕日韩一区二区三区 | 国产精品一区二区亚洲人成毛片| 素人播放一区| 99999亚洲| 天天综合网站| 久操免费观看| 亚洲精品 大香蕉| 色爱天堂| 五月久久HDAV| 粉嫩av平台| 九久9热| 欧美色www亚洲国产阿娇要播| 天天操av懂色| 亚洲熟女乱色一区二区三区| 久久久久久久78| 亚洲 小说 欧美 激情 另类| 日韩99神马视频播放| 91精品微拍福利| 天天澡天天爽日日av| 自拍偷拍亚洲熟女妇人精品| 999 久久久| 秋霞影音一区二区三区| 久久久久久九九九九九| 夜夜爽77777| 国产h小视频在线观看免费| 久久久久久久久久久97| 免费福利视频中文字幕| 精品无码产区一区二| 成人av动漫在线观看| 欧洲亚洲人妻无码高清久久三区四区| 国产在线76页| 最新国内自拍av免费| 无码男人天堂| av中文在线| 精品九九九九| 中文字幕-区二区三区四区视频中国| 国产精品视频自拍在线| 久久久熟女一区| 99热这里只有精品8| 大象AV在线| 91超碰碰在线| 亚洲人成网www| 欧美伊人久久综合网| 中文字幕二区| 啊啊啊 在线观看| av天堂天堂av日韩| 啪啪啪综合| 国产二区三区粉嫩在线| 五月婷婷色| 久久久久亚洲AV无码专区少妇| 97精品视频在线| 久操视频免费在线观看| 风流老熟女一区二区三区l| 天天日夜干| 欧美 日韩 婷婷 五月| 色色五月天激情| 男人的天堂午夜av| 人人妻人人玩人人澡人人爽| 美女黑人91神马| 成年女人一区| 欧美顶级黄片AAAAA在线免费看| 亚洲一区二区在线观看91| 日韩无码AB| 久久久影院| 色综合久| 丰满岳乱妇一区二区三区| 日本色日夜干| 草久在线| 久久久草草精品| 亚州人妻| 欧色综合| 无码一区二区三区四区五区六区七区八区九区十区视频 | 艹比视频国产精品| 91搞逼视频| 少妇久久| 欧美天天弄| 97超碰公开| 久久精品视| 99九九久久| 九九热男人天堂| 91超碰人人操| 国产乱伦一二三区| 国产精品一区二区三区,亚洲综合| 免费视频在线一区二区不卡| 亚欧成人一级片在线播放| 亚洲极品| 粉嫩久久久极品| 九九九精品一区二区无码| 97色97好| 国模不卡一本二本三电影| 又大又长又爽| 爆乳免费黄网站| 蜜桃成人1区2区3区| 狠狠操夜夜操蜜桃视频三区| 丁香五月影院| 日本熟妇一区二区三区| 色欧美天天| 日韩人妻资源在线看| 人妻中文在线| 99热这里只有精品8| 久热伊人| 青青草操逼逼视频| WWW4虎| 亚洲一二三精品久久网| 东北老女人的激情视频| 久久久中文版| 天海翼久久| 欧洲站一级二级三级h| 国产视频97| 91 偷| 久久专区| 久操凹凸视频| 操逼操操操91| 91无码中出人妻视频| 亚殴在线| 加勒比AV天堂| 97中文字幕一区| 91熟女在线| 人人爱人人乐人人操| 国产最火爆久久国产网站网站| 欧美激情性爱视频网站| 美国一区二区免费视频| 麻豆国产尤物AV| 国产天天骚| 日韩操呦呦影院在线观看| 天天干1区2区在线| 亚洲 欧美 色图| 五月天我淫我色av| 国产精选三级在线观看| 日本人体九九九九九九| 伊人 俄罗斯 a v| 婷婷久久久精品| 日韩成年人性爱视频| 精品无码不卡视频| 五月婷婷丁香| 亚洲欧洲日产国产综合网| 久久天堂网| 沈阳熟女高潮对白视频| 国产强奸超碰AV| 久无码| 久久是精品| 丰满人妻被猛烈进入中| 日本 欧美 国产一区| 手机不卡视频不卡在线一二三区| 天天操天天7| 极品销魂美女一区二区| 国产精品久久久久无码AV会牛| 久久男人的天堂国产| 精品人妻一区春色| www国产无码| 再深点灬舒服灬太大了好硬好爽| 女人一区| 99999精品| 欧美黄色片AAAAA| 99国产精品免费| 校园春色综合网| 欧美啪啪女女| 性九九九九九九| 亚洲黄片免费在线播放| 97久久精品亚洲| 夜夜精品视频一区二区| 天天做日日做| 美女大乳久久久久久久女人18| 欧美一级二级三级| 午夜黄色免费在线观看| 今日头条成人一区二区三区四虎精品| 亚洲欧美第一页| 99爱爱| 在线 欧美 亚洲| 超碰成人公开| 人人噜夜夜操| 国产精品成久久久久午夜午夜| 综合激情五月丁香| 久久风骚城市人| 性做久久久久久久| 欧美亚洲宗合色性图| 翔田千里A片一区二区| 99色在线| 农村妇女精品一二区| www久久99| 国产AV线| 成人日本视频人妻在线| 噜噜瑟| 熟女视频久久| 久久久久女教师免费一区| 一级免费啪啪片| 91精品国| 91狠狠综合久久久久久| 极品色综合| 日日狠狠久久偷偷色综合免费| 91制服丝袜| 欧洲色色| 黑人娇小av在线播放| 人人喜人人妻| 欧美性爱日韩高清| 久久水蜜臀亚洲AV无码精品| 日韩精品在线观看观看| 桃色人妻在线视频| 免费中文在线| 人妻少妇无码| 日韩国语字幕| 亚洲黄色视频在线观看视频| 无码视频一区二区| aⅴ日韩成人电影av在线免费看av大全| 任我爽在线视频免费观看| 国产无码一二三区| 国产久久久久久| 绯色AV粉色AV蜜臀AV| 一线黄色免费性爱片| 亚洲色图第四色| 五月丁香色综合| a片 xxxx受爽视频| 伊人 俄罗斯 a v| 久9视频| 日韩啊V| 欧美色图人妻| 98色网| 久操com| 91性网| 97天天弄| 性爱综合网| 久操操AV电影| 久久伊人影院| 操亚州| 久久久久久久一级黄色打同平台| 老司机天天操| 天天干嫩逼网| 我爱搞逼综合网| 国模限制级电影| 色哟哟511老熟女| 91久久青青草原精品| 九九av| 骚乳在线| 天天做天天爽| 国产自产一区视频在线| 夜夜骑夜夜操| 亚洲情色 自拍| 密臀视频一区二区三区| 六六久久日韩不卡| 一个人免费HD91视频| 99精品国产户外露出| 欧美色蜜桃97| a人片中文字幕一区二区| 78精品| 色综合网1| 国产成人精品日本视频| 好看的久久不射无码影视影院| 激情开心五月天| 美國A片| 九九精品无码专区免费| 亚洲欧美黄| 黑人精品欧美一区二区蜜桃| 亚洲色香| 欧美丝袜激情| 欧美九9 9 9| 9999免费精彩视频| 女同性恋久久| 亚洲蜜乳av| 无码不卡八戒| 免费人成毛片乱码| 熟女人妻精品一区二区视频| 偷拍新久久| 老女人91| 啊啊啊久久久视频| 国产精品一区二区后入| 男人天堂站| 九九热免费视频| AV污污污污| 国产51色综合久久免费| 91综合色噜噜| 草草草视频在线免费看| 国产sv美女内射| 91美女视频直播| 日韩色女精品| 欧美高清在线| 亚洲精品人伦一区二区| 亚洲图片在线| 日韩丝袜高跟制服在线观看| 国产青视频| 亚洲第一黄色av网站 | 婷婷91| 丝袜美腿制服人妻二区中文字幕 | 快点操死我| 熟妇人妻一区二区三区| 97亚洲性爱| 久久欧美按摩999| 欧美色偷拍 | 九九热精彩视频| 麻豆天美在线喷水AV| 久久精品国产精品| 亚洲丝袜二区在线| 麻豆色约约| 亚洲性少妇| 玖玖爱伊人玖玖爱| 亚州Av天美传媒| 亚洲久久东京热一二三四五区视频| 久久婷婷国产一区二区色| 久操综合在线| 天天干天天日天天射黄色| 国产农村妇女精品一二区| 免费精品99| 精品乱子一区二区三区99| 夜夜操中文字幕| 97超碰国产亚洲精品| 久久久555| 女人综合网| 日韩美女啪啪一区| 中日韩熟女| 开心五月激情网| 亚洲欧洲国产综合av| 大香蕉av在线| 激情第四色| 色噜噜人妻av 中文字幕| 蜜桃视频一区二区三区 | 性色av蜜臀av色欲aV| 国产精品免费视频人成| 97在线免费看| 久久久久久中文| 9久久久久| 九九干| 五月综合色| 性爱欧美五月| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 色9999日韩国产| 精品夜夜澡人妻无码| 60秒免费小视频| 欧美综合色| 91东京热男人的天堂| 99性爱在线观看| 天美传媒av 在线| 久久久久网站-538在线视频-欧美永久乱码| 日韩有码回春沙龙第一页| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 精品久久久久成人码免| av激情亚洲五月天| 久久久精品中文字幕爱豆| 色五月首页| 亚洲情色一区二区三区| 天堂性色| 国产18精品亚洲精品| 中文字幕 一区二区 亚洲无码| 亚洲天堂久| 日韩欧美亚欧在线视频| 九九亚洲视频| 色九九九综合| 亚洲人成网站7777| 久操精品网| 91高潮喷水美女| 欧美图片校园春色| 日韩一区二区三区四区五区| 青青草黑寡妇男人天堂| 中日韩久久久免费看| 日韩av不卡在线看| 亚码激情| 国产sv美女内射| 色嗨嗨在线| 久久久性爱视频| 欧美色图亚洲色| 色狠狠色| 久久噜噜噜精品国产亚洲综合| 日本高清视频xxxx| 欧美色图私拍91| 天久久久噜噜噜久久国产精品爽爽 | 午夜高清成人在线视频| 精品然女一区二区| 亲子敌伦对白在线播放| 婷婷久久网| 超碰久久综合| 久久精品国产亚洲AV无码电影| 色五月第四色| 九色精品视频导航1| 欧美一级欧美三级在线观看| 蜜臀无码视频在线观看| 天天亚洲综合| 亚洲色图综合| 夜夜操夜夜爽夜夜高潮| 丁香七月婷婷| 国产久久视频| 26uuu久久| 亚洲男人的天堂AV| 午夜亚洲WWW湿好大| 蜜臀AV成人精品蜜臀AV久久| 亚洲 欧美 制服 另类 自拍| 老熟女区| 亚洲国产一区二区入口| 亚洲激情天堂网| 黄片免费久久久久久久| 91nbbbbbb| 色色色色网站| 少妇久久久久久久| 99re6久热只有精品6在线直播| 亚洲中字幕日本一区二区三区| 婷婷四五区| 亚洲熟妇一,二,三期| 国产精品一区二区在钱播放| 日本羞羞的视频在线播放| 色播丁香| 日语五十路和六十路亚洲国产精品| 天天碰操中国年青熟妇| AV在线性爱| 国产精品69久久久久久久| 日本在线播放不卡一区| 少妇高潮九九九九| 用力操死我| 欧美日韩香蕉| 97干在线视频| 后入内射蜜桃臀| 最近2019中文字幕国语免费版| 99最新日韩偷拍视频| 射 色综合| 久久国产AⅤ| 91处女在线视频| 亚洲人成网www| 国产辣妈在线视频福利| 91九色丰满高潮| 五月丁香六月激情综合| 都市久久精品激情亚洲| 日本免费一区二区不卡| 超碰超碰95| 乱伦AVxx| 91色狼| 九九九精品色乱九九九| 色婷婷六月| 99精品欧美一区二区三区桃色| 97欧美日韩综合| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 国产精品粉嫩福利在线| 亚洲天堂,男人| 岛国在线一区二区三区| 亚州综合| 大香蕉青青9| 97干色天堂| 天天干天天狼在线视频| 精品无码一区二区三区| 91久久久老司机| 亚洲五月丁香花狠狠干一区二区三区| 免费αⅴ在线观看| 91 丝袜在线播放| 精品人妻视频一区二区在线播放| 韩国久久97| 欧美日韩国产色图在线| 免费福利视频中文字幕| 91高清欧美| 亚洲在钱| 欧美少妇第一页| 嗯嗯啊中文字幕| 欧美啪啪女女| 在线岛| 成人午夜高潮av猛片| 色狠狠一区二区三区香蕉| 自拍亚洲综合| 亚洲欧美一区二区不卡视频播放| 激情五月综合| 国产亚洲综合欧美一区| 日本熟女免费視颖| 韩国轻伦国内自拍一区| 麻豆国产尤物AV| 天天色综亚洲91污| 久久久久久久亚洲Av无码| 精品国产Av无码久久久亚洲| 久久专区| 少妇久久久久久| 日韩91网| 蜜臀久久99精品久久久久久成人小说 | 国产熟女自拍| 无毛精品| 欲射影视| 夜夜操一区二区| 96免费视频在线| 激情欧美日韩女同久久| 美女AV一区二区| 好吊色一区| 欧美日韩婷婷中文| 超碰天天久久79| 精品国产国产AV| 精品一区二区三区四区外站| 自拍欧美| 欧美 亚洲 91| 超碰综合97在线| 狠操91,com| 性高潮久久久| 亚州,欧美在线| 成人性交免费视频| 国产一级舔足在线观看| 久久夜夜| 91成人高清在线观看| 人妻久久一区二区三区| 日本久久女同性恋视频| 九九视频黄色片| 日韩欧美午夜一区二区| 亚洲欧洲精品视频发布| 久久这里只精品99re66图| 日韩性爱视频免费在线| 婷婷在线播放| 99re6久热只有精品6在线直播 | 10000部十八禁看电影| 欧美日动态视频| 蜜桃丰满熟妇av无码区不卡| 九九五月天| 日本一二三免费久久| 加勒比综合在线| 国产一国产一级毛片古装| 国产成人在线观看网址| 亚洲91在线播放影院| JULIA一区二区三区在线播放| 婷婷丁香五月激情啪啪| 人人爽天天爽| 久久精品视频28| 夜夜爽爽夜夜精品视频| 欧美热图99| 在线不欧美| 中文字幕一区电影在线观看| 五月天色图| 天天综合91在线| 亚洲综合贴图91| 色与欲影视| 久艾草在线精品视频在线观看| 亚洲第一无码播放立川理惠| 久热伊人| 操曰本熟女| 91老女人| 隔壁邻居波多野结衣中文字幕| 婷婷99狠狠| 韩日精品福利视频一区不卡在线免| 人妻美腿丝袜日韩| 岛国片在线视频网站| 久久婷婷热| 99re9这里只有精品| 精品人妻一区二区免费看| 中文字幕精品探花视频| 国产精品老师| 农村妇女精品一区二区| 午夜啊啊| 亚洲乱码国产乱码精网站| 精品无码一区二区| 亚洲少妇免费视频\| a男人的天堂久久一级A毛片| 色婷婷丁香| 97大色网| 成·人免费午夜在线观看| 黄片直播三级黄片两女一男| 久久大香蕉手机高清| 自拍啪啪视频| 久久久久成人网| 亚洲无码AV九九九| 亚洲 欧美 另类 日韩 人妻一区| 亚洲干B| japan日本高清乱xxxx| 97国产亚洲中文在线| 伊人九九九| 欧美成人性爱视频大全| 久久综合久色欧美综合狠狠| 国内伊人久久久久久网站视频| 国产日韩欧美三级片| 日韩精品大香蕉伊人在线| 2024年最新色情网站在线观看| 婷婷亚洲综合| 免费视频观看60秒| 淫荡少妇免费| 天天天天天超碰| 日韩黄色av中文字幕| 日本人体九九九九九九| 9久热这里只有精品| 欧美另类综合久久| 国产熟妇一区二区| 日本一区二区三区午夜观看| 用力操死我| 亚洲色天| 日韩美女久久一区二区三区| nuu12国产麻豆精品| 久久成人国产| 操91| 少妇一级无码精品| 91夜色chaopeng| 久久受www免费人成| 久久女婷| 一本久道久久综合狠狠爱一密臀精 | 95自拍视频在线观看| 少妇极品熟妇人妻无码| 中国AAAAAA黄色片| 九九久久国产精品| 无码国产Av| 玖玖资源中文字幕制服丝袜| 国产高清精品一区二区三区毛片| 国产成自自拍在线观看| 亚洲成人黄色在线观看| 久久鲁夜| 黄片免费久久久久久久| a片亚洲一本通视频| 91精品伊人久久久大香线蕉91| 婷婷20月天青娱乐| 91粉嫩萝控精品福利网站_精品影音先锋国 | 91网站在线播放| 女人高潮大叫一级毛片| 桑老女人九区| 久久久人体| 日本性交操一区二区不卡系列| 综合 青草 伊久久 影院 综合| 亚洲国产一区二区日韩专区| 亚州熟妇精品| 91精品人妻电影| 91九色丨风韵犹存| 天美一二三在线观看Av| 国产乱人伦AVA麻豆软件.| 夜夜嗨免费视频| 天天综合网国产| 日韩av不卡在线看| 色踪合AV| 一区二区 韩日AV| 免费成人在线观看91| 蜜桃色院一区久久| 五月婷婷久久综合| 2023天天操夜夜操| 亚洲天堂情色| 天天爽天天操| 中国一级操逼视频| 大但人体久久久久| 精品免费一区二区三区在线亚洲人成 | 加勒比久久综合网高清| 密臀在线一区尤物| 亚洲限制级| 91黑人无码激情在线| 亚洲婷婷综合网| 51一区二区三区| 中文字幕二区日韩天堂| 亚洲αv一区二区三区| 欧美牲| 夜夜做夜夜爽精品视频| 91麻豆天美国产欧美| 亚洲一级特黄大片在线播放91| 国产精品欧美在线观看 | 亚洲高清国产理伦片| 97天天综合| 精品九九九九九九九九九| 久久男人的天堂国产| 性做久久久久久久| 国产精品伦理| 欧美大片一区二区三区| 九九无码久久精品视频| 大香蕉黄色一区| 无码不卡八戒| 国产久久久久久| 亚洲精品蜜桃久久久| 天天综合有色网| 亚洲午夜免费狠狠干| 一起草精品人妻| 毛片久久| 99精品无码| 国产白丝在线| 少妇二级| a级理论午夜日本| 上海一级黄片| 午夜视频久久久久一区| 欧美96精品在线| 人澡逼| 超碰97欧美日韩| 欧美亚洲日韩16色| 天天影视综合网欧美精品| 欧洲熟妇xxXx欧美老妇裸体 | 大地资源在线观看中文第二页| 亚洲好看强奸乱伦| 国产精品扒开腿做爽爽爽视频| 67914在线兔费成人视频| 欧美国产操逼| 91偷拍欧美亚洲| 中文字幕精品丝袜| 久久久精品日本一道| 五月丁香啪啪啪| 成人日本视频人妻在线| 欧美最婬乱婬爆婬牲视频| 91老司机在线| 婷婷10月天青娱乐| 久久久久久久久久久久九| 欧美永久激情一区二区| 密臀在线免费观看| 国产11页| 欧美九9 9 9| 欧美色图天堂在线| 99在线精品视频| 一区二区三区欧美激情| 久久久国产成人一区二区三区在线| 国产精品呦一区二区三区| 岛国黄片网站| 中文字幕美女91| 青草草免费网站av| 国产av强奸美女| 日韩在线地址一| 国产最新小视频在线播放下载| 日本操色导航| 亚洲影院成人| 操逼日批| 91丨熟女丨丰满熟女|