Aracılığıyla paylaş


Program aracılığıyla hizmet kancası aboneliği oluşturma

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

Azure DevOps projesinde belirli bir olay gerçekleştiğinde bir dış hizmette veya tüketici hizmetinde eylem gerçekleştirmek için abonelik kullanabilirsiniz. Örneğin, bir derleme başarısız olduğunda abonelik, hizmetinize bildirim gönderebilir.

Program aracılığıyla abonelik oluşturmak için Abonelikler REST API'lerini kullanabilirsiniz. Bu makalede abonelik oluşturmak için örnek istek ve örnek kod sağlanır.

Önkoşullar

Kategori Gereksinimler
Proje erişimi Proje üyesi.
veri - Proje Kimliği. Proje kimliğini almak için Project REST API kullanın.
- Olay Kimliği ve ayarları. Bkz. Hizmet kancası olayları.
- Tüketici ve eylem ID'leri ve ayarları. Bkz. Hizmet kancası tüketicileri.

Desteklenen olaylar

Azure DevOps, çok sayıda tetikleyici olayı için destek sağlar. Örnek olarak aşağıdaki olaylar verilebilir:

  • Derleme tamamlandı
  • Kod gönderildi (Git projeleri için)
  • Çekme isteği oluşturuldu veya güncelleştirildi (Git projeleri için)
  • İade edilmiş kod (Team Foundation Sürüm Denetimi projeleri için)
  • İş öğesi oluşturuldu, güncelleştirildi, silindi, geri yüklendi veya yorumlandı

Bir eylemi tetikleyen olayları denetlemek için aboneliklerinizdeki filtreleri yapılandırabilirsiniz. Örneğin, derlemenin tamamlandığı olayı derleme durumuna göre filtreleyebilirsiniz.

İstek oluşturma

Abonelik oluşturduğunuzda, proje kimliğini, olayı, tüketiciyi, eylemi ve ilgili ayarları belirtmek için HTTP POST isteğinin gövdesini kullanırsınız.

Derlemenin tamamlandığı bir olay için abonelik oluşturmak için aşağıdaki isteği kullanabilirsiniz. Bu örnekte, WebSite.CI derlemesi başarısız olduğunda abonelik https://myservice/event adresine bir POST isteği gönderir.

İstek

{
    "publisherId": "tfs",
    "eventType": "build.complete",
    "resourceVersion": "1.0",
    "consumerId": "webHooks",
    "consumerActionId": "httpRequest",
    "publisherInputs": {
        "buildStatus": "failed",
        "definitionName": "WebSite.CI",
        "projectId": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
    },
    "consumerInputs": {
        "url": " https://myservice/event"
    },
}

JSON nesnesindeki özel verilerin güvenliği için güvenli HTTPS URL'leri kullanmanızı kesinlikle öneririz.

Yanıt

Aboneliği oluşturma isteği aşağıdakine benzer bir yanıt oluşturur:

{
    "id": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
    "url": "https://dev.azure.com/fabrikam/DefaultCollection/_apis/hooks/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
    "publisherId": "tfs",
    "eventType": "build.complete",
    "resourceVersion": "1.0",
    "consumerId": "webHooks",
    "consumerActionId": "httpRequest",
    "createdBy": {
        "id": "22cc22cc-dd33-ee44-ff55-66aa66aa66aa"
    },
    "createdDate": "2014-03-28T16:10:06.523Z",
    "modifiedBy": {
        "id": "22cc22cc-dd33-ee44-ff55-66aa66aa66aa"
    },
    "modifiedDate": "2014-04-25T18:15:26.053Z",
    "publisherInputs": {
        "buildStatus": "failed",
        "definitionName": "WebSite.CI",
        "hostId": "d3d3d3d3-eeee-ffff-aaaa-b4b4b4b4b4b4",
        "projectId": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
        "tfsSubscriptionId": "ffff5f5f-aa6a-bb7b-cc8c-dddddd9d9d9d"
    },
    "consumerInputs": {
        "url": "http://myservice/event"
    }
}

Abonelik isteği başarısız olursa, daha fazla ayrıntı içeren bir ileti içeren 400 HTTP yanıt kodu alırsınız.

Olay gerçekleştiğinde ne olur?

Bir olay oluştuğunda, projedeki tüm etkin abonelikler değerlendirilir. Ardından tüm eşleşen abonelikler için tüketici eylemi gerçekleştirilir.

Kaynak sürümleri (gelişmiş)

Bir API önizleme aşamasındayken kaynak sürümü oluşturma uygulanabilir. Çoğu senaryoda, kaynak sürümü olarak 1.0 belirtmek en güvenli yoldur.

