備份Azure DevOps Service 的 Repository 檔案

Edward Kuo
Oct 25 · 6 min read
Image for post
Image for post

今天要來談談如何備份在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

Image for post
Image for post

然後把備份的PowerShell Code放入

Image for post
Image for post

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

完整的Code,請參考我的Github

https://github.com/edwardkuo/AzureDevOpsReposBackup

Edward Kuo

Written by

Enterprise IT Manager / Microsoft Regional Director / Microsoft MVP / DevOps Expert / Speaker, About me: https://profile.edwardkuo.dev/about/

EK.Technology Learn

Design,Thinking,Coding & have fun every thing

Edward Kuo

Written by

Enterprise IT Manager / Microsoft Regional Director / Microsoft MVP / DevOps Expert / Speaker, About me: https://profile.edwardkuo.dev/about/

EK.Technology Learn

Design,Thinking,Coding & have fun every thing

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store