自動化!PowerShell モジュールを PowerShell Gallery に公開

PowerShell 最高!ということで、みなさんも PowerShell のモジュールを日々書かれていると思いますが、書いたモジュールはちゃんと PowerShell Gallery に公開していますか?今日は スクリプトコードのチェックインから Gallery での公開までを自動化したいと思います。

PowerShell Gallery って何?

Microsoft がホストする、PowerShell モジュールを公開できる場所です。PowerShell v5.0 以降または PowerShellGet が入っている環境であれば、PowerShell 内から Find-Module や Install-Module で公開されているモジュールをダウンロード/インストールできます。NuGet や npm のような感じです。モジュールの公開にはアカウントが必要です。まだお持ちでない場合、ここから 作成してください。

画面右上の Register をぽちっと。

事前準備

モジュールの公開には API Key が必要となります。

1. PowerShell Gallery にサインイン

2. 右上の自分のアカウント名をクリック

3. Credentials の項目にある API Key を取得

単純な公開方法

DevOps なんて知らない。ただ公開できればいい!という場合、Publish-Module コマンドレットが使えます。Name にモジュール名を指定するか Path にモジュールのパスを指定し、NuGetAPIKey に上記で取得したキーを指定して実行してください。

DevOps な方法

世の中には同じことが実現できる様々なツールがありますが、今回はソース管理に GitHub、ビルドとリリースに Visual Studio Team Services (VSTS) を利用します。全部 VSTS でやるんだ!という場合は、ソース管理の箇所を VSTS と読み替えて使ってください。VSTS のアカウントがない場合、こちらより無料アカウント試してみてください。

ソース管理

GitHub にリポジトリを作成して、psm1 や psd1、また依存する dll などを入れておきます。

VSTS プロジェクトとビルド定義の作成

1. VSTS にログインして「New Project」をクリック。

2. 必要な名前を入れて「Create」をクリック。

image

3. 「Build & Release」をクリック。

image

4.「New definition」をクリック。

image

5. 今回適切なテンプレートがないので、「Empty」を選択して「Next」をクリック。

image

6.「GitHub」を選択し、「Continuous integration」にチェックを入れて「Create」をクリック。

image

7. 赤くなっている「Repository」をクリック。ちなみに、GitHub に対する接続ないから赤くなっています。

image

8. Connection の横にある「Manage」をクリック。

image

9. 管理画面に遷移するので「New Service Endpoint」より「GitHub」を選択。

image

10. 名前を付けて、「Authorize」をクリック。認証画面出たら GitHub アカウントを入力。

image

11. OK をクリックしてタブをクローズ。元の画面に戻る。

12.「Manage」の横の更新アイコンをクリックして、追加した接続を選択。

image

13. Repository を選択。これで Repository 構成が完了。

image

14. Build タブをクリックし、「Add build step」をクリック。

image

15. 「All」より「Copy and Publish Build Artifacts」の「Add」をクリック。このタスクはファイルをコピーしてリリース用にファイル類を準備できます。

image

16.「Copy Root」横の「…」をクリックし、コピー元のディレクトリを選択。ここが GitHub 接続となる。

image image

17.「Contents」欄にはコピーするファイルを指定。ワイルドカードが使えます。ここでは *.psm1, *.psd1 としました。

18.「Artifact Name」はコピーされる先のフォルダ名となるため、PowerShell Module 名を入れます。ここれは Microsoft.PowerBI.PowerShell としました。

19.「Artifact Type」は「Server」を選択。

image

20.「Save」をクリックし、名前をつけて保存。

image

ビルドのテスト

一応テストしときましょう。

1.「Queue new build」をクリック。

image

2. キュー画面で「OK」をクリックします。

image

3. ビルドが成功するか確認します。

image

4. ビルド結果より「Artifact」をクリックして作成されたものを確認します。

image

リリース定義の作成

1. Release タブをクリックし、「New definition」をクリック。

image

2. 今回もテンプレートはないので、「Empty」を選択して「Next」をクリック。

image

3. 上記で作成したビルドから継続したいので、プロジェクト/ソースを選択し、「Continuous deployment」にチェックをいれて、「Create」をクリック。

image

4.「Add tasks」をクリック。

image

5. このリリースでは PowerShell Gallery にモジュールを公開したいが、良いタスクがないため、画面一番下のマーケットプレースへのリンクをクリック。

image

6. Market Place が出るので、「PowerShell」で検索。PowerShell Gallery Publisher を選択。

image

7.「Install」をクリックしてインストール。

image

8. アカウントを選択して、「Continue」をクリック。続いて「Confirm」をクリックし、最後に「Close」をクリック。

image

9. 再度リリース定義に戻って「Add tasks」をクリック。Package カテゴリより「PowerShell Gallery Publisher」の「Add」をクリック。

image

10. 「API Key」 に PowerShell Gallery で取得したキーを設定し、「Module Folder」の「…」よりビルドで作成したフォルダを選択。

image image

11. Definition 横の鉛筆アイコンより任意の名前に変更して、保存。

image リリースのテスト

1. 作成したリリース定義より、「Release」ドロップダウンの「Create Release」を選択。

image

2.「Create」をクリックして実行。

3. 画面左の定義一覧より作成した定義をクリック。右側に実行中のリリースが表示。たまに更新ボタンクリックして状況確認するか、「…」より「Open」を選択、「Log」タブより詳細を確認。

image

4. 以下は失敗した例。エラーを見るとすでに同じバージョンのモジュールがリリース済のためとありました。

2017-04-18T11:52:18.2341643Z ##[error]System.InvalidOperationException: Module 'Microsoft.PowerBI.PowerShell' with version '1.2' cannot be published. The version must exceed the current version '1.2' that exists in the repository 'https://www.powershellgallery.com/api/v2/'.
image

通しで実行

最後に通しでテスト。必要な個所を Visual Studio Code 等で変更してチェックインすれば、ビルドからリリースまで流れます。完了したら、PowerShell より Find-Module で新しいバージョンが上がっていることを確認しましょう。

他にやることは?

現在のパイプラインにはテストの要素がないため、テストは入れたほうがいいかなと。また時間ある時に考えます。

参考

VSTS PowerShell Module Publisherアドイン
https://marketplace.visualstudio.com/items?itemName=kenakamu.PSGalleryPublisher

ソース: https://github.com/kenakamu/vsts-tasks/tree/master/Tasks/PSGalleryPublisher

 

- 中村 憲一郎