Azure Artifacts akışını özel powershell deposu olarak kullanma

Azure DevOps Hizmetleri

Azure Artifacts, PowerShell betiklerini paylaşmak için kullanışlı bir çözüm sağlar. Azure Artifacts akışlarını kullanarak PowerShell modüllerinizi komut satırından sorunsuz bir şekilde yayımlayabilir ve akış ayarlarınız aracılığıyla bunlara erişimi denetleyebilirsiniz. Bu makale, Azure Artifacts akışınızı PowerShell modüllerinizi depolamak ve paylaşmak için özel bir PowerShell deposu olarak ayarlama işleminde size yol gösterir.

Bu makalede şunları yapmayı öğreneceksiniz:

  • Kişisel Erişim Belirteci Oluşturma
  • PowerShell modülü oluşturma
  • SecretStore kasası oluşturun ve bir depo kaydedin
  • Bir akıştan paketleri yayımlama ve tüketme

Önkoşullar

Not

Azure Artifacts Kimlik Bilgisi Sağlayıcısı PSResourceGet ile desteklenmez.

Kişisel erişim belirteci oluşturma

Kişisel erişim belirteci, dijital kimliğiniz olarak görev yapar ve Azure DevOps ile kimliğinizi doğrulamak için alternatif bir parola görevi görür.

  1. Azure DevOps kuruluşunuza gidin https://dev.azure.com/<ORGANIZATION_NAME>/

  2. Kullanıcı ayarları simgesini seçin, Kişisel erişim belirteçleri'ni ve ardından Yeni Belirteç'i seçin.

  3. PAT’niz için bir ad girin, Son kullanma tarihi ayarlayın, Özel tanımlı seçeneğini belirleyin ve ardından PaketlemeOkuma, yazma ve yönetme seçeneğini belirleyin.

  4. İşiniz bittiğinde Oluştur'u seçin ve PAT'nizi kopyalayıp güvenli bir konumda depoladığınızdan emin olun.

    Yeni bir kişisel erişim belirtecinin nasıl ayarlandığını gösteren ekran görüntüsü.

PowerShell modülü oluşturma

Kendi modülünüz yoksa, örnek bir PowerShell modülü oluşturmak için bu bölümdeki yönergeleri izleyin. Aksi takdirde, sonraki adıma geçin:

  1. PowerShell-Demo adlı yeni bir klasör oluşturun. Klasörünüzde gezinin ve yeni bir PowerShell-Demo.psm1 dosyası oluşturun.

  2. Aşağıdaki betiği PowerShell-Demo.psm1 dosyanıza yapıştırın:

    Function PowerShell-Demo{
        Write-Host "Hello World!"
    }
    
  3. PowerShell-Demo dizininizde aşağıdaki komutu çalıştırarak modül bildirimini oluşturun:

    New-ModuleManifest -Path .\PowerShell-Demo.psd1
    
  4. PowerShell-Demo.psd1 dosyanızı açın ve değişkenini bulun. Bu ayar, modül içeri aktarıldığında PowerShell'in yüklendiği ana betik dosyasını belirtir. Boş dizeyi PowerShell-Demo.psm1 dosyanızın yoluyla değiştirin:

    RootModule = 'PowerShell-Demo.psm1'
    
  5. FunctionsToExport bölümünde, modülünüzü içeri aktaran kullanıcılara hangi işlevlerin erişebileceği belirtiliyor. PowerShell-Demo işlevinizi ekleyin:

    FunctionsToExport = @('PowerShell-Demo')
    
  6. FileList Modülü paketleme sırasında dahil edilen dosyaların listelendiği bölümü bulun. Modülünüzle birlikte paketlemek istediğiniz dosyayı ekleyin:

    FileList = @('./PowerShell-Demo.psm1')
    

