發表文章

目前顯示的是有「Azure DevOps」標籤的文章

Git 版控到底有沒有正確的用法?

圖片
某天,朋友向我詢問一個問題 :『Git 版控到底有沒有正確的用法?』 因為團隊成員要求走自己習慣的 Git 協作流程,溝通無效,team member堅持 : 『像是 Git 這樣的工具,使用時沒有絕對的對錯,不是國外的大神說的就是對的,也沒有觀念是否正確的問題…』。 『很有魄力耶』我說。 『但這樣我很困擾啊』朋友無奈地問:『Member這樣講是對的嗎?』 我回答道: 『你可以說對,也可以說不對。 所有東西都是工具,甚至,廣義來說整個軟體開發技術也都是工具, 常常需要因時因地制宜,因此… 對錯是相對的沒錯,但是到底 相對於什麼呢? 得看目的 。』 Git的使用,一般來說,有爭議或選擇的是兩個部分,Repo 大小的分割(專案顆粒度),以及 git working flow… 拿 git working flow來說,如果是早年的 Git 使用者,多半選擇 git flow,那是有當年時空背景因素的。Git 發展初期,需求是開源專案,開發人員可能並不在同一個辦公室協作,常有跨國合作的需求,當時網路狀況也不像現在品質那麼好,那時分支的建立就相當多且頻繁。 再加上 Git 切分分支的成本極低,到後期,甚至有很多團隊用分支來做為暫時性的程式碼存放或測試,這本身不是問題。但這些分支,終有一天需要合併,每次合併,都帶來不少的痛苦。過去沒有頻繁交付的需求,一兩個月合併一次花花時間,日子也就這麼過了,但如今,不同了。 最近幾年,我們是不建議切出具有 長生命週期 且 數量多 的分支的,因為分支本身就是一種 程式碼隱藏 ,Continuous Delivery 的作者 Dave Farley 就說過, 從 頻繁交付 的角度來看,具有長生命週期且多分支的 git flow 是個不好的選擇: https://www.youtube.com/watch?v=_w6TwnLCFwA 所以,如果要實踐敏捷的頻繁交付(一周數次,一天數次)那我會建議 git 分支數量愈少愈好,分支生命周期愈短愈好,以便能有利於持續整合,實現頻繁交付: 但這是有前提的。 前提是 : 『團隊有良好的自動化CI流程,包含程式碼的靜態掃描、套件安全性掃描、自動化測試…都 必須 在Pipeline中出現。』 如果你想實踐真正的持續整合(CI),就要盡可能地減少不力於頻繁整合的程式碼隱藏,...

DevOps導入前後,該如何評估成效?

圖片
最近好巧,很多朋友詢問我,DevOps導入前後,該如何評估成效? 或是,企業可以從哪些角度來看自身的 DevOps 現況? 找到可以改善的空間和指標? 或許是因為最近 DORA(DevOps Research and Assessment) 蠻紅的,所以大家開始想了解如何評估 DevOps吧? 其實很久以前 Azure DevOps 的網站中就有這個服務,你可以在底下網址找到 : https://devopsassessment.net/ 進入之後,點選『開始評量』就可以了: 接著,可以在出現的領域中,選擇你關心的部分: 接著會出現一堆類似考試或問卷的題目,請認真乖乖作答,完成之後,你就會看到評估的結果,與改善的建議: 從上表中,可以清楚知道企業目前 DevOps 的成熟度,還有可以進行哪些改善項目,雖然這些項目看起來像是老生常談,但其實是歷久彌新,在公司導入 DevOps 的前後,不妨來這個網站評估看看,相信對選擇改善標的會有很大的幫助。 相關課程: 敏捷開發與Azure DevOps實戰 https://www.studyhost.tw/NewCourses/ALM

Azure DevOps - 在Job之間傳遞變數值

