Özel işlem hatları görev uzantısı ekleme
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Azure DevOps'ta özel derleme veya yayın görevleri için kuruluşunuza uzantı yüklemeyi öğrenin. Daha fazla bilgi için bkz. Azure Pipelines nedir?
Not
Bu makale, aracı tabanlı uzantılardaki aracı görevlerini kapsar. Sunucu görevleri ve sunucu tabanlı uzantılar hakkında daha fazla bilgi için Bkz . Sunucu Görevi GitHub Belgeleri.
Önkoşullar
Azure DevOps için uzantılar oluşturmak için aşağıdaki yazılım ve araçlara ihtiyacınız vardır.
Yazılım/araç | Bilgiler |
---|---|
Azure DevOps kuruluşu | Kuruluş oluşturma. |
Metin düzenleyicisi | Birçok yordam için intellisense ve hata ayıklama desteği sağlayan Visual Studio Code'ı kullanırız. En son sürümü indirin. |
Node.js | En son sürümü indirin. |
npmjs.com 4.0.2 veya üzeri | TypeScript Derleyicisi. En son sürümü indirin. |
tfx-cli | Azure DevOps için platformlar arası CLI ile uzantınızı paketleyebilirsiniz. komutunu çalıştırarak npm i -g tfx-cli Node.js bileşenini kullanaraknpm . |
Azure DevOps uzantı SDK'sı | azure-devops-extension-sdk paketini yükleyin. |
home Projeniz için bir dizin |
Derleme home veya yayın görevi uzantısının dizini, bu makaledeki adımları tamamladıktan sonra aşağıdaki örneğe benzer olmalıdır. |
|--- README.md
|--- images
|--- extension-icon.png
|--- buildandreleasetask // where your task scripts are placed
|--- vss-extension.json // extension's manifest
Önemli
Geliştirici makinesinin, yazılan kodun aracıdaki üretim ortamıyla ve en son önizleme olmayan sürümüyle uyumlu olduğundan emin olmak için Node'un en son sürümünü çalıştırması azure-pipelines-task-lib
gerekir. task.json dosyanızı aşağıdaki komutla güncelleştirin:
"execution": {
"Node20_1": {
"target": "index.js"
}
}
1. Özel görev oluşturma
Bu yordamın her bölümünü klasörün içinde buildandreleasetask
yapın.
Not
Bu örnek kılavuzda PowerShell ile Windows kullanılır. Bunu tüm platformlar için genel hale getirdik, ancak ortam değişkenlerini alma söz dizimi farklıdır. Mac veya Linux kullanıyorsanız, herhangi bir örneğini $env:<var>=<val>
ile export <var>=<val>
değiştirin.
Görev iskelesi oluşturma
Görevin klasör yapısını oluşturun ve gerekli kitaplıkları ve bağımlılıkları yükleyin.
Bir PowerShell komut penceresi açın, klasörünüze
buildandreleasetask
gidin ve aşağıdaki komutu çalıştırın.npm init --yes
npm init
package.json
dosyasını oluşturur. Varsayılannpm init
seçeneklerin--yes
tümünü kabul etmek için parametresini ekledik.İpucu
Görev klasörünüzün düğüm modüllerini içermesini beklediğinden aracı gerekli modülleri otomatik olarak yüklemez. Bunu azaltmak için öğesini konumuna
node_modules
buildandreleasetask
kopyalayın. Göreviniz büyüdükçe VSIX dosyasının boyut sınırını (50 MB) kolayca aşabilirsiniz. Düğüm klasörünü kopyalamadan önce veyanpm prune --production
komutunu çalıştırmaknpm install --production
veya her şeyi derlemek ve paketlemek için bir betik yazabilirsiniz.Kitaplığınıza ekleyin
azure-pipelines-task-lib
.npm install azure-pipelines-task-lib --save
Dış bağımlılıklar için TypeScript yazmalarının yüklendiğinden emin olun.
npm install @types/node --save-dev npm install @types/q --save-dev
Bir
.gitignore
dosya oluşturun ve dosyaya node_modules ekleyin. Derleme işleminiz, node_modules her seferinde derlenmesi ve iade edilmesi gerekmemesi için birnpm install
vetypings install
yapmalıdır.echo node_modules > .gitignore
Mocha'yi geliştirme bağımlılığı olarak yükleyin.
npm install mocha --save-dev -g npm install sync-request --save-dev npm install @types/mocha --save-dev
TypeScript sürüm 2.3.4 veya 4.6.3'i seçin.
npm install typescript@4.6.3 -g --save-dev
Not
TypeScript'in geliştirme ortamınızda npm ile genel olarak yüklendiğinden
tsc
emin olun, böylece komut kullanılabilir. Bu adımı atlarsanız, TypeScript sürüm 2.3.4 varsayılan olarak kullanılır ve komutun kullanılabilir olmasıtsc
için paketi genel olarak yüklemeniz gerekir.Derleyici seçenekleri oluşturun
tsconfig.json
. Bu dosya, TypeScript dosyalarınızın JavaScript dosyalarına derlendiğinden emin olun.tsc --init --target es2022
Görev oluşturma
artık yapı iskelesi tamamlandıktan sonra özel görevimizi oluşturabiliriz.
klasöründe bir
task.json
dosyabuildandreleasetask
oluşturun. Dosya derlemetask.json
/yayın görevini açıklar ve derleme/yayın sisteminin yapılandırma seçeneklerini kullanıcıya işlemek ve derleme/yayın zamanında yürütülecek betikleri bilmek için kullandığı görevdir.Aşağıdaki kodu kopyalayın ve öğesini görevinizin bilgileriyle değiştirin
{{placeholders}}
. En önemli yer tutucudurtaskguid
ve benzersiz olmalıdı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" } } }
Başvuru olarak aşağıdaki kodu kullanarak bir
index.ts
dosya oluşturun. Görev çağrıldığında bu kod çalışır.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();
dosyasından bir
index.js
dosyaindex.ts
derlemek için klasöründenbuildandreleasetask
"tsc" girin.
bileşenleri task.json
Dosyanın bazı bileşenlerinin aşağıdaki açıklamalarına task.json
bakın.
Özellik | Açıklama |
---|---|
id |
Göreviniz için benzersiz bir GUID. |
name |
Boşluksuz ad. |
friendlyName |
Açıklayıcı ad (boşluklara izin verilir). |
description |
Görevinizin ne yaptığının ayrıntılı açıklaması. |
author |
Derleme veya yayın görevini geliştiren varlığı açıklayan kısa dize, örneğin: "Microsoft Corporation." |
instanceNameFormat |
Görevin derleme/yayın adımı listesinde nasıl görüntülediği. $(variablename) kullanarak değişken değerlerini kullanabilirsiniz. |
groups |
Kullanıcı arabirimindeki görev özelliklerinin mantıksal gruplandırması açıklanır. |
inputs |
Derleme veya yayın göreviniz çalıştırıldığında kullanılacak girişler. Bu görev samplestring adlı bir giriş bekler. |
execution |
Betikler de dahil olmak üzere bu görev için yürütme seçenekleri. |
restrictions |
GitHub Codespaces komutları göreviyle ilgili göreve uygulanan kısıtlamalar çağırabilir ve değişkenler görevi ayarlanabilir. Yeni görevler için kısıtlama modunu belirtmenizi öneririz. |
Not
PowerShell'de aşağıdaki komutla bir id
oluşturun:
(New-Guid).Guid
Daha fazla bilgi için bkz . Derleme/yayın görevi başvurusu.
Görevi çalıştırma
Görevi PowerShell'den ile node index.js
çalıştırın.
Aşağıdaki örnekte, girişler sağlanmadığı için görev başarısız olur (samplestring
gerekli bir giriştir).
node index.js
##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: samplestring
Bir düzeltme olarak girişi ayarlayabilir samplestring
ve görevi yeniden çalıştırabiliriz.
$env:INPUT_SAMPLESTRING="Human"
node index.js
##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]Agent.ProxyUrl=undefined
##vso[task.debug]Agent.CAInfo=undefined
##vso[task.debug]Agent.ClientCert=undefined
##vso[task.debug]Agent.SkipCertValidation=undefined
##vso[task.debug]samplestring=Human
Hello Human
Bu kez, görev sağlandığından ve doğru şekilde "Merhaba İnsan!" çıkışı sağlandığından başarılı oldu samplestring
.
İpucu
Çeşitli görev çalıştırıcıları ve task.json en son düğüm sürümünü ekleme hakkında bilgi için bkz . Azure Pipelines görev yazarları için düğüm çalıştırıcı güncelleştirme kılavuzu.
2. Görev betiklerinizi birim testi
Çağırdığı dış araçları değil, görev betiğini hızlı bir şekilde test etmek için birim testleri yapın. Hem başarı hem de başarısızlık yollarının tüm yönlerini test edin.
Test araçlarını yükleyin. Bu yordamda test sürücüsü olarak Mocha kullanırız.
npm install mocha --save-dev -g npm install sync-request --save-dev npm install @types/mocha --save-dev
tests
Aşağıdaki içeriklere sahip bir dosya içeren bir_suite.ts
klasö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() { }); after(() => { }); it('should succeed with simple inputs', function(done: Mocha.Done) { // Add success test here }); it('it should fail if tool returns 1', function(done: Mocha.Done) { // Add failure test here }); });
İpucu
Test klasörünüz buildandreleasetask klasöründe bulunmalıdır. Eşitleme isteği hatası alırsanız, komutuyla
npm i --save-dev sync-request
buildandreleasetask klasörüne eşitleme isteği ekleyerek bu sorunu geçici olarak düzeltebilirsiniz.Test dizininizde aşağıdaki içeriklere sahip bir
success.ts
dosya oluşturun. Bu dosya oluşturma, görevi çalıştırmanın benzetimini oluşturur ve dış yöntemlere yapılan tüm çağrıların sahtesini oluşturur.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); tmr.setInput('samplestring', 'human'); tmr.run();
Başarı testi, uygun girişlerle hata veya uyarı olmadan başarılı olduğunu doğrular ve doğru çıkışı döndürür.
Görev sahte çalıştırıcısını çalıştırmak için dosyanıza
_suite.ts
aşağıdaki örnek başarı testini ekleyin.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.run(); //current, old function. 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 }); });
Test dizininizde aşağıdaki içeriklerle görev sahte çalıştırıcınız olarak bir
failure.ts
dosya oluşturun: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); tmr.setInput('samplestring', 'bad'); tmr.run();
Hata testi, araç hatalı veya eksik giriş aldığında, yararlı çıkışla beklenen şekilde başarısız olduğunu doğrular.
Görev sahte çalıştırıcısını çalıştırmak için dosyanıza
_suite.ts
aşağıdaki kodu ekleyin.it('it should fail if tool returns 1', function(done: Mocha.Done) { this.timeout(1000); let tp = path.join(__dirname, 'failure.js'); let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); tr.run(); 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(); });
Testleri çalıştırın.
tsc mocha tests/_suite.js
Her iki test de geçmelidir. Testleri daha ayrıntılı bir çıkışla çalıştırmak istiyorsanız (derleme konsolunda görecekleriniz), ortam değişkenini ayarlayın:
TASK_TEST_TRACE=1
.$env:TASK_TEST_TRACE=1
3. Uzantı bildirim dosyasını oluşturma
Uzantı bildirimi, uzantınızla ilgili tüm bilgileri içerir. Görev klasörleriniz ve görüntü klasörleriniz de dahil olmak üzere dosyalarınızın bağlantılarını içerir. extension-icon.png içeren bir images klasörü oluşturduğunuzdan emin olun. Aşağıdaki örnek, derleme veya yayın görevini içeren bir uzantı bildirimidir.
Aşağıdaki .json kodunu kopyalayın ve dizininize dosyanız vss-extension.json
home
olarak kaydedin.
Bu dosyayı buildandreleasetask klasöründe oluşturmayın.
{
"manifestVersion": 1,
"id": "build-release-task",
"name": "Fabrikam Build and Release Tools",
"version": "0.0.1",
"publisher": "fabrikam",
"targets": [
{
"id": "Microsoft.VisualStudio.Services"
}
],
"description": "Tools for building/releasing with Fabrikam. Includes one build/release task.",
"categories": [
"Azure Pipelines"
],
"icons": {
"default": "images/extension-icon.png"
},
"files": [
{
"path": "buildandreleasetask"
}
],
"contributions": [
{
"id": "custom-build-release-task",
"type": "ms.vss-distributed-task.task",
"targets": [
"ms.vss-distributed-task.tasks"
],
"properties": {
"name": "buildandreleasetask"
}
}
]
}
Not
Yayımcıyı yayımcınızın adıyla değiştirin. Daha fazla bilgi için bkz . Yayımcı oluşturma.
Katkılar
Özellik | Açıklama |
---|---|
id |
Katkının tanımlayıcısı. Uzantı içinde benzersiz olmalıdır. Derleme veya yayın görevinin adıyla eşleşmesi gerekmez. Derleme veya yayın görevi adı genellikle katkının kimliğindedir. |
type |
Katkının türü. ms.vss-distributed-task.task olmalıdır. |
targets |
Bu katkının "hedeflediği" katkılar. ms.vss-distributed-task.tasks olmalıdır. |
properties.name |
Görevin adı. Bu ad, karşılık gelen bağımsız derleme veya yayın işlem hattı görevinin klasör adıyla eşleşmelidir. |
Dosyalar
Özellik | Açıklama |
---|---|
path |
Dizine göre home dosya veya klasörün yolu. |
Not
Özellikleri ve yaptıkları gibi uzantı bildirim dosyası hakkında daha fazla bilgi için uzantı bildirimi başvurusuna bakın.
4. Uzantınızı paketle
Uzantınızı Visual Studio Market'e almak için tüm dosyalarınızı bir araya getirin. Tüm uzantılar VSIX 2.0 uyumlu .vsix dosyaları olarak paketlenir. Microsoft, uzantınızı paketlemek için platformlar arası bir komut satırı arabirimi (CLI) sağlar.
tfx-cli'yi aldıktan sonra uzantınızın giriş dizinine gidin ve aşağıdaki komutu çalıştırın:
tfx extension create --manifest-globs vss-extension.json
Not
Uzantı veya tümleştirmenin sürümü her güncelleştirmede artırılmalıdır.
Mevcut bir uzantıyı güncelleştirirken bildirimdeki sürümü güncelleştirin veya komut satırı anahtarını geçirin --rev-version
. Bu, uzantınızın düzeltme eki sürüm numarasını artırır ve yeni sürümü bildiriminize kaydeder.
Güncelleştirmenin gerçekleşmesi için hem görev sürümünü hem de uzantı sürümünü iptal etmeniz gerekir. tfx extension create --manifest-globs vss-extension.json --rev-version
görev sürümünü değil yalnızca uzantı sürümünü güncelleştirir. Daha fazla bilgi için bkz . GitHub'da Görev Derleme.
Paketlenmiş uzantınız bir .vsix dosyasına eklendikten sonra, uzantınızı Market'te yayımlamaya hazır olursunuz.
5. Uzantınızı yayımlama
Uzantınızı yayımlamak için önce yayımcınızı oluşturur, ardından uzantınızı karşıya yükler ve son olarak da paylaşırsınız.
Yayımcınızı oluşturma
Microsoft'un uzantıları da dahil olmak üzere tüm uzantıların bir yayımcı tarafından sağlandığı tanımlanır. Henüz var olan bir yayımcının üyesi değilseniz, bir tane oluşturursunuz.
- Visual Studio Market Yayımlama Portalı'nda oturum açın.
- Henüz mevcut bir yayımcının üyesi değilseniz, bir yayımcı oluşturmanız istenir. Yayımcı oluşturmanız istenmezse, sayfanın en altına kadar aşağı kaydırın ve İlgili Siteler'in altında Uzantıları yayımla'yı seçin.
- Yayımcınız için bir tanımlayıcı belirtin, örneğin:
mycompany-myteam
.- Bu tanımlayıcı, uzantılarınızın bildirim dosyasında özniteliğin
publisher
değeri olarak kullanılır.
- Bu tanımlayıcı, uzantılarınızın bildirim dosyasında özniteliğin
- Yayımcınız için bir görünen ad belirtin, örneğin:
My Team
.
- Yayımcınız için bir tanımlayıcı belirtin, örneğin:
- Market Yayımcı Sözleşmesi'ni gözden geçirin ve Oluştur'u seçin.
Yayımcınız tanımlanmıştır. Gelecek bir sürümde, yayımcınızın uzantılarını görüntüleme ve yönetme izinleri verilmektedir. Kullanıcılar arasında bir dizi kimlik bilgisi paylaşmaya gerek kalmadan uzantıları ortak bir yayımcı altında yayımlamak daha kolay ve daha güvenlidir.
Uzantınızı karşıya yükleme
Yeni uzantıyı karşıya yükle düğmesini bulun, paketlenmiş .vsix dosyanıza gidin ve Karşıya Yükle'yi seçin.
Uzantınızı tek adımda paketlemek ve yayımlamak yerine
tfx extension create
komutunu kullanaraktfx extension publish
komut satırı arabirimi (CLI) aracılığıyla da uzantınızı karşıya yükleyebilirsiniz. İsteğe bağlı olarak uzantınızı yayımlandıktan sonra bir veya daha fazla hesapla paylaşmak için kullanabilirsiniz--share-with
.tfx extension publish --manifest-globs your-manifest.json --share-with yourOrganization
Kişisel erişim belirteci (PAT) oluşturun.
- "Market (yayımla)" kapsamını seçin. Bu kapsam, belirteci yalnızca Market'te uzantı yayımlayabilecek şekilde sınırlar.
Uzantınızı paylaşma
Uzantınızı karşıya yüklediğinize göre artık Market'tedir, ancak bunu kimse göremez. Yükleyip test edebilmeniz için kuruluşunuzla paylaşın.
Uzantınızı sağ seçip Paylaş'ı seçin ve kuruluş bilgilerinizi girin. Uzantınıza erişmek istediğiniz diğer hesaplarla da paylaşabilirsiniz.
Ö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.
Artık uzantınız Market'te paylaşıldığından, uzantıyı kullanmak isteyen herkesin bu uzantıyı yüklemesi gerekir.
6. Uzantıyı Market'te yayımlamak için derleme ve yayın işlem hattı oluşturma
Market'te özel görevin korunmasına yardımcı olmak için Azure DevOps'ta bir derleme ve yayın işlem hattı oluşturun.
Önkoşullar
Yazılım/araç
Bilgi
Azure DevOps projesi
Proje oluşturma.
Azure DevOps Uzantı Görevleri uzantısı
Kuruluşunuzda ücretsiz Azure DevOps Uzantı Görevleri'ni yükleyin.
İşlem hattı kitaplığı değişken grubu
İşlem hattı tarafından kullanılan değişkenleri tutmak için bir işlem hattı kitaplığı değişken grubu oluşturun. Daha fazla bilgi için bkz . Değişken grupları ekleme ve kullanma. Azure DevOps Kitaplığı sekmesinden veya CLI aracılığıyla değişken grupları oluşturabilirsiniz. İşlem hattınızda bu grup içindeki değişkenleri kullanın. Ayrıca, değişken grubunda aşağıdaki değişkenleri bildirin:
publisherId
: Market yayımcınızın kimliğiextensionId
: vss-extension.json dosyasında belirtildiği gibi uzantınızın kimliğiextensionName
: vss-extension.json dosyasında belirtildiği gibi uzantınızın adıartifactName
: VSIX dosyası için oluşturulan yapıtın adı
Hizmet bağlantısı
Yeni bir Market hizmeti bağlantısı oluşturun ve tüm işlem hatları için erişim izinleri verin.
YAML işlem hattı
YAML ile yeni bir işlem hattı oluşturmak için aşağıdaki örneği kullanın. Daha fazla bilgi için bkz . İlk işlem hattınızı ve YAML şemanızı oluşturma.
trigger:
- main
pool:
vmImage: "ubuntu-latest"
variables:
- group: variable-group # Rename to whatever you named your variable group in the prerequisite stage of step 6
stages:
- stage: Run_and_publish_unit_tests
jobs:
- job:
steps:
- task: TfxInstaller@4
inputs:
version: "v0.x"
- task: Npm@1
inputs:
command: 'install'
workingDir: '/TaskDirectory' # Update to the name of the directory of your task
- task: Bash@3
displayName: Compile Javascript
inputs:
targetType: "inline"
script: |
cd TaskDirectory # Update to the name of the directory of your task
tsc
- task: Npm@1
inputs:
command: 'custom'
workingDir: '/TestsDirectory' # Update to the name of the directory of your task's tests
customCommand: 'testScript' # See the definition in the explanation section below - it may be called test
- task: PublishTestResults@2
inputs:
testResultsFormat: 'JUnit'
testResultsFiles: '**/ResultsFile.xml'
- stage: Package_extension_and_publish_build_artifacts
jobs:
- job:
steps:
- task: TfxInstaller@4
inputs:
version: "0.x"
- task: Npm@1
inputs:
command: 'install'
workingDir: '/TaskDirectory' # Update to the name of the directory of your task
- task: Bash@3
displayName: Compile Javascript
inputs:
targetType: "inline"
script: |
cd TaskDirectory # Update to the name of the directory of your task
tsc
- task: QueryAzureDevOpsExtensionVersion@4
name: QueryVersion
inputs:
connectTo: 'VsTeam'
connectedServiceName: 'ServiceConnection' # Change to whatever you named the service connection
publisherId: '$(PublisherID)'
extensionId: '$(ExtensionID)'
versionAction: 'Patch'
- task: PackageAzureDevOpsExtension@4
inputs:
rootFolder: '$(System.DefaultWorkingDirectory)'
publisherId: '$(PublisherID)'
extensionId: '$(ExtensionID)'
extensionName: '$(ExtensionName)'
extensionVersion: '$(QueryVersion.Extension.Version)'
updateTasksVersion: true
updateTasksVersionType: 'patch'
extensionVisibility: 'private' # Change to public if you're publishing to the marketplace
extensionPricing: 'free'
- task: CopyFiles@2
displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)"
inputs:
Contents: "**/*.vsix"
TargetFolder: "$(Build.ArtifactStagingDirectory)"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: '$(ArtifactName)'
publishLocation: 'Container'
- stage: Download_build_artifacts_and_publish_the_extension
jobs:
- job:
steps:
- task: TfxInstaller@4
inputs:
version: "v0.x"
- task: DownloadBuildArtifacts@0
inputs:
buildType: "current"
downloadType: "single"
artifactName: "$(ArtifactName)"
downloadPath: "$(System.DefaultWorkingDirectory)"
- task: PublishAzureDevOpsExtension@4
inputs:
connectTo: 'VsTeam'
connectedServiceName: 'ServiceConnection' # Change to whatever you named the service connection
fileType: 'vsix'
vsixFile: '$(PublisherID).$(ExtensionName)/$(PublisherID)..vsix'
publisherId: '$(PublisherID)'
extensionId: '$(ExtensionID)'
extensionName: '$(ExtensionName)'
updateTasksVersion: false
extensionVisibility: 'private' # Change to public if you're publishing to the marketplace
extensionPricing: 'free'
Daha fazla bilgi için bkz . İşlem hatlarını tetikleyen olayları belirtme.
Not
Her iş yeni bir kullanıcı aracısı kullanır ve bağımlılıkların yüklenmesini gerektirir.
İşlem hattı aşamaları
Aşağıdaki bölüm işlem hattı aşamalarının nasıl çalıştığını anlamanıza yardımcı olur.
1. Aşama: Birim testlerini çalıştırma ve yayımlama
Bu aşama birim testlerini çalıştırır ve test sonuçlarını Azure DevOps'ta yayımlar.
Birim testlerini çalıştırmak için package.json dosyasına aşağıdaki örnekte olduğu gibi özel bir betik ekleyin.
"scripts": {
"testScript": "mocha ./TestFile --reporter xunit --reporter-option output=ResultsFile.xml"
},
tfx-cli'yi derleme aracınıza yüklemek için "Azure DevOps (tfx-cli) için Node CLI kullanma" ekleyin.
"yükle" komutuyla "npm" görevini ekleyin ve klasörü package.json dosyasıyla hedefleyin.
TypeScript'i JavaScript'e derlemek için "Bash" görevini ekleyin.
"özel" komutuyla "npm" görevini ekleyin, birim testlerini içeren klasörü hedefleyin ve komut olarak giriş
testScript
yapın. Aşağıdaki girişleri kullanın:- Komut: özel
- package.json içeren çalışma klasörü: /TestsDirectory
- Komut ve bağımsız değişkenler:
testScript
"Test Sonuçlarını Yayımla" görevini ekleyin. Mocha XUnit muhabirini kullanıyorsanız sonuç biçiminin "XUnit" değil "JUnit" olduğundan emin olun. Arama klasörünü kök dizin olarak ayarlayın. Aşağıdaki girişleri kullanın:
- Test sonucu biçimi: JUnit
- Test sonuçları dosyaları: **/ResultsFile.xml
- Arama klasörü:
$(System.DefaultWorkingDirectory)
Test sonuçları yayımlandıktan sonra, testler sekmesinin altındaki çıkış aşağıdaki örneğe benzer olmalıdır.
2. Aşama: Uzantıyı paketleme ve derleme yapıtlarını yayımlama
tfx-cli'yi derleme aracınıza yüklemek için "Azure DevOps (tfx-cli) için Node CLI kullanma" ekleyin.
"yükle" komutuyla "npm" görevini ekleyin ve klasörü package.json dosyasıyla hedefleyin.
TypeScript'i JavaScript'e derlemek için "Bash" görevini ekleyin.
Mevcut uzantı sürümünü sorgulamak için "Sorgu Uzantısı Sürümü" görevini ekleyin. Aşağıdaki girişleri kullanın:
- Bağlanın: Visual Studio Market
- Visual Studio Market (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: vss-extension.json dosyasındaki uzantınızın kimliği
- Sürümü artırma: Düzeltme eki
- Çıkış Değişkeni: Task.Extension.Version
Uzantıları bildirim Json'a göre paketlemek için "Paket Uzantısı" görevini ekleyin. Aşağıdaki girişleri kullanın:
- Kök bildirimler klasörü: Bildirim dosyasını içeren kök dizine işaret eder. Örneğin, $(System.DefaultWorkingDirectory) kök dizindir
- Bildirim dosyaları: vss-extension.json
- Yayımcı Kimliği: Visual Studio Market yayımcınızın kimliği
- Uzantı Kimliği: vss-extension.json dosyasındaki uzantınızın kimliği
- Uzantı Adı: vss-extension.json dosyasındaki uzantı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ü: Yalnızca Düzeltme Eki 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
Yayımlanan dosyaları kopyalamak için "Dosyaları kopyala" görevini ekleyin. Aşağıdaki girişleri kullanın:
- İçerik: Yapıt olarak yayımlamak için kopyalanacak tüm dosyalar
- Hedef klasör: Dosyaların kopyalanabilecekleri klasör
- Örneğin: $(Build.ArtifactStagingDirectory)
Yapıtları diğer işlerde veya işlem hatlarında kullanmak üzere yayımlamak için "Derleme yapıtlarını yayımla" 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)
- Yapıt adı: Yapıta verilen ad
- Yapıtların yayımlama konumu: Yapıtı gelecekteki işlerde kullanmak için "Azure Pipelines" öğesini 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
tfx-cli'yi derleme aracınıza yüklemek için "Azure DevOps (tfx-cli) için Node CLI kullanma" ekleyin.
Yapıtları yeni bir işe indirmek için "Derleme yapıtlarını indir" görevini ekleyin. Aşağıdaki girişleri kullanın:
- Tarafından üretilen yapıtları indirme: Yapıtı aynı işlem hattından yeni bir işe indiriyorsanız "Geçerli derleme" seçeneğini belirleyin. Yeni bir işlem hattına indiriyorsanız "Belirli derleme" seçeneğini belirleyin.
- İndirme türü: Yayımlanan tüm dosyaları indirmek için "Belirli yapıt" öğesini seçin.
- Yapıt adı: Yayımlanan yapıtın adı.
- Hedef dizin: Dosyaların indirilmesi gereken klasör.
İhtiyacınız olan son görev "Uzantıyı Yayımla" görevidir. Aşağıdaki girişleri kullanın:
- Bağlanın: Visual Studio Market
- 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: vss-extension.json dosyasındaki uzantınızın kimliği
- Uzantı Adı: vss-extension.json dosyasındaki uzantınızın adı
- Uzantı görünürlüğü: Özel veya genel
İsteğe bağlı: Uzantınızı yükleme ve test edin
Yalnızca birkaç adımda sizinle paylaşılan bir uzantı yükleyin:
- Kuruluşunuzun denetim masasına ()
https://dev.azure.com/{organization}/_admin
giderek proje koleksiyonu yönetimi sayfasına gidin. - Uzantılar sekmesinde uzantınızı "Benimle Paylaşılan Uzantılar" grubunda bulun ve uzantı bağlantısını seçin.
- Uzantıyı yükleyin.
Uzantılar sekmesini göremiyorsanız, bir projenin yönetim sayfasında değil denetim masasında (proje koleksiyonu düzeyindeki https://dev.azure.com/{organization}/_admin
yönetim sayfası) olduğunuzdan emin olun.
Uzantılar sekmesini görmüyorsanız, kuruluşunuz için uzantılar etkinleştirilmez. Visual Studio İş Ortağı Programı'na katılarak uzantılar özelliğine erken erişim elde edebilirsiniz.
Azure DevOps Uzantılarını paketlemek ve Visual Studio Market'te yayımlamak için Azure DevOps Uzantı Görevleri'ni indirebilirsiniz.
SSS
Azure DevOps uzantılarına özel derleme veya yayın görevleri ekleme hakkında aşağıdaki sık sorulan sorulara (SSS) bakın.
S: Görev için Azure Pipelines komut kullanımını nasıl kısıtlayabilirim?
Görev tarafından ayarlanan Azure Pipelines komutlarının kullanımını ve değişkenlerini kısıtlayabilirsiniz. Bu eylem, görevin yürüttüğü özel betikler için değişkenlere/vso komutlarına sınırsız erişimi önlemek için yararlı olabilir. Yeni görevler için ayarlamanızı öneririz. Uygulamak için task.json dosyanıza aşağıdaki deyimi eklemeniz gerekebilir:
"restrictions": {
"commands": {
"mode": "restricted"
},
"settableVariables": {
"allowed": ["variable1", "test*"]
}
}
için mode
değer belirtilirserestricted
, görev tarafından yalnızca aşağıdaki komutları yürütebilirsiniz:
logdetail
logissue
complete
setprogress
setsecret
setvariable
debug
settaskvariable
prependpath
publish
KısıtlamalarsettableVariables
, veya prependpath
komutları tarafından setvariable
ayarlanan bir izin verilenler listesi geçirmenize olanak sağlar. Ayrıca temel normal ifadelere de izin verir. Örneğin, izin verilenler listeniz: ['abc', 'test*']
, ayarı abc
, test
, veya test1
herhangi bir değere sahip değişkenler olarak veya bunları yola önceden bağlama başarılı olur, ancak bir değişken ara sunucusu ayarlamaya çalışırsanız uyarır. Boş liste, görev tarafından hiçbir değişkenin değiştirilmediği anlamına gelir.
settableVariables
veya commands
anahtarı atlanırsa, ilgili kısıtlama uygulanmaz.
Kısıtlama özelliği 2.182.1 aracı sürümünde kullanılabilir.
S: İptal sinyali bir görev tarafından nasıl işlenir?
Y: İşlem hattı aracısı ilgili alt işleme gönderir SIGINT
ve SIGTERM
sinyal gönderir. İşlenmek üzere görev kitaplığında açık bir araç yoktur. Daha fazla bilgi için bkz . Aracı işleri iptali.
S: Görevi proje koleksiyonundan nasıl kaldırabilirim?
Y: Görevlerin otomatik olarak silinmesini desteklemiyoruz. Otomatik silme güvenli değildir ve bu tür görevleri zaten kullanan mevcut işlem hatlarını bozar. Ancak, görevleri kullanım dışı olarak işaretleyebilirsiniz. Bunu yapmak için görev sürümünü kaldırın ve görevi kullanım dışı olarak işaretleyin.
S: Özel görevimi en son Node'a nasıl yükseltebilirim?
Y: En son Node sürümüne yükseltmenizi öneririz. Örneğin, bkz . Görevleri Node 20'ye yükseltme.
Microsoft Barındırılan aracılar ve çeşitli Azure DevOps Server sürümleri farklı yaşam döngülerine sahip olduğundan, görevin çalıştığı yere bağlı olarak farklı Node runner sürümleri yüklenebilir. Farklı Node çalıştırıcı sürümlerine sahip aracılarda aynı görevi çalıştırabilmek için, task.json dosyası birden çok yürütme bölümü içerebilir. Aşağıdaki örnekte, Node 20 çalıştırıcısını içeren Azure Pipeline aracıları varsayılan olarak bu aracıyı seçer ve olmayanlar Node 10 uygulamasına geri döner.
"execution": {
"Node10": {
"target": "bash.js",
"argumentFormat": ""
},
"Node20_1": {
"target": "bash.js",
"argumentFormat": ""
}
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ı sürümlerinde test edin.
Görevinizin yürütme bölümünde, veya 'den
Node
veyaNode10
Node16
Node20
öğesine güncelleştirin.Eski sunucu sürümlerini desteklemek için hedefi bırakmanız
Node
/Node10
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 Düğüm sürümü için en iyi duruma getirilmiş olmasını 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 eklenmemesi, yayın akışından yüklenen aracılarda görevlerin pipelines-agent-*
başarısız olmasına neden olur.