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
Bu kılavuz, özel derleme veya yayın görevlerini Azure DevOps uzantıları olarak oluşturma, test etme ve yayımlama konusunda size yol gösterir. Özel işlem hattı görevleri, Azure DevOps'un basit yardımcı programlardan dış sistemlerle karmaşık tümleştirmelere kadar ekibinizin iş akışlarına uyarlanmış özel işlevlerle genişletmenize olanak tanır.
Aşağıdaki görevlerin nasıl yapılacağını öğrenin:
- Geliştirme ortamını ve proje yapısını ayarlama
- TypeScript ve Azure Pipelines Görev Kitaplığı'nı kullanarak görev mantığı oluşturma
- Sahte çerçevelerle kapsamlı birim testi uygulama
- Uzantınızı dağıtım için paketleme
- Visual Studio Market'te yayımlama
- Uzantı bakımı için otomatik CI/CD işlem hatlarını ayarlama
Azure Pipelines hakkında daha fazla bilgi için bkz. Azure Pipelines nedir?
Not
Bu makale, ajan tabanlı uzantılardaki aracı görevlerini kapsar. Sunucu görevleri ve sunucu tabanlı uzantılar hakkında bilgi için bkz. Sunucu Görevi Yazma.
Önkoşullar
Başlamadan önce aşağıdaki gereksinimleri karşıladığınızdan emin olun:
| Bileşen | Gereksinim | Açıklama |
|---|---|---|
| Azure DevOps kuruluşu | Gerekli | Kuruluşunuz yoksa kuruluş oluşturma |
| Metin düzenleyicisi | Önerilir | IntelliSense için Visual Studio Code ve hata ayıklama desteği |
| Node.js | Gerekli | En son sürümü yükleme (Node.js 20 veya üzeri önerilir) |
| TypeScript derleyicisi | Gerekli | En son sürümü yükleme (sürüm 4.6.3 veya üzeri) |
| Azure DevOps CLI (tfx-cli) | Gerekli |
npm i -g tfx-cli Kullanarak paket uzantılarını yükleme |
| Azure DevOps Uzantısı SDK'sı | Gerekli | azure-devops-extension-sdk paketini yükleme |
| Test çerçevesi | Gerekli | Birim testi için Mocha (kurulum sırasında yüklenir) |
Proje yapısı
Projeniz için bir home dizin oluşturun. Bu öğreticiyi tamamladıktan sonra uzantınız aşağıdaki yapıya sahip olmalıdır:
|--- 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
Önemli
Üretim ortamıyla uyumluluğu sağlamak için geliştirme makinenizin en son Node.jssürümünü çalıştırması gerekir. Dosyanızı task.json Node 20'yi kullanacak şekilde güncelleştirin:
"execution": {
"Node20_1": {
"target": "index.js"
}
}
1. Özel görev oluşturma
Bu bölüm, özel görevinizin temel yapısını ve uygulamasını oluşturma konusunda size yol gösterir. Bu adımdaki tüm dosyalar projenizin buildandreleasetask dizinindeki home klasörde oluşturulmalıdır.
Not
Bu kılavuzda PowerShell ile Windows kullanılır. Adımlar tüm platformlarda çalışır, ancak ortam değişkeni söz dizimi farklıdır. Mac veya Linux'ta değerini ile $env:<var>=<val>değiştirinexport <var>=<val>.
Görev iskelesini ayarlama
Temel proje yapısını oluşturun ve gerekli bağımlılıkları yükleyin:
Node.js projesini başlatmak için PowerShell'i açın, klasörünüze
buildandreleasetaskgidin ve şunu çalıştırın:npm init --yesDosya
package.jsonvarsayılan ayarlarla oluşturulur.--yesbayrağı tüm varsayılan seçenekleri otomatik olarak kabul eder.İpucu
Azure Pipelines aracıları, görev klasörlerinin düğüm modülleri içermesini bekler. Klasörünüzde
node_moduleskopyalayınbuildandreleasetask. VSIX dosya boyutunu (50 MB sınırı) yönetmek için paketlemeden önce veyanpm install --productionçalıştırmayınpm prune --productiongöz önünde bulundurun.Azure Pipelines Görev Kitaplığı'nı yükleyin:
npm install azure-pipelines-task-lib --saveTypeScript tür tanımlarını yükleyin:
npm install @types/node --save-dev npm install @types/q --save-devSürüm denetimi dışlamalarını ayarlama
echo node_modules > .gitignoreDerleme işleminiz her seferinde node_modules yeniden oluşturmak için çalıştırılmalıdır
npm install.Test bağımlılıklarını yükleyin:
npm install mocha --save-dev -g npm install sync-request --save-dev npm install @types/mocha --save-devTypeScript derleyicisini yükleyin:
npm install typescript@4.6.3 -g --save-devNot
Komutun kullanılabilir olduğundan emin olmak için TypeScript'i
tscgenel olarak yükleyin. Bu olmadan TypeScript 2.3.4 varsayılan olarak kullanılır.TypeScript derlemesini yapılandırma:
tsc --init --target es2022Dosya
tsconfig.jsonES2022 hedef ayarlarıyla oluşturulur.
Görev mantığını uygulama
yapı iskelesi tamamlandıktan sonra işlevleri ve meta verileri tanımlayan temel görev dosyalarını oluşturun:
Görev tanımı dosyasını oluşturun: Klasörde oluşturun
task.jsonbuildandreleasetask. Bu dosyada Azure Pipelines sistemindeki göreviniz açıklanır ve girişler, yürütme ayarları ve kullanıcı arabirimi sunusu tanımlanır.{ "$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" } } }Not
değerini, görevinizin gerçek bilgileriyle değiştirin
{{placeholders}}.taskguidbenzersiz olmalıdır. PowerShell kullanarak bir tane oluşturun:(New-Guid).GuidGörev mantığını uygulamak için, görevinizin ana işlevselliğiyle oluşturun
index.ts: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();TypeScript'i JavaScript'e derleme:
tscDosya TypeScript
index.jskaynağınızdan oluşturulur.
task.json bileşenlerini anlama
Dosya task.json , görev tanımınızın kalbidir. Önemli özellikler şunlardır:
| Mülkiyet | Açıklama | Örnek |
|---|---|---|
id |
Göreviniz için benzersiz GUID tanımlayıcısı | Kullanılarak oluşturuldu (New-Guid).Guid |
name |
Boşluk içermeyen görev adı (dahili olarak kullanılır) | MyCustomTask |
friendlyName |
Kullanıcı arabiriminde gösterilen görünen ad | My Custom Task |
description |
Görev işlevselliğinin ayrıntılı açıklaması | Performs custom operations on files |
author |
Yayımcı veya yazar adı | My Company |
instanceNameFormat |
görev işlem hattı adımlarında nasıl görünür? | Process $(inputFile) |
inputs |
Giriş parametreleri dizisi | Aşağıdaki giriş türlerine bakın |
execution |
Yürütme ortamı belirtimi |
Node20_1, PowerShell3vb. |
restrictions |
Komutlar ve değişkenler için güvenlik kısıtlamaları | Yeni görevler için önerilir |
Güvenlik kısıtlamaları
Üretim görevleri için, komut kullanımını ve değişken erişimini sınırlamak için güvenlik kısıtlamaları ekleyin:
"restrictions": {
"commands": {
"mode": "restricted"
},
"settableVariables": {
"allowed": ["variable1", "test*"]
}
}
Kısıtlı mod yalnızca şu komutlara izin verir:
-
logdetail,logissue,complete,setprogress -
setsecret,setvariable,debug,settaskvariable -
prependpath,publish
Değişken izin listesi, veya setvariablearacılığıyla prependpath hangi değişkenlerin ayarlanabileceğini denetler. Temel regex desenlerini destekler.
Not
Bu özellik için aracı sürümü 2.182.1 veya üzeri gerekir.
Giriş türleri ve örnekler
Görev parametreleri için ortak giriş türleri:
"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"
}
]
Görevinizi yerel olarak test edin
Paketlemeden önce, doğru çalıştığından emin olmak için görevinizi test edin:
Eksik girişle test (başarısız olmalıdır):
node index.jsBeklenen çıkış:
##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: samplestringGeçerli girişle test edin (başarılı olmalıdır):
$env:INPUT_SAMPLESTRING="World" node index.jsBeklenen çıkış:
##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 WorldTest hatası işleme:
$env:INPUT_SAMPLESTRING="bad" node index.jsBu eylem, kodunuzda hata işleme yolunu tetiklemelidir.
İpucu
Görev çalıştırıcıları ve Node.js sürümleri hakkında bilgi için bkz . Düğüm çalıştırıcı güncelleştirme kılavuzu.
Daha fazla bilgi için bkz. Derleme/yayın görevi başvurusu.
2. Kapsamlı birim testi uygulama
Görevinizi kapsamlı bir şekilde test etmek güvenilirlik sağlar ve üretim işlem hatlarına dağıtım öncesinde sorunların yakalanmasına yardımcı olur.
Test bağımlılıklarını yükleme
Gerekli test araçlarını yükleyin:
npm install mocha --save-dev -g
npm install sync-request --save-dev
npm install @types/mocha --save-dev
Test oluşturma
Görev dizininizde dosya
testsiçeren bir_suite.tsklasör oluşturun: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 }); });İpucu
Test klasörünüz görev klasöründe (örneğin,
buildandreleasetask) bulunmalıdır. Eşitleme isteği hatasıyla karşılaşırsanız, bunu görev klasörüne yükleyin:npm i --save-dev sync-request.Başarılı görev yürütme benzetimini yapmak için test dizininizde oluşturun
success.ts: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();Başarı testini dosyanıza
_suite.tsekleyin: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 }); });Hata işlemeyi test etmek için test dizininizde oluşturun
failure.ts: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();Hata testini dosyanıza
_suite.tsekleyin: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(); }); });
Testlerinizi çalıştırma
Test paketini yürütme:
# Compile TypeScript
tsc
# Run tests
mocha tests/_suite.js
Her iki test de geçmelidir. Ayrıntılı çıkış için (derleme konsolu çıkışına benzer) izleme ortamı değişkenini ayarlayın:
$env:TASK_TEST_TRACE=1
mocha tests/_suite.js
Test kapsamı en iyi yöntemleri
- Tüm giriş birleşimlerini test edin: Geçerli girişler, geçersiz girişler, eksik gerekli girişler
- Test hatası senaryoları: Ağ hataları, dosya sistemi hataları, izin sorunları
- Sahte dış bağımlılıklar: Birim testlerinde dış hizmetlere güvenmeyin
- Çıkışları doğrulama: Konsol çıkışını, görev sonuçlarını ve oluşturulan yapıtları denetleme
- Performans testi: Büyük dosyaları işleyen görevler için testler eklemeyi göz önünde bulundurun
En iyi güvenlik uygulamaları
- Giriş doğrulama: Girişleri her zaman doğrulama ve temizleme
-
Gizli dizileri işleme: Hassas veriler için kullanın
setSecret - Komut kısıtlamaları: Üretim görevleri için komut kısıtlamaları uygulama
- En az izin: Yalnızca gerekli izinleri iste
- Düzenli güncelleştirmeler: Bağımlılıkları ve Node.js sürümleri güncel tutun
Görevinizi yerel olarak test ettikten ve kapsamlı birim testleri uyguladıktan sonra Azure DevOps için bir uzantıya paketleyebilirsiniz.
Paketleme araçlarını yükleme
Platformlar Arası Komut Satırı Arabirimini (tfx-cli) yükleyin:
npm install -g tfx-cli
Uzantı bildirimini oluşturma
Uzantı bildirimi (vss-extension.json), görev klasörlerinize ve resimlerinize başvurular dahil olmak üzere uzantınızla ilgili tüm bilgileri içerir.
Dosyayla
extension-icon.pngimages klasörü oluşturmaUzantınızın kök dizininde (görev klasöründe değil) oluşturun
vss-extension.json:{ "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" } } ] }
Anahtar bildirim özellikleri
| Mülkiyet | Açıklama |
|---|---|
publisher |
Market yayımcı tanımlayıcınız |
contributions.id |
Uzantı içindeki benzersiz tanımlayıcı |
contributions.properties.name |
Görev klasörü adınızla eşleşmelidir |
files.path |
Bildirime göre görev klasörünüzün yolu |
Not
Yayımcı değerini yayımcı adınızla değiştirin. Yayımcı oluşturma hakkında bilgi için bkz. Yayımcınızı oluşturma.
Uzantınızı paketleme
Uzantınızı bir .vsix dosyasına paketleyin:
tfx extension create --manifest-globs vss-extension.json
Sürüm yönetimi
-
Uzantı sürümü: Her güncelleştirme için sürümündeki
vss-extension.jsonsürümü artırma -
Görev sürümü: Her görev güncelleştirmesi için sürümündeki
task.jsonsürümü artırma -
Otomatik artırma: Düzeltme eki sürümünü otomatik olarak artırmak için kullanın
--rev-version
tfx extension create --manifest-globs vss-extension.json --rev-version
Önemli
Değişikliklerin Azure DevOps'ta etkili olması için hem görev sürümü hem de uzantı sürümü güncelleştirilmelidir.
Sürüm oluşturma stratejisi
Görev güncelleştirmeleriniz için anlamsal sürüm oluşturma ilkelerini izleyin:
- Ana sürüm: Girişlerde/çıkışlarda hataya neden olan değişiklikler
- İkincil sürüm: Yeni özellikler, geriye dönük uyumlu
- Düzeltme eki sürümü: Yalnızca hata düzeltmeleri
Güncelleştirme işlemi:
- Sürümü güncelleştirme
task.json - Sürümü güncelleştirme
vss-extension.json - Bir test kuruluşunda kapsamlı bir şekilde test edin
- Sorunları yayımlama ve izleme
Visual Studio Market'te yayımlama
1. Yayımcınızı oluşturma
- Visual Studio Market Yayımlama Portalı'nda oturum açma
- İstenirse yeni bir yayımcı oluşturun:
-
Yayımcı tanımlayıcısı: Uzantı bildiriminizde kullanılır (örneğin,
mycompany-myteam) -
Görünen ad: Markette gösterilen genel ad (örneğin,
My Team)
-
Yayımcı tanımlayıcısı: Uzantı bildiriminizde kullanılır (örneğin,
- Market Yayımcı Sözleşmesi'ni gözden geçirme ve kabul etme
2. Uzantınızı karşıya yükleyin
Web arabirimi yöntemi:
- Yeni uzantıyı karşıya yükle'yi seçin
- Paketlenmiş
.vsixdosyanızı seçin - Karşıya Yükle'yi seçin
Komut satırı yöntemi:
tfx extension publish --manifest-globs vss-extension.json --share-with yourOrganization
3. Uzantınızı paylaşın
- Markette uzantınıza sağ tıklayın
- Paylaş'ı seçin
- Kuruluşunuzun adını girin
- Gerektiğinde daha fazla kuruluş ekleyin
Önemli
Uzantıları genel olarak paylaşmak için yayımcıların doğrulanması gerekir. Daha fazla bilgi için bkz. Paketle/Yayımla/Yükle.
4. Kuruluşunuza yükleme
Paylaşımdan sonra uzantıyı Azure DevOps kuruluşunuza yükleyin:
- Kuruluş Ayarları>Uzantıları'na gidin
- Uzantınıza göz atın
- Ücretsiz edinin ve yükleyin'i seçin
3. Uzantınızı paketleyip yayımlayın
Uzantınızı doğrulama
Yüklemeden sonra, görevinizin düzgün çalıştığını doğrulayın:
- İşlem hattı oluşturma veya düzenleme.
- Özel görevinizi ekleyin:
- İşlem hattı düzenleyicisinde Görev ekle'yi seçin
- Özel görevinizi ada göre arama
- İşlem hattınıza ekleyin
- Görev parametrelerini yapılandırma:
- Gerekli girişleri ayarlama
- İsteğe bağlı ayarları yapılandırma
- İşlevselliği test etmek için işlem hattını çalıştırma
- Yürütmeyi izleme:
- Düzgün yürütme için görev günlüklerini denetleme
- Beklenen çıkışları doğrulama
- Hata veya uyarı olmadığından emin olun
4. CI/CD ile uzantı yayımlamayı otomatikleştirme
Özel görevinizi etkili bir şekilde sürdürmek için test, paketleme ve yayımlamayı işleyen otomatik derleme ve yayın işlem hatları oluşturun.
Otomasyon önkoşulları
- Azure DevOps Uzantı Görevleri: Uzantıyı ücretsiz yükleyin
-
Değişken grubu: Şu değişkenlerle bir işlem hattı kitaplığı değişken grubu oluşturun:
-
publisherId: Market yayımcı kimliğiniz -
extensionId: vss-extension.json uzantı kimliği -
extensionName: vss-extension.json uzantı adı -
artifactName: VSIX yapıtı için ad
-
- Hizmet bağlantısı: İşlem hattı erişim izinleriyle Market hizmet bağlantısı oluşturma
Tam CI/CD işlem hattı
Test, paketleme ve yayımlama için kapsamlı aşamalara sahip bir YAML işlem hattı oluşturun:
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'
test için package.json yapılandırma
test betiklerini uygulamanıza package.jsonekleyin:
{
"scripts": {
"test": "mocha tests/_suite.js --reporter xunit --reporter-option output=test-results.xml",
"test-verbose": "cross-env TASK_TEST_TRACE=1 npm test"
}
}
İşlem hattı aşama dökümü
1. Aşama: Test ve doğrulama
- Amaç: Kod kalitesini ve işlevselliğini sağlama
- Eylemler: Bağımlılıkları yükleme, TypeScript derleme, birim testleri çalıştırma, sonuçları yayımlama
- Doğrulama: Devam etmek için tüm testlerin geçmesi gerekir
2. Aşama: Paket uzantısı
- Amaç: Dağıtılabilir VSIX paketi oluşturma
- Eylemler: Geçerli sürümü sorgulama, sürümü artırma, paket uzantısı, yapıtları yayımlama
- Sürüm oluşturma: Sürüm artışlarını otomatik olarak işler
3. Aşama: Markette yayımlama
- Amaç: Visual Studio Market'e dağıtma
- Koşullar: Yalnızca başarılı paketlemeden sonra ana dalda çalışır
- Ortam: Onay geçitleri için dağıtım ortamını kullanır
CI/CD için en iyi yöntemler
- Dal koruması: Yalnızca ana/yayın dallarından yayımlama
- Ortam geçitleri: Üretim sürümleri için dağıtım ortamlarını kullanma
- Sürüm yönetimi: Çakışmaları önlemek için sürüm artışlarını otomatikleştirme
- Test kapsamı: Paketlemeden önce kapsamlı test kapsamı sağlayın
- Güvenlik: Sabit kodlanmış kimlik bilgileri yerine hizmet bağlantılarını kullanma
- İzleme: Başarısız dağıtımlar için uyarıları ayarlama
Klasik derleme işlem hatları için uzantı paketleme ve yayımlamayı ayarlamak için şu adımları izleyin:
TypeScript'i
BashJavaScript'e derlemek için görevi ekleyin.Mevcut sürümü sorgulamak için aşağıdaki girişleri kullanarak Sorgu Uzantısı Sürümü görevini ekleyin:
- Visual Studio Marketplace'e Bağlanın
- Visual Studio Marketplace (Hizmet bağlantısı): Hizmet Bağlantısı
- Yayımcı Kimliği: Visual Studio Market yayımcınızın kimliği
- Uzantı Kimliği: Dosyadaki
vss-extension.jsonuzantınızın kimliği - Sürüm güncellemesi: Yama
- Çıkış Değişkeni:
Task.Extension.Version
Uzantıları bildirim Json'a göre paketlemek için aşağıdaki girişleri kullanarak Paket Uzantısı görevini ekleyin:
- Kök bildirimler klasörü: Bildirim dosyasını içeren kök dizine işaret eder. Örneğin,
$(System.DefaultWorkingDirectory)kök dizin - Bildirim dosyası:
vss-extension.json - Yayımcı Kimliği: Visual Studio Market yayımcınızın kimliği
- Uzantı Kimliği: Dosyadaki
vss-extension.jsonuzantınızın kimliği - Uzantı Adı: Dosyadaki
vss-extension.jsonuzantınızın adı - Uzantı Sürümü:
$(Task.Extension.Version) - Görevleri geçersiz kılma sürümü: işaretli (true)
- Geçersiz Kılma Türü: Sadece Yama Değiştir (1.0.r)
- Uzantı Görünürlüğü: Uzantı hala geliştirme aşamasındaysa değeri private olarak ayarlayın. Uzantıyı genel kullanıma açmak için değeri public olarak ayarlayın.
- Kök bildirimler klasörü: Bildirim dosyasını içeren kök dizine işaret eder. Örneğin,
Yayımlanan dosyalara kopyalamak için aşağıdaki girişleri kullanarak Dosyaları kopyala görevini ekleyin:
- İçerik: Yapıt olarak yayımlamak için kopyalanacak tüm dosyalar
- Hedef klasör: Dosyaların kopyalanabilecekleri klasör
- Örneğin:
$(Build.ArtifactStagingDirectory)
- Örneğin:
Derleme yapıtlarını diğer işler veya işlem hatlarında kullanmak üzere yayımlamak için Derleme yapıtlarını yayımla'yı ekleyin. Aşağıdaki girişleri kullanın:
- Yayımlama yolu: Yayımlanmakta olan dosyaları içeren klasörün yolu
- Örneğin:
$(Build.ArtifactStagingDirectory)
- Örneğin:
- Yapıt adı: Yapıta verilen ad
- Yapıtların yayımlama konumu: Yapıtı gelecekteki işlerde kullanmak için Azure Pipelines'ı seçin
- Yayımlama yolu: Yayımlanmakta olan dosyaları içeren klasörün yolu
3. Aşama: Derleme yapıtlarını indirme ve uzantıyı yayımlama
Yapı aracınıza tfx-cli yüklemek için Azure DevOps için Node CLI Kullan (tfx-cli) ekleyin.
Yeni bir iş için artifaktları indirmek üzere aşağıdaki girişleri kullanarak Artifaktları indir görevini ekleyin.
- Tarafından üretilmiş artifaktları indirme: Artifaktı aynı işlem hattından yeni bir işe indiriyorsanız Geçerli yapı'yı seçin. Yeni bir işlem hattına indirme yapıyorsanız Belirli bir derleme'yi seçin
- İndirme türü: Yayımlanan tüm dosyaları indirmek için Belirli yapıt'ı seçin.
- Yapıt adı: Yayımlanan yapıtın adı
- Hedef dizin: Dosyaların indirilmesi gereken klasör
UzantıYı Yayımla görevini almak için aşağıdaki girişleri kullanın:
- Visual Studio Marketplace'e Bağlanın
- Visual Studio Market bağlantısı: ServiceConnection
- Giriş dosyası türü: VSIX dosyası
- VSIX dosyası:
/Publisher.*.vsix - Yayımcı Kimliği: Visual Studio Market yayımcınızın kimliği
- Uzantı Kimliği: Dosyadaki
vss-extension.jsonuzantınızın kimliği - Uzantı Adı: Dosyadaki
vss-extension.jsonuzantınızın adı - Uzantı görünürlüğü: Özel veya genel
İsteğe bağlı: Uzantınızı yükleme ve test edin
Uzantınızı yayımladıktan sonra Azure DevOps kuruluşlarına yüklenmesi gerekir.
Uzantıyı kuruluşa yükleme
Paylaşılan uzantınızı birkaç adımda yükleyin:
Kuruluş ayarları'na gidin ve Uzantılar'ı seçin.
Uzantınızı Benimle Paylaşılan Uzantılar bölümünde bulun:
- Uzantı bağlantısını seçin
- Ücretsiz edinin veya Yükle'yi seçin
Uzantının Yüklü uzantılar listenizde görünüp görünmediğini denetleyin:
- İşlem hattı görev kitaplığınızda kullanılabilir olduğunu onaylayın
Not
Uzantılar sekmesini görmüyorsanız, proje düzeyinde değil kuruluş yönetim düzeyinde (https://dev.azure.com/{organization}/_admin) olduğunuzdan emin olun.
Uçtan uca test
Yüklemeden sonra kapsamlı test gerçekleştirin:
Test işlem hattı oluşturma:
- Özel görevinizi yeni bir işlem hattına ekleme
- Tüm giriş parametrelerini yapılandırma
- Çeşitli giriş bileşimleriyle test edin
İşlevselliği doğrulama:
- İşlem hattını çalıştırma ve yürütmeyi izleme
- Görev çıkışlarını ve günlüklerini denetleme
- Geçersiz girişlerle hata işlemeyi doğrulama
Test performansı:
- Büyük giriş dosyalarıyla test edin (varsa)
- Kaynak kullanımını izleme
- Zaman aşımı davranışını doğrulama
Sıkça sorulan sorular
S: Görev iptali nasıl işlenir?
Y: İşlem hattı aracısı görev işlemlerine gönderir SIGINT ve SIGTERM sinyal gönderir.
Görev kitaplığı açık iptal işleme sağlamasa da, göreviniz sinyal işleyicileri uygulayabilir. Ayrıntılar için bkz . Aracı işleri iptali.
S: Kuruluşumdan bir görevi nasıl kaldırabilirim?
Y: Otomatik silme, mevcut işlem hatlarını bozacağı için desteklenmez. Yerine:
- Görevi kullanım dışı bırakma: Görevi kullanım dışı olarak işaretleme
- Sürüm yönetimi: Görev sürümünü çarpma
- İletişim: Kullanımdan kaldırma zaman çizelgesini kullanıcılara bildirme
S: Görevimi en son Node.js sürümüne nasıl yükseltebilirim?
Y: Daha iyi performans ve güvenlik için en son Node sürümüne yükseltin . Geçiş kılavuzu için bkz . Görevleri Node 20'ye yükseltme.
içinde birden çok yürütme bölümü ekleyerek birden çok Node sürümünü destekleyintask.json:
"execution": {
"Node20_1": {
"target": "index.js"
},
"Node10": {
"target": "index.js"
}
}
Node 20'ye sahip aracılar tercih edilen sürümü kullanırken eski aracılar Node 10'a geri döner.
Görevlerinizi yükseltmek için:
Kodunuzun beklendiği gibi davrandığından emin olmak için görevlerinizi çeşitli Node çalıştırıcı sürümlerinde test edin.
Görevinizin yürütme bölümünde,
NodeveyaNode10konumundanNode16veyaNode20konumuna güncelleyin.Eski sunucu sürümlerini desteklemek için
Node/Node10hedefini bırakmanız gerekir. Eski Azure DevOps Server sürümlerinde en son Node çalıştırıcı sürümü bulunamayabilir.Hedefte tanımlanan giriş noktasını paylaşmayı seçebilir veya hedeflerin kullandığınız Node.js sürümüne en uygun olacak şekilde optimize edilmesini sağlayabilirsiniz.
"execution": { "Node10": { "target": "bash10.js", "argumentFormat": "" }, "Node16": { "target": "bash16.js", "argumentFormat": "" }, "Node20_1": { "target": "bash20.js", "argumentFormat": "" } }
Önemli
Özel görevlerinize Node 20 çalıştırıcısı için destek eklemezseniz, pipelines-agent-*yayın akışından yüklenen aracılarda başarısız olur.