Search code examples
azureazure-devopscontinuous-integrationazure-devops-rest-apiazure-devops-extensions

Azure DevOps repo Backup Copy


We have created repository on https://dev.azure.com/ It's working fine. Now my manager wants a backup copy of this repository on a regular basis. I explained to manager that https://dev.azure.com/ is managed as SAAS by MS so repo is safe always. But he wants a copy of own. It is what is it!!

I thought of few options: a) Get latest on any developer machine and take backup into tape device
b) Use some infra of Azure DevOps to keep backup on Azure Storage

How feasible is option b?

Is backup of Azure DevOps possible with all past check-in history?

Any backup service on Azure DevOps that I can link with Azure Storage?

Is incremental backup possible using some xyz service on Azure DevOps?


Solution

  • How feasible is option b?

    It's possible in Azure Devops Service. What you need is a Yaml pipeline which triggers all branches.

    You can use command line task to backup the repo into {RepoName}.git folder, and then copy this folder into Azure Storage using Azure File Copy task. Similar to this:

    trigger:
      branches:
        include:
        - '*'
    
    pool:
      vmImage: 'windows-latest'
    
    steps:
      - task: CmdLine@2
        inputs:
          script: 'git clone --mirror https://{Your PAT}@dev.azure.com/{OrgName}/{ProjectName}/_git/{RepoName}'
    
      - task: ArchiveFiles@2
        inputs:
          rootFolderOrFile: '$(System.DefaultWorkingDirectory)/{RepoName}.git'
          includeRootFolder: true
          archiveType: 'zip'
          archiveFile: '$(Build.ArtifactStagingDirectory)/Backup.zip'
          replaceExistingArchive: true
    
      - task: AzureFileCopy@4
        displayName: 'AzureBlob File Copy'
        inputs:
          SourcePath: '$(Build.ArtifactStagingDirectory)/Backup.zip'
          azureSubscription: xxxx
          Destination: AzureBlob
          storage: xxxxxxxx
          ContainerName: arm
          BlobPrefix: test
    

    Details:

    1.CI Trigger with wildcard(*) can monitor all your branches. So if there's any update with your repo, the pipeline will be triggered to run.

    2.The cmd task calls git clone --mirror to make the copy of your git repo. To copy Azure Git repo in cmd task with PAT, you can follow the format here:

    git clone https://{yourPAT}@dev.azure.com/yourOrgName/yourProjectName/_git/yourRepoName

    This command will create a RepoName.git folder which contains the copy of your repo in this path: $(System.DefaultWorkingDirectory). To create PAT, you only need to create one with Code-read access scope:

    enter image description here

    3.The logic is: If there's any change to your source repo=>The pipeline will be triggered=>It make a latest copy in DefaultWorkingDirectory(CMD task)=>Archive this copy into a Backup.zip file(Archive file task=>Azure File copy task will copy this Backup.zip to Azure storage blobs)