SlideShare a Scribd company logo
Azure DevOps Service
應用架構與秘辛
Edward Kuo
Edward Kuo
• 2020 宏碁科技 DevOps 講師
• 2020 啟碁科技 Azure DevOps 講師
• 2020 Azure Monitor with TSMC Form 講師
• 2019 台灣 恩智浦半導體 DevOps 培訓講師
• 2019 .NET Conf Taipei 講師
• 2019 中原大學 資料科學實務 客座講師
• 2019 中原大學 資工系 雲端計算平台實務 客座講師
• 2019 Agile Tour Hsinchu DevOps 講師
• 2019 DevOps Days Taipei 講師
• 2019 DevOps Expo @Trend Micro 講師
• 2019 翻轉營運契機 Azure DevOps 趨勢與實務研討會 講師
• 2019 Insider Dev Tour 台北站 講師
• 2018 DevOps Days Taipei 講師
• 2018 DOIS DevOps 國際峰會 深圳站 講師
• 2018 Insider Dev Tour 台北站 講師
• 2018 .NET Core Conf 台北站 講師
• 2018 Agile Tour Taichung 講師
• Global Azure Bootcamp 台灣 & 廣州 講師
• 微軟 北京 Tech Summit 講師
Microsoft Regional Director
Microsoft Azure MVP
Kingston IT Manager
https://profile.edwardkuo.dev/
2
序
Help Us Something
• 時間花在創造商業價值,降低整合異質平台帶來的不便性
• 尤其對 .NET 或是微軟技術開發者
• 從需求管理、開發到發佈採用同一個平台工作
• 因應開發技術的不斷更新,自動擴充和支持
• Service版本才能做到即時性更新
• 彈性且容易整合非Microsoft的平台
Azure DevOps
• Team Foundation Server
• Azure DevOps Server
是基於SQL Server的地端產品
• Visual Studio Team Service
• Azure DevOps Service
是基於Azure的SaaS級的雲端服務平台
5
Azure DevOps
• Server & Service 兩者區別
• Scope and scale data
• Authentication
• Users and groups
• Manage user access
• Security and data protection
• Service無法透過SSRS做DevOps數據報表
• 兩者迭代速度不同
6
Cloud Trend
有越來越多的組織選擇多雲和混合
雲解決方案。 這些解決方案除了提
高性能外,還提供靈活性,控制性
和可用性。多雲和混合雲的使用比
例是有所增加。
Architect Base On Azure DevOps
Our Azure DevOps Ecosystem
DevOps Map Azure DevOps
9
Design Azure DevOps
Architect
• 80% 系統是佈署在企業內部
• 20% 系統是佈署在Azure Services
• 必須能符合企業應用情境模式進行佈署
Design Hybrid DevOps Architect
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
Artifacts Service
• 解耦
• 系統拆解
• 拆分到耦合性最小元件,透過共用元件
或是核心元件,並重複使用與增加被測
試可能性
• 降低CI時間
• 系統程式碼越多,每次編譯拉下程式碼
重新編譯時間就會越長
• 元件化
• 在分散開發與快速迭代下,不影響他人,
耦合性降低,持續整合也會加快且更好
釐清問題
Artifacts Service
• 建立團隊/企業的Feed
• 能放上第三方元件的nupkg 檔案
• 透過CI / CD 建立 nupkg 檔案
• 只需要使用NuGet Push Task
Artifacts Service
• 避免企業使用過期元件
• 設定Package 保留週期
• 設定最多Package版本數量
• 設定保留天數
Agent Pool Practice
Azure DevOps Agent Pool
• Microsoft Agent Pool
• Azure Pipeline
• Hosted macOS
• Hosted Windows Container
• Custom Agent Pool
• Agent Pool
→Agent
→Host
17
Custom Azure Pipeline
Microsoft托管代理
自托管代理
本地環境
Agent Pools
• 我們設置以下Agent Pool
• Azure Pipeline
• Private Cloud Build Pool
• Private Cloud Release Pool
• Private Premise Build Pool
• Private Premise Release Pool
• Private Premise Docker 1803 Pool
• Private Premise Docker 2004 Pool
Use Custom Agent Reason
• 加快Pull Code 速度
• 加快Build Container速度
• 避免.NET Core / .NET Framework 更新問題,
導致舊系統無法Build
• Microsoft Agent 啟動速度有時太慢
• Release的環境在地端
• 省錢
Agent Pool Design
• Build 和 Release Agent 要分開不同Pool
• 地端Build 和Release Agent服務帳號要不同
• 如果資源允許, Build 和 Release Agent要不同Host
• Build Container 與 Non-Build Container Agent Pool
需要分開
• 雲端Build Agent Pool內的Agent最好設置在不同
Region
Use Custom Agent Allocation
• 除非特殊需求才使用Private Premise的Build Agent
• Build Container使用Private Premise的Build Agent
• 裝載Container Host版本不同,Build Agent也要放在對應
的Host 版本
• Release到Azure環境,使用Private Cloud Release
Agent
• Release到On-Premise,使用Private Premise Release
Agent
Agent Version Challenge
• Agent 版本最好能自動更新
• 無法自動更新時,務必要定期手動離線更新Agent
• Build Agent 不更新,會導致新版本.NET或是相關
套件無法進行編譯
• 若發生Azure DevOps Service找不到Agent,多半是
Agent版本過舊
Pipeline Practice
Pipeline Design Patten
• CI 僅處理Build & Unit Test Process
• CI 編譯時間能越短越好
• CI 設計盡量與Agent的OS相依性低
• CI 設計要能隨時可以切換Agent Pool
此相片 (作者: 未知的作者) 已透過 CC BY-NC 授權
Pipeline Design Patten
• Release 僅處理應用程式佈署或是進行環境佈署
• 敏感參數的安全性,用Library管理與置換
• Build Artifacts不要Keep在Local Host,一律用
Upload方式Keep在Azure DevOps
• 即使一個PowerShell Script可以完成,也要區分
Task處理
Pipeline Design Flow
Menu
手動執行模擬
Process
建立Task
Test
測試CI
Review
觀察執行時間
Build Common Rule
• 用Library做DEV、UAT和PRD參數置換
• 所有Build結果,必須上傳到Pipeline Artifacts
• Container: 先Build Application,再Build
Container
• 不同版本Host編譯的Container不能共用
• 不同Branch都要有Build Pipeline
Build Type
• .NET Framework
• ASP.NET MVC
• API
• Container
• Console App
• VSTO
• SQL Project
• Hexo Web Site
• .NET Core
• Vue.js & ASP.NET Core
• API
• Container
• Console App
• Component
• Azure Function
• WPF
Build .NET Framework
• 順序
• NuGet Retore : 版本過舊,可能會造成還原失敗
• Regex : 自動更新AssemblyInfo內版本號
• Replace Parameter : 更換Web.config的設定參數
• SonarQube: Scan Code
• MS Build : 編譯
• UT : Unit Test
• Publish Artifact : 上傳編譯好後的檔案
• 這裡並未封裝成ZIP檔案做部署
Build .NET Core
• 順序
• .NET Core : 還原Package
• Replace Parameter : 更換appsettings.json的設定參
數
• SonarQube: Scan Code
• .NET Core : 編譯
• Publish Artifact :上傳編譯後的檔案
• 可以用ArchiveFiles@2,封裝檔案成
ZIP File
• 由小到大版本,安裝.NET Core SDK
Build Vue.js & .NET Core
• 順序
• .NET Core : 還原套件
• Npm : 用CI Command還原npm套件
• Replace Tokens : 置換Appsetting參數
• Replace Tokens : 置換Webpack參數
• Npm : 用Run Command建置前端程式
• .NET Core : 編譯ASP .NET Core
• Publish Artifact :上傳編譯後的檔案
• npm run 的參數要在package.json設
定好
Build .NET Core & Container
• 順序
• 與Build .NET Core 順序相同
• Copy File : Copy Dockerfile 到Artifact資料夾
• Publish Artifact :上傳編譯後的檔案和Dockerfile
• Download build artifacts : 下載編譯後檔案和
Dockerfile
• Build Docker : 將檔案Copy到Container並編譯
Docker
• Push Docker : Push Container到ACR
Build .NET Core & Container
• 分批建置Container Application
• Application Agent
• Docker Agent
• 不需要Container時候,可以單獨發布
• 能單獨針對編譯後的Application除錯
• Container編譯時候,帶入版本號
Build SQL Project
• 順序
• SQL Enlight Code Analysis : Scan SQL
• Publish Test Results : 上傳Test Result
• MS Build : 編譯
• Copy File : Copy Dacpac到Artifact資料夾
• Publish Artifact :上傳編譯後的檔案
• 首先必須先用SQL Project,針對資料庫程式進
行版控
Release Common Rule
• 所有編譯後的檔案,一律從Build
Artifact取得
• 正式環境部署皆需要人員Approve
• 非Container的佈署,大多用Copy
File方式處理
• 佈署用的參數也存放在Library
• Release Agent不放在被佈署的Host
• Compose File額外Repos管理
Release Type
• NuGet Package
• On-Premise
• Container by Docker Host
• Windows Service by Server & Single PC
• Trigger FTP
• Web Site
• API
• Single DLL File
• MS SQL Database
• VSTO Application
• WPF / Windows Form Application
• Azure
• Azure Web App Service
• Azure Function
• Azure SQL Database
Release Container
• 順序
• 先從IaC Repos下載該Container的Compose.yml
• 置換Compose file的Docker版號
• docker-compose Pull : 下載 Container
• docker-compose Down : 停掉Container
• docker-compose Up : 啟動Container
• 從UAT到PRD,僅Container轉移Host,並用
不同IaC啟動Container
Release Container
• 每次Release的Container必須要有版號,才可以進行管理與快速復原
• 用$(Release.Artifacts.Pipeline Name.BuildNumber) 取得CI 版本
• Compose的image版本號碼是用Buildnumber
Release Windows Service
• 順序
• PowerShell : 停止WS在遠距Host
• Command Line : 卸載WS
• Copy File : 複製新的Application
• PowerShell : 安裝WS到遠距Host
• Command Line : 啟動WS
• 目前並無專門Task,必須透過
Command處理
Compare PRD Database
• 順序
• Download Build Artifacts : 下載需要佈署DB
相關的Script
• PowerShell : 執行佈署Script
• Delete files : 刪除佈署DB相關的Script
• Send email : 差異化檔案用Mail寄出
• 前提DB程式碼要用SQL Project
做管理
• Agent Host要安裝sqlpackage.exe
Compare PRD Database
• 差異化比較屬性,用DB.Publish.xml
管理
• 執行差異化比較的Script,用
PowerShell執行
• 在PowerShell內執行DB.Publish.xml
如果可以,就讓Pipeline做自動化的平台
Azure DevOps Notifications
Build & Release Notifications
• 所有Build / Release 的資訊都要通知到團隊頻道
• 訊息發送到Microsoft Teams
• Azure DevOps Connector
• Webhook方式傳送
• Azure Pipelines
• Azure DevOps bot
Build & Release Notifications
• 所有Build / Release 的資訊都要通知到團隊頻道
• 訊息發送到Microsoft Teams
• Azure DevOps Connector
• Webhook方式傳送
• Azure Pipelines
• Azure DevOps bot
Build & Release Notifications
• Advance
• Build Fail 通知到個人 Teams Chat
• Service Hooks + Power Automate
另類使用方式
非關DevOps,使用模式僅參考,因此,使用前要深思
Schedule Controller
• 透過Release定時驅動功能,作為系統 / 維運 的排程器
• 不需要使用Windows Schedule
• 有完整歷程記錄
• 可以設定執行排程的流程
• 如果用Azure DevOps Service,還可以雲端手動啟動地端排程
Backup All Repos File
• 基於ISO需求,需要將雲端
Repos File 備份到地端
• 用PowerShell & Git 指令
• 呼叫Azure DevOps API
• 搭配Release排程功能
$PATToken="$(PAT)"
$base64AuthInfo=
[System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("
:$($PATToken)"))
$AzureDevopsOrg=“Org"
$AzureDevOpsProject=“Name"
$LocalfilePath="$(BackupFilePath)"
$ProjectUrlAPI =
"https://dev.azure.com/$($AzureDevopsOrg)/$($AzureDevOpsProject)/_apis/g
it/repositories?api-version=6.1-preview.1"
$Repo = (Invoke-RestMethod -Uri $ProjectUrlAPI -Method Get -
UseDefaultCredential -Headers @{Authorization=("Basic {0}" -f
$base64AuthInfo)})
$RepoName= $Repo.value.name
Backup All Repos File
• 基於ISO需求,需要將雲端
Repos File 備份到地端
• 用PowerShell & Git 指令
• 呼叫Azure DevOps API
• 搭配Release排程功能
ForEach ($name in $RepoName)
{
$ReposUrl="https://anything:$($PATToken)@dev.azure.com/$($AzureDevopsOrg)/$($AzureDevOp
sProject.Replace(" ","%20"))/_git/$($name.replace(" ","%20"))"
$FilePath="$($LocalfilePath)$($name)"
if(Test-Path $FilePath)
{
cd $FilePath
write $ReposUrl
git pull origin UAT
git pull origin master
}
else {
write $ReposUrl
git clone $ReposUrl $FilePath -b master
}
}
Trigger CI on Release Stage
• 當某個重要Package被Release後,必
須自動驅動某系統的CI,讓系統重新
編譯取得最新的Package 版本
Trigger CI on Release Stage
• 當某個重要Package被Release後,必
須自動驅動某系統的CI,讓系統重新
編譯取得最新的Package 版本
• CI 必須要在NuGet Package添加取得
最新版本Package
Use NuGet Task
Command : Custom
Command and arguments:
update “Project.sln" -Id “NuGet Package Name" -
ConfigFile "nuget.config"
常用的Marketplace套件
Often Extension
• SQL Enlight Code Quality Task
• 掃描SQL語法是否有符合SQL撰寫規範
• SonarQube Task
• 整合SonarQube服務,進行Code掃描
• Trigger Build Task
• 在現有Pipeline 流程,驅動其他CI Pipeline流程
Often Extension
• Regex Replace Task
• 用Regular Expression替換掉Code資訊,如: AssemblyInfo.cs
• Replace Token Task
• 透過#{變數名稱}#,將資訊注入到File,常搭配Library使用
• Send Mail Task
Summary
Our Challenge
• 不容易明白的錯誤訊息
• 介面與功能常常改變
• 網路穩定性
• 不一定能Work的Preview功能
• 有部分功能可能沒有,但是在.NET世界,基本上都具備
• Pipeline Task版本更新或是Deprecated
• Pipeline的管理
• Pipeline 失敗不一定是Application問題
Use YAML
• 使用YAML
• CI 使用YAML,可以讓有相同CI流程系統,可以快速建立Pipeline
• YAML讓Pipeline具有版控
• YAML支援CD,但功能尚不完善,不建議使用
• 可以離線編輯Pipeline
• 挑戰
• 語法需要熟悉,遇到第三方Task的YAML,不容易撰寫
• 沒有可視化流程
• 除非很熟悉,不然需要比對文件才知道Task屬性
Azure DevOps CLI & API
• 搭配CLI
• 使用CLI可以擴展Azure DevOps,從命令行管理許多Azure DevOps服務。
• 搭配API
• 透過REST API提供對服務的創建,檢索,更新或刪除
Azure DevOps 可以是DevOps工具
也可以是一個應用平台
Reference
• https://docs.microsoft.com/en-us/azure/devops/cli/?view=azure-devops
• https://docs.microsoft.com/en-us/rest/api/azure/devops/?view=azure-
devops-rest-6.1
• https://github.com/edwardkuo/AzureDevOpsPipelineSample
Thanks for joining!
Ask questions on Twitter using #dotNETConf
特別感謝

More Related Content

What's hot (20)

PDF
Kubernetes Application Deployment with Helm - A beginner Guide!
Krishna-Kumar
 
PPTX
微服務的基礎建設 - Service Discovery, Andrew Wu
Andrew Wu
 
PPTX
大規模微服務導入 - #1, 從零開始的系統架構設計概觀
Andrew Wu
 
PPTX
API Token 入門
Andrew Wu
 
PDF
Red Hat OpenShift Container Storage
Takuya Utsunomiya
 
PPTX
[2022 DevOpsDays Taipei] 走過 DevOps 風雨的下一步
Edward Kuo
 
PPTX
コンテナネットワーキング(CNI)最前線
Motonori Shindo
 
PPTX
Devops ppt
Sulekha IT Training
 
PDF
過來人經驗 - 在企業中推行 DevOps 前該具備的認知與工具箱
TIM WANG
 
PPTX
Azure DevOps
Felipe Artur Feltes
 
PDF
Effective DevOps:一場文化與技術的轉型運動 (陳正瑋)
AgileTour@TW
 
PDF
20220224台中演講k8s
chabateryuhlin
 
PDF
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
whywaita
 
PDF
猿でもわかるコンテナ
Tsuyoshi Miyake
 
PDF
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
日本マイクロソフト株式会社
 
PDF
コンテナイメージの脆弱性スキャンについて
YASUKAZU NAGATOMI
 
PDF
JVMのGCアルゴリズムとチューニング
佑哉 廣岡
 
PDF
Kubernetes 101
Crevise Technologies
 
PDF
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Kohei Tokunaga
 
PDF
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
NTT DATA Technology & Innovation
 
Kubernetes Application Deployment with Helm - A beginner Guide!
Krishna-Kumar
 
微服務的基礎建設 - Service Discovery, Andrew Wu
Andrew Wu
 
大規模微服務導入 - #1, 從零開始的系統架構設計概觀
Andrew Wu
 
API Token 入門
Andrew Wu
 
Red Hat OpenShift Container Storage
Takuya Utsunomiya
 
[2022 DevOpsDays Taipei] 走過 DevOps 風雨的下一步
Edward Kuo
 
コンテナネットワーキング(CNI)最前線
Motonori Shindo
 
過來人經驗 - 在企業中推行 DevOps 前該具備的認知與工具箱
TIM WANG
 
Azure DevOps
Felipe Artur Feltes
 
Effective DevOps:一場文化與技術的轉型運動 (陳正瑋)
AgileTour@TW
 
20220224台中演講k8s
chabateryuhlin
 
Kubernetesの良さを活かして開発・運用!Cloud Native入門 / An introductory Cloud Native #osc19tk
whywaita
 
猿でもわかるコンテナ
Tsuyoshi Miyake
 
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
日本マイクロソフト株式会社
 
コンテナイメージの脆弱性スキャンについて
YASUKAZU NAGATOMI
 
JVMのGCアルゴリズムとチューニング
佑哉 廣岡
 
Kubernetes 101
Crevise Technologies
 
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Kohei Tokunaga
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
NTT DATA Technology & Innovation
 

Similar to [2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛 (20)

PDF
twMVC#42 Azure DevOps Service Pipeline設計與非正常應用
twMVC
 
PDF
02 azure devops pipeline - build
Alan Tsai
 
PPTX
[2019 DevOpsDays Taipei]Azure DevOps 建立 DevOps 團隊
Edward Kuo
 
PDF
03 azure devops pipeline - release
Alan Tsai
 
PPTX
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
Will Huang
 
PDF
01 DevOps and Azure DevOps overview
Alan Tsai
 
PPTX
Tech.days Taiwan AZR305
Jeff Chu
 
PPTX
Microsoft Azure 虛擬機器與虛擬網路 (2014-4-2 雲端達人班)
Jeff Chu
 
PPTX
Windows Azure Virtual Machine Services for Developers
Jeff Chu
 
PDF
架構這件事 - Azure 可以幫助什麼 - 如何選擇使用什麼 Azure 服務
Alan Tsai
 
PDF
DevOps Tool Chain - Image Registry Troubleshooting and Best practices
Duran Hsieh
 
PDF
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
Chu-Siang Lai
 
PDF
.NET Conf 2024 :利用 Azure 實現平台工程,從概念到實踐,如何完成導入企業內部
Edward Kuo
 
PPTX
[MonkeyFest 2018 ] App 開發與 DevOps 上的實踐
Edward Kuo
 
PPTX
Artifacts management with CI and CD
Chen-Tien Tsai
 
PPTX
開發人員不可不知的 Windows Container 容器技術預覽
Will Huang
 
PPTX
全新 Windows Server 2019 容器技術 及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)
Will Huang
 
PPTX
2024/11/29 DevOps Taiwan #64 : 從初建到進階:打造符合公司需求的混合雲端 GitLab DevOps 流水線
Freddy Fan
 
PDF
Service Integration Workshop
Ryan Chung
 
PDF
Lab01 cloud project
Jeff Chu
 
twMVC#42 Azure DevOps Service Pipeline設計與非正常應用
twMVC
 
02 azure devops pipeline - build
Alan Tsai
 
[2019 DevOpsDays Taipei]Azure DevOps 建立 DevOps 團隊
Edward Kuo
 
03 azure devops pipeline - release
Alan Tsai
 
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
Will Huang
 
01 DevOps and Azure DevOps overview
Alan Tsai
 
Tech.days Taiwan AZR305
Jeff Chu
 
Microsoft Azure 虛擬機器與虛擬網路 (2014-4-2 雲端達人班)
Jeff Chu
 
Windows Azure Virtual Machine Services for Developers
Jeff Chu
 
架構這件事 - Azure 可以幫助什麼 - 如何選擇使用什麼 Azure 服務
Alan Tsai
 
DevOps Tool Chain - Image Registry Troubleshooting and Best practices
Duran Hsieh
 
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
Chu-Siang Lai
 
.NET Conf 2024 :利用 Azure 實現平台工程,從概念到實踐,如何完成導入企業內部
Edward Kuo
 
[MonkeyFest 2018 ] App 開發與 DevOps 上的實踐
Edward Kuo
 
Artifacts management with CI and CD
Chen-Tien Tsai
 
開發人員不可不知的 Windows Container 容器技術預覽
Will Huang
 
全新 Windows Server 2019 容器技術 及邁向與 Kubernetes 整合之路 (Windows Server 高峰會)
Will Huang
 
2024/11/29 DevOps Taiwan #64 : 從初建到進階:打造符合公司需求的混合雲端 GitLab DevOps 流水線
Freddy Fan
 
Service Integration Workshop
Ryan Chung
 
Lab01 cloud project
Jeff Chu
 
Ad

More from Edward Kuo (20)

PDF
[Study4Love 公益講座]工程師面對AI帶來的影響,破解工程師被消滅之迷失
Edward Kuo
 
PDF
2025 DevOps Days 實踐Platform Engineering之路
Edward Kuo
 
PDF
DevOpsDays Taipei 2024 DevOps加入Biz讓DevOps在企業價值定位
Edward Kuo
 
PDF
應用 Azure Platform-as-a-Service & DevOps 打造彈性企業服務
Edward Kuo
 
PPTX
如何使用微軟Power系列服務的看法
Edward Kuo
 
PPTX
[2021 .NET Conf]善用 Azure Monitor 服務打造 DevOps 監控一環
Edward Kuo
 
PDF
[2021 DevDays]Microsoft Teams 整合 Azure DevOps之實務應用
Edward Kuo
 
PDF
Database in DevOps
Edward Kuo
 
PDF
[Agile Tour Hsinchu 2019] Our practice in the DevOps Process for Manufacture ...
Edward Kuo
 
PPTX
[Study4.TW .NET Conf 2019]看,用 Azure 建立工業 4.0 的第一步
Edward Kuo
 
PPTX
ASP.NET Core 3.0 新功能
Edward Kuo
 
PPTX
大型製造業實踐DevOps 團隊之路
Edward Kuo
 
PPTX
[2018 .NET Conf].NET Core與Azure DevOps應用於企業開發
Edward Kuo
 
PPTX
[2018 DevOps Days]大型企業如何推行DevOps
Edward Kuo
 
PDF
建構Windows混合現實應用程式
Edward Kuo
 
PPTX
2018 Experience for Microsoft Teams
Edward Kuo
 
PDF
微軟 Hololens 混合現實平台開發
Edward Kuo
 
PPTX
How to use Microsoft Teams
Edward Kuo
 
PPTX
DevOps的神鬼奇航
Edward Kuo
 
PPTX
Microsoft Tech Summit 2017 - 制造业运用微软研发云实现云到端的 DevOps 架构
Edward Kuo
 
[Study4Love 公益講座]工程師面對AI帶來的影響,破解工程師被消滅之迷失
Edward Kuo
 
2025 DevOps Days 實踐Platform Engineering之路
Edward Kuo
 
DevOpsDays Taipei 2024 DevOps加入Biz讓DevOps在企業價值定位
Edward Kuo
 
應用 Azure Platform-as-a-Service & DevOps 打造彈性企業服務
Edward Kuo
 
如何使用微軟Power系列服務的看法
Edward Kuo
 
[2021 .NET Conf]善用 Azure Monitor 服務打造 DevOps 監控一環
Edward Kuo
 
[2021 DevDays]Microsoft Teams 整合 Azure DevOps之實務應用
Edward Kuo
 
Database in DevOps
Edward Kuo
 
[Agile Tour Hsinchu 2019] Our practice in the DevOps Process for Manufacture ...
Edward Kuo
 
[Study4.TW .NET Conf 2019]看,用 Azure 建立工業 4.0 的第一步
Edward Kuo
 
ASP.NET Core 3.0 新功能
Edward Kuo
 
大型製造業實踐DevOps 團隊之路
Edward Kuo
 
[2018 .NET Conf].NET Core與Azure DevOps應用於企業開發
Edward Kuo
 
[2018 DevOps Days]大型企業如何推行DevOps
Edward Kuo
 
建構Windows混合現實應用程式
Edward Kuo
 
2018 Experience for Microsoft Teams
Edward Kuo
 
微軟 Hololens 混合現實平台開發
Edward Kuo
 
How to use Microsoft Teams
Edward Kuo
 
DevOps的神鬼奇航
Edward Kuo
 
Microsoft Tech Summit 2017 - 制造业运用微软研发云实现云到端的 DevOps 架构
Edward Kuo
 
Ad

[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛

  • 2. Edward Kuo • 2020 宏碁科技 DevOps 講師 • 2020 啟碁科技 Azure DevOps 講師 • 2020 Azure Monitor with TSMC Form 講師 • 2019 台灣 恩智浦半導體 DevOps 培訓講師 • 2019 .NET Conf Taipei 講師 • 2019 中原大學 資料科學實務 客座講師 • 2019 中原大學 資工系 雲端計算平台實務 客座講師 • 2019 Agile Tour Hsinchu DevOps 講師 • 2019 DevOps Days Taipei 講師 • 2019 DevOps Expo @Trend Micro 講師 • 2019 翻轉營運契機 Azure DevOps 趨勢與實務研討會 講師 • 2019 Insider Dev Tour 台北站 講師 • 2018 DevOps Days Taipei 講師 • 2018 DOIS DevOps 國際峰會 深圳站 講師 • 2018 Insider Dev Tour 台北站 講師 • 2018 .NET Core Conf 台北站 講師 • 2018 Agile Tour Taichung 講師 • Global Azure Bootcamp 台灣 & 廣州 講師 • 微軟 北京 Tech Summit 講師 Microsoft Regional Director Microsoft Azure MVP Kingston IT Manager https://profile.edwardkuo.dev/ 2
  • 3.
  • 4. Help Us Something • 時間花在創造商業價值,降低整合異質平台帶來的不便性 • 尤其對 .NET 或是微軟技術開發者 • 從需求管理、開發到發佈採用同一個平台工作 • 因應開發技術的不斷更新,自動擴充和支持 • Service版本才能做到即時性更新 • 彈性且容易整合非Microsoft的平台
  • 5. Azure DevOps • Team Foundation Server • Azure DevOps Server 是基於SQL Server的地端產品 • Visual Studio Team Service • Azure DevOps Service 是基於Azure的SaaS級的雲端服務平台 5
  • 6. Azure DevOps • Server & Service 兩者區別 • Scope and scale data • Authentication • Users and groups • Manage user access • Security and data protection • Service無法透過SSRS做DevOps數據報表 • 兩者迭代速度不同 6
  • 8. Architect Base On Azure DevOps Our Azure DevOps Ecosystem
  • 9. DevOps Map Azure DevOps 9
  • 10. Design Azure DevOps Architect • 80% 系統是佈署在企業內部 • 20% 系統是佈署在Azure Services • 必須能符合企業應用情境模式進行佈署
  • 11. Design Hybrid DevOps Architect
  • 13. Artifacts Service • 解耦 • 系統拆解 • 拆分到耦合性最小元件,透過共用元件 或是核心元件,並重複使用與增加被測 試可能性 • 降低CI時間 • 系統程式碼越多,每次編譯拉下程式碼 重新編譯時間就會越長 • 元件化 • 在分散開發與快速迭代下,不影響他人, 耦合性降低,持續整合也會加快且更好 釐清問題
  • 14. Artifacts Service • 建立團隊/企業的Feed • 能放上第三方元件的nupkg 檔案 • 透過CI / CD 建立 nupkg 檔案 • 只需要使用NuGet Push Task
  • 15. Artifacts Service • 避免企業使用過期元件 • 設定Package 保留週期 • 設定最多Package版本數量 • 設定保留天數
  • 17. Azure DevOps Agent Pool • Microsoft Agent Pool • Azure Pipeline • Hosted macOS • Hosted Windows Container • Custom Agent Pool • Agent Pool →Agent →Host 17 Custom Azure Pipeline Microsoft托管代理 自托管代理 本地環境
  • 18. Agent Pools • 我們設置以下Agent Pool • Azure Pipeline • Private Cloud Build Pool • Private Cloud Release Pool • Private Premise Build Pool • Private Premise Release Pool • Private Premise Docker 1803 Pool • Private Premise Docker 2004 Pool
  • 19. Use Custom Agent Reason • 加快Pull Code 速度 • 加快Build Container速度 • 避免.NET Core / .NET Framework 更新問題, 導致舊系統無法Build • Microsoft Agent 啟動速度有時太慢 • Release的環境在地端 • 省錢
  • 20. Agent Pool Design • Build 和 Release Agent 要分開不同Pool • 地端Build 和Release Agent服務帳號要不同 • 如果資源允許, Build 和 Release Agent要不同Host • Build Container 與 Non-Build Container Agent Pool 需要分開 • 雲端Build Agent Pool內的Agent最好設置在不同 Region
  • 21. Use Custom Agent Allocation • 除非特殊需求才使用Private Premise的Build Agent • Build Container使用Private Premise的Build Agent • 裝載Container Host版本不同,Build Agent也要放在對應 的Host 版本 • Release到Azure環境,使用Private Cloud Release Agent • Release到On-Premise,使用Private Premise Release Agent
  • 22. Agent Version Challenge • Agent 版本最好能自動更新 • 無法自動更新時,務必要定期手動離線更新Agent • Build Agent 不更新,會導致新版本.NET或是相關 套件無法進行編譯 • 若發生Azure DevOps Service找不到Agent,多半是 Agent版本過舊
  • 24. Pipeline Design Patten • CI 僅處理Build & Unit Test Process • CI 編譯時間能越短越好 • CI 設計盡量與Agent的OS相依性低 • CI 設計要能隨時可以切換Agent Pool 此相片 (作者: 未知的作者) 已透過 CC BY-NC 授權
  • 25. Pipeline Design Patten • Release 僅處理應用程式佈署或是進行環境佈署 • 敏感參數的安全性,用Library管理與置換 • Build Artifacts不要Keep在Local Host,一律用 Upload方式Keep在Azure DevOps • 即使一個PowerShell Script可以完成,也要區分 Task處理
  • 27. Build Common Rule • 用Library做DEV、UAT和PRD參數置換 • 所有Build結果,必須上傳到Pipeline Artifacts • Container: 先Build Application,再Build Container • 不同版本Host編譯的Container不能共用 • 不同Branch都要有Build Pipeline
  • 28. Build Type • .NET Framework • ASP.NET MVC • API • Container • Console App • VSTO • SQL Project • Hexo Web Site • .NET Core • Vue.js & ASP.NET Core • API • Container • Console App • Component • Azure Function • WPF
  • 29. Build .NET Framework • 順序 • NuGet Retore : 版本過舊,可能會造成還原失敗 • Regex : 自動更新AssemblyInfo內版本號 • Replace Parameter : 更換Web.config的設定參數 • SonarQube: Scan Code • MS Build : 編譯 • UT : Unit Test • Publish Artifact : 上傳編譯好後的檔案 • 這裡並未封裝成ZIP檔案做部署
  • 30. Build .NET Core • 順序 • .NET Core : 還原Package • Replace Parameter : 更換appsettings.json的設定參 數 • SonarQube: Scan Code • .NET Core : 編譯 • Publish Artifact :上傳編譯後的檔案 • 可以用ArchiveFiles@2,封裝檔案成 ZIP File • 由小到大版本,安裝.NET Core SDK
  • 31. Build Vue.js & .NET Core • 順序 • .NET Core : 還原套件 • Npm : 用CI Command還原npm套件 • Replace Tokens : 置換Appsetting參數 • Replace Tokens : 置換Webpack參數 • Npm : 用Run Command建置前端程式 • .NET Core : 編譯ASP .NET Core • Publish Artifact :上傳編譯後的檔案 • npm run 的參數要在package.json設 定好
  • 32. Build .NET Core & Container • 順序 • 與Build .NET Core 順序相同 • Copy File : Copy Dockerfile 到Artifact資料夾 • Publish Artifact :上傳編譯後的檔案和Dockerfile • Download build artifacts : 下載編譯後檔案和 Dockerfile • Build Docker : 將檔案Copy到Container並編譯 Docker • Push Docker : Push Container到ACR
  • 33. Build .NET Core & Container • 分批建置Container Application • Application Agent • Docker Agent • 不需要Container時候,可以單獨發布 • 能單獨針對編譯後的Application除錯 • Container編譯時候,帶入版本號
  • 34. Build SQL Project • 順序 • SQL Enlight Code Analysis : Scan SQL • Publish Test Results : 上傳Test Result • MS Build : 編譯 • Copy File : Copy Dacpac到Artifact資料夾 • Publish Artifact :上傳編譯後的檔案 • 首先必須先用SQL Project,針對資料庫程式進 行版控
  • 35. Release Common Rule • 所有編譯後的檔案,一律從Build Artifact取得 • 正式環境部署皆需要人員Approve • 非Container的佈署,大多用Copy File方式處理 • 佈署用的參數也存放在Library • Release Agent不放在被佈署的Host • Compose File額外Repos管理
  • 36. Release Type • NuGet Package • On-Premise • Container by Docker Host • Windows Service by Server & Single PC • Trigger FTP • Web Site • API • Single DLL File • MS SQL Database • VSTO Application • WPF / Windows Form Application • Azure • Azure Web App Service • Azure Function • Azure SQL Database
  • 37. Release Container • 順序 • 先從IaC Repos下載該Container的Compose.yml • 置換Compose file的Docker版號 • docker-compose Pull : 下載 Container • docker-compose Down : 停掉Container • docker-compose Up : 啟動Container • 從UAT到PRD,僅Container轉移Host,並用 不同IaC啟動Container
  • 38. Release Container • 每次Release的Container必須要有版號,才可以進行管理與快速復原 • 用$(Release.Artifacts.Pipeline Name.BuildNumber) 取得CI 版本 • Compose的image版本號碼是用Buildnumber
  • 39. Release Windows Service • 順序 • PowerShell : 停止WS在遠距Host • Command Line : 卸載WS • Copy File : 複製新的Application • PowerShell : 安裝WS到遠距Host • Command Line : 啟動WS • 目前並無專門Task,必須透過 Command處理
  • 40. Compare PRD Database • 順序 • Download Build Artifacts : 下載需要佈署DB 相關的Script • PowerShell : 執行佈署Script • Delete files : 刪除佈署DB相關的Script • Send email : 差異化檔案用Mail寄出 • 前提DB程式碼要用SQL Project 做管理 • Agent Host要安裝sqlpackage.exe
  • 41. Compare PRD Database • 差異化比較屬性,用DB.Publish.xml 管理 • 執行差異化比較的Script,用 PowerShell執行 • 在PowerShell內執行DB.Publish.xml
  • 44. Build & Release Notifications • 所有Build / Release 的資訊都要通知到團隊頻道 • 訊息發送到Microsoft Teams • Azure DevOps Connector • Webhook方式傳送 • Azure Pipelines • Azure DevOps bot
  • 45. Build & Release Notifications • 所有Build / Release 的資訊都要通知到團隊頻道 • 訊息發送到Microsoft Teams • Azure DevOps Connector • Webhook方式傳送 • Azure Pipelines • Azure DevOps bot
  • 46. Build & Release Notifications • Advance • Build Fail 通知到個人 Teams Chat • Service Hooks + Power Automate
  • 48. Schedule Controller • 透過Release定時驅動功能,作為系統 / 維運 的排程器 • 不需要使用Windows Schedule • 有完整歷程記錄 • 可以設定執行排程的流程 • 如果用Azure DevOps Service,還可以雲端手動啟動地端排程
  • 49. Backup All Repos File • 基於ISO需求,需要將雲端 Repos File 備份到地端 • 用PowerShell & Git 指令 • 呼叫Azure DevOps API • 搭配Release排程功能 $PATToken="$(PAT)" $base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(" :$($PATToken)")) $AzureDevopsOrg=“Org" $AzureDevOpsProject=“Name" $LocalfilePath="$(BackupFilePath)" $ProjectUrlAPI = "https://dev.azure.com/$($AzureDevopsOrg)/$($AzureDevOpsProject)/_apis/g it/repositories?api-version=6.1-preview.1" $Repo = (Invoke-RestMethod -Uri $ProjectUrlAPI -Method Get - UseDefaultCredential -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}) $RepoName= $Repo.value.name
  • 50. Backup All Repos File • 基於ISO需求,需要將雲端 Repos File 備份到地端 • 用PowerShell & Git 指令 • 呼叫Azure DevOps API • 搭配Release排程功能 ForEach ($name in $RepoName) { $ReposUrl="https://anything:$($PATToken)@dev.azure.com/$($AzureDevopsOrg)/$($AzureDevOp sProject.Replace(" ","%20"))/_git/$($name.replace(" ","%20"))" $FilePath="$($LocalfilePath)$($name)" if(Test-Path $FilePath) { cd $FilePath write $ReposUrl git pull origin UAT git pull origin master } else { write $ReposUrl git clone $ReposUrl $FilePath -b master } }
  • 51. Trigger CI on Release Stage • 當某個重要Package被Release後,必 須自動驅動某系統的CI,讓系統重新 編譯取得最新的Package 版本
  • 52. Trigger CI on Release Stage • 當某個重要Package被Release後,必 須自動驅動某系統的CI,讓系統重新 編譯取得最新的Package 版本 • CI 必須要在NuGet Package添加取得 最新版本Package Use NuGet Task Command : Custom Command and arguments: update “Project.sln" -Id “NuGet Package Name" - ConfigFile "nuget.config"
  • 54. Often Extension • SQL Enlight Code Quality Task • 掃描SQL語法是否有符合SQL撰寫規範 • SonarQube Task • 整合SonarQube服務,進行Code掃描 • Trigger Build Task • 在現有Pipeline 流程,驅動其他CI Pipeline流程
  • 55. Often Extension • Regex Replace Task • 用Regular Expression替換掉Code資訊,如: AssemblyInfo.cs • Replace Token Task • 透過#{變數名稱}#,將資訊注入到File,常搭配Library使用 • Send Mail Task
  • 57. Our Challenge • 不容易明白的錯誤訊息 • 介面與功能常常改變 • 網路穩定性 • 不一定能Work的Preview功能 • 有部分功能可能沒有,但是在.NET世界,基本上都具備 • Pipeline Task版本更新或是Deprecated • Pipeline的管理 • Pipeline 失敗不一定是Application問題
  • 58. Use YAML • 使用YAML • CI 使用YAML,可以讓有相同CI流程系統,可以快速建立Pipeline • YAML讓Pipeline具有版控 • YAML支援CD,但功能尚不完善,不建議使用 • 可以離線編輯Pipeline • 挑戰 • 語法需要熟悉,遇到第三方Task的YAML,不容易撰寫 • 沒有可視化流程 • 除非很熟悉,不然需要比對文件才知道Task屬性
  • 59. Azure DevOps CLI & API • 搭配CLI • 使用CLI可以擴展Azure DevOps,從命令行管理許多Azure DevOps服務。 • 搭配API • 透過REST API提供對服務的創建,檢索,更新或刪除
  • 62. Thanks for joining! Ask questions on Twitter using #dotNETConf

Editor's Notes

  • #4: 用Azure DevOps Service 非正規玩他 企業真實做法
  • #63: Thanks for joining us! Have a great conference!