ruby sinatra mysql_一分钟开始持续集成之旅系列之:Ruby + Sinatra 应用
前言
現代軟件工程越來越復雜,而開發效率隨著軟件復雜度增加呈指數型下降。為在提高開發效率的同時也能保證質量,越來越多團隊開始踐行敏捷開發方法。
持續集成是敏捷開發的重要實踐之一。它倡導團隊通過自動化構建工具頻繁地驗證軟件可用性,從而盡早發現集成錯誤并集中精力改善軟件質量。
本文將使用 CODING DevOps 工具鏈和騰訊云容器服務(下稱 TKE)為 Ruby + Sinatra 應用項目配置持續集成過程:運行單元測試、構建 Docker 鏡像、推送到制品庫、部署到 K8s 集群,以實現自動化構建、測試、發布、部署。
可以看到這個 Web 應用項目的結構非常簡單。然而隨著項目規模的逐步增大、參與人員的不斷增加,構建、測試、發布過程變得越來越復雜。單靠開發人員在本地機器上人工手動進行集成變得愈發困難,既消耗時間也分散精力,團隊的協作效率越來越低。而借助持續集成,則可以自動化構建、測試、發布的過程,將開發人員從重復的人力勞動中解放出來,更專注于開發且更快地發現和解決問題。
在繼續下面的步驟前,請確保在 CODING 項目中開啟了“持續集成”和“制品庫”功能。
創建制品庫
如今容器化部署已經是大勢所趨,無論是伸縮性還穩定性都相較于傳統的裸機部署提升不少。本文的應用也選擇了容器化部署。容器化部署最后的發布產物則是容器鏡像,故需要創建用于存放發布產物的 Docker 制品庫。
設置制品庫憑證
K8s 集群從制品庫拖取鏡像需要訪問憑證,這里使用 CODING 制品庫自動生成的訪問令牌。這里要注意的是,訪問令牌生成后需要立即復制下來,否則關閉訪問令牌的窗口后將無法再次查看。
生成訪問令牌后會得到一條 Docker 倉庫的登錄命令,例如:
docker login -u release-1587202817568 -p 2f4f129287b3319c52f760635fxxxxxxxxxxxxxx coding-public-docker.pkg.coding.net
其中提供了 3 部分信息:
倉庫域名:coding-public-docker.pkg.coding.net
用戶名:release-1587202817568
密碼:2f4f129287b3319c52f760635fxxxxxxxxxxxxxx
在 TKE 的集群中創建 Secret,輸入上面獲得的倉庫訪問憑證。
設置集群憑據
要通過 CODING 持續集成觸發 K8s 集群部署過程需要在 CODING 中錄入集群憑據,以便在 CODING 持續集成中使用 kubectl 命令實現 K8s 集群控制。
在 TKE 控制臺中找到“集群APIServer信息”,復制其中的“Kubeconfig”。
在 CODING 的憑據管理中錄入 Kubeconfig。
創建部署
為方便將應用部署 K8s 集群中,需要先創建 Deployment 工作負載,之后就可以通過 CODING 持續集成反復運行 kubectl deployment patch ... 命令來將新構建出來的應用鏡像部署到 K8s 集群上。
由于現在還沒有構建本文中 Ruby + Sinatra 應用的 Docker 鏡像,這里選用 nginx r 鏡像來代替,確保 Deployment 能正常跑起來。
創建構建計劃
這里選擇預置內容較少的“自定義構建過程”模板,之后在這個模板的基礎做詳細的配置。
回到“憑據管理”中編輯剛錄入的 K8s 憑據,在“憑據授權”列表里勾選剛創建的構建計劃并保存。
配置構建流程
這里把 Ruby + Sinatra 應用持續集成過程分成 6 個階段:
開始
檢出
運行單元測試
構建 Docker 鏡像
推送到制品庫
部署到 K8s 集群
從模板創建的構建計劃已經包含了“開始”和“檢出” 2 個階段。其中“檢出”階段可以不用修改直接使用。
下面對其他階段進行完善。
“開始”階段
此階段是默認生成的,所有模板都會包含這個階段。在這個階段中可以設置一些全局使用的參數,如“構建基礎環境”、“環境變量”等。在這里需要添加 3 個環境變量,它們會被后面階段引用。
CODING_DOCKER_REG_HOST:制品庫主機,用于登錄制品庫。
DOCKER_IMAGE_NAME:Docker 鏡像名稱,用于構建和推送鏡像。
TKE_CLUSTER_CREDENTIAL_ID:TKE 集群憑據 ID。
上述環境變量的值是根據上面創建的 Docker 制品庫來設置的,可以在制品庫指引中查看相關信息。注意,頁面上的 Docker 鏡像名稱不完整,需要把 替換成實際的值,如果值為 ruby-sinatra,則鏡像名稱就是 coding-public-docker.pkg.coding.net/ruby-sinatra/release/ruby-sinatra。
而 TKE 的集群憑據 ID 則可以在憑據管理中查看。
“運行單元測試”階段
在這個階段里,將運行代碼中已經寫好的單元測試代碼。整個過程會在 Docker 容器中進行,這樣可以節省準備運行環境的時間,也可以與后面構建 Docker 鏡像時使用的基礎環境保持一致。
首先給對模板創建出來的“3-1 自定義構建過程”刪除掉,然后添加名為“運行單元測試”的階段,之后在這個階段里添加“執行 Pipeline 腳本”的步驟,并在右邊的輸入框中輸入運行單元測試的腳本。這里使用 Jenkins Pipeline 來調用 docker run 命令來運行單元測試。
docker.image('ruby:2.6').withRun('-v $(pwd):/app -w /app') { c ->
sh 'bundle install'
sh 'rake test'
}
“構建 Docker 鏡像”階段
接下來是配置 Docker 鏡像的構建過程,同上一步類似,添加名為“構建 Docker 鏡像”的階段,在階段里添加“執行 Pipeline 腳本”的步驟,在腳本輸入框中輸入腳本。這里使用了 Jenkins Pipeline 來構建 Docker 鏡像。
docker.build("${env.DOCKER_IMAGE_NAME}:${env.GIT_BUILD_REF}")
其中的鏡像名稱使用了 1-1 階段設置的環境變量。而標簽則使用內置的環境變量 GIT_BUILD_REF,其值對應“構建對應的 Git 修訂版本號”。內置環境變量的具體說明請見 https://help.coding.net/docs/devops/ci/env.html
“推送到制品庫”階段
這是構建過程的最后一個階段,和上一個階段類似,添加名為“推送到制品庫”的階段,在階段里添加“執行 Pipeline 腳本”的步驟,在腳本輸入框中輸入腳本。這里使用了 Jenkins Pipeline 來推送鏡像到制品庫。
docker.withRegistry("https://${env.CODING_DOCKER_REG_HOST}", "${env.CODING_ARTIFACTS_CREDENTIALS_ID}") {
docker.image("${env.DOCKER_IMAGE_NAME}:${env.GIT_BUILD_REF}").push()
}
腳本中用到了在 1-1 階段定義的環境變量:CODING_DOCKER_REG_HOST 和 DOCKER_IMAGE_NAME。還有兩個內置環境變量:CODING_ARTIFACTS_CREDENTIALS_ID 和 GIT_BUILD_REF。其中 CODING_ARTIFACTS_CREDENTIALS_ID 為制品庫私鑰憑據,用于登錄制品庫。
“部署到 K8s 集群”
這是構建過程的最后一個階段,和上一個階段類似,添加名為“部署到 K8s 集群”的階段,在階段里添加“執行 Pipeline 腳本”的步驟,在腳本輸入框中輸入腳本。這里同樣使用了 Jenkins Pipeline 來調用 docker push 命令來運行單元測試。
withKubeConfig([credentialsId: "${env.TKE_CLUSTER_CREDENTIAL_ID}"]) {
sh "kubectl patch deployment ruby-sinatra --patch '{\"spec\": {\"template\": {\"spec\": {\"containers\": [{\"name\": \"ruby-sinatra\", \"image\": \"${env.DOCKER_IMAGE_NAME}:${env.GIT_BUILD_REF}\"}], \"imagePullSecrets\": [{\"name\": \"ruby-sinatra-reg\"}]}}}}'"
}
腳本中用到了在 1-1 階段定義的環境變量:TKE_CLUSTER_CREDENTIAL_ID。
配置完成后別忘了保存!
這是完成后的完整流程。
此時,已經可以通過“立即構建”來手動觸發持續集成過程了。
整個流程運行完成后,可以查看每一步的運行日志。
配置觸發規則
CODING 持續集成提供了多種觸發規則,如果默認配置無法滿足需求,還可自行配置所需的規則。
查看構建產物
構建計劃運行成功后,可以到 CODING 制品庫查看持續集成的構建產物。
查看部署結果
構建計劃運行成功后,可以到 TKE 控制臺查看 Deployment 的部署狀態。
簡單的、自動化的部署可以用本文的方法來配置一個自動化的部署階段。對于體系化、需要考慮回退、負載流量控制、發布時間窗口、更新策略等則可以使用 CODING 持續部署。
總結
以上是生活随笔為你收集整理的ruby sinatra mysql_一分钟开始持续集成之旅系列之:Ruby + Sinatra 应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 咽喉检查多少钱啊?
- 下一篇: 兰州治疗排卵障碍最好的医院推荐