Depo kaydetme

  1. Bir kimlik bilgisi nesnesi oluşturmak için aşağıdaki komutu çalıştırın. Yer tutucuları doğru bilgilerle değiştirin.

    $username = "<USER_NAME>"
    $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force
    
    $credentials = New-Object System.Management.Automation.PSCredential($username, $patToken)
    
  2. SecretManagement ve SecretStore'un yüklü olduğundan emin olun, ardından bir kasa oluşturmak ve bir giz eklemek için aşağıdaki komutu çalıştırın:

    Register-SecretVault -Name "MySecretVault" -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault
    
    Set-Secret -Name "MyCredential" -Secret $credentials -Vault "MySecretVault"
    
    $CredentialInfo = [Microsoft.PowerShell.PSResourceGet.UtilClasses.PSCredentialInfo]::new('MySecretVault', 'MyCredential')
    
  3. Kasanın ve gizli anahtarın başarıyla oluşturulup oluşturulmadığını doğrulamak için, tüm gizli anahtarlarınızı listelemek üzere aşağıdaki komutu çalıştırın:

    PS > Get-SecretInfo
    
    Name            Type         VaultName
    ----            ----         ---------
    MyCredential    PSCredential MySecretVault
    
    
  4. PowerShell deponuzu kaydetmek için aşağıdaki komutu çalıştırın. SourceLocation bağlantısını, Artifacts>Connect to FeedNuGet.exe yolunu izleyerek, Project setup bölümü altındaki kaynak URL’sinde bulabilirsiniz.

    • Proje kapsamındaki akış:

      Register-PSResourceRepository -Name "PowershellPSResourceRepository" `
          -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" `
          -Trusted `
          -CredentialInfo $CredentialInfo
      
    • Kuruluş kapsamındaki akış:

      Register-PSResourceRepository -Name "PowershellPSResourceRepository" `
          -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" `
          -Trusted `
          -CredentialInfo $CredentialInfo
      

    İpucu

    Bazı PowerShell sürümleri, paket kaynağı çözümlenemiyor uyarısıyla Register-PSResourceRepository karşılaşmamak için cmdlet'i çalıştırdıktan sonra yeni bir oturum başlatmayı gerektirebilir.

  5. Deponun başarıyla kaydedilip kaydedilmediğini doğrulamak için, geçerli kullanıcının tüm kayıtlı depolarını almak üzere aşağıdaki komutu çalıştırın:

    Get-PSResourceRepository
    

Not

Şu hatayla karşılaşırsanız: Yanıt durum kodu başarıyı göstermiyor: 404 (Bulunamadı)., kaynak URL'nizin nuget/v2 yerine nuget/v3/index.json işaret ettiğinden emin olun.

Bir paket yayımlayın

Paketi akışınızda yayımlamak için aşağıdaki komutu çalıştırın. Yer tutucuları paket yolunuz, depo adı, daha önce oluşturduğunuz kimlik bilgisi nesnesiyle değiştirin ve ApiKey için herhangi bir dize sağlayın.

Publish-PSResource -Path <PACKAGE_PATH> -Repository <REPOSITORY_NAME> -Credential $credentials -ApiKey <ANY_STRING>

Örnek:

PS C:\AzureDevOps\Demos\PowerShellDemo> Publish-PSResource -Path .\scripts\ -Repository FabrikamFiberFeed -Credential $credentials -ApiKey az -verbose
VERBOSE: Performing the operation "Publish-PSResource" on target "Publish resource
'C:\AzureDevOps\Demos\PowerShellDemo\scripts\' from the machine".
VERBOSE: The newly created nuspec is:
C:\Users\xxxx\AppData\Local\Temp\xxxxxxxxx\PowerShell-Demo.nuspec
VERBOSE: credential successfully read from vault and set for repository: FabrikamFiberFeed
VERBOSE: Successfully packed the resource into a .nupkg
VERBOSE: Successfully published the resource to
'https://pkgs.dev.azure.com/ramiMSFTDevOps/DemoProject/_packaging/FabrikamFiberFeed/nuget/v3/index.json'
VERBOSE: Deleting temporary directory 'C:\Users\xxxx\AppData\Local\Temp\xxxxxxx'

Akışta yayımlanan PowerShell tanıtım paketini gösteren ekran görüntüsü.

Paketi yükleme

  1. Modülün deponuzda kullanılabilir olup olmadığını onaylamak için aşağıdaki komutu kullanarak bu modülü arayın:

    Find-PSResource -Name <RESOURCE_NAME> -Repository <REPOSITORY_NAME> -verbose
    
  2. Modülünüzün en son kararlı sürümünü yüklemek için aşağıdaki komutu çalıştırın:

    Install-PSResource <MODULE_NAME>
    

İpucu

Şu hatayla karşılaşırsanız: "WriteObject" çağrılırken özel durum oluştu., yeni bir PowerShell penceresi açın ve Get-SecretInfo komutunu çalıştırın. SecretStore zaman aşımı süresi dolabileceğinden, Find-PSResource ve Install-PSResource komutlarını çalıştırmadan önce kasa parolanızı girin. Varsayılan PasswordTimeout 900 saniyedir, ancak bu değeri gerektiği gibi değiştirebilirsiniz. Daha fazla ayrıntı için Otomasyonda SecretStore kullanımı konusuna bakın.

Bu makalede şunları yapmayı öğreneceksiniz:

  • Kişisel Erişim Belirteci Oluşturma
  • PowerShell modülü oluşturma, paketleme ve yayımlama
  • Bir akışa PowerShell deposu olarak bağlanın
  • Azure Pipelines kullanarak PowerShell modülü kaydetme ve yükleme

Önkoşullar

  • Henüz yapmadıysanız bir Azure DevOps kuruluşu ve proje oluşturun.

  • Halihazırda bir akışınız yoksa yeni bir tane oluşturun.

  • Azure Artifacts Kimlik Bilgisi Sağlayıcısı'nı yükleyin.

  • Windows MSBuild'i aşağıdaki seçeneklerden birini kullanarak yükleyin:

  • Yükleyin NuGet(.exe) sürümünün 4.8.0.5385 veya daha yeni olanını.

  • dotnet runtime sürümünün 8.0.x veya üzeri bir sürümünü yükleyin.

  • Uygun PowerShellGet ve PackageManagement sürümlerine sahip olduğunuzdan emin olmak için PowerShell 6.0 veya üzerini yükleyin.

Kişisel erişim belirteci oluşturma

Kişisel erişim belirteci, dijital kimliğiniz olarak görev yapar ve Azure DevOps ile kimliğinizi doğrulamak için alternatif bir parola görevi görür.

  1. Azure DevOps kuruluşunuza gidin https://dev.azure.com/<ORGANIZATION_NAME>/

  2. Kullanıcı ayarları simgesini seçin, Kişisel erişim belirteçleri'ni ve ardından Yeni Belirteç'i seçin.

  3. PAT’niz için bir ad girin, Son kullanma tarihi ayarlayın, Özel tanımlı seçeneğini belirleyin ve ardından PaketlemeOkuma, yazma ve yönetme seçeneğini belirleyin.

  4. İşiniz bittiğinde Oluştur'u seçin ve PAT'nizi kopyalayıp güvenli bir konumda depoladığınızdan emin olun.

    Yeni bir kişisel erişim belirtecinin nasıl ayarlandığını gösteren ekran görüntüsü.

PowerShell modülü oluşturma

Kendi modülünüz yoksa, örnek bir PowerShell modülü oluşturmak için bu bölümdeki yönergeleri izleyin. Aksi takdirde, sonraki adıma geçin:

  1. Get-Hello adlı yeni bir klasör oluşturun. Klasörünüzde gezinin ve yeni bir Get-Hello.psm1 dosyası oluşturun.

  2. Aşağıdaki betiği Get-Hello.psm1 dosyanıza yapıştırın:

    Function Get-Hello{
        Write-Host "Hello Azure DevOps!"
    }
    
  3. Get-Hello dizininizde aşağıdaki komutu çalıştırarak modül bildirimini oluşturun:

    New-ModuleManifest -Path .\Get-Hello.psd1
    
  4. Get-Hello.psd1 dosyanızı açın ve değişkenini bulun. Bu ayar, modül içeri aktarıldığında PowerShell'in yüklendiği ana betik dosyasını belirtir. Boş dizeyi Get-Hello.psm1 dosyanızın yoluyla değiştirin:

    RootModule = 'Get-Hello.psm1'
    
  5. FunctionsToExport bölümünde, modülünüzü içeri aktaran kullanıcılara hangi işlevlerin erişebileceği belirtiliyor. Get-Hello işlevinizi ekleyin:

    FunctionsToExport = @('Get-Hello')
    
  6. FileList Modülü paketlerken dahil edilen dosyaları belirten bölümü bulun. Modülünüzle birlikte paketlemek istediğiniz dosyayı ekleyin:

    FileList = @('./Get-Hello.psm1')
    

Modülü paketleme ve yayımlama

  1. Modülünüz için bir nuspec dosyası oluşturun. Bu komut, modülü paketlemek için gerekli meta verileri içeren bir Get-Hello.nuspec dosyası oluşturur:

    nuget spec Get-Hello
    
  2. Modülünüzü paketlemek için aşağıdaki komutu çalıştırın:

    nuget pack Get-Hello.nuspec
    
  3. Akış kaynağı URL'nizi eklemek için aşağıdaki komutu çalıştırın. NuGet V3 desteklenmediğinden, akış kaynağı URL'nizde V2 kullandığınızdan emin olun.

    • Kuruluş kapsamındaki akış:

      nuget sources Add -Name "<FEED_NAME>" -Source "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -username "<USER_NAME>" -password "<PERSONAL_ACCESS_TOKEN>"
      
    • Proje kapsamındaki akış:

      nuget sources Add -Name "<FEED_NAME>" -Source "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -username "<USER_NAME>" -password "<PERSONAL_ACCESS_TOKEN>"
      
  4. Paketi akışınızda yayımlayın:

    nuget push -Source "<FEED_NAME>" -ApiKey "<ANY_STRING>" "<PACKAGE_PATH>"
    

Önemli

Modül Bildiriminizdeki (.psd1) sürüm numarası, .nuspec dosyanızdaki sürüm numarasıyla aynı olmalıdır.

Bir akışa PowerShell deposu olarak bağlanın

Bu bölüm, bir akışla PowerShell deposu olarak kimlik doğrulaması gerçekleştirme ve akışınızda barındırılan bir modülü kullanma konusunda size yol gösterir:

  1. Bir PowerShell istemi penceresinde, kimlik bilgilerinizi ayarlamak için aşağıdaki komutu çalıştırın. Yer tutucuları uygun bilgilerle değiştirin.

    $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force
    
    $credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
    
  2. PowerShell deponuzu kaydedin. SourceLocation bağlantısını, Artifacts>Connect to FeedNuGet.exe yolunu izleyerek, Project setup bölümü altındaki kaynak URL’sinde bulabilirsiniz.

    • Proje kapsamındaki akış:

      Register-PSRepository -Name <REPOSITORY_NAME> -SourceLocation "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -PublishLocation "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -InstallationPolicy Trusted -Credential $credsAzureDevopsServices
      
    • Kuruluş kapsamındaki akış:

      Register-PSRepository -Name <REPOSITORY_NAME> -SourceLocation "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -PublishLocation "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -InstallationPolicy Trusted -Credential $credsAzureDevopsServices
      

    İpucu

    Bazı PowerShell sürümleri, paket kaynağı çözümlenemiyor uyarısıyla Register-PSRepository karşılaşmamak için cmdlet'i çalıştırdıktan sonra yeni bir oturum başlatmayı gerektirebilir.

  3. Paket kaynağınızı kaydedin:

    • Proje kapsamındaki akış:

      Register-PackageSource -Name <REPOSITORY_NAME> -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices
      
    • Kuruluş kapsamındaki akış:

      Register-PackageSource -Name <REPOSITORY_NAME> -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices 
      

    Not

    • Register-PSRepository: Modülleri bulmak ve yüklemek için PowerShell deposunu kaydetmek için kullanılır.
    • Register-PackageSource: Paketleri bulmak ve yayımlamak üzere bir paket kaynağını kaydetmek için kullanılır.
  4. Deponun başarıyla kaydedilip kaydedilmediğini doğrulamak için, geçerli kullanıcının tüm kayıtlı depolarını almak üzere aşağıdaki komutu çalıştırın:

    Get-PSRepository
    
  5. Get-Hello modülünü yüklemek için aşağıdaki komutu çalıştırın.

    Install-Module -Name <PACKAGE_NAME> -Repository <REPOSITORY_NAME>
    

Not

Kuruluşunuz bir güvenlik duvarı veya ara sunucu kullanıyorsa Azure Artifacts Etki Alanı URL'lerine ve IP adreslerine erişime izin verdiğinizden emin olun.

İşlem hattınızdan paket yükleme

Bu örnek, Azure Artifacts akışıyla kimlik doğrulaması gerçekleştirme ve işlem hattınızdan bir PowerShell modülü yükleme konusunda size yol gösterir. Kişisel erişim belirtecinizi kullanmak için aşağıda gösterildiği gibi bir işlem hattı değişkeni olarak ekleyin:

  1. Azure DevOps kuruluşunuzda oturum açın ve projenize gidin.

  2. İşlem hatları'na tıklayın, işlem hattı tanımınızı seçin ve ardından düzenle'yi seçerek işlem hattınızı değiştirin.

  3. Sağ üst köşedeki Değişkenler'i ve ardından Yeni değişken'i seçin.

  4. Değişkeniniz için bir Ad girin ve kişisel erişim belirtecinizi Değer metin kutusuna yapıştırın.

  5. Bu değeri gizli tut onay kutusunu seçtiğinizden emin olun. İşiniz bittiğinde Tamam'ı seçin.

  6. userName'iniz için ikinci bir değişken ekleyin. Değişkeniniz için bir Ad girin, ardından Değer metin kutusuna userName’inizi girin.

  7. Bitirdiğinizde Kaydet'i seçin.

trigger:
- main

pool:
  vmImage: 'Windows-latest'

variables:
  PackageFeedEndpoint: 'https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2' ## For organization scoped feeds use'https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2'

steps:
- powershell: |
    $pat = ConvertTo-SecureString ${env:pat_token} -AsPlainText -Force
    $credential = New-Object System.Management.Automation.PSCredential("${env:userName}", $pat)
    Register-PSRepository -Name <REPOSITORY_NAME> -SourceLocation "$(PackageFeedEndpoint)" -InstallationPolicy Trusted -Credential $credential
  displayName: 'Register PSRepository'
  env:
    pat_token: $patToken
    userName: $userName

- powershell: |
    nuget install <PACKAGE_NAME> -Source "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json"
  displayName: 'Install module'

Kurumsal dağıtımlar ve gelişmiş güvenlik için, adlandırılmış kullanıcı hesaplarından bağımsız olarak SYSTEM_ACCESSTOKEN Azure Artifact akışına erişmek için kullanılabilir. Bu bağlamda kullanıcı adı gerekli değildir ve parametre gereksinimlerini karşılamak için rastgele bir dize olabilir.

steps:
  - powershell: |
      $token = $env:SYSTEM_ACCESSTOKEN | ConvertTo-SecureString -AsPlainText -Force
      $credential = New-Object System.Management.Automation.PSCredential('ArbitraryPipelineUser', $token)
      Register-PSRepository -Name <REPOSITORY_NAME> -SourceLocation "$(PackageFeedEndpoint)" -InstallationPolicy Trusted -Credential $credential
    displayName: 'Register PSRepository'
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)