やる気駆動型エンジニアの備忘録

WPF(XAML+C#)の話題を中心に.NET/Android/CI やたまに趣味に関するブログです

Azure Pipelines Task の拡張機能を開発する

前回は Azure DevOps の拡張機能Hello World を実施しました。

iyemon018.hatenablog.com

今回は Azure DevOps の中でも最も利用されるであろう Azure Pipelines に自作した Task を追加していきます。

参考ページ

docs.microsoft.com

今回は上記のページに沿って拡張機能を作っていきます。 ただ、上記では Node.js + TypeScript を使って開発されています。単純に手順に沿って作っていけば普通に作れてしまうため、あまりこのエントリで紹介する意味がありません。

なので、ちょっと趣向を変えて Node.js ではなく、PowerShell を使って開発していきます。 PowerShell を使った Task 拡張機能の作り方は Microsoft 公式では見当たらなかったため、以下のページを参考にしています。

codingsight.com

socraticprogrammer.com

環境構築

各種ツールを適宜インストールします。今回は Visual Studio Code を使っていますが、エディタはお好みのものを使ってください。

  1. Node.jsをインストールする
  2. TypeScript Compilerをインストールする
  3. VS Codeをインストールする
  4. npm i -g tfx-cliを実行してtfx-cliをインストールする

Azure Pipelines Task を開発する

今回作るもの

はじめに今回作るものをお見せしておきます。 サンプルなので特にタスクそのものが意味を持つわけではありませんが、画面で入力した値を作成した Task が受け取ってビルドログに表示します。

タスク設定画面

f:id:iyemon018:20200406000030p:plain

ビルドログ

f:id:iyemon018:20200406000111p:plain

カスタムタスクを作る

カスタムタスクを作るまでの手順は上記参考ページに従っていきます。 以下のリンク見出しのCreate task scaffoldingを実行します。

docs.microsoft.com

次に、task.jsonを作成します。こちらも上記のページからコピーして作ってください。 適宜編集した後、最後のexecutionのみ以下のように変更します。 targetには、実行する PowerShell スクリプト名を記載してください。

{
    "$schema": "https://raw.githubusercontent.com/Microsoft/azure-pipelines-task-lib/master/tasks.schema.json",
    "id": "{{GUID}}",
    "name": "{{タスクの名称(英数字のみ、半角スペース使用不可)}}",
    "friendlyName": "{{タスクの表示名(ユーザーに見えるタスク名はこっち。未入力なら name が使われる}}",
    "description": "{{タスクの説明}}",
    "helpMarkDown": "",
    "category": "{{タスクのカテゴリ。Build とか Utility とか。}}",
    "author": "{{publisher 名と同じにする}}",
    "version": {
        ...省略...
    },
    "instanceNameFormat": "{{ここはパイプラインやビルドログに表示する内容。$(変数)で変数も使える。}}",
    "inputs": [
        ...省略...
    ],
    "execution": {
        "PowerShell3": {
            "target": "powershell.ps1",
            "platforms": ["windows"],
            "workingDirectory": "$(currentDirectory)"
        }
    }
}

VstsTaskSdkを使う

VstsTaskSdk を Node.js で使用する場合は参考ページの手順に従ってください。 ここでは PowerShell の VstsTaskSdk を使用する方法について説明します。

  1. VstsTaskSdkのモジュールをインストールする
  2. インストールしたモジュールを拡張機能のps_modulsフォルダに保存する
  3. PowerShellスクリプトからVstsTaskSdkを呼び出す

VstsTaskSdkのモジュールをインストールする

以下のコマンドを実行してローカル端末に VstsTaskSdk をインストールします。

Install-Module -Name VstsTaskSdk -AllowClobber

インストールしたモジュールを拡張機能のps_modulsフォルダに保存する

インストールできたら拡張機能のフォルダ配下にあるps_modulesフォルダ上で以下のコマンドを実行します。

Save-Module -Name VstsTaskSdk -Path "<ps_modules フォルダ>" -Force

これを実行するとps_modulesフォルダ配下にVstsTaskSdkフォルダが作成されます。 その配下にバージョン番号名のフォルダが出来上がりますが、このバージョン番号フォルダ配下のファイルをVstsTaskSdkフォルダに移動させてください。

以下のようになるのが正解です。

f:id:iyemon018:20200406001844p:plain

PowerShellスクリプトからVstsTaskSdkを呼び出す

スクリプトは次のように書いたらOKです。 以下はGet-VstsInputを呼び出しています。

[CmdletBinding()]
param()

try {
    $samplestring = Get-VstsInput -Name "samplestring"
} finally {
    Trace-VstsLeavingInvocation $MyInvocation
}

なお、SDK のモジュールはそこそこの数があります。 以下のページを参照するとちょっとしたヘルプが記載されているので参考にしてください。

github.com

manifestファイルを作ってパッケージを公開する

manifest ファイル(vss-extension.json)の作り方とパッケージの公開方法は前回の記事を参照してください。

作ったTaskを実行する

ここは特に迷いませんね。Azure Pipelines のビルドパイプラインからタスクを追加するだけです。

f:id:iyemon018:20200406002714p:plain


このように割と簡単に Azure Pipelines Task を作ることができました。 PowerShell に慣れている方ならわざわざ Node.js を使う必要もありません。

SDK もそれなりに API が用意されているようなので、今後も色々試していきたいと思います。