還在寫定時任務進行部署? ---使用Artifactory Webhooks和Docker實現持續部署

JFrog傑蛙科技發表於2021-01-29

引言

持續部署(CD) 在持續 整合 的基礎上,把 整合程式碼或構建產物自動化 部署到 測試或 生產環境。這就是我們所說的“流動軟體”。完全自動化可以使您的部署無縫、更少的出錯機率、更快,並且可以縮短反饋迴圈,因為您現在可以在每次更改之後進行部署。

 

實現持續部署需要以下要素:

持續整合(CI),如Jenkins或JFrog Pipeline, 用於構建 / 驗證新版本。

製品 管理器,如JFrog Artifactory,用於儲存 製品, 並提供新版本的部署目標(伺服器、智慧裝置)。

一個部署代理,控制新版本製品的相關運維操作  (停止當前伺服器、下載二進位制檔案、啟動伺服器)。代理有兩種型別:

取方式 : 在目標上執行的 代理

推方式 :  在 任意集中伺服器上執行 的代理,遠端更新目標 服務

 

兩種方式的對比:

拉和推部署模型各有優缺點,您也可以同時使用這兩種模型。拉模型最顯著的缺點是代理不知道二進位制儲存中的更改,因此它不知道何時觸發更新。推送模型的一個缺點是安全性,因為目標需要確保部署代理經過身份驗證,並且只能執行授權執行的操作。

 

本次分享 中, 我們會分享 如何建立一個推/拉 解決方案。我們將 一步一步實現從構建推送 Docker 映象到註冊中心 進行驗證, 將其 升級 生產環境,最後使用JFrog Artifactory webhook來觸發將其部署到我們的生產伺服器。

 

 

1 . 搭建制品庫Artifactory

首先,您需要一個執行的Artifactory伺服器。如果您還沒有云例項,您可以免費建立一個雲例項。

 

首先建立兩個Docker :Docker-local-staging和Docker-local-prod。

new repository視窗中:

 

1.  選擇 Docker

2.  輸入“docker-local-staging”作為 key

3.  點選“儲存並完成”

4.  重複 上述步驟建立 “docker-local-prod”

 

現在你有了兩個空的儲存庫,繼續設定webhook。導航到管理 選單 Admin  | General | Webhooks,點選“新建webhook“像這樣填寫

 

注意:在這個例子中,URL設定為" "。這是因為webhook處理程式將執行在本地主機和埠7979上。這裡的host. d ocker.internal主機名是用來從Docker容器到達主機的。在生產環境中,您可能需要將其更改為您的生產伺服器URL和您選擇的埠 ,   Artifactory   當檔案有變更會主動通知該地址所執行的服務。

 

secret欄位中,您可以輸入任何您想要的字串,它將以HTTP  header “X-jfrog-event-auth” 形式 傳送 到目標服務 ,這樣您就可以驗證查詢是否來自可信的源。

 

選擇“Docker tag was  promoted”事件。在Artifactory中,Docker 映象 可以被 升級(晉級,代表測試驗證透過,將該映象升級為更高成熟度狀態) ,這需要在不修改內容的情況下將Docker 映象 從一個 倉庫 移動到另一個 倉庫 。這可以確保在準備階段測試的 映象 是將 驗證透過並是即將投產 映象。

 

點選“Select Repositories”,然後選擇要從中提升 映象 倉庫 。你也可以在“Include Patterns”部分新增一個過濾器來匹配你的Docker 映象 清單。

 

 

2 建立Webhook   處理程式

webhook處理程式將在生產伺服器上執行,並將接收一個包含 變更 事件 資訊的 HTTP請求。在 上述映象升級 的情況下,它 的請求資料 將看起來像這樣:

 

webhook處理程式需要 做到以下操作 :

 

1.  讀取並解析HTTP訊息體。

2.  驗證Docker 映象 倉庫 。即使你在Artifactory的webhook設定中新增了過濾器,伺服器也應該總是驗證 請求輸入。

3.  最新的Docker 映象

4.  停止正在執行的容器(如果存在的話)。

5.  啟動新版本。

下面是處理程式的核心 邏輯。 完整的程式碼示例可以在Github中找到。

 

func main() {

http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {

ctx := context.Background()

p, err := readPayload(r)

if err != nil {

http.Error(w, err.Error(), http.StatusBadRequest)

log.Printf("Payload reading error: %+v", err)

return

}

if !isMyServerEvent(p) {

http.Error(w, "Bad event", http.StatusBadRequest)

log.Printf("Unexpected event %+v", p)

return

}

cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())

if err != nil {

log.Printf("New client error: %+v", err)

return

}

err = pullLatestVersion(cli, ctx)

if err != nil  {

log.Printf("Pull error: %+v", err)

return

}

err = stopRunningContainer(cli, ctx)

if err != nil {

if client.IsErrNotFound(err){

log.Printf("Container does not exists")

} else {

log.Printf("Stop error: %+v", err)

return

}

}

err = startContainer(cli, ctx)

if err != nil {

log.Printf("Start error: %+v", err)

} else {

            log.Printf("Container updated ")

        }

})

http.ListenAndServe(":8081", nil)

}

 

它使用多個 開源 :

1.  golang內建的http server

2.  docker golang SDK

 

其他部分程式碼請檢視github原始碼,包含輸入資訊檢查,拉取最新映象,更新啟動新的容器等

 

2 構建並推送docker   images(demo   應用)

使用以下簡單的golang web伺服器進行測試: server .go

 

 

測試啟動: go run serve.go

一個 很簡單 測試服務 ,當你在瀏覽器中載入“”時列印出“Hello world”。

以下是這個應用程式的Dockerfile (大部分來自VSCode的golang Dockerfile模板):

 

用以下命令構建dockerfile。這在CI 持續整合 過程中應該是自動化的 (基於JFrog   CLI)

docker build . -t localhost:8082/docker-local-staging/helloworld

 

jfrog rt docker-push localhost:8082/docker-local-staging/helloworld docker-local-staging --url --user admin --password password

 

jfrog rt docker-promote helloworld docker-local-staging docker-local-prod --copy --user admin --password password --url

jfrog rt docker-promote 該命令將觸發以下 流程 :

 

1.  Artifactory將Docker映象複製到Docker-local-prod儲存庫中。

2.  Artifactory 透過 HTTP請求呼叫Webhook。

3.  Webhook 坐在 伺服器獲取最新版本。

4.  它會殺死正在執行的伺服器(如果存在的話)。

5.  用最新的更改 啟動 新的 服務。

 

如果你完成到這裡,恭喜您,您已經完成了一個自動化部署方案!!!

 

4 . 一些建議

希望上面的指南能幫助你開始實現持續部署和使用webhook。還有許多附加的功能可以新增。以下是一些建議:

 

1.  CI環境中執行所有Docker / Jfrog CLI命令。例如,使用包含“#prod”的提交訊息,使開發人員能夠進行部署。

2.  使用容器編排。 進行構建 釋出Docker命令, 比如 使用Kubernetes、Docker swarm或者一些雲提供商SDK。

3.  提高安全性。您可以向來自Artifactory的HTTP查詢新增一個自定義頭,以確保該查詢不會由發現您的開放埠並 意外 觸發部署 動作

4.  嘗試 透過為“docker push”事件建立webhook,自動化分段部署。

 

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69954434/viewspace-2754497/,如需轉載,請註明出處,否則將追究法律責任。

相關文章