使用Hudson打造你專屬軟體建構機器人              嵌藝創研軟體科技簡茂仰              http://www.esast.com11年8月1日星期⼀一
我是誰??    • MaoYang/茂仰    • 曾任某職於機械自動化公司    • 專長: 專案管理/軟體開發    • 軟體開發團隊心得分享         粉絲專頁板主    • 嵌藝創研軟體科技Co-Founder,        ...
更多關於我      •       http://gplus.to/maoyang11年8月1日星期⼀一
Agenda              • Why Hudson??              • 故事起點:工程師10大藉口第⼀一名              • eXtreme Programming              • 什麼是C...
我會用Eclipse/NetBean編譯軟體              為什麼要使用Hudson來              建構軟體??11年8月1日星期⼀一
程式設計師常見藉口第⼀一名               在我的機器明明就可以動啊!                    來源11年8月1日星期⼀一
實際案例      • A工程師可以編譯成功, B工程師卻失敗      • 專案快結案了, 所有的code⼀一起編譯後, Bug              解不完-->專案Delay元兇之⼀一11年8月1日星期⼀一
Yes, We can Change11年8月1日星期⼀一
解決方案?11年8月1日星期⼀一
解決方案?              你的團隊需要⼀一個標準              的自動持續整合伺服器11年8月1日星期⼀一
兩個極端的案例XD11年8月1日星期⼀一
兩個極端的案例XD11年8月1日星期⼀一
兩個極端的案例XD11年8月1日星期⼀一
兩個極端的案例XD   林董內心OS:請款還是自己簽名11年8月1日星期⼀一
為什麼選Hudson??     • 使用Java開發     • 海(Hudson)能納百川          (Plugins), 故能成其大     • 視覺化報表     • 跨OS Build Farm支援11年8月1日星期⼀一
什麼是持續整合(CI)?11年8月1日星期⼀一
什麼是持續整合(CI)?              需求/變更11年8月1日星期⼀一
什麼是持續整合(CI)?              需求/變更11年8月1日星期⼀一
什麼是持續整合(CI)?              需求/變更              寫程式11年8月1日星期⼀一
什麼是持續整合(CI)?              需求/變更              寫程式11年8月1日星期⼀一
什麼是持續整合(CI)?              需求/變更              寫程式                      編譯與單元測試11年8月1日星期⼀一
什麼是持續整合(CI)?              需求/變更              寫程式                      編譯與單元測試11年8月1日星期⼀一
什麼是持續整合(CI)?              需求/變更              寫程式                      編譯與單元測試   測試11年8月1日星期⼀一
什麼是持續整合(CI)?              需求/變更              寫程式                      編譯與單元測試   測試11年8月1日星期⼀一
什麼是持續整合(CI)?              需求/變更              寫程式                      編譯與單元測試   測試                        問題回饋11年8月1日星期⼀一
什麼是持續整合(CI)?              需求/變更              寫程式                      編譯與單元測試   測試                        問題回饋11年8月1日星期⼀一
什麼是持續整合(CI)?              需求/變更              寫程式                        編譯與單元測試   測試              重構/解Bug                 ...
什麼是持續整合(CI)?              需求/變更              寫程式                        編譯與單元測試   測試              重構/解Bug                 ...
什麼是持續整合(CI)?              需求/變更              寫程式                        編譯與單元測試   測試              重構/解Bug                 ...
什麼是持續整合(CI)?              需求/變更              寫程式                        編譯與單元測試   測試   發佈              重構/解Bug            ...
什麼是持續整合(CI)?              需求/變更              寫程式                        編譯與單元測試   測試   發佈              重構/解Bug            ...
什麼是持續整合(CI)?              需求/變更              寫程式                        編譯與單元測試   測試   發佈              重構/解Bug            ...
eXtreme Programming                                              6. 重整                           2. 小量發行              1. 規...
導入CI的等級11年8月1日星期⼀一
導入CI的等級  沒有CI伺服器              LEVEL 111年8月1日星期⼀一
導入CI的等級  沒有CI伺服器               LEVEL 1        每天排程Build                     LEVEL 211年8月1日星期⼀一
導入CI的等級  沒有CI伺服器                  LEVEL 1        每天排程Build                        LEVEL 2              Build & 單元測試       ...
導入CI的等級  沒有CI伺服器                  LEVEL 1        每天排程Build                        LEVEL 2              Build & 單元測試       ...
導入CI的等級  沒有CI伺服器                  LEVEL 1        每天排程Build                        LEVEL 2              Build & 單元測試       ...
導入CI的等級  沒有CI伺服器                  LEVEL 1        每天排程Build                        LEVEL 2              Build & 單元測試       ...
導入CI的等級  沒有CI伺服器                  LEVEL 1        每天排程Build                        LEVEL 2              Build & 單元測試       ...
開始使用Hudson      • java -jar hudson.jar --httpPort=909011年8月1日星期⼀一
Demo網路架構11年8月1日星期⼀一
Hudson 使用流程      • 設定Hudson編譯環境      • 撰寫Build Script      • 新增Build Jobs      • 設定SCM連接->SVN/Git/Mercurial      • 設定Build...
設定Hudson編譯環境      • JDK      • ANT or Maven11年8月1日星期⼀一
JDK11年8月1日星期⼀一
ANT11年8月1日星期⼀一
開發者端的準備     • 為專案寫Build Script ,          例如Ant     • 將專案與Build Script          push到SCM Server                           ...
Demo ANT Target 說明      • ant test 編譯與單元測試      • ant reports 編譯,單元測試,與產生單元測試              xml報表檔案11年8月1日星期⼀一
設定SCM Plugin      • Hudson已經內建CVS/SVN/Git等Plugin11年8月1日星期⼀一
安裝報表Plugins       • JUnit-已內建11年8月1日星期⼀一
新增Job11年8月1日星期⼀一
新增Job                       選用Free-Style                      software project11年8月1日星期⼀一
設定SCM11年8月1日星期⼀一
執行Build Job11年8月1日星期⼀一
設定JUnit報表11年8月1日星期⼀一
手動測試11年8月1日星期⼀一
排程        例如, 如果要設定每天凌晨⼀一點零分開始執行Build Job, 可以設定如下        0 1 * * *11年8月1日星期⼀一
什麼時候Build會啟動??      • 排程      • 外部程式驅動-> scm hook      • ⼀一個Build Job完成後驅動另⼀一個Build Job      • 手動11年8月1日星期⼀一
Build報表檢視11年8月1日星期⼀一
實機操作Demo11年8月1日星期⼀一
恭喜你的CI等級已經達              到Level 311年8月1日星期⼀一
測試覆蓋率??11年8月1日星期⼀一
Ant +JUnit+Cobertura      • 使用Ant在Hudson端必須設定Cobertura的Ant              Task 與 Junit Ant Task              請參考            ...
Cobertura Plugin     • 安裝Cobertura Plugin11年8月1日星期⼀一
Cobertura Plugin                              安裝Plugin後     • 安裝Cobertura Plugin    Hudson必須重新                            ...
設定Cobertura報表11年8月1日星期⼀一
完整的範例與安裝              http://cb.esast.com/cb/wiki/3476611年8月1日星期⼀一
Hudson實務與技巧11年8月1日星期⼀一
選擇版本控制伺服器      • CVS : 不建議使用      • Subversion      • Git      • Mercurial11年8月1日星期⼀一
選擇版本控制伺服器      • CVS : 不建議使用      • Subversion      • Git           支援Change Set更新較快      • Mercurial11年8月1日星期⼀一
Polling or Trigger      • Polling: 使用排程, 當要快速回饋時, Build間隔              時間必須縮短-對Server or 網路負擔大      • Trigger: 當code commi...
Polling or Trigger      • Polling: 使用排程, 當要快速回饋時, Build間隔              時間必須縮短-對Server or 網路負擔大      • Trigger: 當code commi...
Build Script選擇      • Ant: 簡單易入門      • Maven: 對於套件的相依性管理佳      • Groovy : 要使用較複雜的Build邏輯, 撰寫較簡              單11年8月1日星期⼀一
版本資訊同步      • 每次的Build要將Version的資訊寫入產出的              Build      • 在軟體的介面可以看出Build的版本資訊11年8月1日星期⼀一
版本不⼀一致的案例11年8月1日星期⼀一
Build版本顯示              <target name="version">                      <typedef resource="com/googlecode/svntask/svntask.xml"...
Build失敗通知      • E-Mail      • Twitter      • MSN                   圖片來源 :https://wiki.jenkins-ci.org/display/JENKINS/Huds...
源碼品質與Code Review      • FindBugs      • PMD      • CPD      • CheckStyle11年8月1日星期⼀一
PMD11年8月1日星期⼀一
FindBugs11年8月1日星期⼀一
Build產出發佈      • Build好的檔案可以自動發佈到FTP Server      • Build的檔案最好與Release report放在⼀一起      • 自動Deploy到測試環境, 例如JBoss有專屬的       ...
Build Job切割      • Hudson有支援Build Job關連      • 較費時的Build(源碼分析)建議切割              參考 http://wiki.hudson-ci.org/display/HUDSO...
Master/Slave架構  • 專案要支援⼀一種以上OS, 可使用Master/Slave架構11年8月1日星期⼀一
參數化建構      • 指定要Build那⼀一個Tag(SVN tag or Git tag)11年8月1日星期⼀一
Matrix Build                                     1.6    1.5                             Win     Pass   Fail               ...
Hudson整合經驗分享11年8月1日星期⼀一
網路架構11年8月1日星期⼀一
使用Groovy+Ant11年8月1日星期⼀一
建構版本資訊11年8月1日星期⼀一
電子看板11年8月1日星期⼀一
電子看板11年8月1日星期⼀一
CI 要如何導才能成功??11年8月1日星期⼀一
配合開發流程      • Scrum的Daily Stand Up meeting      • 每天要修復失敗的Build11年8月1日星期⼀一
記得CC主管11年8月1日星期⼀一
記得CC主管              老闆支持很重要!11年8月1日星期⼀一
持續整合的精神是不斷              的進步與改進, 今天只              是開始11年8月1日星期⼀一
Thank You for your Joining11年8月1日星期⼀一
Upcoming SlideShare
Loading in …5
×

