Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Artifacts management with CI and CD

877 views

Published on

產出物管理與 Continue Integration & Continue Deployment 的進化之路

Published in: Software
  • Be the first to comment

Artifacts management with CI and CD

  1. 1. Artifacts Management with CI&CD Blackie Tsai
  2. 2. Hi! I am Blackie • Technical Architect • Microsoft MVP 2017 – Present • 2018 iT 邦幫忙鐵人賽 • DevOps組冠軍 • 最佳團隊(XY動手不動口) • 大內攻城 (Software Engineering in .NET) - Organizer • Study4.tw - Core Member • Speaker on .NET Conf 2017 & 2018, GCPUG.TW, etc.…
  3. 3. 今天想與大家分享…
  4. 4. Software Artifacts Artifacts Management Tools Artifacts Management with Continue Integration Artifacts Management with Continue Deployment
  5. 5. Special thanks to • https://itunes.apple.com/tw/developer/wang-ming-ren/id1294969400 Ming-Ren Wang (aka Hotdog Wang) 輕鬆考駕照 默背模式讓你無腦背題庫 NS大買家 Switch 買遊戲的最佳幫手 • https://www.linkedin.com/in/ming-jen-wang-027a5368 • Nexus Artifacts Management • Jenkins, Continue Integration • Docker, Container • Selenium, MS Test, Load Testing • iOS, Sketch
  6. 6. 先破題
  7. 7. 持續交付的意義在於 效率提升 可靠的質量 安全牢固的產出 有效的團隊協作 透明的流程
  8. 8. Software Artifacts
  9. 9. 什麼是 Artifacts An artefact is an ornament, tool, or other object that is made by a human being. 是由人類製造的人工製品,如裝飾品,工具或其他物體。
  10. 10. 什麼是 Software Artifacts Software Artifact 是在軟體開發過程中產 生的副產品。可能包含項目源代碼,依賴 項,二進製文件或資源,並且可以根據技 術以不同的佈局表示。 通常存儲在 Repository 如 npm registry, d ocker hub 等,可以讓團隊之間共享更為方 便。
  11. 11. 編譯 (Compiling)、打包 (Packing) 、加工(Processing) 原始碼 (Source Code) 產出物 (Artifacts)
  12. 12. 產出物類型 Library/Package 程式於開發時所引用 的第三方或自身獨立 部分功能的產出物 Application Build 原始碼經過編譯或是 打包所參考產出物 Any Binary File 任何一個與開發或商 業運作有關的產出物, 如設計文件或素材大 檔 Image File 建置環境所需的映像 檔案 Deployment Profile 部署所需的設定配置 檔
  13. 13. 這些都是產出物
  14. 14. 什麼是 Artifacts Repository 是一個存儲位置,其中包含 packages, libraries, binaries, or containers 等組件,以便 可以安裝或使用它們.使用已經開發好的部分產出,延續開發商務應用可有效加速開發 的產出、縮短時程並收斂改變的變更處.不同的開發語言或是工具有自己的管理工具: Java Central Repository(Maven Central) .NET NuGet Gallery Python Pypi.org Ruby RubyGems.org JavaScript Npmjs.org Linux YUM Container hub.docker.com Kubernetes helm.sh
  15. 15. 以自身開發環境為例
  16. 16. 目前團隊使用的技術與環境 • OS – macOS, CentOS • Service – C#, .NET Core • Presentation - Web – JavaScript, React • Provisioning – Container, Docker • Deployment – K8s, Helm • Version Control – Git, Gitlab
  17. 17. Artifacts Management MyApp Git LFS Packages ContainerOS Deployment Artifacts of Software Development
  18. 18. 最害怕的交付是哪些? • 原始碼直接部署與修改 • 配置設定與原始碼強耦合 – 修改不易 – 對應不同的環境有不同的配置 • 當次部署有問題,經過一番處理成功部署了,但不知道怎麼被修好的 • 部署流程有工具自動完成,但如果多一個新環境或流程則需要全部重寫 • 內外交付溝通沒有標準語言
  19. 19. https://www.pinterest.com/pin/370702613054573734/ 在其他環境開發時…
  20. 20. https://www.pinterest.com/pin/354095589444668688/ 在其他環境部署時…
  21. 21. 出自笑傲江湖2:東方不敗 需要讓人手動修改/操作 就一定會出錯
  22. 22. Artifacts 的目的是讓開發與交付 變得更簡易, 不易出錯且更具彈性
  23. 23. 舉例來說 Artifacts Management MyApp Git LFS Packages ContainerOS Deployment yum yum npm, NuGet yum npm, NuGet MyApp yum npm, NuGet MyApp yum npm, NuGet MyApp yum npm, NuGet MyApp
  24. 24. 在剛剛這個例子裡 問題: 開發人員正在一遍又一遍地下載相同的組件,降低生產速度並降低建 置的性能。 解決辦法: 改用 Artifacts Repository Management Tool ,協助減輕與開源/第三方 組件使用相關的緩慢下載。並開始考慮建立於組織內的存儲庫配置與 改善開發與部屬流程的強化.
  25. 25. Artifacts Management Tools
  26. 26. Artifacts Repository Management Tool • 是一個集中管控各種不同類型 Repository 的系統,可用來建立開發團隊間更加的協 同開發基礎 • 藉由更廣泛的軟件和基於本地端的套件發 佈,提高架構與開發的性能與變更控制 • 減少網絡帶寬和對遠程存儲庫的依賴 • 保護您的公司免受互聯網中斷,公共存儲 庫中斷(Maven Central, npm, nuget, dock er hub 等),甚至刪除開源組件。
  27. 27. Cloud Host V - - On-premise Host(Container) V V V Repositories Excellent* Well Limited** Searchability / Flexibility Excellent Limited - Interactions - REST API + Tools Excellent Well Limited LDAP V V V Users/Groups and Roles Well Well Excellent Storage Backends Local Storage Local Storage and S3 Local Storage, S3 and Azure Storage https://www.praqma.com/stories/artifactory-nexus-proget/ * Jfrog OSS only supports : Maven, Gradle and Ivy ** ProGet supports : Powershell, Chocolatey, VSIX, etc…
  28. 28. • Maven Repositories • Raw Repositories and Maven Sites • .NET Package Repositories with NuGet • Node Packaged Modules and npm Registries • PyPI Repositories • Ruby, RubyGems and Gem Repositories • Bower Repositories • Yum Repositories • Git LFS Repositories • Private Registry for Docker • Go Package Repositories with vgo* • Helm Repositories for K8s* * Community Support only 我選用 Nexus Repository Manager
  29. 29. FREE to use! FREE to use! FREE to use!
  30. 30. Install Nexus with Docker • Pull image $ docker pull sonatype/nexus3 • Create Persistent Volume – 使用 docker volume(建議做法) $ docker volume create --name nexus-data $ docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data sonatype/nexus3 – 將本機目錄視為一個 volume 並將其 Mount 至設定 $ mkdir /some/dir/nexus-data && chown -R 200 /some/dir/nexus-data $ docker run -d -p 8081:8081 --name nexus -v /some/dir/nexus-data:/nexus-data sonatype/nexus3 • 開啟 http://localhost:8081 並用 admin/admin123 作為 Administrator 登入 *新啟用的 container 需要 2-3 minutes 暖機. 可查看 log 確認 instance 是否準備服務 https://help.sonatype.com/repomanager3/download
  31. 31. Nexus Repository Manager 各目錄 • bin:包含Nexus啟動|停止等腳本,以及一些跟啟動有關的配置參 數,如JVM,karaf等 • etc:包含主配置文件nexus-default.properties,以及一些其他配置 文件,如ssl,jetty,karaf等 • lib:包含跟karaf相關的jar包 • public:包含跟Nexus應用相關的共用資源 • system:包含所有組成Nexus應用的組件和插件 • sonatype-work 預設的數據存儲目錄,包含所有組件,倉庫,配置, db,日誌等。
  32. 32. Nexus Repository Manager Welcome Page
  33. 33. Accounts and Privileges
  34. 34. Security Model Users, Roles, and Privileges • Users – 三種類型 Anonymous, Users 與 LDAP – Anonymous 使用 Realms 控制所賦予的權限 – Users 使用 Roles 控制所賦予的權限 – LDAP 使用 Realms + 指定 Roles 控制所賦予的權限 • Realms – 一系列的群組權限,包括 Nexus 系統預先定義的群組或的從LDAP匯入 • Roles – 繫結該角色實際賦予的 Privileges • Privileges – 紅色 = Admin 權限 – 灰色 = 僅有 View 權限
  35. 35. Repository Types • Hosted Repository – 自行開發、維護與上傳的 package • Proxy Repository – 通常為第三方的 package,Proxy Repository 是鏈接到遠端儲存庫的儲存庫。 – 根據 Proxy Repository 的本地內容驗證對 package 的任何請求,如果未找到本地組件, 則將請求轉發到遠端儲存庫。 – 可額外設定 Sync up Stream 將轉發到遠端儲存庫請求回應儲存一份本地主機內,下次即 可在本地取得。 • Group Repository – 是多個儲存庫的集合.提供單一的訪問地址.
  36. 36. Artifact Metadata • Name • Version • Timestamp • Commit SHA Id • Others…
  37. 37. API
  38. 38. Artifacts Management with Continue Integration
  39. 39. 良好的 DevOps 需要工具來有效 管理不斷增長的產出物,以確保 順利的讓開發工作與應用服務/程 式的持續整合與部屬不被中斷
  40. 40. 今天發生天災或是官方在維護,組織的開發 部署會遇到什麼問題嗎?
  41. 41. 想一下 下面的情境現在團隊能否達成與如何達成? • 新人的開發環境如何最快速的建置完成? • 新功的開發有部分功能先前有其他人寫過,如何分享給本 次開發使用? • 部署到發佈的產出能被人為修改的地發有哪些? • 如何在當前的 CI 流程內多插入一個新項目該如何來調整 流程? • 建立一個新的部屬環境,該調整哪些地方與內容?
  42. 42. 重點在如何解除耦合性
  43. 43. 樂高(LEGO)思維
  44. 44. 當有越多不同顆粒的完整體可選擇時,能 做得決定也就越廣,且每個決定都包含了 先前已確認的完整內容.
  45. 45. 以下是我與團隊實務上的做法經驗
  46. 46. 依照需求,採有兩種 Git Flow… 一般應用程式開發 (Gitlab Flow) 核心共用模組開發 (Github Flow)
  47. 47. 實際流程差異 一般應用程式開發 (Gitlab Flow) 核心共用模組開發 (Github Flow)
  48. 48. 選擇 Fork/Branch 的原因 乾淨的 Merge Commit 才能再遇到問題時選擇上一個 Commit 還原
  49. 49. Version Control 有版本、版本有意義才有管理的可能 Semantic Versioning
  50. 50. Versioning during Development 開發與正式不會是同一個版本但應該看得出關係
  51. 51. Pre-release and Publish Package
  52. 52. 使用 Cake 協助 .NET 封裝 Library
  53. 53. Private Repository Manager • Nexus Repository Manager 具有 upstream sync 功 能(Proxy) – 保持組織內 Repository 與外部 Repository 的一致性 – 保持本機與組織內 Repository 的一致性 Private Repository Manager Team Repository Manager
  54. 54. Artifacts Management with Continue Deployment
  55. 55. Artifacts Environments Configurations and Profiles Setting Documents, Tools and Process flow Delivery for Software
  56. 56. 避免包含 Configuration 與 Setting 的方法 OS 環境變數 k8s 環境變數與設定 獨立服務
  57. 57. 個人推薦 Consul
  58. 58. .NET Artifact(.dll) Configuration Source code External artifacts Build Procedure New Artifacts
  59. 59. Jenkins Trigger Internal Library Container Provisioning Configuration Source code External artifacts Build Procedure New Artifact available for deployment Automated acceptance testing Provisioning Push to Nexus Repository
  60. 60. Product Release https://godleon.github.io/blog/Kubernetes/k8s-Helm-Introduction/
  61. 61. Jenkins Job Jenkins 只拿來執行腳本!!!!!
  62. 62. 讓我們簡單回顧一下這場的內容
  63. 63. 持續交付的意義在於 效率提升 可靠的質量 安全牢固的產出 有效的團隊協作 透明的流程
  64. 64. 今天分享的內容有些開發語言、技術 無法支援該怎麼辦?
  65. 65. 有些時候你就是會吃不飽…
  66. 66. local-npm A Node server that acts as a local npm registry https://www.npmjs.com/package/local-npm
  67. 67. Athens A Server for Go Packages https://github.com/gomods/athens
  68. 68. Nexus Repository Helm Format Community Plugin for Helm https://github.com/sonatype-nexus-community/nexus-repository-helm
  69. 69. Helm Nexus Repository PushA plugin for helm that will pus h a chart to a Nexus Hosted Repository https://github.com/sonatype-nexus-community/helm-nexus-push
  70. 70. Helm Nexus Repository PushA plugin for helm that will pus h a chart to a Nexus Hosted Repository https://github.com/sonatype-nexus-community/helm-nexus-push
  71. 71. ChartMuseum An open-source Helm Chart Repository server https://github.com/helm/chartmuseum
  72. 72. Nexus Repository Manager OSS Host on GCP by Blackie Tsai https://github.com/blackie1019/gcp-k8s-persisantdisk-nexus3-oss
  73. 73. Nexus Repository Manager OSS Host on GCP by Helm https://github.com/helm/charts/tree/master/stable/sonatype-nexus
  74. 74. Nexus Repository Manager OSS Host on AWS https://guides.sonatype.com/repo3/quick-start-guides/aws-for-repo/
  75. 75. 有的時候只想玩玩它…
  76. 76. Azure Artifacts https://azure.microsoft.com/zh-tw/services/devops/artifacts/
  77. 77. Azure DevOps Serve (前身為 Team Foundation Server) 也有內建支援
  78. 78. Thank you! Enjoy your DevOps journey with FUN
  79. 79. References  https://help.sonatype.com/learning  https://hub.docker.com/r/sonatype/nexus3/  https://rickhw.github.io/2018/07/08/DevOps/Artifacts-Management/  https://www.skytap.com/blog/continuous-delivery-fully-functional-environments-skytap-part-2/  https://help.sonatype.com/repomanager3/repository-manager-feature-matrix  http://exchange.sonatype.com/list  https://blackie1019.github.io/2017/08/07/JFrog-Universal-Artifact-Repository-Manager/  https://blackie1019.github.io/2017/08/15/Another-Free-Universal-Package-Manager-ProGet/  https://blackie1019.github.io/2017/08/18/One-More-Universal-Package-Manager-Nexus-Repository-Manager/  https://blackie1019.github.io/2017/08/10/local-npm-Offline-npm-registry/

×