📦

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 などのコマンドレットが利用できるようになります。

https://docs.microsoft.com/en-us/azure/devops/artifacts/tutorials/private-powershell-library?WT.mc_id=PS-MVP-5002941

Discussion