تنفيذ CI/CD لـ Stream Analytics على IoT Edge باستخدام واجهات برمجة التطبيقات

يمكنك تمكين التكامل والنشر المستمرين لمهام Azure Stream Analytics باستخدام واجهات برمجة تطبيقات REST. توفر هذه المقالة أمثلة على واجهات برمجة التطبيقات التي يجب استخدامها وكيفية استخدامها. واجهات برمجة تطبيقات REST غير مدعومة على Azure Cloud Shell.

استدعاء واجهات برمجة التطبيقات من بيئات مختلفة

يمكن استدعاء واجهات برمجة تطبيقات REST من كل من Linux وWindows. توضح الأوامر التالية بناء الجملة المناسب لاستدعاء واجهة برمجة التطبيقات. سيتم توضيح استخدام محدد لواجهة برمجة التطبيقات في الأقسام اللاحقة من هذه المقالة.

Linux

بالنسبة إلى Linux، يمكنك استخدام Curl أو Wget الأوامر:

curl -u { <username:password> }  -H "Content-Type: application/json" -X { <method> } -d "{ <request body> }" { <url> }   
wget -q -O- --{ <method> } -data="<request body>" --header=Content-Type:application/json --auth-no-challenge --http-user="<Admin>" --http-password="<password>" <url>

Windows

بالنسبة إلى Windows، استخدم PowerShell:

$user = "<username>" 
$pass = "<password>" 
$encodedCreds = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$pass))) 
$basicAuthValue = "Basic $encodedCreds" 
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" 
$headers.Add("Content-Type", 'application/json') 
$headers.Add("Authorization", $basicAuthValue) 
$content = "<request body>" 
$response = Invoke-RestMethod <url> -Method <method> -Body $content -Headers $Headers 
echo $response 

إنشاء وظيفة ASA على IoT Edge

لإنشاء وظيفة Stream Analytics، استدع أسلوب PUT باستخدام واجهة برمجة تطبيقات Stream Analytics.

الأسلوب URL للطلب
PUT https://management.azure.com/subscriptions/{subscription-id}/resourcegroups/{resource-group-name}/providers/Microsoft.StreamAnalytics/streamingjobs/{job-name}?api-version=2017-04-01-preview

مثال على الأمر باستخدام الثني:

curl -u { <username:password> } -H "Content-Type: application/json" -X { <method> } -d "{ <request body> }" https://management.azure.com/subscriptions/{subscription-id}/resourcegroups/{resource-group-name}/providers/Microsoft.StreamAnalytics/streamingjobs/{jobname}?api-version=2017-04-01-preview  

مثال على نص الطلب في JSON:

{ 
  "location": "West US", 
  "tags": { "key": "value", "ms-suppressjobstatusmetrics": "true" }, 
  "sku": {  
      "name": "Standard" 
    }, 
  "properties": { 
    "sku": {  
      "name": "standard" 
    }, 
       "eventsLateArrivalMaxDelayInSeconds": 1, 
       "jobType": "edge", 
    "inputs": [ 
      { 
        "name": "{inputname}", 
        "properties": { 
         "type": "stream", 
          "serialization": { 
            "type": "JSON", 
            "properties": { 
              "fieldDelimiter": ",", 
              "encoding": "UTF8" 
            } 
          }, 
          "datasource": { 
            "type": "GatewayMessageBus", 
            "properties": { 
            } 
          } 
        } 
      } 
    ], 
    "transformation": { 
      "name": "{queryName}", 
      "properties": { 
        "query": "{query}" 
      } 
    }, 
    "package": { 
      "storageAccount" : { 
        "accountName": "{blobstorageaccountname}", 
        "accountKey": "{blobstorageaccountkey}" 
      }, 
      "container": "{blobcontaine}]" 
    }, 
    "outputs": [ 
      { 
        "name": "{outputname}", 
        "properties": { 
          "serialization": { 
            "type": "JSON", 
            "properties": { 
              "fieldDelimiter": ",", 
              "encoding": "UTF8" 
            } 
          }, 
          "datasource": { 
            "type": "GatewayMessageBus", 
            "properties": { 
            } 
          } 
        } 
      } 
    ] 
  } 
} 

لمزيدٍ من المعلومات، راجع وثائق واجهة برمجة تطبيقات.

انشر حزمة IoT Edge

لنشر مهمة Stream Analytics علىIoT Edge، استدع أسلوب النشر باستخدام نشر حزمة واجهة برمجة تطبيقات IoT Edge.

الأسلوب URL للطلب
POST https://management.azure.com/subscriptions/{subscriptionid}/resourceGroups/{resourcegroupname}/providers/Microsoft.StreamAnalytics/streamingjobs/{jobname}/publishedgepackage?api-version=2017-04-01-preview

يؤدي الاستدعاء السابق إلى نشر حزمة واجهة برمجة تطبيقات IoT Edge إلى تشغيل عملية غير متزامنة وإرجاع حالة 202. يحتوي عنوان استجابة الموقع على معرف الموارد المنتظم URI المستخدم للحصول على حالة تلك العملية غير المتزامنة. يقوم استدعاء معرف الموارد المنتظم URI في عنوان الموقع بإرجاع حالة 202 للإشارة إلى أن العملية غير المتزامنة لا تزال قيد التقدم. عند اكتمال العملية، يقوم الاستدعاء إلى معرف الموارد المنتظم URI في عنوان الموقع بإرجاع حالة 200.