圖片
學員來信問到了,如何在 Azure DevOps Pipeline 的多個 Job 之間,傳遞變數值。這有一些知識背景。 首先,Azure DevOps 的一條 Pipeline 中可以有多個Job,每個Job可以獨立運行,或是相依運行(例如Job A完成後再運行 Job B),每一個Job裡面才是多個Tasks(或是Steps),類似底下這樣: 假設,上面兩個 Job 之間有相依性,如何在第一個 Job 完成之後,把特定的資訊,傳遞到第二個 Job 之中呢? 一般來說我們會想到 Pipeline Variable。底下這樣的輸出,可以建立出一個 Pipeline Variable,基本的設計是在 tasks 之間傳遞資訊: - powershell : | Write-Host "##vso[task.setvariable variable=myVar;]foo" - bash : | echo "##vso[task.setvariable variable=myVar;]foo" 上面這樣的指令可以定義一個名稱為 myVar 的變數,然後設定其值為 foo。 要使用其值,就可以採用 $(變數名稱) 這樣的指令: - powershell : | Write-Host "變數值: $(myVar)" - bash : | echo "變數值: $(myVar)" 問題是,上述的變數預設狀況下只能在單一的job之間使用,如果要pass到另一個job,得做些設定。首先,變數設定得多加一個 isOutput=true,表明要在下一個job中使用: 接著,要在第二個Job中,設定一個環境變數(例如下圖的B1StagePara),來承接第一個output變數myPara1: 這樣在第二個job中才可以使用。ok, 確實有點迂迴。 不過如此一般,你就可以順利的把第一個job產出的資訊,pass給第二個job了: 整段 Yaml 檔案如下: trigger : - main pool : vmImage : ubuntu - latest stages : - stage ...

敏捷導入流程 - ADAPT

圖片
端午節前,上課的時候,又有學員說到: 『老師,你說的這些都很對,但在公司裡面,老闆(PM/主管)就是沒法接受我花額外的時間來做這些(單元測試、重構…etc.)。而且同仁也不覺得這些東西(測試左移、敏捷開發、頻繁交付…etc.)有那麼重要…』 相信我,敏捷轉型和DevOps導入做久了,我常常碰到這個事情。 上周五我才在 Agile Summit 2023 分享這張圖,幾十分鐘演講我無法把心裡的感受 100% 講清楚,但我得說,組織數位轉型,如果只是技能(Ability)的教導,是很難很難很難達到推動的效果的。 因為同仁(或老闆)根本不認為自己有改變的需要。 因此,在培養同仁的能力(Ability)之前,先得營造團隊對於改變的渴望(Desire),而這必須從讓同仁和團隊意識(Awareness)到自己需要改變開始。(上圖) 過去很多公司把教育訓練(Ability)當作Awareness來使,不是不行,只是成效很勉強。上週五分享時,我們同仁有說過,Awareness的建立,很像是持續的在靜止的湖面一直丟一顆一顆的小石子,讓漣漪可以一波一波的傳遞出去。為了達成這件事,同仁用了很多策略,包含在企業內定期舉辦內部社群聚會、持續帶狀的發送電子報、持續舉辦的分享會和教育訓練、安排技能陪跑指導…這些都只是開始,經過了不斷的努力,成果才會慢慢開始看到。 這還有一個前提,就是大老闆對數位轉型在觀念上是支持的,因此不會挑戰你為何要做這些、那些…。然後,我們才有機會在企業內,依照這個循環,把一種技術、或一種方法逐漸落地、紮根,然後開始改變同仁的習慣,最後才能實踐轉型。 否則要不了多久,你帶入的所有新做法,都會被組織的慣性所掩蓋,同仁會逐漸回到原本那個樣子,船過水無痕。 數位轉型,說起來感覺很容易,得做過才知道箇中難處在哪裡。 『如果老闆就是不支持呢?』學員問。 我說:『那你做你的,不要跟老闆說。』我特別補充:『這不是我說的,這是Martin Fowler說的。』(圖二) 記得,你的關注範圍不要大於你的影響範圍,否則,你自己會很痛苦。(屈原就是這樣) 如果你的影響範圍目前就只有你自己的團隊,那就從你的團隊安安靜靜地開始做起。如果你做的事情是對的,要不了多久,你的成果就會被大家看到,你的影響範圍就有機會逐漸擴大,這時你的關注範圍(在組織內可進行轉型的影響半徑),就可...

