continuous delivery: automated testing, continuous integration and continuous deployment

43
Continuous Delivery: automated testing, continuous integration and continuous deployment. 持續發佈:利動化測試與持續 集成來持續發佈品質的軟體 Jimmy Lai 2014.10.15 Jimmy Lai是然語處理與機器學習領域的 Python愛好者。 更多他的分享: http://www.slideshare.net/jimmy_lai/

Upload: jimmy-lai

Post on 02-Dec-2014

612 views

Category:

Technology


4 download

DESCRIPTION

Continuous Delivery: automated testing, continuous integration and continuous deployment.

TRANSCRIPT

Page 1: Continuous Delivery: automated testing, continuous integration and continuous deployment

Continuous Delivery: automated testing, continuous integration and continuous deployment. 持續發佈:利⽤用⾃自動化測試與持續集成來持續發佈⾼高品質的軟體

Jimmy Lai2014.10.15

!Jimmy Lai是⾃自然語⾔言處理與機器學習領域的 Python愛好者。

更多他的分享: http://www.slideshare.net/jimmy_lai/

Page 2: Continuous Delivery: automated testing, continuous integration and continuous deployment

Outline

1. 持續發佈的概念

2. 持續發佈的⼯工具

3. 以Python專案為範例建構部署流⽔水線

2

Page 3: Continuous Delivery: automated testing, continuous integration and continuous deployment

Continuous Delivery持續發佈

• 軟體發佈了才算做完了 • 只有commit程式碼還不算完成

• 提交程式碼到軟體發佈的過程必須完全⾃自動化

• 可重複使⽤用的發佈與部署流程,以確保軟體品質

• 程式碼與設定檔等產出必須要進⾏行版本控制,以便快速的追蹤與回復

3

Page 4: Continuous Delivery: automated testing, continuous integration and continuous deployment

Version Control版本控制

• 需要版本控制的項⺫⽬目• 原始碼• 套件相依管理• 系統參數設定

• 主流⼯工具: Git

4

Page 5: Continuous Delivery: automated testing, continuous integration and continuous deployment

Continuous Integration持續整合

• 在合作開發的團隊中,持續地將每個⼈人的變更整合在⼀一起,越頻繁地整合就可以減少嚴重的衝突發⽣生

• 要件:• 頻繁的commit原始碼• ⾃自動化的測試• 簡短的建置與測試週期,以及早獲得回饋

• 主流⼯工具: Jenkins5

Page 6: Continuous Delivery: automated testing, continuous integration and continuous deployment

Testing測試

• ⾃自動化測試• 單元測試: 針對function/class• 功能測試: 針對客⼾戶端需求• 系統整合測試: 針對⼦子系統的整合

• 效能與覆載測試• 安全性測試

• ⼿手動測試• 探索性測試、使⽤用者接受度測試

• Python測試⼯工具: nosetests6

Page 7: Continuous Delivery: automated testing, continuous integration and continuous deployment

部署流⽔水線1. 建置與單元測試(當commit程式碼時)2. ⾃自動化的功能測試3. 使⽤用者接受度測試(測試⼯工程師)4. 發佈

過程中有任何錯誤即⾃自動通知開發者,開發者應優先修復部署流⽔水線後再繼續開發新功能

7

Page 8: Continuous Delivery: automated testing, continuous integration and continuous deployment

Git版本控制• 分散式版本控制• 每⼀一台機器都有⼯工作⺫⽬目錄和版本資料庫

• 每⼀一台機器的版本資料庫都可以與任意機器同步

• 開發時先對本地資料庫進⾏行commit, 不需要網路連線

8http://git-scm.com/

Page 9: Continuous Delivery: automated testing, continuous integration and continuous deployment

Git實務• ⼯工作⺫⽬目錄 <-> 暫存區 <-> 版本資料庫• ⼯工作⺫⽬目錄為某個版本分⽀支的狀態加上新的修改• git add: 將檔案當前的狀態加⼊入暫存區• git commit -m “commit message”: 將⺫⽬目前暫存區當中的所有檔案更改儲存到版本資料庫