Belirli tüketicilere gönderilen olay yükü, bir konu kaynağının JSON gösterimini içerir. Örneğin, web kancalarına, Azure Service Bus'a ve Azure Depolama'ya gönderilen yük, derleme veya iş öğesi hakkındaki bilgileri içerir. Bu kaynağın gösterimi çeşitli biçimlere veya sürümlere sahip olabilir.

Tüketici hizmetine göndermek istediğiniz kaynağın sürümünü abonelik üzerindeki resourceVersion alanı aracılığıyla belirtebilirsiniz.

Kaynak sürümü, API sürümüyle aynıdır. Kaynak sürümü belirtmezseniz, en son sürüm latest releasedolan kullanılır. Zaman içinde tutarlı bir olay yükü sağlamaya yardımcı olmak için her zaman bir kaynak sürümü belirtin.

Sıkça Sorulan Sorular

S: El ile abone olabileceğim hizmetler var mı?

Y: Evet. Proje yönetimi sayfasından abone olabileceğiniz hizmetler hakkında daha fazla bilgi için bkz. Hizmet kancalarıyla tümleştirme.

S: Abonelik oluşturmak için kullanabileceğim C# kitaplıkları var mı?

Y: Hayır, ancak başlamanıza yardımcı olacak bir örnek aşağıda verilmiştir. Azure DevOps kimlik doğrulaması için aşağıdaki kod, Azure Key Vault'ta depolanan bir kişisel erişim belirteci (PAT) kullanır. Üretim ortamında daha güvenli bir kimlik doğrulama yöntemi kullanın. Daha fazla bilgi için bkz. Doğru kimlik doğrulama mekanizmasını seçme.

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.ServiceHooks.WebApi;
using Microsoft.VisualStudio.Services.WebApi;

namespace CreateServiceHookSubscription
{
    internal class Program
    {
        // Create a service hook subscription to send a message to an Azure Service Bus queue when code is pushed to a Git repository.

        static async Task Main(string[] args)
        {
            // Get the secrets from the key vault.
            string keyVaultURI = "https://<key-vault-name>.vault.azure.net/";
            var secretClient = new SecretClient(new Uri(keyVaultURI), new DefaultAzureCredential());
            string personalAccessTokenSecretName = "<personal-access-token-secret-name>";
            string serviceBusConnectionStringSecretName = "<Service-Bus-connection-string-secret-name>";
            KeyVaultSecret personalAccessTokenSecret = await secretClient.GetSecretAsync(personalAccessTokenSecretName);
            KeyVaultSecret serviceBusConnectionStringSecret = await secretClient.GetSecretAsync(serviceBusConnectionStringSecretName);

            // Set up the connection parameters for Azure DevOps.
            var azureDevOpsOrganizationURL = new Uri("https://dev.azure.com/<Azure-DevOps-organization-name>/");
            string azureDevOpsTeamProjectID = "<Azure-DevOps-team-project-ID>";
            string azureDevOpsPersonalAccessToken = personalAccessTokenSecret.Value;

            // Set up the event parameters.
            string eventPublisherID = "tfs";
            string eventID = "git.push";
            string eventDescription = "Any stage in any release";
            string resourceVersion = "1.0";

            // Set up the consumer parameters.
            string consumerID = "azureServiceBus";
            string consumerActionID = "serviceBusQueueSend";
            string serviceBusNamespace = "<Service-Bus-namespace>";
            string serviceBusQueueName = "<Service-Bus-queue-name>";
            string consumerActionDescription = $"Send a message to the Service Bus {serviceBusQueueName} queue in the {serviceBusNamespace} namespace.";
            string serviceBusConnectionString = serviceBusConnectionStringSecret.Value;

            // Configure the subscription.
            var subscription = new Subscription()
            {
                PublisherId = eventPublisherID,
                PublisherInputs = new Dictionary<string, string>
                {
                    ["projectId"] = azureDevOpsTeamProjectID
                },
                EventType = eventID,
                EventDescription = eventDescription,
                ResourceVersion = resourceVersion,
                ActionDescription = consumerActionDescription,
                ConsumerActionId = consumerActionID,
                ConsumerId = consumerID,
                ConsumerInputs = new Dictionary<string, string>
                {
                    ["connectionString"] = serviceBusConnectionString,
                    ["queueName"] = serviceBusQueueName
                }
            };

            // Connect to the Azure DevOps organization and get a service hook client.
            var azureDevOpsCredentials = new VssBasicCredential(azureDevOpsPersonalAccessToken, string.Empty);
            var azureDevOpsConnection = new VssConnection(azureDevOpsOrganizationURL, azureDevOpsCredentials);
            var serviceHookClient = azureDevOpsConnection.GetClient<ServiceHooksPublisherHttpClient>();

            // Create the subscription.
            var createdSubscription = await serviceHookClient.CreateSubscriptionAsync(subscription);
            Console.WriteLine($"A subscription was created that has ID {createdSubscription.Id}.");
        }
    }
}