からめもぶろぐ。

俺たちは雰囲気で OAuth をやっている

PowerShell モジュールを Azure Artifacts に公開する

この記事は Azure DevOps Advent Calendar 2019 に参加しています。

qiita.com

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

docs.microsoft.com