• git push origin master: 將當前分⽀支的本機更新推送到遠端(origin)版本資料庫的master分⽀支

• git pull origin master: 將遠端(origin)版本資料庫的master分⽀支的更新下載到當前⼯工作⺫⽬目錄分⽀支

9http://git-scm.com/docs/gittutorial

Page 10: Continuous Delivery: automated testing, continuous integration and continuous deployment

Git Code Review• 透過Github的code review來確保軟體品質:1. git checkout -b branch: 在本地建⽴立分⽀支並切換到該分⽀支2. git commit: 在本地分⽀支提交變更3. git push origin branch_a: 將變更推送到Github4. 在Github建⽴立pull request5. Reviewer進⾏行審查6. 審查修改完善後將branch merge回master• master branch⽤用來發佈軟體,新的修改都先在其他分⽀支進⾏行,經過審查後才merge

• Code Review有助於團隊成員互相學習並提⾼高程式碼品質

10http://nvie.com/posts/a-successful-git-branching-model/

Page 11: Continuous Delivery: automated testing, continuous integration and continuous deployment

Git Code Review Demo

https://github.com/jimmylai/continuous_delivery_demo

Page 12: Continuous Delivery: automated testing, continuous integration and continuous deployment

Git Code Review 範例• 需求: 撰寫設定系統套件的Makefile,並進⾏行Code Review

• 步驟:1. 於git建⽴立新分⽀支2. 在新分⽀支提交修改3. 更新到github後,建⽴立pull request4. Review確認後merge

12

Page 13: Continuous Delivery: automated testing, continuous integration and continuous deployment

13

Committed Changes

Create a pull request

Page 14: Continuous Delivery: automated testing, continuous integration and continuous deployment

14

Activity Stream

Page 15: Continuous Delivery: automated testing, continuous integration and continuous deployment

15

Post Review Message

Page 16: Continuous Delivery: automated testing, continuous integration and continuous deployment

16

Update According to the Comments

Merge

Page 17: Continuous Delivery: automated testing, continuous integration and continuous deployment

17

Merged

Page 18: Continuous Delivery: automated testing, continuous integration and continuous deployment

單元測試• 單元測試: 對程式碼單元(funtion, class)進⾏行撰寫測試案例

• 被測試的程式碼必須要減少與其他程式碼的相依性才容易測試,通常可以透過適當的封裝函數來達成。必要時必須要利⽤用Mock技術來隔離相依性,例如呼叫資料庫連線、外部IO.

• Python測試⼯工具nosetest18

Page 19: Continuous Delivery: automated testing, continuous integration and continuous deployment

Unit Test with nosetests

https://github.com/jimmylai/continuous_delivery_demo/tree/master/web/calculator

Page 20: Continuous Delivery: automated testing, continuous integration and continuous deployment

Unit Test with nosetests範例

• 需求: 撰寫⼀一個函式,有兩個整數作為參數,回傳兩個參數相加之和

• 步驟:1. 撰寫函式2. 利⽤用doctest做為說明及測試3. 撰寫測試函數

20

Page 21: Continuous Delivery: automated testing, continuous integration and continuous deployment

Unit test with Nosetest

21

doctest: 作為函式說明範例,也是單元測試

Page 22: Continuous Delivery: automated testing, continuous integration and continuous deployment

22

將測試檔案以xxx_test.py命名, 測試函式以!test_xxx()命名, nosetests就會找出來執⾏行

Page 23: Continuous Delivery: automated testing, continuous integration and continuous deployment

功能測試• 針對客⼾戶端要求的功能進⾏行驗證,測試的對象可能是由數個元件組成的系統

• 針對不同界⾯面的系統需要使⽤用不同的⽅方式來測試,例如網⾴頁就必須以瀏覽器來測試才完整

• 範例: 基於先前的add( ), 提供⼀一個⽤用來進⾏行加法RESTful API, 針對輸⼊入進⾏行檢查,計算後回傳結果

23

Page 24: Continuous Delivery: automated testing, continuous integration and continuous deployment

