Aracılığıyla paylaş


Ö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-cliNode.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-libgerekir. 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

  1. Görevin klasör yapısını oluşturun ve gerekli kitaplıkları ve bağımlılıkları yükleyin.

  2. 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 initpackage.json dosyasını oluşturur. Varsayılan npm 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 buildandreleasetaskkopyalayı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 veya npm prune --productionkomutunu çalıştırmak npm install --production veya her şeyi derlemek ve paketlemek için bir betik yazabilirsiniz.

  3. Kitaplığınıza ekleyin azure-pipelines-task-lib .

    npm install azure-pipelines-task-lib --save
    
  4. 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
    
  5. Bir .gitignore dosya oluşturun ve dosyaya node_modules ekleyin. Derleme işleminiz, node_modules her seferinde derlenmesi ve iade edilmesi gerekmemesi için bir npm install ve typings install yapmalıdır.

    echo node_modules > .gitignore
    
  6. 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
    
  7. 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.

  8. 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.

  1. klasöründe bir task.json dosya buildandreleasetask oluşturun. Dosya derleme task.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.

  2. Aşağıdaki kodu kopyalayın ve öğesini görevinizin bilgileriyle değiştirin {{placeholders}} . En önemli yer tutucudur taskguidve 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"
         }
     }
     }
    
  3. 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();
    
  4. dosyasından bir index.js dosya index.tsderlemek için klasöründen buildandreleasetask "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.

  1. 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
    
  2. 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-requestbuildandreleasetask klasörüne eşitleme isteği ekleyerek bu sorunu geçici olarak düzeltebilirsiniz.

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

  4. 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
        });
    });
    
  5. 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.

  6. 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();
    });
    
  7. 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.

  1. Visual Studio Market Yayımlama Portalı'nda oturum açın.
  2. 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.
    • Yayımcınız için bir görünen ad belirtin, örneğin: My Team.
  3. 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.

  1. Uzantınızı tek adımda paketlemek ve yayımlamak yerine tfx extension create komutunu kullanarak tfx 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
    
  2. 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ği
  • extensionId: vss-extension.json dosyasında belirtildiği gibi uzantınızın kimliği
  • extensionName: 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"
},
  1. tfx-cli'yi derleme aracınıza yüklemek için "Azure DevOps (tfx-cli) için Node CLI kullanma" ekleyin.

  2. "yükle" komutuyla "npm" görevini ekleyin ve klasörü package.json dosyasıyla hedefleyin.

  3. TypeScript'i JavaScript'e derlemek için "Bash" görevini ekleyin.

  4. "ö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
  5. "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.

    Test sonucu örneğinin ekran görüntüsü.

2. Aşama: Uzantıyı paketleme ve derleme yapıtlarını yayımlama

  1. tfx-cli'yi derleme aracınıza yüklemek için "Azure DevOps (tfx-cli) için Node CLI kullanma" ekleyin.

  2. "yükle" komutuyla "npm" görevini ekleyin ve klasörü package.json dosyasıyla hedefleyin.

  3. TypeScript'i JavaScript'e derlemek için "Bash" görevini ekleyin.

  4. 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
  5. 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
  6. 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)
  7. 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

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

  1. tfx-cli'yi derleme aracınıza yüklemek için "Azure DevOps (tfx-cli) için Node CLI kullanma" ekleyin.

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

  1. Kuruluşunuzun denetim masasına ()https://dev.azure.com/{organization}/_admin giderek proje koleksiyonu yönetimi sayfasına gidin.
  2. Uzantılar sekmesinde uzantınızı "Benimle Paylaşılan Uzantılar" grubunda bulun ve uzantı bağlantısını seçin.
  3. 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}/_adminyö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 veya Node10 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.