亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Google App Engine上持續集成/部署/交付是否太冒險了?

在Google App Engine上持續集成/部署/交付是否太冒險了?

12345678_0001 2020-02-01 16:14:03
我們最近在Google App Engine上設置了Node.js Web應用程序的持續集成/部署/交付。CI服務器(GitLabCI)根據分支(開發/母版)運行依賴項安裝,構建,測試和部署到集成/產品。在今天,我們所面對的唯一錯誤是在依賴步驟中,因此我們對此并不在意。但是昨天(16/10/16),發生了大規模的DNS中斷,并且在部署步驟的中間,管道失敗了,從而導致了產品故障。只需重新運行管道就可以完成工作,但是問題可以隨時重現。我的問題是:在持續部署過程中,我們如何處理此類網絡問題?在Google App Engine上進行持續部署真的是一個好主意嗎?如果是,那么App Engine部署方法是什么?我找不到任何相關的文檔...目前,我們只有兩個版本“ dev”和“ prod”在提交后進行了更新,但是在隨機時間,我可以觀察到奇怪的行為。任何回應/建議/反饋都非常歡迎!關于我正在談論的網絡問題的stacktrace示例:DEBUG: Error sending result: 'MetadataServerException(HTTPError(),)'. Reason: 'PicklingError("Can't pickle <type 'cStringIO.StringO'>: attribute lookup cStringIO.StringO failed",)'Traceback (most recent call last):  File "/google-cloud-sdk/lib/googlecloudsdk/calliope/cli.py", line 733, in Execute    resources = args.calliope_command.Run(cli=self, args=args)  File "/google-cloud-sdk/lib/googlecloudsdk/calliope/backend.py", line 1630, in Run    resources = command_instance.Run(args)  File "/google-cloud-sdk/lib/surface/app/deploy.py", line 53, in Run    return deploy_util.RunDeploy(self, args)  File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", line 387, in RunDeploy    all_services)  File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", line 247, in Deploy    manifest = _UploadFiles(service, code_bucket_ref)  File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", line 115, in _UploadFiles    service, code_bucket_ref)  File "/google-cloud-sdk/lib/googlecloudsdk/api_lib/app/deploy_app_command_util.py", line 277, in CopyFilesToCodeBucketNoGsUtil    _UploadFiles(files_to_upload, bucket_ref)  File "/google-cloud-sdk/lib/googlecloudsdk/api_lib/app/deploy_app_command_util.py", line 219, in _UploadFiles    results = pool.map(_UploadFile, tasks)  File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map    return self.map_async(func, iterable, chunksize).get()  File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get    raise self._value
查看完整描述

1 回答

?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

好壞?主觀的-因此對SO來說是題外話。假設問題是如何使連續部署可靠:)


好吧,問題在于您正在使用應用程序版本作為CI環境,這意味著您無法避免由于特定版本不良而造成的損壞。您只能希望通過重新部署版本(中斷結束時)來盡快恢復-這可以自動進行。


您不應讓生產站點直接在CI production管道覆蓋的版本上運行,否則會因部署不當而冒著站點中斷的風險。相反,你可以使用一個新的/唯一版本的CI的每個執行production管線并且只有完成之后成功你最終使用流量如下所述切換網站流量到它的版本(也可以在CI管線內使用,如果使用不同的應用程序,而不是CI 版本的應用程序版本)


從部署程序開始:


默認情況下,deploy命令每次使用時都會自動生成一個新的版本ID,并將所有流量路由到該新版本。


要覆蓋此行為,可以使用version標志指定版本ID:


gcloud app deploy --version myID

您也可以使用--no-promote標志指定不立即將所有流量發送到新版本:


gcloud app deploy --no-promote

因此,請確保不要部署一個版本,并且不要在同一步驟中將該版本設置為默認的流量目標(如果從客戶端驅動,則可能不是原子的)。特別是對于生產應用程序。代替:


部署新版本(gcloud app deploy --no-promote --version ...)

啟動新版本(gcloud app versions ...)并檢查其是否有效

如果工作正常,則將實際流量切換到(gcloud app services set-traffic ...)

這樣,唯一關鍵的操作是流量切換,(有希望)這是成功的原子操作,或者它已完全退回到GAE端(如果不是,則是GAE錯誤)。如果此步驟失敗,則該應用仍應繼續使用舊版本。


當然,這假設網絡問題僅在您和GAE之間,如果它們也影響GAE的內部運營,那么所有的賭注都沒有了(但是我相信應該及時解決)。


查看完整回答
反對 回復 2020-02-01
  • 1 回答
  • 0 關注
  • 743 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號