Functional Test of RESTful API

https://github.com/jimmylai/continuous_delivery_demo/tree/master/functional_tests

Page 25: Continuous Delivery: automated testing, continuous integration and continuous deployment

Functional Test of RESTful API範例

• 需求: 實作⼀一個Restful API, 透過HTTP GET輸⼊入兩個參數, 呼叫前⼀一範例的add( )進⾏行加總, 以json格式回傳結果

• 步驟:1. 使⽤用Django rest framework撰寫API2. 驗證輸⼊入的兩個參數存在且為整數3. 將運算結果回傳4. 測試客⼾戶端送出HTTP GET request來進⾏行測試

25

Page 26: Continuous Delivery: automated testing, continuous integration and continuous deployment

26

Django RESTful API - View

Page 27: Continuous Delivery: automated testing, continuous integration and continuous deployment

27

functional test

Page 28: Continuous Delivery: automated testing, continuous integration and continuous deployment

28

start web server

functional testtest successfully

Page 29: Continuous Delivery: automated testing, continuous integration and continuous deployment

Jenkins• 廣受歡迎的持續整合軟體• 根據設定的條件(如提交程式碼時、定時排程)觸發建置,如建置發⽣生錯誤便⽴立即通知開發者,建置順利可繼續下⼀一階段建制或⾃自動發佈

• 建置的結果報表以網⾴頁的⽅方式呈現• 建置的過程與產出皆有存檔,⽅方便回溯

29http://jenkins-ci.org/

Page 30: Continuous Delivery: automated testing, continuous integration and continuous deployment

Unitest when Commits with Jenkins

Page 31: Continuous Delivery: automated testing, continuous integration and continuous deployment

Unitest when Commits with Jenkins範例

• 需求:透過Jenkins Job, 當有新的程式碼被提交時, 便⾃自動運⾏行unit test, 輸出測試結果報表

• 步驟:1. 設定Jenkins Job與Github的授權2. 設定當有新的change時, 由Github觸發Jenkins

3. 設定測試結果報表資訊31

Page 32: Continuous Delivery: automated testing, continuous integration and continuous deployment

32

Github access with ssh key auth

Page 33: Continuous Delivery: automated testing, continuous integration and continuous deployment

33

build when new changes come in

Jenkins settings

Github settings

Page 34: Continuous Delivery: automated testing, continuous integration and continuous deployment

34

Unit test coverage

Unit test report

Page 35: Continuous Delivery: automated testing, continuous integration and continuous deployment

35

Page 36: Continuous Delivery: automated testing, continuous integration and continuous deployment

⾃自動部署

• ⾃自動將建置好的軟體安裝與設定到不同的環境,進⾏行後續的測試、交付產品

• 不同的環境可能有不同的系統相依套件、不同的設定

• 設定檔與部署程式都應進⾏行版本控制

36

Page 37: Continuous Delivery: automated testing, continuous integration and continuous deployment

Deploy after Unit Tests Success

Page 38: Continuous Delivery: automated testing, continuous integration and continuous deployment

Deploy after Unit Tests Success範例

• 需求: 使⽤用Apache作為Web server, 設定Jenkins Job當unit test完成後, 發佈到Apache Server

• 步驟:1. 準備Apache設定檔2. 準備deploy scripts3. 設定Jenkins job

38

Page 39: Continuous Delivery: automated testing, continuous integration and continuous deployment

39

Apache Config

Page 40: Continuous Delivery: automated testing, continuous integration and continuous deployment

40

Jenkins Setting

Deploy script

Page 41: Continuous Delivery: automated testing, continuous integration and continuous deployment

部署流⽔水線1. unittest: 由⼯工程師提交程式碼觸發2. deploy3. functional test4. release, …

過程中有任何錯誤即⾃自動通知開發者,開發者應優先修復部署流⽔水線後再繼續開發新功能

41

Page 42: Continuous Delivery: automated testing, continuous integration and continuous deployment

42

Page 43: Continuous Delivery: automated testing, continuous integration and continuous deployment

43