使用Hudson打造屬於你自己的軟體建構機器人

8,515 views

Published on

在軟體開發團隊,軟體自動建構在軟體開發過程中可以說是扮演非常重要的角色,它是軟體交付到測試者/使用者手中的最後一里, 但也是最繁複的一個過程, 學會了Hudson可以讓你輕鬆將軟體建構化繁為簡,它將成為你團隊中成本最低的好幫手. 在這個一小時中, 將與你分享Hudoson軟體功能,使用教戰守則, 讓你的軟體輕鬆走出軟體開發團隊的大門.

Published in: Technology
0 Comments
26 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,515
On SlideShare
0
From Embeds
0
Number of Embeds
355
Actions
Shares
0
Downloads
220
Comments
0
Likes
26
Embeds 0
No embeds

No notes for slide

使用Hudson打造屬於你自己的軟體建構機器人

  1. 1. 使用Hudson打造你專屬軟體建構機器人 嵌藝創研軟體科技簡茂仰 http://www.esast.com11年8月1日星期⼀一
  2. 2. 我是誰?? • MaoYang/茂仰 • 曾任某職於機械自動化公司 • 專長: 專案管理/軟體開發 • 軟體開發團隊心得分享 粉絲專頁板主 • 嵌藝創研軟體科技Co-Founder, 主要業務CodeBeamer代理與 應用 http://cb.esast.com11年8月1日星期⼀一
  3. 3. 更多關於我 • http://gplus.to/maoyang11年8月1日星期⼀一
  4. 4. Agenda • Why Hudson?? • 故事起點:工程師10大藉口第⼀一名 • eXtreme Programming • 什麼是CI?? • 開始使用Hudson • 開始使用Hudson/⼀一個簡單的Java建構與 自動單元測試範例 • Hudson實務與技巧11年8月1日星期⼀一
  5. 5. 我會用Eclipse/NetBean編譯軟體 為什麼要使用Hudson來 建構軟體??11年8月1日星期⼀一
  6. 6. 程式設計師常見藉口第⼀一名 在我的機器明明就可以動啊! 來源11年8月1日星期⼀一
  7. 7. 實際案例 • A工程師可以編譯成功, B工程師卻失敗 • 專案快結案了, 所有的code⼀一起編譯後, Bug 解不完-->專案Delay元兇之⼀一11年8月1日星期⼀一
  8. 8. Yes, We can Change11年8月1日星期⼀一
  9. 9. 解決方案?11年8月1日星期⼀一
  10. 10. 解決方案? 你的團隊需要⼀一個標準 的自動持續整合伺服器11年8月1日星期⼀一
  11. 11. 兩個極端的案例XD11年8月1日星期⼀一
  12. 12. 兩個極端的案例XD11年8月1日星期⼀一
  13. 13. 兩個極端的案例XD11年8月1日星期⼀一
  14. 14. 兩個極端的案例XD 林董內心OS:請款還是自己簽名11年8月1日星期⼀一
  15. 15. 為什麼選Hudson?? • 使用Java開發 • 海(Hudson)能納百川 (Plugins), 故能成其大 • 視覺化報表 • 跨OS Build Farm支援11年8月1日星期⼀一
  16. 16. 什麼是持續整合(CI)?11年8月1日星期⼀一
  17. 17. 什麼是持續整合(CI)? 需求/變更11年8月1日星期⼀一
  18. 18. 什麼是持續整合(CI)? 需求/變更11年8月1日星期⼀一
  19. 19. 什麼是持續整合(CI)? 需求/變更 寫程式11年8月1日星期⼀一
  20. 20. 什麼是持續整合(CI)? 需求/變更 寫程式11年8月1日星期⼀一
  21. 21. 什麼是持續整合(CI)? 需求/變更 寫程式 編譯與單元測試11年8月1日星期⼀一
  22. 22. 什麼是持續整合(CI)? 需求/變更 寫程式 編譯與單元測試11年8月1日星期⼀一
  23. 23. 什麼是持續整合(CI)? 需求/變更 寫程式 編譯與單元測試 測試11年8月1日星期⼀一
  24. 24. 什麼是持續整合(CI)? 需求/變更 寫程式 編譯與單元測試 測試11年8月1日星期⼀一
  25. 25. 什麼是持續整合(CI)? 需求/變更 寫程式 編譯與單元測試 測試 問題回饋11年8月1日星期⼀一
  26. 26. 什麼是持續整合(CI)? 需求/變更 寫程式 編譯與單元測試 測試 問題回饋11年8月1日星期⼀一
  27. 27. 什麼是持續整合(CI)? 需求/變更 寫程式 編譯與單元測試 測試 重構/解Bug 問題回饋11年8月1日星期⼀一
  28. 28. 什麼是持續整合(CI)? 需求/變更 寫程式 編譯與單元測試 測試 重構/解Bug 問題回饋11年8月1日星期⼀一
  29. 29. 什麼是持續整合(CI)? 需求/變更 寫程式 編譯與單元測試 測試 重構/解Bug 問題回饋11年8月1日星期⼀一
  30. 30. 什麼是持續整合(CI)? 需求/變更 寫程式 編譯與單元測試 測試 發佈 重構/解Bug 問題回饋11年8月1日星期⼀一
  31. 31. 什麼是持續整合(CI)? 需求/變更 寫程式 編譯與單元測試 測試 發佈 重構/解Bug 問題回饋11年8月1日星期⼀一
  32. 32. 什麼是持續整合(CI)? 需求/變更 寫程式 編譯與單元測試 測試 發佈 重構/解Bug 問題回饋11年8月1日星期⼀一
  33. 33. eXtreme Programming 6. 重整 2. 小量發行 1. 規劃遊戲 4. 測試 7.雙人組程式設計 3. 簡單的設計 8.程式碼共有 5. 持續性的整合-Continuous Integration 10.客戶隨時在旁 9.每週工作40小時 11.隱喻 12.程式碼標準11年8月1日星期⼀一
  34. 34. 導入CI的等級11年8月1日星期⼀一
  35. 35. 導入CI的等級 沒有CI伺服器 LEVEL 111年8月1日星期⼀一
  36. 36. 導入CI的等級 沒有CI伺服器 LEVEL 1 每天排程Build LEVEL 211年8月1日星期⼀一
  37. 37. 導入CI的等級 沒有CI伺服器 LEVEL 1 每天排程Build LEVEL 2 Build & 單元測試 LEVEL 311年8月1日星期⼀一
  38. 38. 導入CI的等級 沒有CI伺服器 LEVEL 1 每天排程Build LEVEL 2 Build & 單元測試 LEVEL 3 源碼靜態解析與度量 LEVEL 411年8月1日星期⼀一
  39. 39. 導入CI的等級 沒有CI伺服器 LEVEL 1 每天排程Build LEVEL 2 Build & 單元測試 LEVEL 3 源碼靜態解析與度量 LEVEL 4 建構參數化與Matrix建構 LEVEL 511年8月1日星期⼀一
  40. 40. 導入CI的等級 沒有CI伺服器 LEVEL 1 每天排程Build LEVEL 2 Build & 單元測試 LEVEL 3 源碼靜態解析與度量 LEVEL 4 建構參數化與Matrix建構 LEVEL 5 可接受測試與GUI自動測試 LEVEL 611年8月1日星期⼀一
  41. 41. 導入CI的等級 沒有CI伺服器 LEVEL 1 每天排程Build LEVEL 2 Build & 單元測試 LEVEL 3 源碼靜態解析與度量 LEVEL 4 建構參數化與Matrix建構 LEVEL 5 可接受測試與GUI自動測試 LEVEL 6 持續佈署 LEVEL 711年8月1日星期⼀一
  42. 42. 開始使用Hudson • java -jar hudson.jar --httpPort=909011年8月1日星期⼀一
  43. 43. Demo網路架構11年8月1日星期⼀一
  44. 44. Hudson 使用流程 • 設定Hudson編譯環境 • 撰寫Build Script • 新增Build Jobs • 設定SCM連接->SVN/Git/Mercurial • 設定Build Target • 手動測試 • 檢視Build報告11年8月1日星期⼀一
  45. 45. 設定Hudson編譯環境 • JDK • ANT or Maven11年8月1日星期⼀一
  46. 46. JDK11年8月1日星期⼀一
  47. 47. ANT11年8月1日星期⼀一
  48. 48. 開發者端的準備 • 為專案寫Build Script , 例如Ant • 將專案與Build Script push到SCM Server Junit原理與範例可參考 http://caterpillar.onlyfun.net/Gossip/JUnit/index.html11年8月1日星期⼀一
  49. 49. Demo ANT Target 說明 • ant test 編譯與單元測試 • ant reports 編譯,單元測試,與產生單元測試 xml報表檔案11年8月1日星期⼀一
  50. 50. 設定SCM Plugin • Hudson已經內建CVS/SVN/Git等Plugin11年8月1日星期⼀一
  51. 51. 安裝報表Plugins • JUnit-已內建11年8月1日星期⼀一
  52. 52. 新增Job11年8月1日星期⼀一
  53. 53. 新增Job 選用Free-Style software project11年8月1日星期⼀一
  54. 54. 設定SCM11年8月1日星期⼀一
  55. 55. 執行Build Job11年8月1日星期⼀一
  56. 56. 設定JUnit報表11年8月1日星期⼀一
  57. 57. 手動測試11年8月1日星期⼀一
  58. 58. 排程 例如, 如果要設定每天凌晨⼀一點零分開始執行Build Job, 可以設定如下 0 1 * * *11年8月1日星期⼀一
  59. 59. 什麼時候Build會啟動?? • 排程 • 外部程式驅動-> scm hook • ⼀一個Build Job完成後驅動另⼀一個Build Job • 手動11年8月1日星期⼀一
  60. 60. Build報表檢視11年8月1日星期⼀一
  61. 61. 實機操作Demo11年8月1日星期⼀一
  62. 62. 恭喜你的CI等級已經達 到Level 311年8月1日星期⼀一
  63. 63. 測試覆蓋率??11年8月1日星期⼀一
  64. 64. Ant +JUnit+Cobertura • 使用Ant在Hudson端必須設定Cobertura的Ant Task 與 Junit Ant Task 請參考 http://cobertura.sourceforge.net/ & http://caterpillar.onlyfun.net/Gossip/JUnit/index.html11年8月1日星期⼀一
  65. 65. Cobertura Plugin • 安裝Cobertura Plugin11年8月1日星期⼀一
  66. 66. Cobertura Plugin 安裝Plugin後 • 安裝Cobertura Plugin Hudson必須重新 啟動11年8月1日星期⼀一
  67. 67. 設定Cobertura報表11年8月1日星期⼀一
  68. 68. 完整的範例與安裝 http://cb.esast.com/cb/wiki/3476611年8月1日星期⼀一
  69. 69. Hudson實務與技巧11年8月1日星期⼀一
  70. 70. 選擇版本控制伺服器 • CVS : 不建議使用 • Subversion • Git • Mercurial11年8月1日星期⼀一
  71. 71. 選擇版本控制伺服器 • CVS : 不建議使用 • Subversion • Git 支援Change Set更新較快 • Mercurial11年8月1日星期⼀一
  72. 72. Polling or Trigger • Polling: 使用排程, 當要快速回饋時, Build間隔 時間必須縮短-對Server or 網路負擔大 • Trigger: 當code commit, 使用Hook來驅動遠 端Hudson的Build Job11年8月1日星期⼀一
  73. 73. Polling or Trigger • Polling: 使用排程, 當要快速回饋時, Build間隔 時間必須縮短-對Server or 網路負擔大 • Trigger: 當code commit, 使用Hook來驅動遠 端Hudson的Build Job http://SERVER/hudson/job/PROJECTNAME/build11年8月1日星期⼀一
  74. 74. Build Script選擇 • Ant: 簡單易入門 • Maven: 對於套件的相依性管理佳 • Groovy : 要使用較複雜的Build邏輯, 撰寫較簡 單11年8月1日星期⼀一
  75. 75. 版本資訊同步 • 每次的Build要將Version的資訊寫入產出的 Build • 在軟體的介面可以看出Build的版本資訊11年8月1日星期⼀一
  76. 76. 版本不⼀一致的案例11年8月1日星期⼀一
  77. 77. Build版本顯示 <target name="version"> <typedef resource="com/googlecode/svntask/svntask.xml"> <classpath> <fileset dir="/usr/share/ant/lib"> <include name="svnkit.jar"/> <include name="svntask.jar"/> </fileset> </classpath> </typedef> <svn><info path="." revisionProperty="revisionVersion" /></svn> <property name="version" value="${revisionVersion}" /> <echo>Version:${version}</echo> <propertyfile file="${plugin.install.dir}/data/resources/buildrevision.inc"> <entry key="BuildRevision" value="${version}" /> </propertyfile> </target>11年8月1日星期⼀一
  78. 78. Build失敗通知 • E-Mail • Twitter • MSN 圖片來源 :https://wiki.jenkins-ci.org/display/JENKINS/Hudson+Build+Status+Lava+Lamps11年8月1日星期⼀一
  79. 79. 源碼品質與Code Review • FindBugs • PMD • CPD • CheckStyle11年8月1日星期⼀一
  80. 80. PMD11年8月1日星期⼀一
  81. 81. FindBugs11年8月1日星期⼀一
  82. 82. Build產出發佈 • Build好的檔案可以自動發佈到FTP Server • Build的檔案最好與Release report放在⼀一起 • 自動Deploy到測試環境, 例如JBoss有專屬的 佈署Plugin11年8月1日星期⼀一
  83. 83. Build Job切割 • Hudson有支援Build Job關連 • 較費時的Build(源碼分析)建議切割 參考 http://wiki.hudson-ci.org/display/HUDSON/Splitting+a+big+job+into+smaller+jobs11年8月1日星期⼀一
  84. 84. Master/Slave架構 • 專案要支援⼀一種以上OS, 可使用Master/Slave架構11年8月1日星期⼀一
  85. 85. 參數化建構 • 指定要Build那⼀一個Tag(SVN tag or Git tag)11年8月1日星期⼀一
  86. 86. Matrix Build 1.6 1.5 Win Pass Fail Linux Pass Pass • 同⼀一份程式碼要在不同的JDK版本測試 • 同⼀一份程式碼要在不同的OS測試 • 同⼀一份程式碼要在不同的DB測試11年8月1日星期⼀一
  87. 87. Hudson整合經驗分享11年8月1日星期⼀一
  88. 88. 網路架構11年8月1日星期⼀一
  89. 89. 使用Groovy+Ant11年8月1日星期⼀一
  90. 90. 建構版本資訊11年8月1日星期⼀一
  91. 91. 電子看板11年8月1日星期⼀一
  92. 92. 電子看板11年8月1日星期⼀一
  93. 93. CI 要如何導才能成功??11年8月1日星期⼀一
  94. 94. 配合開發流程 • Scrum的Daily Stand Up meeting • 每天要修復失敗的Build11年8月1日星期⼀一
  95. 95. 記得CC主管11年8月1日星期⼀一
  96. 96. 記得CC主管 老闆支持很重要!11年8月1日星期⼀一
  97. 97. 持續整合的精神是不斷 的進步與改進, 今天只 是開始11年8月1日星期⼀一
  98. 98. Thank You for your Joining11年8月1日星期⼀一

×