PowerShell モジュールを Azure Artifacts に公開する
はじめに
Azure DevOps には Azure Artifacts というパッケージをホストする機能があります。Azure Artifacts では NuGet パッケージをサポートしているため、PowerShell モジュールを公開してプライベートなリポジトリとして利用できます。Azure Pipelines で PowerShell モジュールをビルドし、Azure Artifacts に公開するまでの手順を紹介します。
実行手順
プロジェクトの準備
今回作成する PowerShell モジュールは PowerShell Core を前提とします。.NET Core 2.1 でビルドする HelloPowerShell という名前のプロジェクトを作成します。モジュールのマニフェストファイル (psd1 ファイル) と NuGet のマニフェストファイル (nuspec ファイル) を作成し、ビルド時にファイルを出力ディレクトリにコピーするように設定します。作成したプロジェクトは Azure Repos の Git に push します。
Build Pipeline の作成
Build Pipeline を作成します。Azure Repos Git からリポジトリを選択し、Starter pipeline で最小テンプレートの YAML を作成します。作成した YAML を次のように設定します。
trigger:
- master
pool:
vmImage: 'windows-latest'
variables:
solutionFile: 'HelloPowerShell.csproj'
manifestFile: 'HelloPowerShell.psd1'
nuspecFile: 'HelloPowerShell.nuspec'
buildConfiguration: 'Release'
buildVersion: '1.0.0'
buildId: '$(Build.BuildId)'
steps:
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
Write-Host "##vso[task.setvariable variable=buildNumber]$env:buildVersion.$env:buildId"
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
Update-ModuleManifest -Path $env:manifestFile -ModuleVersion $env:buildNumber
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
$xml=[xml](Get-Content $env:nuspecFile)
$xml.package.metadata.version=$env:buildNumber
$xml.Save($env:nuspecFile)
- task: DotNetCoreCLI@2
inputs:
command: 'restore'
projects: '$(solutionFile)'
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
publishWebProjects: false
projects: '$(solutionFile)'
arguments: '-c $(buildConfiguration) -o $(Build.ArtifactStagingDirectory) -p:version=$(buildNumber);fileversion=$(buildNumber)'
zipAfterPublish: false
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'HelloPowerShell'
publishLocation: 'Container'
dotnet publish で Artifact を作成しますが、バージョンがビルドごとに変わるようにバージョン番号の書き換えています。
Release Pipeline の作成
続いて Release Pipeline を作成します。Build Pipeline の Artifact をトリガーに設定し、CI/CD を有効にします。

ジョブでは NuGet をインストールし、nuget pack と nuget push を実行します。

nuget pack では、対象を csproj ではなく nuspec に変更します。

nuget push では push するフィードに Azure Artifacts のフィードを指定します。

実行結果
Pipeline を実行すると、Azure Artifacts にパッケージが追加されます。

あとは Register-PSRepository でフィードを登録することで、Find-Module や Install-Module などのコマンドレットが利用できるようになります。
Discussion