在Azure DevOps CI CD Pipeline中直接發送LINE通知訊息

圖片
這是一個我很久以前就想實現的功能。 儘管Azure DevOps的Pipeline本身可以搭配WebHook,依照監聽的事件掛上各種通知,但相對來說比較不直覺,如果能夠在 Pipeline 中,直接透過某個Task來發送LINE通知,會方便很多。 使用的情境很廣,你可以在自動化建置(Build)或佈署(Deploy)的過程中,將成功與否的狀態,直接通知某一個群組或個人(主管、團隊Leader),並且留下紀錄。 我們採用 LINE Notify 最主要的原因是 – 迅速、免費。 LINE 這個 App 在台灣幾乎每台手機上都有安裝,沒有人沒有LINE。速度甚至比簡訊還快,所以作為通知方式是相當有效的。 申請 Token 來發送 LINE Notify 訊息 要發送 LINE Notify 訊息,其實很簡單。 任何人(只要你有LINE帳號),都可以到底下網址 https://notify-bot.line.me/ 免費建立一個 Token ,即可透過程式碼以自動化的方式發送訊息到你的LINE帳號,或是你指定的群組。 建立 LINE Notify Token 的方式如下: 如果要發送到群組,記得要將 LINE Notify 這個帳號邀請進入群組中,將來,訊息會透過統一的 LINE Notify 帳號發到你的 App 中,收到時類似底下這樣。參考上面的影片,下圖中的【test20230408】,就是你在建立權杖時候設定的名稱。 而自動化發送訊息方式,原本得透過 Rest API,相關的文件在底下: https://notify-bot.line.me/doc/en/ 寫程式當然比較麻煩,筆者為 LINE Notify 做了一個 Azure DevOps Task,有了 LINE Notify Task之後,就可以直接在 Azure DevOps Pipeline 中發送。 使用 LINE Notify Task 現在,你可以透過使用該 Task 直接在Pipeline中發送訊息: 該Task安裝位置如下: https://marketplace.visualstudio.com/items?itemName=tw-developer.LineNotify 你可以透過上面位置來安裝到組織中。 安裝好之後,即可直接在Pipeline...

使用AI(ChatGPT)對PR進行自動化 Code Reivew

圖片
趁著假日,今天來談談『使用AI(ChatGPT)對PR進行code reivew』這個話題。 這次我們談的code review,是指… 開發人員針對feature branch要merge回主線(master)前,所發出的PR(Pull-Request),在該PR中,常常會指定團隊中特定的資深開發人員(或Leader),針對修改的部分(就是PR所關聯的change內容,也就是feature branch中的commit)所進行的code review。 過去,這一段基本都採人工在送出PR之後進行的,請看底下這個GitHub Flow的圖: 一般來說,這個code review動作發生在上面框出的這一段。 後面那隻松鼠是什麼呢? 這邊是指PR-CI,也就是PR所觸發的CI Pipeline,一般而言,我們會在這個Pipeline當中,針對差異部分(這次PR修改的部分)做靜態程式碼掃描(code analysis)、單元測試(UT)…等動作,這個動作和上面框出的code review,往往會同步(甚至提前)進行。 如此一來,人工code reivew的時候,如果發現PR-CI的build沒過(或是UT沒過),那根本不用繼續 review 了,直接退回重改即可。 而現在我想談的『使用AI(ChatGPT)對PR進行code reivew』這個部分,就是採用ChatGPT(嚴格來說是Azure Open AI API)對於PR中差異部分的(這次PR修改的部分)進行 自動化code review 。 如何觸發自動化code review 由於ChatGPT的出現,我們可以透過AI對程式碼進行code review,而在Azure DevOps當中,只需要加入一個套件即可,該套件位於: https://marketplace.visualstudio.com/items?itemName=tw-developer.GPTPRReviewer 是一個免費套件。(但當然你OpenAI API呼叫多了是要錢的) 自動化code review,主要是針對PR中修改的部分,而非所有的程式碼,這很合理,否則每次CI Pipeline就會跑亂久了。針對差異掃描,並且頻繁簽入,才是正解。 也因此,你必須先具備底下條件: 設計一個在PR進行時,會被觸發的P...

