狠狠撸

狠狠撸Share a Scribd company logo
Artifacts Management
with CI&CD
Blackie Tsai
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.…
今天想与大家分享…
Software Artifacts
Artifacts Management Tools
Artifacts Management with Continue Integration
Artifacts Management with Continue Deployment
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
先破题
持續交付的意義在於
效率提升
可靠的質量
安全牢固的產出
有效的團隊協作
透明的流程
Software Artifacts
什麼是 Artifacts
An artefact is an ornament, tool, or other object
that is made by a human being.
是由人類製造的人工製品,如裝飾品,工具或其他物體。
什麼是 Software Artifacts
Software Artifact 是在軟體開發過程中產
生的副產品。可能包含項目源代碼,依賴
項,二進製文件或資源,並且可以根據技
術以不同的佈局表示。
通常存儲在 Repository 如 npm registry, d
ocker hub 等,可以讓團隊之間共享更為方
便。
編譯 (Compiling)、打包 (Packing) 、加工(Processing)
原始碼
(Source Code)
產出物
(Artifacts)
產出物類型
Library/Package
程式於開發時所引用
的第三方或自身獨立
部分功能的產出物
Application Build
原始碼經過編譯或是
打包所參考產出物
Any Binary File
任何一個與開發或商
業運作有關的產出物,
如設計文件或素材大
檔
Image File
建置環境所需的映像
檔案
Deployment Profile
部署所需的設定配置
檔
这些都是产出物
什麼是 Artifacts Repository
是一個存儲位置,其中包含 packages, libraries, binaries, or containers 等組件,以便
可以安裝或使用它們.使用已經開發好的部之a出,延續開發商務應用可有效加速開發
的產出、縮短時程並收斂改變的變更處.不同的開發語言或是工具有自己的管理工具:
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
以自身开发环境為例
目前團隊使用的技術與環境
? OS
– macOS, CentOS
? Service
– C#, .NET Core
? Presentation - Web
– JavaScript, React
? Provisioning
– Container, Docker
? Deployment
– K8s, Helm
? Version Control
– Git, Gitlab
Artifacts Management
MyApp
Git LFS
Packages ContainerOS Deployment
Artifacts of Software Development
最害怕的交付是哪些?
? 原始碼直接部署與修改
? 配置設定與原始碼強耦合
– 修改不易
– 對應不同的環境有不同的配置
? 當次部署有問題,經過一番處理成功部署了,但不知道怎麼被修好的
? 部署流程有工具自動完成,但如果多一個新環境或流程則需要全部重寫
? 內外交付溝通沒有標準語言
https://www.pinterest.com/pin/370702613054573734/
在其他環境開發時…
https://www.pinterest.com/pin/354095589444668688/
在其他環境部署時…
出自笑傲江湖2:東方不敗
需要讓人手動修改/操作
就一定會出錯
Artifacts 的目的是讓開發與交付
變得更簡易, 不易出錯且更具彈性
舉例來說
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
在剛剛這個例子裡
問題:
開發人員正在一遍又一遍地下載相同的組件,降低生產速度並降低建
置的性能。
解決辦法:
改用 Artifacts Repository Management Tool ,協助減輕與開源/第三方
組件使用相關的緩慢下載。並開始考慮建立於組織內的存儲庫配置與
改善開發與部屬流程的強化.
Artifacts Management Tools
Artifacts Repository
Management Tool
? 是一個集中管控各種不同類型 Repository
的系統,可用來建立開發團隊間更加的協
同開發基礎
? 藉由更廣泛的軟件和基於本地端的套件發
佈,提高架構與開發的性能與變更控制
? 減少網絡帶寬和對遠程存儲庫的依賴
? 保護您的公司免受互聯網中斷,公共存儲
庫中斷(Maven Central, npm, nuget, dock
er hub 等),甚至刪除開源組件。
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…
? 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
FREE to use!
FREE to use!
FREE to use!
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
Nexus Repository Manager 各目錄
? bin:包含Nexus啟動|停止等腳本,以及一些跟啟動有關的配置參
數,如JVM,karaf等
? etc:包含主配置文件nexus-default.properties,以及一些其他配置
文件,如ssl,jetty,karaf等
? lib:包含跟karaf相關的jar包
? public:包含跟Nexus應用相關的共用資源
? system:包含所有組成Nexus應用的組件和插件
? sonatype-work 預設的數據存儲目錄,包含所有組件,倉庫,配置,
db,日誌等。
Nexus Repository Manager
Welcome Page
Accounts and Privileges
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 權限
Repository Types
? Hosted Repository
– 自行開發、維護與上傳的 package
? Proxy Repository
– 通常為第三方的 package,Proxy Repository 是鏈接到遠端儲存庫的儲存庫。
– 根據 Proxy Repository 的本地內容驗證對 package 的任何請求,如果未找到本地組件,
則將請求轉發到遠端儲存庫。
– 可額外設定 Sync up Stream 將轉發到遠端儲存庫請求回應儲存一份本地主機內,下次即
可在本地取得。
? Group Repository
– 是多個儲存庫的集合.提供單一的訪問地址.
Artifact Metadata
? Name
? Version
? Timestamp
? Commit SHA Id
? Others…
API
Artifacts Management
with Continue Integration
良好的 DevOps 需要工具來有效
管理不斷增長的產出物,以確保
順利的讓開發工作與應用服務/程
式的持續整合與部屬不被中斷
今天發生天災或是官方在維護,組織的開發
部署會遇到什麼問題嗎?
想一下
下面的情境現在團隊能否達成與如何達成?
? 新人的開發環境如何最快速的建置完成?
? 新功的開發有部分功能先前有其他人寫過,如何分享給本
次開發使用?
? 部署到發佈的產出能被人為修改的地發有哪些?
? 如何在當前的 CI 流程內多插入一個新項目該如何來調整
流程?
? 建立一個新的部屬環境,該調整哪些地方與內容?
重点在如何解除耦合性
乐高(尝贰骋翱)思维
當有越多不同顆粒的完整體可選擇時,能
做得決定也就越廣,且每個決定都包含了
先前已確認的完整內容.
以下是我与团队实务上的做法经验
Artifacts management with CI and CD
依照需求,採有兩種 Git Flow…
一般應用程式開發
(Gitlab Flow)
核心共用模組開發
(Github Flow)
實際流程差異
一般應用程式開發
(Gitlab Flow)
核心共用模組開發
(Github Flow)
選擇 Fork/Branch 的原因
乾淨的 Merge Commit 才能再遇到問題時選擇上一個 Commit 還原
Version Control
有版本、版本有意義才有管理的可能
Semantic Versioning
Versioning during Development
開發與正式不會是同一個版本但應該看得出關係
Pre-release and Publish Package
使用 Cake 協助 .NET 封裝 Library
Private Repository Manager
? Nexus Repository Manager 具有 upstream sync 功
能(Proxy)
– 保持組織內 Repository 與外部 Repository 的一致性
– 保持本機與組織內 Repository 的一致性
Private Repository Manager Team Repository Manager
Artifacts management with CI and CD
Artifacts Management
with Continue Deployment
Artifacts Environments
Configurations
and Profiles
Setting
Documents,
Tools and
Process flow
Delivery for Software
避免包含 Configuration 與 Setting 的方法
OS 環境變數 k8s 環境變數與設定 獨立服務
個人推薦 Consul
.NET Artifact(.dll)
Configuration
Source code
External artifacts
Build Procedure New Artifacts
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
Product Release
https://godleon.github.io/blog/Kubernetes/k8s-Helm-Introduction/
Jenkins Job
Jenkins 只拿來執行腳本!!!!!
让我们简单回顾一下这场的内容
持續交付的意義在於
效率提升
可靠的質量
安全牢固的產出
有效的團隊協作
透明的流程
今天分享的內容有些開發語言、技術
無法支援該怎麼辦?
有些时候你就是会吃不饱…
local-npm
A Node server that acts as
a local npm registry
https://www.npmjs.com/package/local-npm
Athens
A Server for Go Packages
https://github.com/gomods/athens
Nexus Repository
Helm Format
Community Plugin for Helm
https://github.com/sonatype-nexus-community/nexus-repository-helm
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
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
ChartMuseum
An open-source Helm Chart
Repository server
https://github.com/helm/chartmuseum
Nexus Repository
Manager OSS
Host on GCP by Blackie Tsai
https://github.com/blackie1019/gcp-k8s-persisantdisk-nexus3-oss
Nexus Repository
Manager OSS
Host on GCP by Helm
https://github.com/helm/charts/tree/master/stable/sonatype-nexus
Nexus Repository
Manager OSS
Host on AWS
https://guides.sonatype.com/repo3/quick-start-guides/aws-for-repo/
有的时候只想玩玩它…
Azure Artifacts
https://azure.microsoft.com/zh-tw/services/devops/artifacts/
Azure DevOps Serve (前身為 Team Foundation Server) 也有內建支援
Thank you!
Enjoy your DevOps journey with FUN
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/

More Related Content

Artifacts management with CI and CD

Editor's Notes

  • #13: Application Build 原始碼經過編譯或是打包所參考產出物 Application Library/Component/Package 程式於開發時所引用的第三方或自身獨立部分功能的產出物 Virtual Machine/Container Image 建置環境所需的映像檔案 Deployment Profile 部署所需的設定配置檔 Any Binary File 任何一個與開發或商業運作有關的產出物,如Repository 的 README.md.
  • #67: 所以簡單說,透過 Artifact?解偶 (decouple)?整個 pipeline,讓需要的角色可以獨立作業。 如果 pipeline 只能是按鍵部署,而沒有其他的選擇,那麼表示部署流水線是沒有任何彈性的,換言之,部署的主動性只有開發團隊有,其他人都無法自主,造成的現象就是?強耦合 (couple),當有第二、第三環境要部署的時候,就要重新 Pull Code、Build … 實際上是沒有意義的。