還在寫定時任務進行部署? ---使用Artifactory Webhooks和Docker實現持續部署
引言
持續部署(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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用 GitHub 和 Python 實現持續部署GithubPython
- SpringBoot+Docker+Git+Jenkins實現簡易的持續整合和持續部署Spring BootDockerGitJenkins
- 使用流水線外掛實現持續整合、持續部署
- 第2章 實現突破——持續部署、微服務和容器微服務
- 使用GitHub的Webhooks實現程式碼的自動部署GithubWebHook
- 基於Saltstack、Artifactory打造傳統模式下持續部署平臺模式
- jenkins+docker進行微服務部署JenkinsDocker微服務
- Jenkins持續部署-Windows環境持續部署探究1JenkinsWindows
- 持續整合持續部署持續交付_持續整合與持續部署之間的真正區別
- 持續整合、持續交付與持續部署
- 微服務容器部署與持續整合微服務
- 叢集多機部署時定時任務重複執行問題
- .NET Core部署到linux(CentOS)最全解決方案,入魔篇(使用Docker+Jenkins實現持續整合、自動化部署)LinuxCentOSDockerJenkins
- PHP定時執行任務的實現PHP
- 對持續整合、 持續交付、持續部署和持續釋出的介紹
- 利用github提供的Webhooks實現自動化部署GithubWebHook
- Artifactory & GitLab CI持續整合實踐Gitlab
- 持續整合、持續部署、持續交付、持續釋出
- 使用Java實現定時任務排程Java
- CI/CD 持續整合部署實踐
- 私有化輕量級持續整合部署方案--05-持續部署服務-Drone(上)
- 私有化輕量級持續整合部署方案--05-持續部署服務-Drone(下)
- Jenkins Android APP 持續整合體系建設二—自動部署、執行測試任務,關聯打包任務JenkinsAndroidAPP
- jenkins+gitlab+docker持續整合部署maven專案JenkinsGitlabDockerMaven
- Python定時任務前端專案本地自動打包遠端部署指令碼實現Python前端指令碼
- [譯] 如何使用 CircleCI for GitHub Pages 持續部署Github
- 你真的懂持續整合、持續交付、持續部署嗎?!
- Laravel5.6 使用定時任務實現定時發郵件Laravel
- Laravel5.6使用定時任務實現定時發郵件Laravel
- SpringBoot如何實現定時任務Spring Boot
- Java如何實現定時任務?Java
- 【持續部署】批量部署工具,總結、對比
- 淺談持續整合(CI)、持續交付(CD)、持續部署(CD)
- Kettle8在Linux Centos7部署並定時任務排程LinuxCentOS
- Spring Boot系列之使用@Scheduled實現定時任務Spring Boot
- [奇思異想]使用RabbitMQ實現定時任務MQ
- 在dotnet core實現類似crontab的定時任務
- Java編寫定時任務Java