Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Çekme isteği (PR) iş akışı, yazılımcılara meslektaşlarından ve otomatik araçlardan kodları hakkında geri bildirim alma fırsatı sunar. Microsoft dışı araçlar ve hizmetler, PR Durum API'sinikullanarak PR iş akışına katılabilir. Bu makale, Azure DevOps Services Git deposundaki değişiklik isteklerini doğrulamak için bir durum sunucusu oluşturma sürecinde size rehberlik eder. Çekme isteği durumu hakkında daha fazla bilgi için bkz. Çekme isteği durumuyla çekme isteği iş akışlarını özelleştirme ve genişletme.
Önkoşullar
| Kategori | Gereksinimler |
|---|---|
| Kuruluş | Azure DevOps'ta git deposuna sahip bir kuruluş. |
| Araçlar |
-
Visual Studio Code veya seçtiğiniz diğer kod düzenleyicisini. - Node.js. İndirme, Node.js çalışma zamanını yerel makinenize yüklemek için çalıştırabileceğiniz bir yükleyici içerir. Node.js yüklerken, yüklemenin varsayılan olarak seçili gelen npm paket yöneticisi kısmını tutmayı unutmayın. |
| Kimlik Doğrulaması | Çekme isteği durumunu değiştirme iznine sahip olmak için Kod (durum) kapsamına sahip Microsoft Entra ID belirteci. Daha fazla bilgi için bkz . Microsoft Entra kimlik doğrulaması. |
Express kullanarak temel bir web sunucusu oluşturma
Bu bölümdeki adımlar, web sunucusu oluşturmayı basitleştiren birçok HTTP yardımcı programı yöntemi sağlayan Node.js için basit bir web çerçevesi olan Expresskullanır. Bu çerçeve, PR etkinliklerini dinlemek için gereken temel işlevleri sağlar.
Komut satırından web sunucunuz için yeni bir proje klasörü oluşturun.
mkdir pr-server cd pr-serverProje için yeni bir
npm initdosyası oluşturmak içinpackage.jsonkomutunu kullanın.npm initGiriş noktası dışındaki tüm seçeneklerin varsayılanlarını kabul etmek için seçin ve ile giriş yapın.
app.jsolarak değiştirinentry point: (index.js) app.jsAşağıdaki komutu kullanarak Express'i
pr-serverdizinine yükleyin. Bu işlem Express'i yükler ve bağımlılıklar listesine kaydeder.npm install expressPR durum sunucusu için bir Express uygulaması oluşturun. Aşağıdaki adımlar, Express Merhaba dünya örneği'ni temel alır.
a. Klasörden aşağıdaki komutu
pr-serverçalıştırarak Visual Studio Code'da proje klasörünü açın.code .b. Yeni bir dosya
(Ctrl + N)oluşturun ve temel bir Express sunucusu oluşturmak için aşağıdaki örnek kodu yapıştırın.const express = require('express') const app = express() app.get('/', function (req, res) { res.send('Hello World!') }) app.listen(3000, function () { console.log('Example app listening on port 3000!') })ç. Dosyayı
app.jsolarak kaydedin.Aşağıdaki komutu kullanarak temel web sunucusunu çalıştırın:
node app.jshttp://localhost:3000/'e göz atarak sunucunun çalıştığını doğrulayın.
HTTP POST isteklerini dinleme
Web sunucusu Azure DevOps Services'dan POST istekleri alır, bu nedenle bu istekleri sunucunuzda işlemeniz gerekir.
app.jsdosyasının sonuna aşağıdaki kodu ekleyin ve dosyayı kaydedin.app.post('/', function (req, res) { res.send('Received the POST') })Aşağıdaki komutu kullanarak web sunucunuzu yeniden çalıştırın:
node app.js
PR olayları için servis kancası yapılandırma
Hizmet kancaları, belirli olaylar gerçekleştiğinde dış hizmetleri uyarabilen bir Azure DevOps Services özelliğidir. Bu örnek için PR olayları için iki hizmet kancası ayarlayın, böylece durum sunucusuna bildirim gönderilebilir. Birincisi, numaralı Çekme isteği oluşturulan olayı için ve ikincisi, numaralı Çekme isteği güncellenmiş olayı içindir.
Hizmet kancası bildirimlerini almak için bir bağlantı noktasını açık internette erişilebilir hale getirin. ngrok yardımcı programı, geliştirme ortamında bunu yapmak için kullanışlıdır.
Platformunuz için uygun ngrok sürümünü indirin ve sıkıştırmasını açın.
Örnek sunucunuzla aynı bağlantı noktasında dinlemeye başlamak için ngrok kullanın - bağlantı noktası 3000. Aşağıdaki komutu yeni bir komut penceresinde çalıştırın.
ngrok http 3000Ngrok,
localhost:3000adresine yönlendiren bir genel URL oluşturur. Bir sonraki adımda ihtiyacınız olduğu gibi URL'yi not edin. Aşağıdaki örneğe benzer:http://c3c1bffa.ngrok.ioAzure DevOps'ta projenize göz atın, örneğin
https://dev.azure.com/<your account>/<your project name>Navigasyon menüsünden dişli simgesi üzerine gelin ve Hizmet Kancalarıseçeneğini seçin.
İlk hizmet kancanızsa + Abonelik oluşturöğesini seçin.
Yapılandırılmış başka hizmet kancalarınız varsa, yeni bir hizmet kancası aboneliği oluşturmak için artı
(+)seçin.
Yeni Hizmet Kancaları Aboneliği iletişim kutusunda, hizmetler listesinden Web Kancaları'nı seçin ve daha sonra Sonraki'ni seçin.
Olay tetikleyicileri listesinden oluşturulan çekme isteğini seçin, ardından 'e İleri'yi seçin.
Eylem sayfasında, URL kutusuna ngrok url'sini girin. Sunucunuza test olayı göndermek için test seçin.
Ngrok konsol penceresinde, içeri gelen bir
POST, sunucunuzun hizmet kancası olayını aldığını belirten bir200 OKolarak görüntülenir.HTTP Requests ------------- POST / 200 OKTest Bildirimi penceresinde Yanıt sekmesini seçerek sunucunuzdan gelen yanıtın ayrıntılarını görüntüleyin. POST işleyicinizdeki dizenin uzunluğuyla eşleşen 17 karakter uzunluğunda bir içerik görmelisiniz (örneğin, "POST alındı").
Test Bildirimi penceresini kapatın ve hizmet kancasını oluşturmak için Son seçeneğini seçin.
3'ten 9'a kadar olan adımları tekrar geçin, ancak bu kez Çekme isteği güncelleştirildi olayını yapılandırın.
Önemli
Önceki adımları iki kez uyguladığınızdan ve hem Çekme isteği oluşturuldu hem de Çekme isteği güncellendi olayları için hizmet kancaları oluşturduğunuzdan emin olun.
PR'lere durumu yayınla
Yeni PR'ler oluşturulduğunda sunucunuz servis kancası olaylarını alabildiğine göre, PR'ye durum bildirimini geri gönder olacak şekilde bunu güncelleştirin.
Hizmet kancası istekleri, olayı açıklayan bir JSON yükü içerir. Hizmet kancası tarafından döndürülen JSON'u ayrıştırmaya yardımcı olmak için body-parser paketini yükleyin.
npm install body-parserapp.js'ıapplication/json'i ayrıştırmak için body-parser kullanarak güncelleyin.var bodyParser = require('body-parser') app.use(bodyParser.json())Azure Repos'a REST API çağrıları yapmayı kolaylaştırmak için azure-devops-node-api paketini yükleyin.
npm install azure-devops-node-apiazure-devops-node-api paketini kullanmak, hesabınızla bağlantının ayrıntılarını ayarlamak ve Git API'sinin bir örneğini almak için
app.jsgüncelleştirin.const vsts = require("azure-devops-node-api") const collectionURL = process.env.COLLECTIONURL const token = process.env.TOKEN var authHandler = vsts.getBearerHandler(token) var connection = new vsts.WebApi(collectionURL, authHandler) var vstsGit = connection.getGitApi()koleksiyon URL'niz için bir ortam değişkeni oluşturun ve
<your account>yerine Azure DevOps kuruluşunuzun adını yazın.setx COLLECTIONURL "https://dev.azure.com/<your account>"Microsoft Entra ID belirteci alarak uygulamanızda kullanın. Microsoft Entra Id belirteçleri, Azure DevOps REST API'leri için önerilen kimlik doğrulama yöntemidir. Bu belirteçleri aşağıdaki yollarla alabilirsiniz:
- 1. Seçenek: Azure CLI (geliştirme/test için)
az account get-access-token --resource 499b84ac-1321-427f-aa17-267ca6975798 --query "accessToken" --output tsv - Seçenek 2: Hizmet Sorumlusu (üretim için)
- Microsoft Entra ID'de bir uygulama kaydetme
- Uygulama için istemci sırrı oluşturma
- Azure DevOps'ta uygulamaya uygun izinleri verme
- Belirteçleri program aracılığıyla almak için hizmet sorumlusu kimlik bilgilerini kullanın
Daha fazla bilgi için bkz . Microsoft Entra kimlik doğrulaması.
- 1. Seçenek: Azure CLI (geliştirme/test için)
Microsoft Entra ID belirteciniz için bir ortam değişkeni oluşturun.
setx TOKEN "your-entra-id-token-here"
Microsoft Entra ID belirteçlerini programatik olarak alma (Üretim için önerilir)
Üretim uygulamaları için, statik belirteçler kullanmak yerine program aracılığıyla Microsoft Entra ID belirteçlerini edinmeniz gerekir. Node.jsiçin Microsoft Kimlik Doğrulama Kitaplığı 'nı (MSAL) kullanarak bunu şu şekilde uygulayacaksınız:
MSAL Node paketini yükleyin:
npm install @azure/msal-nodeBelirteç sağlayıcısı modülü oluşturma (
tokenProvider.js):const { ConfidentialClientApplication } = require('@azure/msal-node'); const clientConfig = { auth: { clientId: process.env.CLIENT_ID, clientSecret: process.env.CLIENT_SECRET, authority: `https://login.microsoftonline.com/${process.env.TENANT_ID}` } }; const cca = new ConfidentialClientApplication(clientConfig); async function getAccessToken() { const clientCredentialRequest = { scopes: ['499b84ac-1321-427f-aa17-267ca6975798/.default'] }; try { const response = await cca.acquireTokenByClientCredential(clientCredentialRequest); return response.accessToken; } catch (error) { console.error('Error acquiring token:', error); throw error; } } module.exports = { getAccessToken };Belirtecinizi
app.jsbelirteç sağlayıcısını kullanacak şekilde güncelleştirin:const { getAccessToken } = require('./tokenProvider'); // Instead of using a static token, get a fresh token app.post("/", async function (req, res) { try { const token = await getAccessToken(); var authHandler = vsts.getBearerHandler(token); var connection = new vsts.WebApi(collectionURL, authHandler); // ... rest of your POST handler code } catch (error) { console.error('Authentication error:', error); res.status(500).send('Authentication failed'); } });Çekme isteği ayrıntılarını web kancası yükünden okumak için
post()işlevini güncelleyin. Durumu geri göndermek için bu değerlere ihtiyacınız var.var repoId = req.body.resource.repository.id var pullRequestId = req.body.resource.pullRequestId var title = req.body.resource.titlePR'ye göndermek için durum nesnesini oluşturun.
State, GitStatusState türünde bir sabit listesidir. PR'nin durum kontrolünü geçtiğini ve birleştirmeye hazır olduğunu belirtmek içinsucceededkullanın.description, Durum bölümünde ve çekme isteği ayrıntıları görünümünde etkinlik akışında kullanıcıya görüntülenen bir dize değeridir.targetUrl, Durum bölümünde ve etkinlik akışında açıklama metni için bağlantı oluşturmak için kullanılan bir URL'dir. Bu url, kullanıcıların durum hakkında daha fazla bilgi almak için gidebileceği yerdir( örneğin, bir derleme raporu veya test çalıştırması). URL belirtilmezse, açıklama bağlantısız metin olarak görünür.Bağlam
namevegenre, durumu kategorize etmek ve diğer hizmetlerin durum paylaşımlarından ayırmak için kullanılır.var prStatus = { "state": "succeeded", "description": "Ready for review", "targetUrl": "https://visualstudio.microsoft.com", "context": { "name": "wip-checker", "genre": "continuous-integration" } }succeededdurumunu hemen göndermek yerine, çekme isteği (PR) başlığını inceleyin. Kullanıcının, başlığa WIP ekleyerek çekme isteğinin devam eden bir iş olup olmadığını belirtip belirtmediğini kontrol edin. Öyleyse, PR'ye geri gönderilmiş durumu değiştirin.if (title.includes("WIP")) { prStatus.state = "pending" prStatus.description = "Work in progress" }Son olarak,
createPullRequestStatus()yöntemini kullanarak durumu gönderin. Durum nesnesi, depo kimliği ve çekme isteği kimliği gereklidir. Gönderinin sonucunu görebilmek için yanıtı düğüm konsoluna gönderin.vstsGit.createPullRequestStatus(prStatus, repoId, pullRequestId).then( result => { console.log(result) })Sonuçta elde edilen yöntem şöyle görünmelidir:
app.post("/", async function (req, res) { try { // Get the details about the PR from the service hook payload var repoId = req.body.resource.repository.id var pullRequestId = req.body.resource.pullRequestId var title = req.body.resource.title // Build the status object that we want to post. // Assume that the PR is ready for review... var prStatus = { "state": "succeeded", "description": "Ready for review", "targetUrl": "https://visualstudio.microsoft.com", "context": { "name": "wip-checker", "genre": "continuous-integration" } } // Check the title to see if there is "WIP" in the title. if (title.includes("WIP")) { // If so, change the status to pending and change the description. prStatus.state = "pending" prStatus.description = "Work in progress" } // Get the Git API instance and post the status to the PR const gitApi = await vstsGit const result = await gitApi.createPullRequestStatus(prStatus, repoId, pullRequestId) console.log(result) res.send("Received the POST") } catch (error) { console.error('Error processing PR status:', error) res.status(500).send('Error processing request') } })app.jskaydedin ve düğüm uygulamanızı yeniden başlatın.node app.js
Durum sunucusunu test etmek için yeni bir pull request oluştur.
Sunucunuz çalıştığına ve hizmet kancası bildirimlerini dinlediğine göre, test etmek için bir pull isteği oluşturun.
Dosyalar görünümünden başlayın. Deponuzdaki readme.md dosyasını (veya readme.md yoksa başka bir dosyayı) düzenleyin.
Düzenleme yapın ve değişiklikleri depoya işleyin.
Değişiklikleri yeni bir dala işlediğinizden emin olun ki sonraki adımda bir çekme isteği (PR) oluşturabilirsiniz.
Çekme isteği oluştur bağlantısını seçin.
Uygulamanın işlevselliğini test etmek için başlığa WIP ekleyin. Çekme isteğini oluşturmak için Oluştur'u seçin.
Çekme isteği oluşturulduğunda, durum bölümünde yükte belirtilen URL'ye bağlanan Çalışma devam ediyor girdisi gösterilir.
Çekme isteği başlığını güncelleyin ve WIP metnini kaldırın ve "Devam eden çalışma" durumunun "İnceleme için hazır"olarak değiştiğine dikkat edin.