理系学生日記

おまえはいつまで学生気分なのか

Azure PipelinesでPull RequestをトリガーにCIを走らせる (または、CIトリガーとPRトリガーでの重複実行を抑止する)

Pull Requestが作成されたらCIを実行したい。こういったユースケースはよくあります。 Azure Pipelinesでもこの実現はできるのですが、この実現にはかなり癖があります。

結論

PR Triggerの設定は、azure-pipelines.ymlではなく、Azure ReposのBuild validationで設定します。

Triggerの種類

Azure PipelinesにおいてCIを実行する契機のことをTriggerと呼びます。 サポートされるTriggerの種類については以下をご参照ください。面白いのは、Azure PipelinesとしてサポートするTriggerと、YAMLで記述できるTriggerがイコールではないことです。 Azure ReposのGitリポジトリに対するPR Triggerはサポートされているものの、azure-pipelines.ymlでは実現できません。

Azure Repos GitリポジトリでのPR Trigger

Azure ReposのGitリポジトリにおいて、Pull Request作成時やPull RequestのbranchへのPUSH時にCIを実行するにはどうすれば良いか。 ドキュメントには以下のように、Build validation policyで実現しろと記載されています。

To enable pull request validation in Azure Git Repos, navigate to the branch policies for the desired branch, and configure the Build validation policy for that branch.

PR triggers

図のようにEdit Build PolicyのTrigger設定でAutomaticを選択すれば、PR triggerを設定できます。

azure-pipelines.ymlの書き方

それでは、Azure Pipelines上のTrigger設定をどう記述すれば良いか。 ぼくは以下のように、trigger自体を無効化しています。

trigger: none

変にCI triggerを 無効化すると、PR triggerとしてCIが実行され、その上でCI triggerによってCIが実行されます。 このような二重起動を防ぐtrigger設定はそこそこ面倒です。 開発プロセスが許すなら、CI triggerは無効化した方が楽でしょう。