一分鐘開始持續集成之旅系列之:Ruby + Sinatra 應用

前言

現代軟件工程愈來愈複雜,而開發效率隨着軟件複雜度增長呈指數型降低。爲在提升開發效率的同時也能保證質量,愈來愈多團隊開始踐行敏捷開發方法。html

持續集成是敏捷開發的重要實踐之一。它倡導團隊經過自動化構建工具頻繁地驗證軟件可用性,從而儘早發現集成錯誤並集中精力改善軟件質量。nginx

本文將使用 CODING DevOps 工具鏈和騰訊雲容器服務(下稱 TKE)爲 Ruby + Sinatra 應用項目配置持續集成過程:運行單元測試、構建 Docker 鏡像、推送到製品庫、部署到 K8s 集羣,以實現自動化構建、測試、發佈、部署。git

項目倉庫地址:https://coding-public.coding....docker

能夠看到這個 Web 應用項目的結構很是簡單。然而隨着項目規模的逐步增大、參與人員的不斷增長,構建、測試、發佈過程變得愈來愈複雜。單靠開發人員在本地機器上人工手動進行集成變得愈發困難,既消耗時間也分散精力,團隊的協做效率愈來愈低。而藉助持續集成,則能夠自動化構建、測試、發佈的過程,將開發人員從重複的人力勞動中解放出來,更專一於開發且更快地發現和解決問題。ruby

在繼續下面的步驟前,請確保在 CODING 項目中開啓了「持續集成」和「製品庫」功能。
20562435.png
在這裏插入圖片描述app

建立製品庫

現在容器化部署已是大勢所趨,不管是伸縮性還穩定性都相較於傳統的裸機部署提高很多。本文的應用也選擇了容器化部署。容器化部署最後的發佈產物則是容器鏡像,故須要建立用於存放發佈產物的 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,輸入上面得到的倉庫訪問憑證。
在這裏插入圖片描述
在這裏插入圖片描述ui

設置集羣憑據

要經過 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 個階段:

  1. 開始
  2. 檢出
  3. 運行單元測試
  4. 構建 Docker 鏡像
  5. 推送到製品庫
  6. 部署到 K8s 集羣

從模板建立的構建計劃已經包含了「開始」和「檢出」 2 個階段。其中「檢出」階段能夠不用修改直接使用。

在這裏插入圖片描述

下面對其餘階段進行完善。

「開始」階段

此階段是默認生成的,全部模板都會包含這個階段。在這個階段中能夠設置一些全局使用的參數,如「構建基礎環境」、「環境變量」等。在這裏須要添加 3 個環境變量,它們會被後面階段引用。

在這裏插入圖片描述

  • CODING_DOCKER_REG_HOST:製品庫主機,用於登陸製品庫。
  • DOCKER_IMAGE_NAME:Docker 鏡像名稱,用於構建和推送鏡像。
  • TKE_CLUSTER_CREDENTIAL_ID:TKE 集羣憑據 ID。

上述環境變量的值是根據上面建立的 Docker 製品庫來設置的,能夠在製品庫指引中查看相關信息。注意,頁面上的 Docker 鏡像名稱不完整,須要把 <PACKAGE> 替換成實際的值,若是值爲 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/...

「推送到製品庫」階段

這是構建過程的最後一個階段,和上一個階段相似,添加名爲「推送到製品庫」的階段,在階段裏添加「執行 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_HOSTDOCKER_IMAGE_NAME。還有兩個內置環境變量:CODING_ARTIFACTS_CREDENTIALS_IDGIT_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 持續部署。

相關文章
相關標籤/搜索