Seringkali sebagai bagian dari cek Permintaan Tarik, selain dari tinjauan kode itu sendiri, ada kebutuhan untuk melakukan serangkaian pemeriksaan rutin. Beberapa pemeriksaan mungkin menyangkut desain PR. Lainnya - periksa kondisi terkait yang membentuk dasar dari proses adopsi perubahan.
Jika pemeriksaan rutin tidak otomatis, seseorang mungkin mulai melupakan atau mengelak dari mereka. Karena rutin itu membosankan.
Layanan Visual Studio Team menawarkan infrastruktur yang cukup nyaman untuk menangani Permintaan Tarik. Ini termasuk kebijakan membangun gabungan kustom, penunjukan pengulas, menggabungkan aturan untuk perubahan yang diterima. Semua ini dilengkapi dengan sistem yang nyaman untuk mendiskusikan dan mengomentari kode.
Alat paling ampuh untuk memperpanjang proses Tarik Permintaan adalah kebijakan plug-in eksternal.
Kami akan berbicara tentang pembuatan dan penggunaannya (dan melihat kodenya)
Status Permintaan Tarik yang Dapat Diperluas
Status PR adalah bendera yang ditentukan dalam konteks. Konteks - kombinasi unik dari nama konteks dan "genre". Genre biasanya satu per aplikasi yang memanipulasi status.
Sebagai contoh:
Status 1: genre = 'my-policy', name = 'check-1'
Status 2: genre = 'my-policy', name = 'check-2'
Status mengambil salah satu nilai yang telah ditentukan. Untuk tujuan mendukung proses, kami akan tertarik pada dua: berhasil dan gagal.
Status dapat digunakan saat menyiapkan kebijakan brunch: flag yang dipilih harus memiliki status berhasil agar PR diterima. Dengan cara yang sama, kebijakan bawaan diterapkan yang memeriksa jumlah pengemudi, keberadaan tiket terlampir, dll.
Pergi ke pengeditan kebijakan cabang. Tambahkan kebijakan luar negeri.

Jika status telah diset setidaknya satu kali, itu akan tersedia di menu drop-down.
Di bagian bawah, Anda dapat menentukan judul untuk status, bagaimana judulnya akan ditampilkan di blok penyelesaian permintaan-tarik.

Status yang ditambahkan akan terlihat pada halaman permintaan tarik di blok centang:

