銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

VSTS でAPIからビルドをキャンセルする

APIからビルドをQueueに積むのは専用のAPIがあります。

tech.tanaka733.net

では、いったんQueueに積まれたビルドをAPIからキャンセルしたいときはどうしましょう?API一覧にキャンセルとかストップといった類のメソッドはありません...*1

答えはビルドに対するUpdateを行います。

private async Task CancelBuild(string project, string buildDefinitionName)
{
    var definitions = await build.GetDefinitionsAsync(project: project);
    var target = definitions.FirstOrDefault(d => d.Name.StartsWith(buildDefinitionName, StringComparison.InvariantCultureIgnoreCase));
    if (target == null)
    {
        throw new ArgumentException("{buildDefinitionName} という名前のビルド定義はありません", nameof(buildDefinitionName));
    }
    //そのビルド定義名で実行されたビルド一覧を取得
    var builds = await build.GetBuildsAsync(project, new[] {target.Id});
    //完了済みもしくはキャンセル中のもの「以外」を取得
    foreach (var b in builds.Where(b => !(b.Status == BuildStatus.Completed || b.Status == BuildStatus.Cancelling)))
    {
        b.Status = BuildStatus.Cancelling;
        await build.UpdateBuildAsync(b, b.Id);
    }
}

どうにもAPIの対称性が悪い気がしますが、まあこんなもんなんでしょう...

*1:Deleteはあるのですが、これは完了したビルドを文字通り削除するのでキャンセルとは別物のようです