مثال على مكالمة نشر حزمة IoT Edge باستخدام الثني:

curl -d -X POST https://management.azure.com/subscriptions/{subscriptionid}/resourceGroups/{resourcegroupname}/providers/Microsoft.StreamAnalytics/streamingjobs/{jobname}/publishedgepackage?api-version=2017-04-01-preview

بعد إجراء مكالمة POST، يجب أن تتوقع استجابة مع نص أساسي فارغ. ابحث عن معرف الموارد المنتظم URI في عنوان الموقع للاستجابة، وسجله لمزيد من الاستخدام.

مثال على معرف الموارد المنتظم URI من عنوان الموقع للاستجابة:

https://management.azure.com/subscriptions/{subscriptionid}/resourcegroups/{resourcegroupname}/providers/Microsoft.StreamAnalytics/StreamingJobs/{resourcename}/OperationResults/{guidAssignedToTheAsynchronousOperation}?api-version=2017-04-01-preview

انتظر من بضع ثوانٍ إلى دقيقتين قبل إجراء مكالمة إلى واجهة برمجة التطبيقات التي وجدت عنوان معرف الموارد المنتظم URI الخاص بها في عنوان الموقع للاستجابة لنشر حزمة واجهة برمجة تطبيقات IoT Edge، وكرر دورة الانتظار وإعادة المحاولة حتى تحصل على استجابة 200.

مثال على إجراء استدعاء واجهة برمجة التطبيقات مع عنوان معرف الموارد المنتظم URI الذي تم إرجاعه باستخدام الثني:

curl -d –X GET https://management.azure.com/subscriptions/{subscriptionid}/resourcegroups/{resourcegroupname}/providers/Microsoft.StreamAnalytics/StreamingJobs/{resourcename}/OperationResults/{guidAssignedToTheAsynchronousOperation}?api-version=2017-04-01-preview

تتضمن الاستجابة المعلومات التي تحتاج إلى إضافتها إلى البرنامج النصي لنشر IoT Edge. توضح الأمثلة أدناه المعلومات التي تحتاج إلى جمعها ومكان إضافتها في بيان النشر.

نموذج نص الاستجابة بعد النشر بنجاح:

{ 
  edgePackageUrl : null 
  error : null 
  manifest : "{"supportedPlatforms":[{"os":"linux","arch":"amd64","features":[]},{"os":"linux","arch":"arm","features":[]},{"os":"windows","arch":"amd64","features":[]}],"schemaVersion":"2","name":"{jobname}","version":"1.0.0.0","type":"docker","settings":{"image":"{imageurl}","createOptions":null},"endpoints":{"inputs":["\],"outputs":["{outputnames}"]},"twin":{"contentType":"assignments","content":{"properties.desired":{"ASAJobInfo":"{asajobsasurl}","ASAJobResourceId":"{asajobresourceid}","ASAJobEtag":"{etag}","PublishTimeStamp":"{publishtimestamp}"}}}}" 
  status : "Succeeded" 
} 

عينة من بيان النشر:

{ 
  "modulesContent": { 
    "$edgeAgent": { 
      "properties.desired": { 
        "schemaVersion": "1.0", 
        "runtime": { 
          "type": "docker", 
          "settings": { 
            "minDockerVersion": "v1.25", 
            "loggingOptions": "", 
            "registryCredentials": {} 
          } 
        }, 
        "systemModules": { 
          "edgeAgent": { 
            "type": "docker", 
            "settings": { 
              "image": "mcr.microsoft.com/azureiotedge-agent:1.0", 
              "createOptions": "{}" 
            } 
          }, 
          "edgeHub": { 
            "type": "docker", 
            "status": "running", 
            "restartPolicy": "always", 
            "settings": { 
              "image": "mcr.microsoft.com/azureiotedge-hub:1.0", 
              "createOptions": "{}" 
            } 
          } 
        }, 
        "modules": { 
          "<asajobname>": { 
            "version": "1.0", 
            "type": "docker", 
            "status": "running", 
            "restartPolicy": "always", 
            "settings": { 
              "image": "<settings.image>", 
              "createOptions": "<settings.createOptions>" 
            } 
            "version": "<version>", 
             "env": { 
              "PlanId": { 
               "value": "stream-analytics-on-iot-edge" 
          } 
        } 
      } 
    }, 
    "$edgeHub": { 
      "properties.desired": { 
        "schemaVersion": "1.0", 
        "routes": { 
            "route": "FROM /* INTO $upstream" 
        }, 
        "storeAndForwardConfiguration": { 
          "timeToLiveSecs": 7200 
        } 
      } 
    }, 
    "<asajobname>": { 
      "properties.desired": {<twin.content.properties.desired>} 
    } 
  } 
} 

بعد تكوين بيان النشر، راجع نشر وحدات Azure IoT Edge النمطية باستخدام Azure CLI للنشر.

الخطوات التالية