Please enable JavaScript.
Coggle requires JavaScript to display documents.
DevOps (部署pipeline (佈署相關實踐 (只生成一次二進位包, 確保生成是經過驗證流程, 不同環境使用相同佈署方式,…
DevOps
部署pipeline
價值流
佈署相關實踐
只生成一次二進位包
確保生成是經過驗證流程
不同環境使用相同佈署方式
對佈署進行冒煙測試
向生產環境的副本進行佈署
每次變更都要在pipeline 中傳遞
只要有環節失敗,就停止整個pipeline
提交階段
每次提交都生成一個 pipeline
可能包含
編譯
提交測試
建立二進位包
靜態分析程式碼
把可能容易發生錯誤移到這個階段測試可以更有效率
評估程式品質的指標
測試涵蓋率
重複程式數量
複雜度
程式碼風格
編譯警告數目
發布準備
所有成員共同維護一份發布計畫
盡可能自動化步驟, 從最容易出錯的地方開始自動化
再類生產環境進行發布測試
具有撤銷發布的能力
制定配置和資料庫的遷移策略
工具
Spinnaker
Octopus Deploy
Argo CD
監控
工具
OpenNMS
Splunk
Grafana
Prometheus
New Relic
Nagios
Loki
數據來源
硬體
可透過IPMI
作業系統
unix透過collected
windows透過效能計數器
中間件
應用程式
SNMP協定
日誌
dashboard
事件
警報
指標
技能樹
DevOps 路線圖
原文版
The Complete DevOps Engineer RoadMap 2021
掌握程式語言概念: Go
學習管理伺服器
作業系統概念
終端操作能力
tmux
vim
編譯原始碼
系統效能監控: nmon, iostat, sar, vmstat
Process監控: ps, top, htop, atop, lsof
網路: nmap, tcpdump, ping, mtr, traceroute, dig, airmon, airodump, iptables, netstat
文字處理能力: awk, grep, sed...
網路/安全/協定
HTTP/HTTPS/SSL/TLS/SSH/FTP
Port Forwarding
Email: SMTP/IMAPS/POP3S/DMARC/SPF/Domain Key
了解和安裝
正向代理
反向代理
負載平衡
快取伺服器
防火牆
網頁伺服器
CI/CD: Gitlab CI, Github Action, CircleCI, Jenkins
IaC
Service Mesh: Istio, Consul
容器協作: k8s
組奈管理: ansible
容器: Docker
基礎設施佈建: Terraform
監控
基礎設施監控: Prometheus, Grafana
應用監控: Jaeger, New Relic
日誌管理: ElasticSearch
雲端供應商
AWS
GCP
Azure
Digital Ocean
雲端設計模式
可用性
資料管理
設計與實作
管理與監控
術語
開發發佈部署之相關原則
版控
TDD
測試先行再寫功能
讓開發承擔更多軟體品質責任
應用部署: 軟體發布的過程中,關於軟體交付的規劃,維護和執行的一切流程
CI
程式碼合併到 mater分支過程
頻繁小異動合併
容易發現錯誤
自動執行驗證,簡單快速檢視結果
持續交付(delivery)
確保異動能夠部署上線
持續部署
異動部署到生產環境過程
最小化可行性產品
用最小的努力打造產品原型,驗證概念可行性
基礎架構之相關原則
組態管理
確保資源在生命周期的一致性
雲端運算
基礎架構自動化
產出物管理
容器
軟體開發方法
Waterfall
Agile
個人互動重於流程和工具
可用的軟體重於詳盡的文件
與客戶合作重於合約協商
回應變化重於遵循計畫
Scrum
強化開發團隊面對專案和客戶的應變能力
明確開發週期 sprint
長度1週到一個月
開始前會議確立該次 sprint目標
sprint結束進行檢討會議
每日scrum會議
成員回答問題
今天預計做什麼幫助團隊完成sprint目標
有發現什麼阻礙團隊達成sprint目標
我做了什麼幫助團隊達成sprint目標
由scrum master 召開
通常早上進行
確保成員朝目標前進
軟體開發工作分解成不同階段
文化原則
回顧會議
專案結束後進行的討論
成功和失敗經驗應用於未來專案
討論主題
發生了什麼事情?
那些部分進行順利?
那些部分做的不好?
事後檢討
事故發生後的檢討
針對特定狀況的討論
目標是建立組織學習
討論重點
發生什麼事情?
事件細節
補救方式?
不咎責
不是為了逃脫責任,而是確保人員可以自在描述事發經過
組織學習
系統化方法
Lean
原則
價值(value)
價值流(value stream)
flow
pull
perfection
藉由系統化的識別浪費並減少浪費的方式來追求完善
追求客戶價值最大化和成本浪費極小化
軟體開發應用
透過工具監控避免浪費
改善工作流程
將系統視為整體來思考
推薦圖書
thinking in system
how complex system fail
維運方法
ITIL
偏向被動
建議更重視客戶
核心
service strategy
service design
service transition
service operation
continue service improvement
COBIT
使業務經營與IT目標一致
滿足厲害關係人不的需求
涵蓋企業的端到端
採用單一且整合的策略
使用全面性的方法
區分治理和管理
配置管理
版本控制
所有內容都進行版控(除了機密相關資料)
重建系統所需的一切配置/腳本/程式
解決團隊相關人員得到的資訊一致
測試相關文件
PM將發布計畫 進度表 風險日誌
分析人員的需求文件
使用意義明顯的提交註解
關聯的需求或bug單
大標題和詳細描述
給未來追查問題的人提供必要資訊
工具檢查是否包含必要資訊
頻繁提交程式到主版本
頻繁提交表示修改幅度相對小容易理解和維護
依賴管理
外部依賴套件管理
是否放一份在版控各有優缺
需要有明確的版本
確保最終使用的依賴一致
組件管理
應用程式透過多個組件合併而成
使用組件依賴二進位檔案而非原始碼
二進位檔是經過驗證的產出物
軟體配置管理
配置會影響軟體的行為
軟體生命週期對配置的管理
使用同一份編譯結果
部署環境差異使用配置
環境變數
命令列參數
登錄檔
資料庫
外部配置服務
配置檔
會影響軟體行為的都視為一種編寫程式
如何驗證配置?
部署的冒煙測試
配置靈活度和複雜度要找到一個平衡點
配置重點
能針對不同環境配置
部署腳本能夠讀取配置
檔案系統文件
優: 簡單,語言實作容易
缺
部份執行環境不支援檔案系統讀寫, 如applet, web client
集群環境需要同步配置
配置服務中心
透過對外服務端口存取佩ㄓ
最好將api封裝方便測試替換
如何描述配置
項目盡可能少
命名盡可能簡單
機密資訊不要放進去
配置需要測試驗證
軟體執行環境管理
可能的環境參數
作業系統版本,補丁
軟體依賴套件版本和補丁
網路拓樸結構
外部服務資訊
資料庫香關
原則
配置與應用軟體包分離
所有配置存放在一起
評估使用外部服務或套件的指標
能夠自己部署?
它的配置能有效版本控管
能自動化部署?
工具
Puppet
Ansible
Chef
DevOps是什麼?
一種思維及工作方式
關於經驗分享與建立同理心的框架
請使團隊能有效且持久的完成工作
個人如何看待工作
對”如何工作“和“為何工作“進行迭代和改善
工具不等於devops
評估不同工具和流程,找出適合有效的方法
誤解
只包含開發和系統管理員
修正:組織內所有的角色
是一種團隊
修正:一種文化也是一種歷程
修正:特定團隊會造成非必要溝通障礙
一種職位或職稱
只和網路與新創有關
需要devops證照
devops意味著用一半人力作所有事
修正
改善工作質量與效率
降低服務中斷時間
提高個人與團隊的效能
有某種施行 devops方式
修正
透過舒適的學習
反覆迭代
找出適合自己的工具和流程
需花費特定時間才能導入
修正
持續向前的過程
devops只與工具有關
修正
devops是一種文化
沒有特定工具
選擇適合的工具和流程
devops與自動化有關
修正
devops希望改善工作效能,這部份自動化可以
devops只是一時風潮
修正
可能被吸收或融合不會過時
並非只是另一種軟體開發方法
文化與人際關系才是關鍵
主軸
協作(collaboration)
多人互動投入建立朝向某個具體目標的過程
誤解與疑難排解
實際範例
非同步程式碼審核
文件
更新issue 和 bug
顯示每週進度
定期狀態更新
親和力(affinity)
增長和維持協作關係
工具
擴展(scaling)
測試
測試策略
目的:識別和評估專案風險的優先級
決策採用那些方法緩解風險
提供軟體完整和即時的說明
能夠描述系統符合需求規範的運作
證明軟體符合需求運作
測試分類
業務導向並且支持開發過程
一般稱為功能測試或驗收測試
確保用戶需求得到滿足
開發之前應該先完成測試
工具
JBehave
Cucumber
Twist
Concordion
自動化測試
可快速反饋
維護成本可能很高
可選擇部分採用人工測試
技術導向並支持開發過程
工具
JMeter
Selenium
每當變動發生時都應該執行測試
軟體交付問題
反模式
手工部署
容易出錯
壓力來源
冗長文件和SOP
除非你只部署這一次
完整開發後才開始部署
後期才能發現問題
開發沒有考量到部署環境
手工調整生產環境配置
無法重現操作步驟
無法自動化
無法測試
無法管理變動
如何避免反模式
每次修改(變動)都要觸發反饋
CI/CD
盡快接收反饋
自動化才能快
接收反饋才能盡早修改錯誤
交付團隊針對反饋做出回應
團隊成員能夠接收反饋訊息
每次提交程式都產生一個可發佈的版本
軟體交付原則
為軟體發布建立可重覆且可靠的過程
盡可能自動化
所有東西都要版本控制
build/test/deploy/release流程相關東西
需求文件,測試文件,自動化測試案例,網路配置腳本,部署腳本,資料庫,升級,降級,初始腳本
提早並頻繁作你感到痛苦的部份
注重軟體品質
錯誤盡早發現盡早修復
團隊每個成員都有職責
測試是持續的過程
一個功能交付給使用者算完成
持續改進
PMDC: 計畫 執行 檢查 改進
團隊每個成員都要參與
交付過程是每個團隊成員責任
理想: 團隊有共同目標,團隊成員互相幫助實現目標,無論成功或失敗都屬於團隊而非個人
安全
TwistLock
Sysdig
Anchore
資料庫管理
資料庫腳本化
對資料庫的所有操作都要版本控制
資料庫初始化
增量修改
結構和資料的修改
升級和降級機制
資料庫版本控制技術
資料庫包含目前使用版本資訊
數據異動時提供: 升級和降級腳本
設定目前應用使用版本的機制
升級:依序順序執行升級腳本
降級: 依序執行降級腳本
可查看目前目前版本和可用版本
工具
DbDeploy
Flyway
IBatis Dbmigrate
Microaoft DbDiff
Tarantino
語言框架常用遷移工具
Python Django ORM
RoR ActiveRecord
Java DbDeploy
.net DbDeploy.net
PHP Laravel Migrations
相關書籍
Refactoring Database
Receipt Continuous Database integration
持續集成
如何實現
準備工作
專案所有相關內容都要提交到版本控制
自動化構建
團隊共識
持續集成是一種實踐不是一種工具
團隊需要遵守一些準則
頻繁提交程式到主分支
確保每次異動影響範圍不會太大
容易回滾一個變動
容易驗證一些想法
盡早發現錯誤
修復錯誤是最高優先權
修復完成前不要再提交新程式
避免修復難度
建立全面的自動化測試
Component Testing
測試時間較長
驗收測試(Acceptance Test)
確認功能是否吻合業務驗收要求
測試執行環境最好與生產(Production)環境相同
測試時間較長
Unit Test
需要能夠非常快執行完成
不需要啟動整個應用程式也能運作
不需要連接網路/資料庫/檔案系統
測試劃分階段
提交(Commit)
Build 並執行單元測試並生出可佈署的二進位檔
驗收
驗收測試
集成測試
安全測試
性能測試
使用 Commit 階段產生的二進位檔案
分組驗證縮短執行時間
測試類型
冒煙測試(smoke testing)
基本快速驗證系統是否可運作
回歸測試(regression testing)
可用性測試(usability testing)
驗證功能是否符合用戶需求
A/B testing
一種實驗方法
1 more item...
blue/green deployment
一種部署流程
兩組完全相同環境 ,一組用於前期驗證,確認無誤再進行切換
canary testing
production環境開放部分用戶使用新功能評估成效
Build 和 Test 時間維持在10分鐘內完成
時間拉太長會影響成員頻繁提交程式的意願
成員開發環境應該盡量與集成環境一樣
依賴套件版本要一致
一個好的應用架構指標就是能夠很容易執行在開發機上
自動化測試和冒煙測試(Smoke Test)能夠一致執行
要達成這個目標需要將所有需要的一切都放入版本控制
回家前確保 Build 成功
隨時準備Rollback前一個版本
如果無法快速修復時(如:10分鐘)
測試驅動開發
為自己導致的問題負責
如果自己的提交導致別人的測試失敗需要負責修復
不要將失敗的測試註解
:!: 除非你明確知道哪個測試已經無效
:!: 除非你要解決其他緊急情況暫時關閉特定測試
:red_flag: 檢查測試數量減少趨勢
測試速度過慢就判定為失敗
編譯警告或程式風格問題視為失敗
基本的持續集成系統
Gitlab CI
Drone
Jenkins
持續集成提交新程式的準則
確認是否有 Build 在執行, 如果有等他執行完成。如果失敗需要與團隊一起修復他,然後才提交新的程式
Build 完成並通過 Test 後,合併版控和自己的程式
Build和Test合併後的程式是否正常
本地Build和Test成功就可以提交程式
如果 Build 失敗就修復直到進入步驟3
如果 Build 成功就可以進入下一個任務
等待遠端Build這次提交結果
工具
Gitlab CI
Jenkins
TeamCity
Bamboo
devops轉型
關鍵在堅實的組織文化
資訊流
信任
溝通
擁抱歧義
沒有唯一正解
找出適合組織的答案
圖書
Effective DevOps
強調彼此協調合作才是DevOps成功的基礎
案例
Etsy
不咎責文化
充分授權和信任
事後檢討
錯誤中吸取教訓
失敗的價值
完整CI/CD
包含 local,try,QA,production環境
具有監控
每日部署約60次,每次10分
VM取代刀鋒主機
部署幫助開發完成功能並交付功能給客戶
測試能幫助找出錯誤
監控能看出工作成果造成的影響
溝通順暢
經驗傳承
資深帶領新員工
文件完整
版本控制
工具
Gitea
Gitlab Repo
Github
BitBucket
軟體品質
SonarQube
分散式版本控制系統(DVCS, Distributed Version Control System)
非功能測試