透過Azure App Configuration實現Feature Toggle

圖片
Feature Toggle有很多名稱,也常被叫做 Feature Flag, Feature Switch…但不管他叫什麼名字,都無損他在這個時代的重要性。 為什麼重要? 他為這個時代所面對的問題,提供了適當的解決方案,這些問題包含: 實現A/B測試 實踐金絲雀佈署 實踐高強度的頻繁交付 實踐不同環境上的自動化佈署 … 乍看之下,上面這幾件事情都跟Feature Toggle無關,但實則有很大的關連性。在說明前,我們先理解一下 Feature Toggle 是甚麼? Feature Toggle的建立 他是一個後台控制的開關,與我們的程式碼有所連動,簡單的說,就是在我們的程式中,加上一些簡單的if…then判斷敘述,然後依照這個開關在後台所設定的on或off,來決定是否要執行(啟用)某個功能。 這麼簡單的機制,為何和自動化佈署有關? 又為何可以幫助我們實踐 A/B 測試? 先談『高強度的頻繁交付』,以及『在不同環境上實現自動化佈署』這件事。 如果你對CI/CD或敏捷開發有概念,大概能夠理解近代軟體開發都希望能夠頻繁交付,頻繁的程度因團隊而異,高強度的頻繁交付,可能需要一天更版數次,而無論是一天更版數次,或是一周交付數次,都意味著開發團隊很可能每天多次合併程式碼,在這種狀況下,程式碼版控的多分支方案(例如gitflow)將變得不可行,而會慢慢收斂成單一分支(feature branch)或根本沒有分支的狀態,在這種狀況下,程式碼的整合和交付將可以變得非常頻繁。 但衍生出一個副作用,就是在這個狀況下,開發到一半的功能怎麼辦? 如果團隊需要急著修復用戶反饋的某一個bug, 必須立刻整合上版,但卻又同時需要等某幾個功能都做完,才能一次上線,這就產生了矛盾。 這時,feature toggle就會派上用場,它可以幫我們在正式環境上,先關掉不想開放的功能,等幾個具有相依性的功能都完成,再從後台一次打開開關放行。 這就是feature toggle在近代敏捷開發與CI/CD潮流下,非常重要的原因,因為它有效的分離了釋出(Release)與(Deployment)。 可以實現佈署(Deployment),但不開放(Release)功能的效果。 配合A/B測試 與 金絲雀佈署 你可能有聽過 A/B Testing,它指的是,我們會在p...

使用Azure WebApp的Slot機制實現藍綠佈署

圖片
藍綠佈署是開發人員想實踐zero-downtime不停機更版的最佳實踐。底下這個例子,你會看到我們示範,當有新版的功能時,我們先將其佈署到 staging slot,然後交換 staging slot 與 production slot,在瞬間完成網站的更版。 優點在於: 不需要停機,沒有頓點,不像過去網站剛更新的時候,第一個使用的用戶會覺得卡卡的。 不會有任何用戶斷線或被登出。 有問題可以立即 rollback ,再swap回來就好,讓上新版變得安全可靠。 step: 15秒 --> 你會看到 staging slot,有獨立的網址 50秒 --> 將新版發佈到 staging slot 1’36秒 --> swap 正式機與staging slot 2’03秒 --> 正式機上出現新網站,由於已經在staging運行過,上版時瞬間可運行,不卡頓

Azure DevOps in Action - 在Build Pipeline當中加入自動化程式碼檢查

