DevOps的技術(shù)和工具有哪些?
工具及流程概覽
我們的 DevOps 工具鏈有 Jira, Gitlab, 時(shí)速云 DevOps 平臺(tái),Sonarqube, TestLink, Harbor
- Jira: 項(xiàng)目管理;
- Gitlab: 代碼托管、在線 Review;
- 時(shí)速云 DevOps 平臺(tái):基于 Kubernetes 的代碼拉取,編譯,代碼掃描,單元測(cè)試,打包,構(gòu)建鏡像、持續(xù)部署,審批,郵件;
- Sonarqube:代碼靜態(tài)掃描;
- TestLink: 測(cè)試管理;
- Harbor: 鏡像托管,鏡像安全掃描;
流程如下:
實(shí)踐說(shuō)明
1 需求/缺陷管理
需求和缺陷管理我們使用功能強(qiáng)大的 Jira 工具,以兩周一迭代方式進(jìn)行敏捷式開(kāi)發(fā)。
2 代碼 Review/Merge
聊天工具集成 gitlab,PR 提交后 Reviewer 及時(shí)看到提交信息,進(jìn)行 Review 和Merge。
3 Gitlab觸發(fā)自動(dòng)化構(gòu)建
時(shí)速云 DevOps 平臺(tái)自動(dòng)生成 Gitlab 項(xiàng)目的 webhook, 當(dāng) gitlab 有事件發(fā)生,把事件信息發(fā)送到時(shí)速云 DevOps 平臺(tái),時(shí)速云 DevOps 平臺(tái)根據(jù)條件觸發(fā)自動(dòng)執(zhí)行構(gòu)建。
4 時(shí)速云 DevOps 平臺(tái)
4.1 流程簡(jiǎn)介
時(shí)速云 DevOps 平臺(tái)基于 Kubernetes 和 Docker 運(yùn)行具體任務(wù),由 Kubernetes 調(diào)度、執(zhí)行完后銷毀。每一個(gè)任務(wù)模板最終生成 Kubernetes 的 Job,Job 會(huì)生成 Pod 運(yùn)行任務(wù), 并管理生命周期。
每個(gè)任務(wù)模板鏡像都有為自身任務(wù)的最小化工具。比如 maven 任務(wù)鏡像只有 maven 客戶端命令工具,容器被 job 生成時(shí),會(huì)通過(guò)進(jìn)入點(diǎn)運(yùn)行 maven 命令,運(yùn)行結(jié)束后將結(jié)束容器。代碼掃描任務(wù)會(huì)有 sonar-scanner 客戶端工具,Docker 構(gòu)建任務(wù)可以運(yùn)行Docker build 命令構(gòu)建鏡像和 Push 鏡像到 Harbor。
鏡像推送到 Harbor 后會(huì)使用平臺(tái)持續(xù)部署任務(wù)模板更新服務(wù)。
持續(xù)部署成功后服務(wù)會(huì)被升級(jí)到最新版本。
4.2 任務(wù)模板
時(shí)速云 DevOps 平臺(tái)的任務(wù)模板是為執(zhí)行任務(wù)的鏡像和數(shù)據(jù)集合。
sonar 掃描任務(wù)為例,sonar 掃描任務(wù)執(zhí)行就是容器化運(yùn)行 sonar-scanner。
下圖為 sonar 掃描任務(wù)的 Dockerfile, 就是把代碼和 sonar 掃描配置文件拷貝到指定目錄,運(yùn)行 sonar-scanner 命令。
執(zhí)行結(jié)果以 Rest API 方式發(fā)送到平臺(tái),平臺(tái)記錄執(zhí)行結(jié)果,并根據(jù)設(shè)置執(zhí)行下一步任務(wù)或失敗退出。
5 集成測(cè)試
測(cè)試有測(cè)試用例,測(cè)試用例有測(cè)試結(jié)果,如果測(cè)試結(jié)果與期待結(jié)果不符,同步到 Jira, 再執(zhí)行編碼的步驟,形成一個(gè)閉環(huán)。
測(cè)試用例和測(cè)試版本的測(cè)試結(jié)果使用TestLink工具管理。
6 Harbor 同步
測(cè)試人員進(jìn)行測(cè)試通過(guò)以后,使用 Harbor 鏡像同步功能,同步到運(yùn)維環(huán)境 Harbor。
7 Harbor 鏡像更新后通過(guò)觸發(fā)設(shè)置觸發(fā)執(zhí)行部署任務(wù)
harbor的common/config/registry/config.yml設(shè)置notification屬性為時(shí)速云 DevOps 平臺(tái) webhook 地址和認(rèn)證方式,時(shí)速云 DevOps 平臺(tái)可以根據(jù) payload 信息觸發(fā)執(zhí)行 CI/CD。
8 部署運(yùn)維服務(wù)
時(shí)速云 DevOps 平臺(tái)被觸發(fā)執(zhí)行后,與上面部署一樣會(huì)根據(jù)新的鏡像更新部署新的服務(wù)。
9 自動(dòng)標(biāo)記 Jira
集成測(cè)試結(jié)束以后,通過(guò) Jira API , 把 gitlab 中的大括號(hào)里相應(yīng)的 Jira issue 為關(guān)閉狀態(tài),添加部署版本說(shuō)明。
10 保障代碼和最終交付產(chǎn)物的源頭一致性
如下圖,在代碼構(gòu)建時(shí)把代碼的版本信息一同寫入鏡像可以做到最終交付產(chǎn)物和代碼源頭的一致性比較。
git rev-parse --shortHEAD > .gitversion
git log--pretty=oneline HEAD...$PREVIOUS_COMMIT_ID > .gitdiff
作者:時(shí)速云
鏈接:https://www.zhihu.com/question/462977053/answer/1922306293