Aracılığıyla paylaş


Özel veri işleme hatları görev uzantısı ekleme

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:

  1. Node.js projesini başlatmak için PowerShell'i açın, klasörünüze buildandreleasetask gidin ve şunu çalıştırın:

    npm init --yes
    

    Dosya package.json varsayılan ayarlarla oluşturulur. --yes bayrağı 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_modules kopyalayınbuildandreleasetask. VSIX dosya boyutunu (50 MB sınırı) yönetmek için paketlemeden önce veya npm install --production çalıştırmayı npm prune --production göz önünde bulundurun.

  2. Azure Pipelines Görev Kitaplığı'nı yükleyin:

    npm install azure-pipelines-task-lib --save
    
  3. TypeScript tür tanımlarını yükleyin:

    npm install @types/node --save-dev
    npm install @types/q --save-dev
    
  4. Sürüm denetimi dışlamalarını ayarlama

    echo node_modules > .gitignore
    

    Derleme işleminiz her seferinde node_modules yeniden oluşturmak için çalıştırılmalıdır npm install .

  5. 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-dev
    
  6. TypeScript derleyicisini yükleyin:

    npm install typescript@4.6.3 -g --save-dev
    

    Not

    Komutun kullanılabilir olduğundan emin olmak için TypeScript'i tsc genel olarak yükleyin. Bu olmadan TypeScript 2.3.4 varsayılan olarak kullanılır.

  7. TypeScript derlemesini yapılandırma:

    tsc --init --target es2022
    

    Dosya tsconfig.json ES2022 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:

  1. 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}} . taskguid benzersiz olmalıdır. PowerShell kullanarak bir tane oluşturun: (New-Guid).Guid

  2. Gö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();
    
  3. TypeScript'i JavaScript'e derleme:

    tsc
    

    Dosya TypeScript index.js kaynağı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:

  1. Eksik girişle test (başarısız olmalıdır):

    node index.js
    

    Beklenen çı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: samplestring
    
  2. Geçerli girişle test edin (başarılı olmalıdır):

    $env:INPUT_SAMPLESTRING="World"
    node index.js
    

    Beklenen çı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 World
    
  3. Test hatası işleme:

    $env:INPUT_SAMPLESTRING="bad"
    node index.js
    

    Bu 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

  1. Görev dizininizde dosya tests 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() {
             // 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.

  2. 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();
    
  3. Başarı testini dosyanıza _suite.ts 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.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
         });
     });
    
  4. 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();
    
  5. Hata testini dosyanıza _suite.ts ekleyin:

     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.

  1. Dosyayla extension-icon.png images klasörü oluşturma

  2. Uzantı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.json sürümü artırma
  • Görev sürümü: Her görev güncelleştirmesi için sürümündeki task.json sü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:

  1. Sürümü güncelleştirme task.json
  2. Sürümü güncelleştirme vss-extension.json
  3. Bir test kuruluşunda kapsamlı bir şekilde test edin
  4. Sorunları yayımlama ve izleme

Visual Studio Market'te yayımlama

1. Yayımcınızı oluşturma

  1. Visual Studio Market Yayımlama Portalı'nda oturum açma
  2. İ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)
  3. 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:

  1. Yeni uzantıyı karşıya yükle'yi seçin
  2. Paketlenmiş .vsix dosyanızı seçin
  3. 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

  1. Markette uzantınıza sağ tıklayın
  2. Paylaş'ı seçin
  3. Kuruluşunuzun adını girin
  4. 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:

  1. Kuruluş Ayarları>Uzantıları'na gidin
  2. Uzantınıza göz atın
  3. Ü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:

  1. İşlem hattı oluşturma veya düzenleme.
  2. Ö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
  3. Görev parametrelerini yapılandırma:
    • Gerekli girişleri ayarlama
    • İsteğe bağlı ayarları yapılandırma
  4. İşlevselliği test etmek için işlem hattını çalıştırma
  5. 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:

  1. TypeScript'i Bash JavaScript'e derlemek için görevi ekleyin.

  2. 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.json uzantınızın kimliği
    • Sürüm güncellemesi: Yama
    • Çıkış Değişkeni: Task.Extension.Version
  3. 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.json uzantınızın kimliği
    • Uzantı Adı: Dosyadaki vss-extension.json 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ü: 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.
  4. 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)
  5. 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)
    • 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

3. Aşama: Derleme yapıtlarını indirme ve uzantıyı yayımlama

  1. Yapı aracınıza tfx-cli yüklemek için Azure DevOps için Node CLI Kullan (tfx-cli) ekleyin.

  2. 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
  3. 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.json uzantınızın kimliği
    • Uzantı Adı: Dosyadaki vss-extension.json 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

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:

  1. Kuruluş ayarları'na gidin ve Uzantılar'ı seçin.

  2. 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
  3. 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:

  1. 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
  2. İş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
  3. 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:

  1. Görevi kullanım dışı bırakma: Görevi kullanım dışı olarak işaretleme
  2. Sürüm yönetimi: Görev sürümünü çarpma
  3. İ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, Node veya Node10 konumundan Node16 veya Node20 konumuna güncelleyin.

  • Eski sunucu sürümlerini desteklemek için Node/Node10 hedefini 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.