Azure Artifacts 피드를 프라이빗 PowerShell 리포지토리로 사용
Azure DevOps Services
Azure Artifacts는 PowerShell 스크립트를 공유하기 위한 편리한 솔루션을 제공합니다. Azure Artifacts 피드를 사용하면 명령줄에서 PowerShell 모듈을 원활하게 게시하고 피드 설정을 통해 액세스 권한을 제어할 수 있습니다. 이 문서에서는 PowerShell 모듈을 저장하고 공유하는 프라이빗 PowerShell 리포지토리로 Azure Artifacts 피드를 설정하는 방법을 안내합니다.
이 문서에서는 다음을 수행하는 방법을 알아봅니다.
- 개인용 액세스 토큰 만들기
- PowerShell 모듈 만들기
- SecretStore 자격 증명 모음 만들기 및 리포지토리 등록
- 피드에서 패키지 게시 및 사용
필수 조건
새 피드가 없는 경우 새 피드 를 만듭니다.
PSResourceGet을 설치 합니다.
SecretManagement 및 SecretStore 모듈을 설치합니다.
참고 항목
Azure Artifacts 자격 증명 공급자는 PSResourceGet에서 지원되지 않습니다.
개인용 액세스 토큰 만들기
개인 액세스 토큰은 디지털 ID 역할을 하며 Azure DevOps를 사용하여 인증하는 대체 암호 역할을 합니다.
Azure DevOps 조직으로 이동
https://dev.azure.com/<ORGANIZATION_NAME>/
사용자 설정 아이콘을 선택하고 개인 액세스 토큰을 선택한 다음 새 토큰을 선택합니다.
PAT의 이름을 입력하고, 만료 날짜를 설정하고, 사용자 지정 정의를 선택한 다음, 읽기 패키징>, 쓰기 및 관리를 선택합니다.
완료되면 만들기를 선택하고 PAT를 안전한 위치에 복사하고 저장해야 합니다.
PowerShell 모듈 만들기
고유한 모듈이 없는 경우 이 섹션의 지침에 따라 샘플 PowerShell 모듈을 만듭니다. 그렇지 않으면 다음 단계로 건너뜁니다.
PowerShell-Demo 폴더를 새로 만듭니다. 폴더로 이동하여 PowerShell-Demo.psm1 파일을 새로 만듭니다.
PowerShell-Demo.psm1 파일에 다음 스크립트를 붙여넣습니다.
Function PowerShell-Demo{ Write-Host "Hello World!" }
PowerShell-Demo 디렉터리에서 다음 명령을 실행하여 모듈 매니페스트를 생성합니다.
New-ModuleManifest -Path .\PowerShell-Demo.psd1
PowerShell-Demo.psd1 파일을 열고 변수를 찾습니다
RootModule
. 이 설정은 모듈을 가져올 때 PowerShell이 로드하는 기본 스크립트 파일을 지정합니다. 빈 문자열을 PowerShell-Demo.psm1 파일의 경로로 바꿉니다.RootModule = 'PowerShell-Demo.psm1'
이 섹션에서는
FunctionsToExport
사용자가 모듈을 가져올 때 액세스할 수 있는 함수를 지정합니다. PowerShell-Demo 함수를 포함합니다.FunctionsToExport = @('PowerShell-Demo')
모듈을
FileList
패키징할 때 포함된 파일을 나열하는 섹션을 찾습니다. 모듈을 사용하여 패키지하려는 파일을 추가합니다.FileList = @('./PowerShell-Demo.psm1')
리포지토리 등록
다음 명령을 실행하여 자격 증명 개체를 만듭니다. 자리 표시자를 올바른 정보로 바꿉다.
$username = "<USER_NAME>" $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force $credentials = New-Object System.Management.Automation.PSCredential($username, $patToken)
SecretManagement 및 SecretStore가 설치되어 있는지 확인하고 다음 명령을 실행하여 자격 증명 모음을 만들고 비밀을 추가합니다.
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')
자격 증명 모음 및 비밀이 성공적으로 만들어졌는지 확인하려면 다음 명령을 실행하여 모든 비밀을 나열합니다.
PS > Get-SecretInfo Name Type VaultName ---- ---- --------- MyCredential PSCredential MySecretVault
다음 명령을 실행하여 PowerShell 리포지토리를 등록합니다. Project 설치 섹션 원본 URL에서 아티팩트>연결을 피드>NuGet.exe 이동하여 링크를 찾을
SourceLocation
수 있습니다.>프로젝트 범위 피드:
Register-PSResourceRepository -Name "PowershellPSResourceRepository" ` -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" ` -Trusted ` -CredentialInfo $CredentialInfo
조직 범위 피드:
Register-PSResourceRepository -Name "PowershellPSResourceRepository" ` -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" ` -Trusted ` -CredentialInfo $CredentialInfo
팁
일부 버전의 PowerShell에서는 패키지 소스 경고를 해결할 수 없음을 방지하기 위해 cmdlet을 실행
Register-PSResourceRepository
한 후 새 세션을 시작해야 할 수 있습니다.리포지토리가 성공적으로 등록되었는지 확인하려면 다음 명령을 실행하여 현재 사용자의 등록된 모든 리포지토리를 검색합니다.
Get-PSResourceRepository
참고 항목
오류가 발생하는 경우: 응답 상태 코드가 성공을 나타내지 않음: 404(찾을 수 없음). 원본 URL이 대신 가리키는 nuget/v3/index.json
nuget/v2
지 확인합니다.
패키지 게시
다음 명령을 실행하여 피드에 패키지를 게시합니다.
Publish-PSResource -Path <PACKAGE_PATH> -Repository <REPOSITORY_NAME> -ApiKey (Get-Secret <SECRET_NAME>)
예제:
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'
패키지 설치
리포지토리에서 모듈을 사용할 수 있는지 확인하려면 다음 명령을 사용하여 해당 모듈을 검색합니다.
Find-PSResource -Name <RESOURCE_NAME> -Repository <REPOSITORY_NAME> -verbose
다음 명령을 실행하여 안정적인 최신 버전의 모듈을 설치합니다.
Install-PSResource <MODULE_NAME>
팁
"WriteObject"를 호출하는 예외 오류가 발생하는 경우 새 PowerShell 창을 시작하고 실행Get-SecretInfo
합니다. SecretStore 시간 제한 기간이 만료 될 수 있으므로 Find-PSResource 및 Install-PSResource를 실행하기 전에 자격 증명 모음 암호를 입력합니다. 기본 PasswordTimeout 은 900초이지만 필요에 따라 이 값을 수정할 수 있습니다. 자세한 내용은 자동화에서 SecretStore 사용을 참조하세요.
이 문서에서는 다음을 수행하는 방법을 알아봅니다.
- 개인용 액세스 토큰 만들기
- PowerShell 모듈 만들기, 패키지 및 게시
- PowerShell 리포지토리로 피드에 연결
- Azure Pipelines를 사용하여 PowerShell 모듈 등록 및 설치
필수 조건
새 피드가 없는 경우 새 피드 를 만듭니다.
Azure Artifacts 자격 증명 공급자를 설치합니다.
NuGet을 설치 합니다.
개인용 액세스 토큰 만들기
개인 액세스 토큰은 디지털 ID 역할을 하며 Azure DevOps를 사용하여 인증하는 대체 암호 역할을 합니다.
Azure DevOps 조직으로 이동
https://dev.azure.com/<ORGANIZATION_NAME>/
사용자 설정 아이콘을 선택하고 개인 액세스 토큰을 선택한 다음 새 토큰을 선택합니다.
PAT의 이름을 입력하고, 만료 날짜를 설정하고, 사용자 지정 정의를 선택한 다음, 읽기 패키징>, 쓰기 및 관리를 선택합니다.
완료되면 만들기를 선택하고 PAT를 안전한 위치에 복사하고 저장해야 합니다.
PowerShell 모듈 만들기
고유한 모듈이 없는 경우 이 섹션의 지침에 따라 샘플 PowerShell 모듈을 만듭니다. 그렇지 않으면 다음 단계로 건너뜁니다.
새 폴더 Get-Hello를 만듭니다. 폴더로 이동하여 새 파일 Get-Hello.psm1을 만듭니다.
Get-Hello.psm1 파일에 다음 스크립트를 붙여넣습니다.
Function Get-Hello{ Write-Host "Hello Azure DevOps!" }
Get-Hello 디렉터리에서 다음 명령을 실행하여 모듈 매니페스트를 생성합니다.
New-ModuleManifest -Path .\Get-Hello.psd1
Get-Hello.psd1 파일을 열고 변수를 찾습니다
RootModule
. 이 설정은 모듈을 가져올 때 PowerShell이 로드하는 기본 스크립트 파일을 지정합니다. 빈 문자열을 Get-Hello.psm1 파일의 경로로 바꿉니다.RootModule = 'Get-Hello.psm1'
이 섹션에서는
FunctionsToExport
사용자가 모듈을 가져올 때 액세스할 수 있는 함수를 지정합니다. Get-Hello 함수를 포함합니다.FunctionsToExport = @('Get-Hello')
모듈을
FileList
패키징할 때 포함된 파일을 지정하는 섹션을 찾습니다. 모듈을 사용하여 패키지하려는 파일을 추가합니다.FileList = @('./Get-Hello.psm1')
모듈 패키지 및 게시
모듈에 대한 nuspec 파일을 생성합니다. 이 명령은 모듈을 압축하는 데 필요한 메타데이터를 포함하는 Get-Hello.nuspec 파일을 만듭니다.
nuget spec Get-Hello
다음 명령을 실행하여 모듈을 패키지합니다.
nuget pack Get-Hello.nuspec
다음 명령을 실행하여 피드 원본 URL을 추가합니다. NuGet V3이 지원되지 않으므로 피드 원본 URL에서 V2를 사용해야 합니다.
조직 범위 피드:
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>"
프로젝트 범위 피드:
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>"
피드에 패키지를 게시합니다.
nuget push -Source "<FEED_NAME>" -ApiKey "<ANY_STRING>" "<PACKAGE_PATH>"
Important
모듈 매니페스트(.psd1)의 버전 번호는 .nuspec 파일의 버전 번호와 동일해야 합니다.
PowerShell 리포지토리로 피드에 연결
이 섹션에서는 피드를 PowerShell 리포지토리로 인증하고 피드에서 호스트되는 모듈을 사용하는 것을 안내합니다.
PowerShell 프롬프트 창에서 다음 명령을 실행하여 자격 증명을 설정합니다. 자리 표시자를 적절한 정보로 바꿉다.
$patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force $credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
PowerShell 리포지토리를 등록합니다. Project 설치 섹션 원본 URL에서 아티팩트>연결을 피드>NuGet.exe 이동하여 링크를 찾을
SourceLocation
수 있습니다.>프로젝트 범위 피드:
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
조직 범위 피드:
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
팁
일부 버전의 PowerShell에서는 패키지 소스 경고를 해결할 수 없음을 방지하기 위해 cmdlet을 실행
Register-PSRepository
한 후 새 세션을 시작해야 할 수 있습니다.패키지 원본을 등록합니다.
프로젝트 범위 피드:
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
조직 범위 피드:
Register-PackageSource -Name <REPOSITORY_NAME> -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices
참고 항목
- Register-PSRepository: 모듈을 찾아 설치하기 위해 PowerShell 리포지토리를 등록하는 데 사용됩니다.
- Register-PackageSource: 패키지를 찾고 게시하기 위한 패키지 원본을 등록하는 데 사용됩니다.
리포지토리가 성공적으로 등록되었는지 확인하려면 다음 명령을 실행하여 현재 사용자의 등록된 모든 리포지토리를 검색합니다.
Get-PSRepository
다음 명령을 실행하여 Get-Hello 모듈을 설치합니다.
Install-Module -Name <PACKAGE_NAME> -Repository <REPOSITORY_NAME>
참고 항목
조직에서 방화벽 또는 프록시 서버를 사용하는 경우 Azure Artifacts 도메인 URL 및 IP 주소에 대한 액세스를 허용해야 합니다.
파이프라인에서 패키지 설치
이 예제에서는 Azure Artifacts 피드를 사용하여 인증하고 파이프라인에서 PowerShell 모듈을 설치하는 단계를 안내합니다. 개인 액세스 토큰을 사용하려면 아래와 같이 파이프라인 변수로 추가합니다.
Azure DevOps 조직에 로그인한 다음 프로젝트로 이동합니다.
파이프라인을 선택하고 파이프라인 정의를 선택한 다음 편집을 선택하여 파이프라인을 수정합니다.
오른쪽 위 모서리에서 변수를 선택한 다음 새 변수를 선택합니다.
변수의 이름을 입력한 다음 개인 액세스 토큰을 값 텍스트 상자에 붙여넣습니다.
이 값 비밀 유지 확인란을 선택했는지 확인합니다. 완료되면 확인을 선택합니다.
userName에 대한 두 번째 변수를 추가합니다. 변수의 이름을 입력한 다음 값 텍스트 상자에 userName을 입력합니다.
완료되면 저장을 선택합니다.
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'