Jika status tidak digunakan sebagai kebijakan, nilainya ditampilkan pada halaman di bagian Status. Jika statusnya ditentukan sebagai kebijakan, itu akan terlihat di bagian atas blok.
Manajemen Status Program
Status PR dapat dimanipulasi secara terprogram menggunakan API REST. Dengan demikian, dimungkinkan untuk menerapkan pemeriksaan PR tambahan dan menerjemahkan hasilnya secara langsung ke dalam proses membuat perubahan.
Nilai status baru ditambahkan oleh metode Buat . Selain hasil dan konteks, perlu untuk menyampaikan teks yang dilihat pengguna. Anda dapat meneruskan URL secara opsional: dalam hal ini, label status pada formulir PR akan menjadi tautan dan pengguna dapat pergi ke halaman dengan detail status.
Panggilan metode menghasilkan pembuatan catatan status PR baru. Dalam satu konteks, nilai status tambahan terakhir dianggap aktif. Entri status sebelumnya tidak terlihat dari UI, tetapi mereka dapat diperoleh dengan menggunakan metode Daftar .
Untuk status status pada gambar sebelumnya, daftar nyata status untuk permintaan tarik dapat sebagai berikut:
{ "value": [ { "id": 1, "state": "failed", "description": "PR title format", "context": "@{name=check-title; genre=my-pr-policy}", "creationDate": "2018-11-06T18:35:57.0324172Z", "updatedDate": "2018-11-06T18:35:57.0324172Z", "createdBy": "Masked value", "targetUrl": null }, { "id": 2, "state": "failed", "description": "Build for last update", "context": "@{name=check-build; genre=my-pr-policy}", "creationDate": "2018-11-06T18:35:57.5167963Z", "updatedDate": "2018-11-06T18:35:57.5167963Z", "createdBy": "Masked value", "targetUrl": null }, { "id": 3, "state": "succeeded", "description": "No offset from develop", "context": "@{name=check-offset; genre=my-pr-policy}", "creationDate": "2018-11-06T18:35:57.782379Z", "updatedDate": "2018-11-06T18:35:57.782379Z", "createdBy": "Masked value", "targetUrl": null }, { "id": 4, "state": "succeeded", "description": "PR title format", "context": "@{name=check-title; genre=my-pr-policy}", "creationDate": "2018-11-06T18:46:37.2627154Z", "updatedDate": "2018-11-06T18:46:37.2627154Z", "createdBy": "Masked value", "targetUrl": null }, { "id": 5, "state": "succeeded", "description": "Build for last update", "context": "@{name=check-build; genre=my-pr-policy}", "creationDate": "2018-11-06T18:51:33.7920543Z", "updatedDate": "2018-11-06T18:51:33.7920543Z", "createdBy": "Masked value", "targetUrl": null }, { "id": 6, "state": "failed", "description": "PR title format", "context": "@{name=check-title; genre=my-pr-policy}", "creationDate": "2018-11-06T18:53:44.3075889Z", "updatedDate": "2018-11-06T18:53:44.3075889Z", "createdBy": "Masked value", "targetUrl": null }, { "id": 7, "state": "failed", "description": "Title format is not correct", "context": "@{name=check-title; genre=my-pr-policy}", "creationDate": "2018-11-06T19:26:11.3019433Z", "updatedDate": "2018-11-06T19:26:11.3019433Z", "createdBy": "Masked value", "targetUrl": null } ], "count": 7 }
Setelah melihat daftar status saat ini, Anda dapat memperbarui yang dipilih berdasarkan indeks dalam daftar. Untuk melakukan ini, gunakan metode Pembaruan .
Akhirnya, catatan status dapat dihapus menggunakan metode Hapus .
Riwayat perubahan status PR dapat berguna untuk analisis lebih lanjut. Oleh karena itu, kami menggunakan metode berikut untuk mengubah status:
- Temukan catatan status terbaru untuk konteks yang sama
- Jika dia memiliki nilai hasil yang sama, deskripsi, dan tautan yang ingin kita tambahkan, kita tidak melakukan apa pun
- Jika tidak, tambahkan catatan status baru.
Ini memungkinkan Anda untuk menyimpan riwayat perubahan, tidak terlalu menggembungkannya.
function Set-PullRequestStatus { param( [Parameter (Mandatory = $true)] [string] $pullRequestId, [Parameter (Mandatory = $true)] [string] $state, [Parameter (Mandatory = $true)] [string] $description, [Parameter (Mandatory = $true)] [string] $contextName, [Parameter (Mandatory = $false)] [string] $contextGenre, [Parameter (Mandatory = $false)] [string] $targetUrl, [Parameter (Mandatory = $true)] [object] $context ) $b = @{ state = $state; description = $description; context = @{ name = $contextName; genre = $contextGenre; }; targetUrl = $targetUrl; } $body = ConvertTo-Json $b # # Get current list of statuses # $endpoint = (Get-ProjectBaseURL) + "/_apis/git/repositories/{repositoryId}/pullRequests/{pullRequestId}/statuses?api-version=4.1-preview.1" $res = Get-AzureRequestReqults -URI $endpoint -context ($context + @{pullRequestId = $pullRequestId}) # # Try to find a status for a given context genre and name. Start looking from the last one. If found - check if it has same values. # $i = $res.count $foundSameStatus = $false while ($i -GT 0) { $r = $res.value[$i-1] if (($r.context.name -EQ $contextName) -AND ($r.context.genre -EQ $contextGenre)) { $foundSameStatus = ($r.state -EQ $state) -AND ($r.description -EQ $description) -AND ($r.targetUrl -EQ $targetUrl) break } $i-- } $res = $r # # If same status / values was not found - add new record. # if (-not $foundSameStatus) { $endpoint = (Get-ProjectBaseURL) + "/_apis/git/repositories/{repositoryId}/pullRequests/{pullRequestId}/statuses?api-version=4.1-preview.1" $res = Get-AzureRequestReqults -URI $endpoint -context ($context + @{pullRequestId = $pullRequestId}) -method POST -query $body } return @{status = $res; status_changed = $(-not $foundSameStatus)} }
Aplikasi praktis
Kami telah mengadopsi pendekatan yang agak konservatif untuk menerima perubahan pada cabang integrasi. Kami mencoba menguji perubahan ke maksimum pada cabang fitur hingga maksimum.
Berikut adalah beberapa tugas yang kami selesaikan dengan bantuan status PR, sebagai bagian dari kebijakan khusus:
- Semua PR harus didekorasi dengan gaya yang sama. Oleh karena itu, kontrol pertama yang dibuat adalah desain header PR. Kami memeriksanya dengan ekspresi reguler.
- Cabang PR tidak boleh ketinggalan di belakang cabang tempat dituangkan (integrasi dilakukan).
- Jika, dalam kerangka PR, file proyek database diubah, maka file autotest juga harus ada.
- Ada kumpulan cabang yang berhasil untuk perubahan terakhir.
- Perakitan ini berhasil dipompa ke bangku tes dan tes otomatis berlalu.
Kondisi yang tercantum dapat diperiksa secara manual. Kami melakukan ini sebelumnya. Tapi ini rutin, dan sudah digantikan oleh proses otomatis. Sekarang kita dapat menambah dan mengubah set cek - itu akan selalu diintegrasikan ke dalam proses, selalu dijalankan.
Tambahan besar polis - mereka transparan untuk semua orang, dan selalu terlihat - di halaman PR. Mereka tidak perlu diingatkan lagi.
Selain itu, untuk kebijakan yang gagal verifikasi, kami menampilkan tautan ke halaman Wiki kami dengan deskripsi kebijakan dan tindakan yang diharapkan.
Implementasi teknis penegakan kebijakan
Saat ini, logika kebijakan diimplementasikan dalam bentuk skrip PowerShell. Karena cmdlet tingkat tinggi dan model data objek yang baik, kode skrip sangat kompak. Dan kemampuan untuk menjalankan skrip secara interaktif dalam beberapa langkah dan mengotak-atik variabel - sangat menyederhanakan proses pengembangan dan debugging.
Ngomong-ngomong, setelah rilis powershell core - skrip dapat dijalankan pada platform lain (diuji pada MacOS).
Jalankan skrip dalam rilis khusus VSTS pada jadwal sekitar sekali setiap beberapa jam. Mungkin kita akan mulai menjalankan sheduler lebih sering.
Pendekatan ini, tentu saja, memberikan respons yang jauh lebih lambat daripada jika Anda menerapkan hal yang sama dalam bentuk Fungsi Azure dan menghubungkannya ke VSTS melalui kait web. Tetapi bagi kami itu lebih penting untuk menerapkan pemeriksaan dan melihat bagaimana ini akan bekerja dalam proses (MVP). Efisiensi pemeriksaan belum penting. Ini akan menjadi langkah selanjutnya.
Implementasi pustaka untuk bekerja dengan VSTS REST API, yang digunakan dalam pemeriksaan, ditambah contoh kecil yang mengimplementasikan beberapa kebijakan ini dapat ditemukan dalam repositori di GitHub . Saya harap seseorang akan merasakan manfaatnya.