備份Azure DevOps Service 的 Repository 檔案

今天要來談談如何備份在Azure DevOps Service上面的Repository。為什麼需要這樣做?既然都用雲端服務,為甚麼還需要把雲端服務的檔案備份呢?主要在有時基於所謂"資安"或是"ISO2XXXX"相關條文就需要做到這一點。當然,另一種就是對於所謂"雲端"抱持的存疑或是其他的不安全關係,必須做到這一點。我想如果今日是使用Azure DevOps Server可能就不會需要這樣子做吧。
不過,既然有這樣需求存在,要去備份Azure DevOps Service上面的Repository也不是不可能。要做到這樣方式也不難,不過,如果靠手工做這件事情,又相當的不先進。因此,我們來透過自動化方式外加使用Azure DevOps Service的Release排程來完成定時備份Azure DevOps Service的Repository
作法依序為下列幾個步驟
- 取得Azure DevOps 專案內的所有Repository 名稱
- 用Git Clone所有Repository
- 用Git Pull 定期同步所有Repository
首先,先設定幾個變數吧
$PATToken="PAT"
$base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($PATToken)"))
$AzureDevopsOrg="Organization Name"
$AzureDevOpsProject="Project Name"
$LocalfilePath="Backup File Path"
- $PATToken: 取得Azure DevOps的PAT Token,其中權限可以只開針對Repository部分就好
- $base64AuthInfo: 轉換成Base64編碼,等下呼叫Azure DevOps API會需要用到
- $AzureDevopsOrg: Azure DevOps 組織名稱。名稱為在於dev.azure.com/組織名
- $AzureDevOpsProject: Azure DevOps要備份的專案名稱
- $LocalfilePath: 要儲存的位置,這邊會設定在地端或是某台VM的儲存位置
然後,就是呼叫Azure DevOps Service API,取得該專案內所有的Repository
$ProjectUrlAPI = "https://dev.azure.com/$($AzureDevopsOrg)/$($AzureDevOpsProject)/_apis/git/repositories?api-version=6.1-preview.1" $Repo = (Invoke-RestMethod -Uri $ProjectUrlAPI -Method Get -UseDefaultCredential -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)})
透過_apis/git/repositories?api-version=6.1-preview.1
這個API就可以抓到該專案下所有的Repos Name
$RepoName= $Repo.value.name
當有了所有Repos Name,接下來就好辦事了,只要透過Git 指令,就可以進行Clone或是Pull 等動作。
在這邊因為只有第一次或是遇到新的Repos才需要做Clone,其餘,只需要做Pull更新就好,不然每次都做Clone,不僅費時,還必須把原本的檔案給刪除,這樣不切實際
ForEach ($name in $RepoName){ $ReposUrl="https://anything:$($PATToken)@dev.azure.com/$($AzureDevopsOrg)/$($AzureDevOpsProject.Replace(" ","%20"))/_git/$($name.replace(" ","%20"))" $FilePath="$($LocalfilePath)\$($name)"
if(Test-Path $FilePath) {
cd $FilePath
git pull origin Develop
git pull origin master
}
else {
git clone $ReposUrl $FilePath -b master
}
}
在這裡的Pull我會同步兩個Branch,而Clone我會先特別指定是要master Branch,畢竟,不一定每個Repos的預設Branch會是Master,我想先要備份在Master版本的Code就好。
不過,最後發現如果用Pull兩個branch,其實,是否一開始一定要指定Clone Branch似乎也不那樣重要了。
這些Powershell寫好後。就是來設定Azure DevOps Service上的Release功能`只要新建立一個Release Pipeline,然後,在Task中選擇Powershell

然後把備份的PowerShell Code放入

最後,只要設定要跑這個Release的時程,這樣就可以。就可以做到定期的備份Azure DevOps Service上面的Repos。不過,記住這邊使用的Agent,一定要使用地端的Agent,才可以備份到地端。當然如果要備份到Azure,也是可以的
完整的Code,請參考我的Github