LoginSignup
2
1

More than 1 year has passed since last update.

Azure PipelinesのタスクでPullRequestに対してコメントをつけたい

Posted at

要約

以下を試しました

モチベーション

インフラをコードで管理するとなると、インフラに適用した時どうなるかが気になります。
そんなときはterraform planやAzure TemplateのWhat-ifで適用時の変化を確認することができます。

これをPullRequest時に行ってレビュー時に一緒にチェックできると嬉しいでしょう。手元に持ってきて実行するのも手間なのと、そもそも実行できない環境の場合もあるためです。

今回はAzure PipelinesでAzure TemplateのWhat-ifの結果をコメントに残すのを行ってみました。

手順

Pipelinesを仕込む

ブランチのポリシーでPRトリガを設定するにはあらかじめPipelineが存在する必要があるため、先に行っておく必要があります。

適当なタスクでいいのでazure-pipelines.ymlを書き、Gitリポジトリ保存し、Azure Pipelinesに登録してPipelinesが動くようにしておきます。

通常のPipelineの登録と同じなので省略します。

ブランチのポリシーでPRトリガを実行するようにする

過去に書いたり、ドキュメントにもありますが一応。

Reposの該当のリポジトリを開き、Branchesから対象のブランチのBaranch Policyを開きます。

image.png

ブランチの設定が開くので、「+」ボタンからBuild Validationを追加します。

image.png

あらかじめ登録しておいたpipelineを指定し、Saveで保存します。

image.png

以上で完了です。

リポジトリの設定でBuild ServiceからのPullRequestのContributeを許可する

プロジェクト毎にBuild Serviceユーザ({Project名} Build Service ({Organization名}) )がいるようで、Pipelineを実行しています。
なので、そのユーザに対してPullRequestへのContributeを許可します。デフォルトは不許可になっています。

image.png

これを行わないと後述するPullRequestのスレッドにコメントをつけるREST APIで以下のようなレスポンスになり失敗します。

{
  "$id": "1",
  "innerException": null,
  "message": "TF401027: You need the Git 'PullRequestContribute' permission to perform this action. Details: identity 'Build\\xxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxx', scope 'repository'.",
  "typeName": "Microsoft.TeamFoundation.Git.Server.GitNeedsPermissionException, Microsoft.TeamFoundation.Git.Server",
  "typeKey": "GitNeedsPermissionException",
  "errorCode": 0,
  "eventId": 3000
}

PipelinesでPull RequestのスレッドにコメントをつけるRest APIを実行するタスクを書く

$(System.AccessToken)AuthorizationヘッダにBearerトークンとして埋め込み、Rest APIに対してJSONをPOSTするだけです。Rest APIの仕様は以下です。

ただ、JSONの組み立てやMarkdownの記入が地味に面倒なので、PowerShellかPython等でPipelines用のスクリプトを用意してGitリポジトリに含めておき、それを実行するのがよいでしょう。

参考までに標準入力をコメントにするスクリプトを書いたので共有です。

タスクの例は以下です。

# 単純なBash Script
- task: Bash@3
  condition: eq(variables['Build.Reason'], 'PullRequest')
  env:
    SYSTEM_ACCESSTOKEN: $(System.AccessToken)
  inputs: 
    targetType: inline
    script: |
      (echo "# Hello"; echo "world") | python pull-request-comment.py

# Azure CLIでBicepをWhat-ifにかけた結果をコメントする
# (別途Service Connectionの設定をしてPipelinesからAzure CLIタスクでAzureリソース操作ができるようにしておく)
- task: AzureCLI@2
  condition: eq(variables['Build.Reason'], 'PullRequest')
  env:
    SYSTEM_ACCESSTOKEN: $(System.AccessToken)
  inputs:
    azureSubscription: "Service Connection名"
    scriptType: bash
    scriptLocation: inlineScript
    inlineScript: |
      az deployment group what-if --subscription "$(Subscription)" --resource-group $(ResourceGroup) --template-file $(TemplateFilePath) 2>&1 | python pull-request-comment.py --title "What-if"
  • $(System.AccessToken) で環境変数を埋め込むこと
  • condition: eq(variables['Build.Reason'], 'PullRequest') でPRのみ反応するタスクとして定義

特にアクセストークン$(System.AccessToken)の扱いには注意しましょう。これが漏れると誰でもBuild Serviceの権限でできることができてしまいます。

また、PullRequestのコメントに残ることを考え、出力するものは問題ないかどうかは確認しておきましょう。

動作確認

PullRequestを行い、Pipelineをトリガする

うまくいくとPRにコメントが付きます。

上記の「Azure CLIでBicepをWhat-ifにかけた結果をコメントする」のタスクだとこんな感じです。

image.png

PRの内容を適用すると、ストレージアカウントが1個作られる様子がわかります。よかったですね。
(ただ、What-ifについてはこんな単純な差分ばかりではないのが現実で、この結果を確認するほうが辛くなってきそうですが。)

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1