Azure CLI kullanarak Azure DevOps'taki tüm depoları klonlama


Pek çok farklı bilgisayar kullanıyorum ve bilgisayarlarımın görüntülerini çok sık yeniden oluşturma gibi bir özelliğim var. Sonuç olarak bu, kendimi sıklıkla yeni kurulan bir bilgisayarın önünde otururken bulduğum anlamına geliyor.

Her zaman yeni bir bilgisayarda yaptığım şeylerden biri, Azure DevOps'taki kişisel kuruluşumdan notlarımı ve gittiğim her yerde kullanılmasını istediğim çeşitli araçları içeren bir dizi depoyu klonlamaktır. Diğer bir senaryo ise, bir müşteriye ulaştığımda bana Azure DevOps'ta katkıda bulunmam gereken depolar içeren bir dizi projeye erişim izni vermesidir.

Bu senaryoların her ikisinde de kendi URL'lerimi kopyalayıp yapıştırırken buluyorum ve git clone'u birkaç kez çalıştırıyorum. Kulağa çok zor gelmediğini biliyorum ama bir şeyi birden fazla yapmaktan gerçekten hoşlanmıyorum!

Peki ne yapmalı? Elbette PowerShell'i kullanalım!

Azure DevOps ile entegrasyona yönelik, gerçekten kullanışlı bulduğum bir Azure CLI uzantısı var. Azure CLI'de mevcut olan çok sayıda uzantının farkında olmayan kaç kişiyle tanıştığıma şaşırdım, bu yüzden erişimim olan tüm Azure depolarını klonlamak için bunu nasıl kullanabileceğimi paylaşacağımı düşündüm. Azure DevOps.

Azure CLI'yi yüklemenin zamanı gelmediyse, zaten Azure CLI'nin yüklü olduğunu varsayıyorum.

Öncelikle oturum açmamız gerekiyor. Bu, “az giriş” çağrısı yapılarak yapılır. Azure'da herhangi bir aboneliğe erişimim yoksa " -allow-no-subscriptions" parametresini eklemem gerekecek.

az login --allow-no-subscriptions

O zaman doğru uzantının kurulu olduğundan emin olmalıyız. Yüklü uzantılar şu komutla listelenebilir:

az extension list

Yüklü çok sayıda uzantı varsa bu liste biraz bunaltıcı olabilir. Çıktıyı JSON'dan PowerShell kullanarak nesnelere dönüştürebilir ve ardından listeyi PowerShell'deki diğer herhangi bir şeyde yaptığım gibi filtreleyebilirim. Ancak Azure CLI'de filtrelemenin yerel bir yolu var; o halde neden bunu kullanmayasınız? Azure CLI, JMESPath ifadesini alan “-query” adlı bir parametreye sahiptir. JMESPath, XPath'a benzer, ancak XML yerine JSON için https://jmespath.org/ adresinde belgelenmiştir.

Uzantıları listelediğimde aldığım yanıt bir dizi uzantıdır. Filtrelemek için şu ifadeyi kullanabilirim: '[?name == 'azure-devops''].name'. Ayrıca Azure CLI'ye, "-o tsv" parametresini ekleyerek sonucu JSON yerine sekmeyle ayrılmış biçimde çıkarmasını söyleyebilirim. Burada sadece bir ismi geri alacağım için bu bana çok uygun.

az extension list  --query '[?name == ''azure-devops''].name' -o tsv

'Azure-devops'u geri alırsam, hazırım! Hiçbir şey geri alamazsam devops uzantısını yüklemem gerekiyor. Bu çalıştırılarak yapılır:

az extension add --name 'azure-devops'

Artık Azure DevOps'a bazı sorgular göndermeye hazırız! Azure DevOps'ta depoları listelemek için kuruluş URL'sini ve proje adını sağlamamız gerekir. Kuruluş adını bir değişkene kaydedelim ve bunu tüm projeleri listelemek için kullanalım. Bir kez daha yalnızca isimleri geri almak için bir sorgu kullanıyoruz ve çıktıyı tsv olarak almayı seçiyoruz.

$Organization = 'https://dev.azure.com/SimonWahlin'
$Projects = az devops project list --organization $Organization --query 'value[].name' -o tsv

Artık her projedeki tüm depoları listelemeye hazırım!

foreach ($Proj in $Projects) {
  az repos list --organization $Organization --project $Proj | ConvertFrom-Json
}

Bu, her depo için bir nesnenin çıktısını verecektir. webUrl özelliğinde bulunuyorsa, https kullanılarak klonlamanın yolu. Şimdi bunu birleştirirsek aşağıdaki betiği elde ederiz:

param(
    [string]$Organization
)

if ($Organization -notmatch '^https?://dev.azure.com/\w+') {
    $Organization = "https://dev.azure.com/$Organization"
}

# Make sure we are signed in to Azure
$AccountInfo = az account show 2>&1
try {
    $AccountInfo = $AccountInfo | ConvertFrom-Json -ErrorAction Stop
}
catch {
    az login --allow-no-subscriptions
}

# Make sure we have Azure DevOps extension installed
$DevOpsExtension = az extension list --query '[?name == ''azure-devops''].name' -o tsv
if ($null -eq $DevOpsExtension) {
    $null = az extension add --name 'azure-devops'
}

$Projects = az devops project list --organization $Organization --query 'value[].name' -o tsv
foreach ($Proj in $Projects) {
    if (-not (Test-Path -Path ".\$Proj" -PathType Container)) {
        New-Item -Path $Proj -ItemType Directory |
        Select-Object -ExpandProperty FullName |
        Push-Location
    }
    $Repos = az repos list --organization $Organization --project $Proj | ConvertFrom-Json
    foreach ($Repo in $Repos) {
        if(-not (Test-Path -Path $Repo.name -PathType Container)) {
            Write-Warning -Message "Cloning repo $Proj\$($Repo.Name)"
            git clone $Repo.webUrl
        }
    }
}

Azure CLI'yi nasıl kullanıyorsunuz? Deneyiminizi yorumlarda paylaşın!

İlgili makaleler