圖片
在CI Pipeline當中,想要持續提升開發品質,除了單元測試,靜態程式碼檢查也很重要。在Build Pipeline運行過程中,適度的加上程式碼檢查工具,可以幫助我們掃描程式碼的狀況,檢查是否有具有潛在風險的程式碼。 我們常聽到的程式碼壞味道(code bad smells),或是技術債(technical debt),都是靜態程式碼檢查的主要標的。 技術債這個概念是1992年,由Ward Cunningham首次提出。而後常出現於Martin Fowler等大師的文章中。泛指為了縮短開發時程,而在開發過程中做出的妥協(像是安全性、測試、變數的命名…等)雖然可以得到立即的效果,但未來將可能連本帶利付上更大代價。 而SonarCloud,就是這類掃描工具中的翹楚,他是一個獨立的第三方產品,但可以跟Azure DevOps Pipeline做很好的整合。 要在Build Pipeline當中加入SonarCloud進行程式碼檢查非常容易,你只需要到SonarCloud.io申請帳號,並且在Azure DevOps站台上安裝免費套件後,即可進行這樣的掃描。 整個服務完全免費。 安裝SonarCloud 要使用該服務在Build Pipeline上,首先得安裝套件,請至底下網址: https://marketplace.visualstudio.com/items?itemName=SonarSource.sonarcloud 在出現下列畫面時,選擇 Get it free: 接著在出現的畫面中,選擇你的組織(站台),然後按下Install即可: 安裝完成後,你會發現在建立Pipeline的時候,多了幾個Tempalte: 上面這幾個『…With SonarCloud』的Build Process Tempalte,就是安裝套件後,自動幫您加上的。針對 .Net Core和傳統 .Net Framework環境的開發專案,都有著適合的建置範本可供參考。 申請帳號 在使用之前,我會建議你,先到 https://sonarcloud.io/ 這個站台建立帳號,你只需要透過Azure DevOps帳號(也就是MS Account)即可以Single-Sign-On的方式,取得SonarCloud帳號: 進入SonarCloud的P...

Azure DevOps in Action - 透過Trigger實現CI

圖片
在 上一篇 ,我們介紹過如何建立Build Pipeline,完成自動化的建置之後,我們接著要來看如何透過Build Process中的Trigger實現CI(Continuous Integration)。 也就是說,我們要讓雲端上的CI Build Pipeline在有任何程式碼被簽入(異動)的時候,自動運行雲端的Build 我們來修改一下上面這段程式,讓CI Build可以正確地完成Pipeline中的每一個tasks。 但在開啟Visual Studio 2019進行程式碼修改之前,我們先在Pipeline上做一件事情,請點選下圖的Edit切換到Pipeline設計畫面: 進入到設計畫面之後,請在Triggers分頁,勾選『enable continuous integration』: 請留意上圖中的A選項,這意味著, 若source code所在的repo中,master分支上的code有所異動時(不管是直接修改或是透過PR修改),就會自動觸發這個Pipeline進行自動建置 ,這就是所謂的CI(continuous integration)。 設計完成之後,這次我們只需要選擇Save,暫時先不queue一個執行個體(instance): 因為我們要讓你體驗看看CI Build的威力,待會讓CI機制幫我們自動觸發Build Process。 請依照上圖儲存完之後,回到你用戶端剛才Visual Studio 2019開啟的專案(如果你不想使用Visual Studio 2019,其實也可以用Azure DevOps內建的Web UI,這部分我們日後介紹),我們把關鍵程式碼(\WebBMI\HealthMgr\BmiCalculator.cs)從int改成float: 完成後,我們透過Git工具將程式碼同步到伺服器端: 當同步完成後,我們可以切換到Azure DevOps管理站台,你會發現由於我們修改了master分支上的程式碼,雲端的Pipeline CI Build被自動觸發了: 同時,由於我們把程式碼改成正確的了,因此Unit Test順利過關: 整個CI Build自動完成了。 到這邊,我們可以看到幾個結論: Pipeline可以在雲端對專案作自動化的建置。 如果將Pipeline的Trigger設定...