PowerShell モジュールを Azure Artifacts に公開する
はじめに
この記事は Azure DevOps Advent Calendar 2019 に参加しています。
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