Używanie źródła danych usługi Azure Artifacts jako prywatnego repozytorium programu PowerShell
Azure DevOps Services
Usługa Azure Artifacts udostępnia wygodne rozwiązanie do udostępniania skryptów programu PowerShell. Za pomocą kanałów informacyjnych usługi Azure Artifacts można bezproblemowo publikować moduły programu PowerShell z poziomu wiersza polecenia i kontrolować dostęp do nich za pośrednictwem ustawień kanału informacyjnego. Ten artykuł przeprowadzi Cię przez proces konfigurowania źródła danych usługi Azure Artifacts jako prywatnego repozytorium programu PowerShell do przechowywania i udostępniania modułów programu PowerShell.
Ten artykuł obejmuje następujące zagadnienia:
- Tworzenie osobistego tokenu dostępu
- Tworzenie modułu programu PowerShell
- Tworzenie magazynu SecretStore i rejestrowanie repozytorium
- Publikowanie i używanie pakietów z kanału informacyjnego
Wymagania wstępne
Utwórz organizację usługi Azure DevOps i projekt, jeśli jeszcze tego nie zrobiono.
Utwórz nowe źródło danych, jeśli jeszcze go nie masz.
Zainstaluj moduł PSResourceGet.
Uwaga
Dostawca poświadczeń usługi Azure Artifacts nie jest obsługiwany za pomocą polecenia PSResourceGet.
Tworzenie osobistego tokenu dostępu
Osobisty token dostępu działa jako tożsamość cyfrowa i służy jako alternatywne hasło do uwierzytelniania w usłudze Azure DevOps.
Przejdź do organizacji usługi Azure DevOps
https://dev.azure.com/<ORGANIZATION_NAME>/
Wybierz ikonę ustawień użytkownika, wybierz pozycję Osobiste tokeny dostępu, a następnie wybierz pozycję Nowy token.
Wprowadź nazwę identyfikatora pat, ustaw datę wygaśnięcia, wybierz pozycję Zdefiniowane niestandardowe, a następnie wybierz pozycję Pakowanie>odczytu, zapisu i zarządzania.
Wybierz pozycję Utwórz po zakończeniu i upewnij się, że kopiujesz i przechowujesz swój token dostępu w bezpiecznej lokalizacji.
Tworzenie modułu programu PowerShell
Jeśli nie masz własnego modułu, postępuj zgodnie z instrukcjami w tej sekcji, aby utworzyć przykładowy moduł programu PowerShell. W przeciwnym razie przejdź do następnego kroku:
Utwórz nowy folder PowerShell-Demo. Przejdź do folderu i utwórz nowy plik PowerShell-Demo.psm1.
Wklej następujący skrypt do pliku PowerShell-Demo.psm1 :
Function PowerShell-Demo{ Write-Host "Hello World!" }
Wygeneruj manifest modułu, uruchamiając następujące polecenie w katalogu PowerShell-Demo :
New-ModuleManifest -Path .\PowerShell-Demo.psd1
Otwórz plik PowerShell-Demo.psd1 i znajdź zmienną
RootModule
. To ustawienie określa główny plik skryptu, który program PowerShell ładuje po zaimportowaniu modułu. Zastąp pusty ciąg ścieżką do pliku PowerShell-Demo.psm1 :RootModule = 'PowerShell-Demo.psm1'
Sekcja
FunctionsToExport
określa, które funkcje są dostępne dla użytkowników podczas importowania modułu. Dołącz funkcję PowerShell-Demo :FunctionsToExport = @('PowerShell-Demo')
Znajdź sekcję zawierającą
FileList
listę plików uwzględnionych podczas pakowania modułu. Dodaj plik, który chcesz spakować przy użyciu modułu:FileList = @('./PowerShell-Demo.psm1')
Rejestrowanie repozytorium
Uruchom następujące polecenie, aby utworzyć obiekt poświadczeń. Zastąp symbole zastępcze poprawnymi informacjami.
$username = "<USER_NAME>" $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force $credentials = New-Object System.Management.Automation.PSCredential($username, $patToken)
Upewnij się, że zainstalowano usługę SecretManagement i SecretStore , a następnie uruchom następujące polecenie, aby utworzyć magazyn i dodać wpis tajny:
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')
Aby sprawdzić, czy magazyn i wpis tajny zostały pomyślnie utworzone, uruchom następujące polecenie, aby wyświetlić listę wszystkich wpisów tajnych:
PS > Get-SecretInfo Name Type VaultName ---- ---- --------- MyCredential PSCredential MySecretVault
Uruchom następujące polecenie, aby zarejestrować repozytorium programu PowerShell. Link można znaleźć
SourceLocation
, przechodząc do sekcji Artifacts>Connect to Feed>NuGet.exe w obszarze Adres URL źródła sekcji > Konfiguracja projektu.Źródło danych o zakresie projektu:
Register-PSResourceRepository -Name "PowershellPSResourceRepository" ` -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" ` -Trusted ` -CredentialInfo $CredentialInfo
Kanał informacyjny o zakresie organizacji:
Register-PSResourceRepository -Name "PowershellPSResourceRepository" ` -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" ` -Trusted ` -CredentialInfo $CredentialInfo
Napiwek
Niektóre wersje programu PowerShell mogą wymagać uruchomienia nowej sesji po uruchomieniu
Register-PSResourceRepository
polecenia cmdlet, aby zapobiec napotkaniu ostrzeżenia Nie można rozpoznać źródła pakietu.Aby sprawdzić, czy repozytorium zostało pomyślnie zarejestrowane, uruchom następujące polecenie, aby pobrać wszystkie zarejestrowane repozytoria dla bieżącego użytkownika:
Get-PSResourceRepository
Uwaga
Jeśli wystąpi błąd: Kod stanu odpowiedzi nie wskazuje powodzenia: 404 (Nie znaleziono). Upewnij się, że źródłowy adres URL wskazuje wartość nuget/v3/index.json
zamiast nuget/v2
.
Publikowanie pakietu
Uruchom następujące polecenie, aby opublikować pakiet w kanale informacyjnym:
Publish-PSResource -Path <PACKAGE_PATH> -Repository <REPOSITORY_NAME> -ApiKey (Get-Secret <SECRET_NAME>)
Przykład:
PS C:\AzureDevOps\Demos\PowerShellDemo> Publish-PSResource -Path .\scripts\ -Repository FabrikamFiberFeed -ApiKey (Get-Secret MyNewCredential) -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'
Instalowanie pakietu
Aby sprawdzić, czy moduł jest dostępny w repozytorium, użyj następującego polecenia, aby go wyszukać:
Find-PSResource -Name <RESOURCE_NAME> -Repository <REPOSITORY_NAME> -verbose
Uruchom następujące polecenie, aby zainstalować najnowszą stabilną wersję modułu:
Install-PSResource <MODULE_NAME>
Napiwek
Jeśli wystąpi błąd: Wyjątek wywołujący funkcję "WriteObject", uruchom nowe okno programu PowerShell i uruchom polecenie Get-SecretInfo
. Wprowadź hasło magazynu przed uruchomieniem polecenia Find-PSResource i Install-PSResource, ponieważ limit czasu secretStore może wygasnąć. Wartość domyślna PasswordTimeout wynosi 900 sekund, ale możesz zmodyfikować tę wartość zgodnie z potrzebami. Aby uzyskać więcej informacji, zobacz Use the SecretStore in automation (Używanie magazynu wpisów tajnych w automatyzacji ).
Ten artykuł obejmuje następujące zagadnienia:
- Tworzenie osobistego tokenu dostępu
- Tworzenie, pakowanie i publikowanie modułu programu PowerShell
- Nawiązywanie połączenia z kanałem informacyjnym jako repozytorium programu PowerShell
- Rejestrowanie i instalowanie modułu programu PowerShell przy użyciu usługi Azure Pipelines
Wymagania wstępne
Utwórz organizację usługi Azure DevOps i projekt, jeśli jeszcze tego nie zrobiono.
Utwórz nowe źródło danych, jeśli jeszcze go nie masz.
Zainstaluj pakiet NuGet.
Tworzenie osobistego tokenu dostępu
Osobisty token dostępu działa jako tożsamość cyfrowa i służy jako alternatywne hasło do uwierzytelniania w usłudze Azure DevOps.
Przejdź do organizacji usługi Azure DevOps
https://dev.azure.com/<ORGANIZATION_NAME>/
Wybierz ikonę ustawień użytkownika, wybierz pozycję Osobiste tokeny dostępu, a następnie wybierz pozycję Nowy token.
Wprowadź nazwę identyfikatora pat, ustaw datę wygaśnięcia, wybierz pozycję Zdefiniowane niestandardowe, a następnie wybierz pozycję Pakowanie>odczytu, zapisu i zarządzania.
Wybierz pozycję Utwórz po zakończeniu i upewnij się, że kopiujesz i przechowujesz swój token dostępu w bezpiecznej lokalizacji.
Tworzenie modułu programu PowerShell
Jeśli nie masz własnego modułu, postępuj zgodnie z instrukcjami w tej sekcji, aby utworzyć przykładowy moduł programu PowerShell. W przeciwnym razie przejdź do następnego kroku:
Utwórz nowy folder Get-Hello. Przejdź do folderu i utwórz nowy plik Get-Hello.psm1.
Wklej następujący skrypt do pliku Get-Hello.psm1 :
Function Get-Hello{ Write-Host "Hello Azure DevOps!" }
Wygeneruj manifest modułu, uruchamiając następujące polecenie w katalogu Get-Hello :
New-ModuleManifest -Path .\Get-Hello.psd1
Otwórz plik Get-Hello.psd1 i znajdź zmienną
RootModule
. To ustawienie określa główny plik skryptu, który program PowerShell ładuje po zaimportowaniu modułu. Zastąp pusty ciąg ścieżką do pliku Get-Hello.psm1 :RootModule = 'Get-Hello.psm1'
Sekcja
FunctionsToExport
określa, które funkcje są dostępne dla użytkowników podczas importowania modułu. Dołącz funkcję Get-Hello :FunctionsToExport = @('Get-Hello')
Znajdź sekcję
FileList
, która określa pliki uwzględnione podczas pakowania modułu. Dodaj plik, który chcesz spakować przy użyciu modułu:FileList = @('./Get-Hello.psm1')
Pakowanie i publikowanie modułu
Wygeneruj plik nuspec dla modułu. To polecenie tworzy plik Get-Hello.nuspec zawierający niezbędne metadane do pakowania modułu:
nuget spec Get-Hello
Uruchom następujące polecenie, aby spakować moduł:
nuget pack Get-Hello.nuspec
Uruchom następujące polecenie, aby dodać adres URL źródła kanału informacyjnego. Upewnij się, że używasz wersji 2 w adresie URL źródła kanału informacyjnego, ponieważ program NuGet V3 nie jest obsługiwany.
Kanał informacyjny o zakresie organizacji:
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>"
Źródło danych o zakresie projektu:
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>"
Opublikuj pakiet w kanale informacyjnym:
nuget push -Source "<FEED_NAME>" -ApiKey "<ANY_STRING>" "<PACKAGE_PATH>"
Ważne
Numer wersji w manifeście modułu (psd1) musi być identyczny z numerem wersji w pliku nuspec .
Nawiązywanie połączenia z kanałem informacyjnym jako repozytorium programu PowerShell
Ta sekcja przeprowadzi Cię przez proces uwierzytelniania za pomocą źródła danych jako repozytorium programu PowerShell i korzystania z modułu hostowanego w kanale informacyjnym:
W oknie wiersza polecenia programu PowerShell uruchom następujące polecenie, aby skonfigurować poświadczenia. Zastąp symbole zastępcze odpowiednimi informacjami.
$patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force $credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
Zarejestruj repozytorium programu PowerShell. Link można znaleźć
SourceLocation
, przechodząc do sekcji Artifacts>Connect to Feed>NuGet.exe w obszarze Adres URL źródła sekcji > Konfiguracja projektu.Źródło danych o zakresie projektu:
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
Kanał informacyjny o zakresie organizacji:
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
Napiwek
Niektóre wersje programu PowerShell mogą wymagać uruchomienia nowej sesji po uruchomieniu
Register-PSRepository
polecenia cmdlet, aby zapobiec napotkaniu ostrzeżenia Nie można rozpoznać źródła pakietu.Zarejestruj źródło pakietu:
Źródło danych o zakresie projektu:
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
Kanał informacyjny o zakresie organizacji:
Register-PackageSource -Name <REPOSITORY_NAME> -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices
Uwaga
- Register-PSRepository: służy do rejestrowania repozytorium programu PowerShell w celu znajdowania i instalowania modułów.
- Register-PackageSource: służy do rejestrowania źródła pakietu na potrzeby znajdowania i publikowania pakietów.
Aby sprawdzić, czy repozytorium zostało pomyślnie zarejestrowane, uruchom następujące polecenie, aby pobrać wszystkie zarejestrowane repozytoria dla bieżącego użytkownika:
Get-PSRepository
Uruchom następujące polecenie, aby zainstalować moduł Get-Hello .
Install-Module -Name <PACKAGE_NAME> -Repository <REPOSITORY_NAME>
Uwaga
Jeśli organizacja używa zapory lub serwera proxy, upewnij się, że zezwolisz na dostęp do adresów URL i adresów IP domeny usługi Azure Artifacts.
Instalowanie pakietu z potoku
W tym przykładzie przedstawiono proces uwierzytelniania za pomocą źródła danych usługi Azure Artifacts i instalowania modułu programu PowerShell z potoku. Aby użyć osobistego tokenu dostępu, dodaj go jako zmienną potoku, jak pokazano poniżej:
Zaloguj się do organizacji usługi Azure DevOps, a następnie przejdź do projektu.
Wybierz pozycję Potoki, wybierz definicję potoku, a następnie wybierz pozycję Edytuj , aby zmodyfikować potok.
Wybierz pozycję Zmienne w prawym górnym rogu, a następnie wybierz pozycję Nowa zmienna.
Wprowadź nazwę zmiennej, a następnie wklej osobisty token dostępu w polu tekstowym Wartość.
Upewnij się, że zaznaczono pole wyboru Zachowaj tę wartość wpisu tajnego. Po zakończeniu wybierz przycisk OK .
Dodaj drugą zmienną dla nazwy użytkownika UserName. Wprowadź nazwę zmiennej, a następnie wprowadź wartość userName w polu tekstowym Wartość.
Wybierz Zapisz, gdy skończysz.
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'