AzureFunction@1 - Azure Function v1 タスクを呼び出す

リリース パイプラインの エージェントレス ジョブ でこのタスクを使用して、関数アプリで HTTP によってトリガーされる関数を呼び出し、応答を解析します。 関数アプリは、Azure Functionsで作成してホストする必要があります。

構文

# Invoke Azure Function v1
# Invoke an Azure Function.
- task: AzureFunction@1
  inputs:
    function: # string. Required. Azure function URL. 
    key: # string. Required. Function key. 
    method: 'POST' # 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | 'PATCH'. Required. Method. Default: POST.
    #headers: # string. Headers. 
    #queryParameters: # string. Query parameters. 
    #body: # string. Optional. Use when method != GET && method != HEAD. Body. 
  # Advanced
    waitForCompletion: 'false' # 'true' | 'false'. Required. Completion event. Default: false.
    #successCriteria: # string. Optional. Use when waitForCompletion = false. Success criteria.
# Invoke Azure Function v1
# Invoke an Azure Function as a part of your pipeline.
- task: AzureFunction@1
  inputs:
    function: # string. Required. Azure function URL. 
    key: # string. Required. Function key. 
    method: 'POST' # 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | 'PATCH'. Required. Method. Default: POST.
    #headers: # string. Headers. 
    #queryParameters: # string. Query parameters. 
    #body: # string. Optional. Use when method != GET && method != HEAD. Body. 
  # Advanced
    waitForCompletion: 'false' # 'true' | 'false'. Required. Completion event. Default: false.
    #successCriteria: # string. Optional. Use when waitForCompletion = false. Success criteria.

入力

function - Azure 関数の URL
string. 必須です。

呼び出される Azure 関数の URL。 例: https://azurefunctionapp.azurewebsites.net/api/HttpTriggerJS1.


key - 関数キー
string. 必須です。

関数にアクセスして関数を呼び出すために使用される関数またはホスト キー。 キーをセキュリティで保護するには、シークレット パイプライン変数を使用して関数キーを格納します。 例: $(myFunctionKey). myFunctionKey は、シークレット キーとして値を持つ環境レベルのシークレット変数です。


method - メソッド
string. 必須です。 使用できる値: OPTIONSGET、、、HEADPOSTPUTDELETETRACEPATCH。 既定値: POST

関数が呼び出される HTTP メソッド。


headers - ヘッダー
string. 既定値: {\n"Content-Type":"application/json", \n"PlanUrl": "$(system.CollectionUri)", \n"ProjectId": "$(system.TeamProjectId)", \n"HubName": "$(system.HostType)", \n"PlanId": "$(system.PlanId)", \n"JobId": "$(system.JobId)", \n"TimelineId": "$(system.TimelineId)", \n"TaskInstanceId": "$(system.TaskInstanceId)", \n"AuthToken": "$(system.AccessToken)"\n}

関数に送信される要求にアタッチされる JSON 形式のヘッダー。


queryParameters - クエリ パラメーター
string.

関数 URL に追加する文字列クエリ。 または &?始めてはいけません。


body -
string. 省略可能。 の場合は method != GET && method != HEADを使用します。

JSON 形式の要求本文。


waitForCompletion - Completion イベント
string. 必須です。 使用できる値: true (コールバック)、 false (ApiResponse)。 既定値: false

タスクが完了を報告する方法。

  • false - API 応答 - 関数は成功を返し、成功条件は true に評価されます。
  • true - Callback - 関数は、タイムライン レコードを更新するためのコールバックを行います。

successCriteria - 成功条件
string. 省略可能。 の場合は waitForCompletion = falseを使用します。

成功したタスクの条件。 既定では、タスクは成功すると状態を 200 OK 返します。

例: 応答 {"status" : "successful"}の場合、式には を指定 eq(root['status'], 'successful')できます。 条件の指定の詳細については、こちらを参照してください。


タスク制御オプション

すべてのタスクには、タスク入力に加えて制御オプションがあります。 詳細については、「 コントロール オプションと一般的なタスク プロパティ」を参照してください。

出力変数

[なし] :

解説

このタスクは、リリース パイプラインのエージェントレス ジョブで使用して、Azure Functionsで作成およびホストされる関数アプリで HTTP によってトリガーされる関数を呼び出し、応答を解析します。

完了イベントとしてコールバックが選択されている場合、タスクはどこで完了を通知する必要がありますか?

完了を通知するために、関数は完了データを次のパイプライン REST エンドポイントに POST する必要があります。

{planUri}/{projectId}/_apis/distributedtask/hubs/{hubName}/plans/{planId}/events?api-version=2.0-preview.1

**Request Body**
{ "name": "TaskCompleted", "taskId": "taskInstanceId", "jobId": "jobId", "result": "succeeded" }

詳細については、このシンプルな cmdline アプリケーションを参照してください。 さらに、C# ヘルパー ライブラリを利用して、エージェントレス タスクのライブ ログ記録とタスク状態の管理を有効にすることができます。 詳細情報

タイムアウトが長い場合、タスクが 1 分以内に失敗するのはなぜですか?

関数が 1 分を超える間実行される場合は、 コールバック 完了イベントを使用します。 API 応答入力候補オプションは、60 秒以内に完了する要求でサポートされています。

コールバック完了モードを使用する Azure 関数の例

#r "Newtonsoft.Json"

using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    var url = req.Headers["PlanUrl"];
    var projectId = req.Headers["ProjectId"];
    var hubName = req.Headers["HubName"];
    var planId = req.Headers["PlanId"];
    var jobId = req.Headers["JobId"];
    var timelineId = req.Headers["TimelineId"];
    var taskInstanceId = req.Headers["TaskinstanceId"];
    var authToken = req.Headers["AuthToken"];

    var callbackUrl = $"{url}/{projectId}/_apis/distributedtask/hubs/{hubName}/plans/{planId}/events?api-version=2.0-preview.1";
  
    var successBody = JsonConvert.SerializeObject(new {
        name = "TaskCompleted",
        taskId = taskInstanceId.ToString(),
        jobId = jobId.ToString(),
        result = "succeeded"
    });

    // the following call does not block
    Task.Run(() =>
    {
        Thread.Sleep(70000); // simulate long running work
        PostEvent(callbackUrl, successBody, authToken, log);
    });
   
    return new OkObjectResult("Long-running job successfully scheduled!");
}
    
public static void PostEvent(String callbackUrl, String body, String authToken, ILogger log)
{
    try
    {
        var client = new HttpClient();
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
        var requestContent = new StringContent(body, Encoding.UTF8, "application/json");
        var response = client.PostAsync(new Uri(callbackUrl), requestContent).Result;
        var responseContent = response.Content.ReadAsStringAsync().Result;
        log.LogInformation(response.StatusCode.ToString());
        log.LogInformation(responseContent);
    }
    catch (Exception ex)
    {
        log.LogError(ex.Message);
    }
}

要件

要件 説明
パイプラインの種類 YAML、クラシック ビルド、クラシック リリース
上で実行 Server、ServerGate
確認要求 なし
Capabilities このタスクは、ジョブ内の後続のタスクに対する要求を満たしていません。
コマンドの制限 Any
設定可能な変数 Any
エージェントのバージョン サポートされているすべてのエージェント バージョン。
タスクのカテゴリ ユーティリティ

こちらもご覧ください