📦

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

2022/01/01に公開

はじめに

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

https://qiita.com/advent-calendar/2019/azuredevops

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 packnuget push を実行します。

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

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

実行結果

Pipeline を実行すると、Azure Artifacts にパッケージが追加されることがわかります。

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

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

Discussion