Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Layanan Azure DevOps | Azure DevOps Server | Azure DevOps Server 2022
Panduan ini memandu Anda membuat, menguji, dan menerbitkan tugas build atau rilis kustom sebagai ekstensi Azure DevOps. Tugas alur kustom memungkinkan Anda memperluas Azure DevOps dengan fungsionalitas khusus yang disesuaikan dengan alur kerja tim Anda, dari utilitas sederhana hingga integrasi kompleks dengan sistem eksternal.
Pelajari cara melakukan tugas berikut:
- Menyiapkan lingkungan pengembangan dan struktur proyek
- Membuat logika tugas menggunakan TypeScript dan Pustaka Tugas Azure Pipelines
- Menerapkan pengujian unit komprehensif dengan kerangka kerja tiruan
- Mengemas ekstensi Anda untuk distribusi
- Menerbitkan ke Visual Studio Marketplace
- Menyiapkan alur CI/CD otomatis untuk pemeliharaan ekstensi
Untuk informasi selengkapnya tentang Azure Pipelines, lihat Apa itu Azure Pipelines?
Catatan
Artikel ini membahas tugas agen dalam ekstensi berbasis agen. Untuk informasi tentang tugas server dan ekstensi berbasis server, lihat Penulisan Tugas Server.
Prasyarat
Sebelum memulai, pastikan Anda memiliki persyaratan berikut:
| Komponen | Persyaratan | Deskripsi |
|---|---|---|
| Organisasi Azure DevOps | Diperlukan | Membuat organisasi jika Anda tidak memilikinya |
| Editor teks | Direkomendasikan | Visual Studio Code untuk IntelliSense dan dukungan penelusuran kesalahan |
| Node.js | Diperlukan | Instal versi terbaru (disarankanNode.js 20 atau yang lebih baru) |
| Pengkompilasi TypeScript | Diperlukan | Instal versi terbaru (versi 4.6.3 atau yang lebih baru) |
| Azure DevOps CLI (tfx-cli) | Diperlukan | Menginstal menggunakan npm i -g tfx-cli ekstensi paket |
| SDK Ekstensi Azure DevOps | Diperlukan | Menginstal paket azure-devops-extension-sdk |
| Kerangka kerja pengujian | Diperlukan | Mocha untuk pengujian unit (diinstal selama penyiapan) |
Struktur proyek
Buat home direktori untuk proyek Anda. Setelah Anda menyelesaikan tutorial ini, ekstensi Anda harus memiliki struktur berikut:
|--- README.md
|--- images
|--- extension-icon.png
|--- buildandreleasetask // Task scripts location
|--- task.json // Task definition
|--- index.ts // Main task logic
|--- package.json // Node.js dependencies
|--- tests/ // Unit tests
|--- _suite.ts
|--- success.ts
|--- failure.ts
|--- vss-extension.json // Extension manifest
Penting
Komputer pengembangan Anda harus menjalankan versi terbaru Node.js untuk memastikan kompatibilitas dengan lingkungan produksi. Perbarui file Anda task.json untuk menggunakan Node 20:
"execution": {
"Node20_1": {
"target": "index.js"
}
}
1. Buat tugas kustom
Bagian ini memandu Anda membuat struktur dasar dan implementasi tugas kustom Anda. Semua file dalam langkah ini harus dibuat dalam folder di buildandreleasetask dalam direktori proyek home Anda.
Catatan
Panduan ini menggunakan Windows dengan PowerShell. Langkah-langkahnya berfungsi pada semua platform, tetapi sintaks variabel lingkungan berbeda. Di Mac atau Linux, ganti $env:<var>=<val> dengan export <var>=<val>.
Menyiapkan perancah tugas
Buat struktur proyek dasar dan instal dependensi yang diperlukan:
Untuk menginisialisasi proyek Node.js, buka PowerShell, buka folder Anda
buildandreleasetask, dan jalankan:npm init --yesFile
package.jsondibuat dengan pengaturan default. Bendera--yesmenerima semua opsi default secara otomatis.Tips
Agen Azure Pipelines mengharapkan folder tugas menyertakan modul simpul. Salin
node_moduleske folder Andabuildandreleasetask. Untuk mengelola ukuran file VSIX (batas 50 MB), pertimbangkan untuk menjalankannpm install --productionataunpm prune --productionsebelum pengemasan.Instal Pustaka Tugas Azure Pipelines:
npm install azure-pipelines-task-lib --savePasang definisi jenis TypeScript:
npm install @types/node --save-dev npm install @types/q --save-devMenyiapkan pengecualian kontrol versi
echo node_modules > .gitignoreProses build Anda harus berjalan
npm installuntuk membangun kembali node_modules setiap kali.Instal dependensi pengujian:
npm install mocha --save-dev -g npm install sync-request --save-dev npm install @types/mocha --save-devInstal pengkompilasi TypeScript:
npm install typescript@4.6.3 -g --save-devCatatan
Instal TypeScript secara global untuk memastikan
tscperintah tersedia. Tanpanya, TypeScript 2.3.4 digunakan secara default.Mengonfigurasi kompilasi TypeScript:
tsc --init --target es2022File
tsconfig.jsondibuat dengan pengaturan target ES2022.
Menerapkan logika tugas
Dengan perancah selesai, buat file tugas inti yang menentukan fungsionalitas dan metadata:
Membuat file definisi tugas: Buat
task.jsondibuildandreleasetaskfolder. File ini menjelaskan tugas Anda ke sistem Azure Pipelines, menentukan input, pengaturan eksekusi, dan presentasi UI.{ "$schema": "https://raw.githubusercontent.com/Microsoft/azure-pipelines-task-lib/master/tasks.schema.json", "id": "{{taskguid}}", "name": "{{taskname}}", "friendlyName": "{{taskfriendlyname}}", "description": "{{taskdescription}}", "helpMarkDown": "", "category": "Utility", "author": "{{taskauthor}}", "version": { "Major": 0, "Minor": 1, "Patch": 0 }, "instanceNameFormat": "Echo $(samplestring)", "inputs": [ { "name": "samplestring", "type": "string", "label": "Sample String", "defaultValue": "", "required": true, "helpMarkDown": "A sample string" } ], "execution": { "Node20_1": { "target": "index.js" } } }Catatan
Ganti
{{placeholders}}dengan informasi aktual tugas Anda. harustaskguidunik. Hasilkan menggunakan PowerShell:(New-Guid).GuidUntuk menerapkan logika tugas, buat
index.tsdengan fungsionalitas utama tugas Anda:import tl = require('azure-pipelines-task-lib/task'); async function run() { try { const inputString: string | undefined = tl.getInput('samplestring', true); if (inputString == 'bad') { tl.setResult(tl.TaskResult.Failed, 'Bad input was given'); return; } console.log('Hello', inputString); } catch (err: any) { tl.setResult(tl.TaskResult.Failed, err.message); } } run();Kompilasi TypeScript ke JavaScript:
tscFile
index.jsdibuat dari sumber TypeScript Anda.
Memahami komponen task.json
File task.json adalah inti dari definisi tugas Anda. Berikut adalah properti utamanya:
| Properti | Deskripsi | Contoh |
|---|---|---|
id |
Pengidentifikasi GUID unik untuk tugas Anda | Dihasilkan menggunakan (New-Guid).Guid |
name |
Nama tugas tanpa spasi (digunakan secara internal) | MyCustomTask |
friendlyName |
Nama tampilan ditampilkan di UI | My Custom Task |
description |
Deskripsi terperinci tentang fungsionalitas tugas | Performs custom operations on files |
author |
Penerbit atau nama penulis | My Company |
instanceNameFormat |
Bagaimana tugas muncul dalam langkah-langkah alur | Process $(inputFile) |
inputs |
Array parameter input | Lihat jenis input berikut |
execution |
Spesifikasi lingkungan eksekusi |
Node20_1, PowerShell3, dll. |
restrictions |
Pembatasan keamanan untuk perintah dan variabel | Direkomendasikan untuk tugas baru |
Pembatasan keamanan
Untuk tugas produksi, tambahkan pembatasan keamanan untuk membatasi penggunaan perintah dan akses variabel:
"restrictions": {
"commands": {
"mode": "restricted"
},
"settableVariables": {
"allowed": ["variable1", "test*"]
}
}
Mode terbatas hanya memungkinkan perintah ini:
-
logdetail,logissue,complete,setprogress -
setsecret,setvariable,debug,settaskvariable -
prependpath,publish
Variabel allowlist mengontrol variabel mana yang dapat diatur melalui setvariable atau prependpath. Mendukung pola regex dasar.
Catatan
Fitur ini memerlukan agen versi 2.182.1 atau yang lebih baru.
Jenis dan contoh input
Jenis input umum untuk parameter tugas:
"inputs": [
{
"name": "stringInput",
"type": "string",
"label": "Text Input",
"defaultValue": "",
"required": true,
"helpMarkDown": "Enter a text value"
},
{
"name": "boolInput",
"type": "boolean",
"label": "Enable Feature",
"defaultValue": "false",
"required": false
},
{
"name": "picklistInput",
"type": "pickList",
"label": "Select Option",
"options": {
"option1": "First Option",
"option2": "Second Option"
},
"defaultValue": "option1"
},
{
"name": "fileInput",
"type": "filePath",
"label": "Input File",
"required": true,
"helpMarkDown": "Path to the input file"
}
]
Menguji tugas Anda secara lokal
Sebelum pengemasan, uji tugas Anda untuk memastikannya berfungsi dengan benar:
Uji dengan input yang hilang (seharusnya gagal):
node index.jsOutput yang diharapkan:
##vso[task.debug]agent.workFolder=undefined ##vso[task.debug]loading inputs and endpoints ##vso[task.debug]loaded 0 ##vso[task.debug]task result: Failed ##vso[task.issue type=error;]Input required: samplestring ##vso[task.complete result=Failed;]Input required: samplestringUji dengan input yang valid (harus berhasil):
$env:INPUT_SAMPLESTRING="World" node index.jsOutput yang diharapkan:
##vso[task.debug]agent.workFolder=undefined ##vso[task.debug]loading inputs and endpoints ##vso[task.debug]loading INPUT_SAMPLESTRING ##vso[task.debug]loaded 1 ##vso[task.debug]samplestring=World Hello WorldPenanganan kesalahan pengujian:
$env:INPUT_SAMPLESTRING="bad" node index.jsTindakan ini harus memicu jalur penanganan kesalahan dalam kode Anda.
Tips
Untuk informasi tentang pelari tugas dan versi Node.js, lihat Panduan pembaruan runner node.
Untuk informasi selengkapnya, lihat referensi tugas Build/release.
2. Menerapkan pengujian unit komprehensif
Menguji tugas Anda secara menyeluruh memastikan keandalan dan membantu menangkap masalah sebelum penyebaran ke alur produksi.
Menginstal dependensi pengujian
Instal alat pengujian yang diperlukan:
npm install mocha --save-dev -g
npm install sync-request --save-dev
npm install @types/mocha --save-dev
Membuat pengujian
Buat
testsfolder di direktori tugas Anda yang_suite.tsberisi file:import * as path from 'path'; import * as assert from 'assert'; import * as ttm from 'azure-pipelines-task-lib/mock-test'; describe('Sample task tests', function () { before( function() { // Setup before tests }); after(() => { // Cleanup after tests }); it('should succeed with simple inputs', function(done: Mocha.Done) { // Success test implementation }); it('should fail if tool returns 1', function(done: Mocha.Done) { // Failure test implementation }); });Tips
Folder pengujian Anda harus terletak di folder tugas (misalnya,
buildandreleasetask). Jika Anda mengalami kesalahan permintaan sinkronisasi, instal di folder tugas:npm i --save-dev sync-request.Buat
success.tsdi direktori pengujian Anda untuk mensimulasikan keberhasilan eksekusi tugas:import ma = require('azure-pipelines-task-lib/mock-answer'); import tmrm = require('azure-pipelines-task-lib/mock-run'); import path = require('path'); let taskPath = path.join(__dirname, '..', 'index.js'); let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); // Set valid input for success scenario tmr.setInput('samplestring', 'human'); tmr.run();Tambahkan pengujian keberhasilan ke file Anda
_suite.ts:it('should succeed with simple inputs', function(done: Mocha.Done) { this.timeout(1000); let tp: string = path.join(__dirname, 'success.js'); let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.runAsync().then(() => { console.log(tr.succeeded); assert.equal(tr.succeeded, true, 'should have succeeded'); assert.equal(tr.warningIssues.length, 0, "should have no warnings"); assert.equal(tr.errorIssues.length, 0, "should have no errors"); console.log(tr.stdout); assert.equal(tr.stdout.indexOf('Hello human') >= 0, true, "should display Hello human"); done(); }).catch((error) => { done(error); // Ensure the test case fails if there's an error }); });Buat
failure.tsdi direktori pengujian Anda untuk menguji penanganan kesalahan:import ma = require('azure-pipelines-task-lib/mock-answer'); import tmrm = require('azure-pipelines-task-lib/mock-run'); import path = require('path'); let taskPath = path.join(__dirname, '..', 'index.js'); let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); // Set invalid input to trigger failure tmr.setInput('samplestring', 'bad'); tmr.run();Tambahkan pengujian kegagalan ke file Anda
_suite.ts:it('should fail if tool returns 1', function(done: Mocha.Done) { this.timeout(1000); const tp = path.join(__dirname, 'failure.js'); const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.runAsync().then(() => { console.log(tr.succeeded); assert.equal(tr.succeeded, false, 'should have failed'); assert.equal(tr.warningIssues.length, 0, 'should have no warnings'); assert.equal(tr.errorIssues.length, 1, 'should have 1 error issue'); assert.equal(tr.errorIssues[0], 'Bad input was given', 'error issue output'); assert.equal(tr.stdout.indexOf('Hello bad'), -1, 'Should not display Hello bad'); done(); }); });
Jalankan pengujian Anda
Jalankan rangkaian pengujian:
# Compile TypeScript
tsc
# Run tests
mocha tests/_suite.js
Kedua tes harus lulus. Untuk output verbose (mirip dengan output konsol build), atur variabel lingkungan pelacakan:
$env:TASK_TEST_TRACE=1
mocha tests/_suite.js
Menguji praktik terbaik cakupan
- Uji semua kombinasi input: Input yang valid, input yang tidak valid, input yang diperlukan hilang
- Skenario kesalahan pengujian: Kegagalan jaringan, kesalahan sistem file, masalah izin
- Menipu dependensi eksternal: Jangan mengandalkan layanan eksternal dalam pengujian unit
- Memvalidasi output: Memeriksa output konsol, hasil tugas, dan artefak yang dihasilkan
- Pengujian performa: Pertimbangkan untuk menambahkan pengujian untuk tugas yang memproses file besar
Praktik terbaik keamanan
- Validasi input: Selalu validasi dan bersihkan input
-
Penanganan rahasia: Gunakan
setSecretuntuk data sensitif - Pembatasan perintah: Menerapkan pembatasan perintah untuk tugas produksi
- Izin minimal: Minta izin yang diperlukan saja
- Pembaruan reguler: Menjaga dependensi dan versi Node.js terkini
Setelah menguji tugas Anda secara lokal dan menerapkan pengujian unit yang komprehensif, kemas ke dalam ekstensi untuk Azure DevOps.
Menginstal alat pengemasan
Instal Antarmuka Baris Perintah Lintas Platform (tfx-cli):
npm install -g tfx-cli
Membuat manifes ekstensi
Manifes ekstensi (vss-extension.json) berisi semua informasi tentang ekstensi Anda, termasuk referensi ke folder dan gambar tugas Anda.
Membuat folder gambar dengan
extension-icon.pngfileBuat
vss-extension.jsondi direktori akar ekstensi Anda (bukan di folder tugas):{ "manifestVersion": 1, "id": "my-custom-tasks", "name": "My Custom Tasks", "version": "1.0.0", "publisher": "your-publisher-id", "targets": [ { "id": "Microsoft.VisualStudio.Services" } ], "description": "Custom build and release tasks for Azure DevOps", "categories": [ "Azure Pipelines" ], "icons": { "default": "images/extension-icon.png" }, "files": [ { "path": "MyCustomTask" } ], "contributions": [ { "id": "my-custom-task", "type": "ms.vss-distributed-task.task", "targets": [ "ms.vss-distributed-task.tasks" ], "properties": { "name": "MyCustomTask" } } ] }
Properti manifes kunci
| Properti | Deskripsi |
|---|---|
publisher |
Pengidentifikasi penerbit marketplace Anda |
contributions.id |
Pengidentifikasi unik dalam ekstensi |
contributions.properties.name |
Harus cocok dengan nama folder tugas Anda |
files.path |
Jalur ke folder tugas Anda relatif terhadap manifes |
Catatan
Ubah nilai penerbit menjadi nama penerbit Anda. Untuk informasi tentang membuat penerbit, lihat Membuat penerbit Anda.
Mengemas ekstensi perangkat lunak Anda
Kemas ekstensi Anda ke dalam file .vsix:
tfx extension create --manifest-globs vss-extension.json
Manajemen versi
-
Versi ekstensi: Menaikkan versi untuk
vss-extension.jsonsetiap pembaruan -
Versi tugas: Menaikkan versi untuk
task.jsonsetiap pembaruan tugas -
Kenaikan otomatis: Gunakan
--rev-versionuntuk secara otomatis meningkatkan versi patch
tfx extension create --manifest-globs vss-extension.json --rev-version
Penting
Versi tugas dan versi ekstensi harus diperbarui agar perubahan diterapkan di Azure DevOps.
Strategi penerapan versi
Ikuti prinsip penerapan versi semantik untuk pembaruan tugas Anda:
- Versi utama: Melanggar perubahan pada input/output
- Versi minor: Fitur baru, kompatibel mundur
- Versi patch: Perbaikan bug saja
Proses pembaruan:
- Perbarui
task.jsonversi - Perbarui
vss-extension.jsonversi - Menguji secara menyeluruh dalam organisasi pengujian
- Menerbitkan dan memantau masalah
Terbitkan ke Visual Studio Marketplace
1. Buat penerbit Anda
- Masuk ke Portal Penerbitan Marketplace Visual Studio
- Buat penerbit baru jika diminta:
-
Pengidentifikasi penerbit: Digunakan dalam manifes ekstensi Anda (misalnya,
mycompany-myteam) -
Nama tampilan: Nama publik yang ditampilkan di marketplace (misalnya,
My Team)
-
Pengidentifikasi penerbit: Digunakan dalam manifes ekstensi Anda (misalnya,
- Meninjau dan menerima Perjanjian Penerbit Marketplace
2. Unggah ekstensi Anda
Metode antarmuka web:
- Pilih Unggah ekstensi baru
- Pilih file paket
.vsixAnda - Pilih Unggah
Metode baris perintah:
tfx extension publish --manifest-globs vss-extension.json --share-with yourOrganization
3. Bagikan ekstensi Anda
- Klik kanan ekstensi Anda di marketplace
- Pilih Bagikan
- Masukkan nama organisasi Anda
- Menambahkan lebih banyak organisasi sesuai kebutuhan
Penting
Penerbit harus diverifikasi untuk berbagi ekstensi secara publik. Untuk informasi selengkapnya, lihat Paket/Terbitkan/Instal.
4. Instal ke organisasi Anda
Setelah berbagi, instal ekstensi ke organisasi Azure DevOps Anda:
- Menavigasi keEkstensi> Organisasi
- Telusuri ekstensi Anda
- Pilih Dapatkan gratis dan instal
3. Mengemas dan menerbitkan ekstensi Anda
Memverifikasi ekstensi Anda
Setelah penginstalan, verifikasi tugas Anda berfungsi dengan benar:
- Membuat atau mengedit alur.
- Tambahkan tugas kustom Anda:
- Pilih Tambahkan tugas di editor alur
- Cari tugas kustom Anda berdasarkan nama
- Menambahkannya ke alur Anda
- Mengonfigurasi parameter tugas:
- Mengatur input yang diperlukan
- Mengonfigurasi pengaturan opsional
- Jalankan alur untuk menguji fungsionalitas
- Pantau eksekusi:
- Periksa log tugas untuk eksekusi yang tepat
- Memverifikasi output yang diharapkan
- Pastikan tidak ada kesalahan atau peringatan
4. Mengotomatiskan penerbitan ekstensi dengan CI/CD
Untuk mempertahankan tugas kustom Anda secara efektif, buat alur build dan rilis otomatis yang menangani pengujian, pengemasan, dan penerbitan.
Prasyarat untuk otomatisasi
- Tugas Ekstensi Azure DevOps: Instal ekstensi secara gratis
-
Grup variabel: Buat grup variabel pustaka alur dengan variabel ini:
-
publisherId: ID penerbit marketplace Anda -
extensionId: ID Ekstensi dari vss-extension.json -
extensionName: Nama ekstensi dari vss-extension.json -
artifactName: Nama untuk artefak VSIX
-
- Koneksi layanan: Membuat koneksi layanan Marketplace dengan izin akses alur
Menyelesaikan alur CI/CD
Buat alur YAML dengan tahap komprehensif untuk pengujian, pengemasan, dan penerbitan:
trigger:
- main
pool:
vmImage: "ubuntu-latest"
variables:
- group: extension-variables # Your variable group name
stages:
- stage: Test_and_validate
displayName: 'Run Tests and Validate Code'
jobs:
- job: RunTests
displayName: 'Execute unit tests'
steps:
- task: TfxInstaller@4
displayName: 'Install TFX CLI'
inputs:
version: "v0.x"
- task: Npm@1
displayName: 'Install task dependencies'
inputs:
command: 'install'
workingDir: '/MyCustomTask' # Update to your task directory
- task: Bash@3
displayName: 'Compile TypeScript'
inputs:
targetType: "inline"
script: |
cd MyCustomTask # Update to your task directory
tsc
- task: Npm@1
displayName: 'Run unit tests'
inputs:
command: 'custom'
workingDir: '/MyCustomTask' # Update to your task directory
customCommand: 'test' # Ensure this script exists in package.json
- task: PublishTestResults@2
displayName: 'Publish test results'
inputs:
testResultsFormat: 'JUnit'
testResultsFiles: '**/test-results.xml'
searchFolder: '$(System.DefaultWorkingDirectory)'
- stage: Package_extension
displayName: 'Package Extension'
dependsOn: Test_and_validate
condition: succeeded()
jobs:
- job: PackageExtension
displayName: 'Create VSIX package'
steps:
- task: TfxInstaller@4
displayName: 'Install TFX CLI'
inputs:
version: "v0.x"
- task: Npm@1
displayName: 'Install dependencies'
inputs:
command: 'install'
workingDir: '/MyCustomTask'
- task: Bash@3
displayName: 'Compile TypeScript'
inputs:
targetType: "inline"
script: |
cd MyCustomTask
tsc
- task: QueryAzureDevOpsExtensionVersion@4
name: QueryVersion
displayName: 'Query current extension version'
inputs:
connectTo: 'VsTeam'
connectedServiceName: 'marketplace-connection'
publisherId: '$(publisherId)'
extensionId: '$(extensionId)'
versionAction: 'Patch'
- task: PackageAzureDevOpsExtension@4
displayName: 'Package extension'
inputs:
rootFolder: '$(System.DefaultWorkingDirectory)'
publisherId: '$(publisherId)'
extensionId: '$(extensionId)'
extensionName: '$(extensionName)'
extensionVersion: '$(QueryVersion.Extension.Version)'
updateTasksVersion: true
updateTasksVersionType: 'patch'
extensionVisibility: 'private'
extensionPricing: 'free'
- task: PublishBuildArtifacts@1
displayName: 'Publish VSIX artifact'
inputs:
PathtoPublish: '$(System.DefaultWorkingDirectory)/*.vsix'
ArtifactName: '$(artifactName)'
publishLocation: 'Container'
- stage: Publish_to_marketplace
displayName: 'Publish to Marketplace'
dependsOn: Package_extension
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
jobs:
- deployment: PublishExtension
displayName: 'Deploy to marketplace'
environment: 'marketplace-production'
strategy:
runOnce:
deploy:
steps:
- task: TfxInstaller@4
displayName: 'Install TFX CLI'
inputs:
version: "v0.x"
- task: PublishAzureDevOpsExtension@4
displayName: 'Publish to marketplace'
inputs:
connectTo: 'VsTeam'
connectedServiceName: 'marketplace-connection'
fileType: 'vsix'
vsixFile: '$(Pipeline.Workspace)/$(artifactName)/*.vsix'
publisherId: '$(publisherId)'
extensionId: '$(extensionId)'
extensionName: '$(extensionName)'
updateTasksVersion: false
extensionVisibility: 'private'
extensionPricing: 'free'
Mengonfigurasi package.json untuk pengujian
Tambahkan skrip pengujian ke package.json:
{
"scripts": {
"test": "mocha tests/_suite.js --reporter xunit --reporter-option output=test-results.xml",
"test-verbose": "cross-env TASK_TEST_TRACE=1 npm test"
}
}
Perincian tahap alur
Tahap 1: Menguji dan memvalidasi
- Tujuan: Memastikan kualitas dan fungsionalitas kode
- Tindakan: Menginstal dependensi, mengkompilasi TypeScript, menjalankan pengujian unit, menerbitkan hasil
- Validasi: Semua pengujian harus lulus untuk melanjutkan
Tahap 2: Ekstensi paket
- Tujuan: Membuat paket VSIX yang dapat disebarkan
- Tindakan: Mengkueri versi saat ini, versi tahapan, ekstensi paket, menerbitkan artefak
- Penerapan versi: Secara otomatis menangani kenaikan versi
Tahap 3: Terbitkan ke marketplace
- Tujuan: Sebarkan ke Visual Studio Marketplace
- Kondisi: Hanya berjalan di cabang utama setelah kemasan berhasil
- Lingkungan: Menggunakan lingkungan penyebaran untuk gerbang persetujuan
Praktik terbaik untuk CI/CD
- Perlindungan cabang: Hanya terbitkan dari cabang utama/rilis
- Gerbang lingkungan: Menggunakan lingkungan penyebaran untuk rilis produksi
- Manajemen versi: Mengotomatiskan kenaikan versi untuk menghindari konflik
- Cakupan pengujian: Memastikan cakupan pengujian komprehensif sebelum pengemasan
- Keamanan: Gunakan koneksi layanan alih-alih kredensial yang dikodekan secara permanen
- Pemantauan: Menyiapkan pemberitahuan untuk penyebaran yang gagal
Untuk alur build klasik, ikuti langkah-langkah berikut untuk menyiapkan pengemasan dan penerbitan ekstensi:
BashTambahkan tugas untuk mengkompilasi TypeScript ke Dalam JavaScript.Untuk mengkueri versi yang sudah ada, tambahkan tugas Versi Ekstensi Kueri menggunakan input berikut:
- Menyambungkan ke: Visual Studio Marketplace
- Visual Studio Marketplace (Koneksi layanan): Koneksi layanan
- ID Penerbit: ID penerbit Visual Studio Marketplace Anda
- ID Ekstensi: ID ekstensi Anda dalam
vss-extension.jsonfile - Tingkatkan versi: Patch
- Variabel Output:
Task.Extension.Version
Untuk mengemas ekstensi berdasarkan Json manifes, tambahkan tugas Ekstensi Paket menggunakan input berikut:
- Folder utama manifes: Mengarah ke direktori akar yang berisi file manifes. Misalnya,
$(System.DefaultWorkingDirectory)adalah direktori akar - File manifes:
vss-extension.json - ID Penerbit: ID penerbit Visual Studio Marketplace Anda
- ID Ekstensi: ID ekstensi Anda dalam
vss-extension.jsonfile - Nama Ekstensi: Nama ekstensi Anda dalam
vss-extension.jsonfile - Versi Ekstensi:
$(Task.Extension.Version) - Ganti versi tugas: ditandai (true)
- Penggantian Tipe: Hanya Gantikan Patch (1.0.r)
- Visibilitas Ekstensi: Jika ekstensi masih dalam pengembangan, atur nilai ke privat. Untuk merilis ekstensi ke publik, atur nilai ke publik.
- Folder utama manifes: Mengarah ke direktori akar yang berisi file manifes. Misalnya,
Untuk menyalin ke file yang diterbitkan, tambahkan tugas Salin file menggunakan input berikut:
- Isi: Semua file yang akan disalin untuk dipublikasikan sebagai artefak
- Folder tujuan: Folder tempat file disalin
- Misalnya:
$(Build.ArtifactStagingDirectory)
- Misalnya:
Tambahkan Terbitkan artefak build untuk menerbitkan artefak agar dapat digunakan dalam pekerjaan atau pipeline lain. Gunakan input berikut:
- Jalur untuk diterbitkan: Jalur ke folder yang berisi file yang sedang diterbitkan
- Misalnya:
$(Build.ArtifactStagingDirectory)
- Misalnya:
- Nama artefak: Nama yang diberikan ke artefak
- Lokasi penerbitan artifak: Pilih Azure Pipelines untuk menggunakan artifak dalam pekerjaan mendatang
- Jalur untuk diterbitkan: Jalur ke folder yang berisi file yang sedang diterbitkan
Tahap 3: Unduh artefak build dan terbitkan ekstensi
Untuk menginstal tfx-cli ke agen build Anda, tambahkan Gunakan Node CLI untuk Azure DevOps (tfx-cli).
Untuk mengunduh artefak pada pekerjaan baru, tambahkan tugas Download build artifacts dengan menggunakan input berikut:
- Unduh artefak yang diproduksi oleh: Jika Anda mengunduh artefak pada pekerjaan baru dari rangkaian proses yang sama, pilih Rancangan saat ini. Jika Anda mengunduh di jalur baru, pilih Build tertentu
- Jenis unduhan: Pilih Artefak tertentu untuk mengunduh semua file yang diterbitkan.
- Nama artefak: Nama artefak yang diterbitkan
- Direktori tujuan: Folder tempat file harus diunduh
Untuk mendapatkan tugas Terbitkan Ekstensi , gunakan input berikut:
- Menyambungkan ke: Visual Studio Marketplace
- Koneksi Visual Studio Marketplace: ServiceConnection
- Jenis file input: File VSIX
- File VSIX:
/Publisher.*.vsix - ID Penerbit: ID penerbit Visual Studio Marketplace Anda
- ID Ekstensi: ID ekstensi Anda dalam
vss-extension.jsonfile - Nama Ekstensi: Nama ekstensi Anda dalam
vss-extension.jsonfile - Visibilitas ekstensi: Baik privat atau publik
Opsional: Menginstal dan menguji ekstensi Anda
Setelah Anda menerbitkan ekstensi, ekstensi perlu diinstal di organisasi Azure DevOps.
Menginstal ekstensi ke organisasi
Instal ekstensi bersama Anda dalam beberapa langkah:
Buka Pengaturan organisasi dan pilih Ekstensi.
Temukan ekstensi Anda di bagian Ekstensi Dibagikan Dengan Saya :
- Pilih tautan ekstensi
- Pilih Dapatkan gratis atau Instal
Periksa apakah ekstensi muncul di daftar Ekstensi terinstal Anda:
- Mengonfirmasi bahwa tersedia di pustaka tugas alur Anda
Catatan
Jika Anda tidak melihat tab Ekstensi , pastikan Anda berada di tingkat administrasi organisasi (https://dev.azure.com/{organization}/_admin) dan bukan di tingkat proyek.
Pengujian ujung-ke-ujung
Setelah penginstalan, lakukan pengujian komprehensif:
Buat alur pengujian:
- Menambahkan tugas kustom Anda ke alur baru
- Mengonfigurasi semua parameter input
- Uji dengan berbagai kombinasi input
Memvalidasi fungsionalitas:
- Jalankan eksekusi alur dan pantau
- Memeriksa output dan log tugas
- Memverifikasi penanganan kesalahan dengan input yang tidak valid
Performa pengujian:
- Uji dengan file input besar (jika berlaku)
- Memantau penggunaan sumber daya
- Memvalidasi perilaku batas waktu
Tanya jawab umum
T: Bagaimana pembatalan tugas ditangani?
A: Agen alur mengirim SIGINT dan SIGTERM memberi sinyal ke proses tugas. Meskipun pustaka tugas tidak menyediakan penanganan pembatalan eksplisit, tugas Anda dapat menerapkan penangan sinyal. Untuk detailnya, lihat Pembatalan pekerjaan agen.
T: Bagaimana cara menghapus tugas dari organisasi saya?
A: Penghapusan otomatis tidak didukung karena akan merusak alur yang ada. Sebaliknya:
- Menghentikan tugas: Menandai tugas sebagai tidak digunakan lagi
- Manajemen versi: Benjolan versi tugas
- Komunikasi: Memberi tahu pengguna tentang garis waktu penghentian
T: Bagaimana cara memutakhirkan tugas saya ke versi Node.js terbaru?
A: Tingkatkan ke versi Node terbaru untuk performa dan keamanan yang lebih baik. Untuk panduan migrasi, lihat Meningkatkan tugas ke Node 20.
Dukung beberapa versi Node dengan menyertakan beberapa bagian eksekusi di task.json:
"execution": {
"Node20_1": {
"target": "index.js"
},
"Node10": {
"target": "index.js"
}
}
Agen dengan Node 20 menggunakan versi pilihan, sementara agen yang lebih lama kembali ke Node 10.
Untuk meningkatkan tugas Anda:
Untuk memastikan kode Anda berperilaku seperti yang diharapkan, uji tugas Anda pada berbagai versi runner Node.
Di bagian eksekusi tugas Anda, perbarui dari
NodeatauNode10keNode16atauNode20.Untuk mendukung versi server yang lebih lama, Anda harus mempertahankan target
Node/Node10. Versi Azure DevOps Server yang lebih lama mungkin tidak menyertakan versi runner Node terbaru.Anda dapat memilih untuk membagikan titik entri yang ditentukan dalam target atau memiliki target yang dioptimalkan untuk versi Node yang digunakan.
"execution": { "Node10": { "target": "bash10.js", "argumentFormat": "" }, "Node16": { "target": "bash16.js", "argumentFormat": "" }, "Node20_1": { "target": "bash20.js", "argumentFormat": "" } }
Penting
Jika Anda tidak menambahkan dukungan untuk runner Node 20 pada tugas kustom Anda, tugas tersebut akan gagal pada agen yang diinstal dari umpan rilis pipelines-agent-*.