Megosztás a következőn keresztül:


Egyéni folyamatok tevékenységbővítményének hozzáadása

Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019

Megtudhatja, hogyan telepítheti a bővítményeket a szervezetére egyéni buildelési vagy kiadási feladatokhoz az Azure DevOpsban. További információ: Mi az Azure Pipelines?

Feljegyzés

Ez a cikk az ügynökalapú bővítmények ügynöktevékenységeit ismerteti. A kiszolgálói feladatokkal és a kiszolgálóalapú bővítményekkel kapcsolatos további információkért tekintse meg a Kiszolgálói feladat GitHub dokumentációját.

Előfeltételek

Az Azure DevOps bővítményeinek létrehozásához az alábbi szoftverekre és eszközökre van szüksége.

Szoftver/eszköz Tájékoztatás
Azure DevOps-szervezet Hozzon létre egy szervezetet.
Szövegszerkesztő Számos eljárás esetén a Visual Studio Code-ot használjuk, amely intelliense és hibakeresési támogatást nyújt. Töltse le a legújabb verziót.
Node.js Töltse le a legújabb verziót.
npmjs.com 4.0.2 vagy újabb TypeScript Compiler. Töltse le a legújabb verziót.
tfx-cli Csomagolja be a bővítményt az Azure DevOps platformfüggetlen parancssori felületével. a parancs futtatásával npma Node.js egyik összetevőjét használja npm i -g tfx-cli.
Azure DevOps-bővítmény SDK Telepítse az azure-devops-extension-sdk csomagot.
A home projekt könyvtára A home build- vagy kiadási feladatbővítmény könyvtárának az alábbi példához hasonlóan kell kinéznie a cikkben leírt lépések elvégzése után.
|--- README.md    
|--- images                        
    |--- extension-icon.png  
|--- buildandreleasetask            // where your task scripts are placed
|--- vss-extension.json             // extension's manifest

Fontos

A fejlesztői gépnek a Node legújabb verzióját kell futtatnia, hogy az írott kód kompatibilis legyen az ügynök éles környezetével és a legújabb nem előzetes verzióval azure-pipelines-task-lib. Frissítse a task.json fájlt az alábbi parancs szerint:

"execution": {
   "Node20_1": {
     "target": "index.js"
   }
 }

1. Egyéni feladat létrehozása

Végezze el az eljárás minden részét a buildandreleasetask mappában.

Feljegyzés

Ez a példa végigvezeti a Windowst a PowerShell-lel. Általánossá tettük az összes platformon, de a környezeti változók lekérésének szintaxisa eltérő. Ha Macet vagy Linuxot használ, cserélje le az összes példányt $env:<var>=<val> a következőre export <var>=<val>: .

Feladat-állványzat létrehozása

  1. Hozza létre a feladat mappastruktúráját, és telepítse a szükséges kódtárakat és függőségeket.

  2. Nyisson meg egy PowerShell-parancsablakot, nyissa meg a buildandreleasetask mappát, és futtassa a következő parancsot.

    npm init --yes
    

    npm init hozza létre a package.json fájlt. Hozzáadtuk a paramétert --yes az összes alapértelmezett npm init beállítás elfogadásához.

    Tipp.

    Az ügynök nem telepíti automatikusan a szükséges modulokat, mert azt várja, hogy a feladatmappa tartalmazza a csomópontmodulokat. A probléma elhárításához másolja a következőbebuildandreleasetask: node_modules . Ahogy a feladat egyre nagyobb lesz, egyszerűen túllépheti a VSIX-fájlok méretkorlátját (50 MB). A csomópontmappa másolása előtt érdemes lehet futtatni npm install --production vagy npm prune --productionírni egy szkriptet, amely mindent összeállít és becsomagol.

  3. Adja hozzá azure-pipelines-task-lib a tárhoz.

    npm install azure-pipelines-task-lib --save
    
  4. Győződjön meg arról, hogy a TypeScript-gépelések telepítve vannak a külső függőségekhez.

    npm install @types/node --save-dev
    npm install @types/q --save-dev
    
  5. Hozzon létre egy .gitignore fájlt, és adjon hozzá node_modules. A buildelési folyamatnak végrekellt kell végeznie npm install typings install , hogy a node_modules minden alkalommal elkészüljenek, és ne kelljen bejelentkeznie.

    echo node_modules > .gitignore
    
  6. Telepítse a Mocha-t fejlesztési függőségként.

    npm install mocha --save-dev -g
    npm install sync-request --save-dev
    npm install @types/mocha --save-dev
    
  7. Válassza a TypeScript 2.3.4-es vagy 4.6.3-es verzióját.

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

    Feljegyzés

    Győződjön meg arról, hogy a TypeScript globálisan telepítve van az npm használatával a fejlesztői környezetben, hogy a tsc parancs elérhető legyen. Ha kihagyja ezt a lépést, a TypeScript 2.3.4-es verziója alapértelmezés szerint használatban lesz, és globálisan kell telepítenie a csomagot, hogy elérhető legyen a tsc parancs.

  8. Fordítóbeállítások létrehozása tsconfig.json . Ez a fájl biztosítja, hogy a TypeScript-fájlok JavaScript-fájlokra legyenek lefordítva.

    tsc --init --target es2022
    

Feladat létrehozása

Most, hogy az állványzat elkészült, létrehozhatjuk az egyéni feladatunkat.

  1. Hozzon létre egy task.json fájlt a buildandreleasetask mappában. A task.json fájl leírja a buildelési/kiadási feladatot, és a build/kiadási rendszer a konfigurációs beállítások felhasználó számára való megjelenítésére és annak megismerésére, hogy mely szkripteket kell végrehajtani a build/kiadás idején.

  2. Másolja ki a következő kódot, és cserélje le a {{placeholders}} feladat adataira. A legfontosabb helyőrző a taskguid, és egyedinek kell lennie.

    {
     "$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. Hozzon létre egy index.ts fájlt az alábbi kód hivatkozásként való használatával. Ez a kód a feladat meghívásakor fut.

    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. Írja be a "tsc" kifejezést a mappából egy buildandreleasetask fájl fordításához index.js a mappából index.ts.

task.json összetevők

Tekintse meg a fájl egyes összetevőinek task.json alábbi leírását.

Tulajdonság Leírás
id A feladat egyedi GUID azonosítója.
name Név szóköz nélkül.
friendlyName Leíró név (megengedett szóközök).
description A tevékenység tevékenységének részletes leírása.
author A buildelési vagy kiadási feladatot fejlesztő entitást leíró rövid sztring, például: "Microsoft Corporation".
instanceNameFormat Hogyan jelenik meg a feladat a buildelési/kiadási lépéslistában. A változóértékeket a $(variablename) használatával használhatja.
groups A feladattulajdonságok logikai csoportosítását ismerteti a felhasználói felületen.
inputs A buildelési vagy kiadási feladat futtatásakor használandó bemenetek. Ez a feladat a névmintákat tartalmazó bemenetet várja.
execution A feladat végrehajtási beállításai, beleértve a szkripteket is.
restrictions A GitHub Codespaces parancsokkal kapcsolatos tevékenységre alkalmazott korlátozások meghívhatók, és a változók tevékenység beállíthatók. Javasoljuk, hogy adjon meg korlátozási módot az új tevékenységekhez.

Feljegyzés

Hozzon létre egy id következő parancsot a PowerShellben:

(New-Guid).Guid

További információkért tekintse meg a buildelési/kiadási feladatra vonatkozó referenciát.

A feladat futtatása

Futtassa a feladatot a node index.js PowerShellből.

Az alábbi példában a feladat meghiúsul, mert a bemenetek nem lettek megadva (samplestring ez egy kötelező bemenet).

 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

Javításként beállíthatjuk a samplestring bemenetet, és újra futtathatjuk a feladatot.

$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

Ezúttal a feladat sikeres volt, mert samplestring a megadott és helyesen kimenetelt "Hello Human!"

Tipp.

A különböző feladatfuttatókról és a legújabb csomópontverzió task.json való hozzáadásáról további információt az Azure Pipelines-feladatkészítők csomópontfuttatóinak frissítési útmutatójában talál.

2. Egység tesztelje a feladatszkripteket

Az egységtesztekkel gyorsan tesztelheti a feladatszkriptet, és nem az általa hívott külső eszközöket. Tesztelje a sikeres és a sikertelen elérési utak minden aspektusát.

  1. Telepítse a teszteszközöket. Ebben az eljárásban a Mocha-t használjuk tesztvezetőként.

    npm install mocha --save-dev -g
    npm install sync-request --save-dev
    npm install @types/mocha --save-dev
    
  2. Hozzon létre egy tests _suite.ts fájlt tartalmazó mappát a következő tartalommal:

    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
        });    
    });
    

    Tipp.

    A tesztmappának a buildandreleasetask mappában kell lennie. Ha szinkronizálási kérési hibát kap, megkerülheti azt úgy, hogy a parancsot npm i --save-dev sync-requesthozzáadja a buildandreleasetask mappához.

  3. Hozzon létre egy success.ts fájlt a tesztkönyvtárban az alábbi tartalommal. Ez a fájllétrehozás szimulálja a feladat futtatását, és a külső metódusokra irányuló összes hívást szimulálja.

    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();
    

    A sikerességi teszt ellenőrzi, hogy a megfelelő bemenetekkel hiba vagy figyelmeztetés nélkül sikerül-e, és a megfelelő kimenetet adja vissza.

  4. Adja hozzá a következő sikeres sikerességi tesztet a _suite.ts fájlhoz a feladatfuttató futtatásához.

        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. Hozzon létre egy failure.ts fájlt a tesztkönyvtárban feladatmockafuttatóként a következő tartalommal:

    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();
    

    A hibateszt ellenőrzi, hogy ha az eszköz rossz vagy hiányos bemenetet kap, a várt módon, hasznos kimenettel meghiúsul.

  6. Adja hozzá a következő kódot a _suite.ts fájlhoz a feladatfuttató futtatásához.

    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. Futtassa a teszteket.

    tsc
    mocha tests/_suite.js
    

    Mindkét tesztnek át kell mennie. Ha részletesebb kimenettel szeretné futtatni a teszteket (amit a buildkonzolban látna), állítsa be a környezeti változót: TASK_TEST_TRACE=1.

    $env:TASK_TEST_TRACE=1
    

3. A bővítmény jegyzékfájljának létrehozása

A bővítményjegyzék tartalmazza a bővítményre vonatkozó összes információt. A fájlokra mutató hivatkozásokat tartalmaz, beleértve a feladatmappákat és a képek mappáit. Győződjön meg arról, hogy létrehozott egy lemezképmappát extension-icon.png. Az alábbi példa egy bővítményjegyzék, amely tartalmazza a buildelési vagy kiadási feladatot.

Másolja ki a következő .json kódot, és mentse fájlként vss-extension.json a home könyvtárba.

Ne hozza létre ezt a fájlt a buildandreleasetask mappában.

{
    "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"
            }
        }
    ]
}

Feljegyzés

Módosítsa a közzétevőt a közzétevő nevére. További információ: Közzétevő létrehozása.

Hozzájárulások

Tulajdonság Leírás
id A hozzájárulás azonosítója. A bővítményen belül egyedinek kell lennie. Nem kell megegyeznie a buildelési vagy kiadási feladat nevével. A buildelési vagy kiadási tevékenység neve általában a hozzájárulás azonosítójában található.
type A hozzájárulás típusa. Ms.vss-distributed-task.task.
targets A hozzájárulás által "megcélzott" hozzájárulások. Ms.vss-distributed-task.tasks fájlnak kell lennie.
properties.name A tevékenység neve. Ennek a névnek meg kell egyeznie a megfelelő önálló buildelési vagy kiadási folyamat feladat mappanevével.

Fájlok

Tulajdonság Leírás
path A fájl vagy mappa elérési útja a home könyvtárhoz viszonyítva.

Feljegyzés

A bővítmény jegyzékfájljáról, például a tulajdonságairól és a műveletekről további információt a bővítmény jegyzékfájljának hivatkozásában talál.

4. A bővítmény csomagolása

Csomagolja össze az összes fájlt, hogy bejuttassa a bővítményt a Visual Studio Marketplace-be. Minden bővítmény VSIX 2.0-kompatibilis .vsix-fájlként van csomagolva. A Microsoft egy platformfüggetlen parancssori felületet (CLI) biztosít a bővítmény csomagolásához.

Miután megkapta a tfx-cli-t, lépjen a bővítmény kezdőlapjára, és futtassa a következő parancsot:

tfx extension create --manifest-globs vss-extension.json

Feljegyzés

A bővítmény vagy integráció verzióját minden frissítésnél növelni kell. Meglévő bővítmény frissítésekor frissítse a jegyzékben szereplő verziót, vagy adja át a parancssori --rev-version kapcsolót. Ez növeli a bővítmény javításverziójának számát, és menti az új verziót a jegyzékbe. A frissítéshez a feladatverziót és a bővítményverziót is át kell adni. tfx extension create --manifest-globs vss-extension.json --rev-version csak a bővítmény verzióját frissíti, a feladatverziót nem. További információ: Feladat összeállítása a GitHubon.

Ha a csomagolt bővítmény egy .vsix-fájlban található, készen áll a bővítmény közzétételére a Marketplace-en.

5. A bővítmény közzététele

A bővítmény közzétételéhez először létre kell hoznia a közzétevőt, majd fel kell töltenie a bővítményt, majd meg kell osztania.

A közzétevő létrehozása

Minden bővítményt, beleértve a Microsoft bővítményeit is, a közzétevő által biztosítottként azonosítja. Ha még nem tagja egy meglévő közzétevőnek, hozzon létre egyet.

  1. Jelentkezzen be a Visual Studio Marketplace közzétételi portálra.
  2. Ha még nem tagja egy meglévő közzétevőnek, a rendszer kérni fogja, hogy hozzon létre egy közzétevőt. Ha a rendszer nem kéri közzétevő létrehozását, görgessen le a lap aljára, és válassza a Bővítmények közzététele lehetőséget a Kapcsolódó webhelyek területen.
    • Adja meg a közzétevő azonosítóját, például: mycompany-myteam.
      • Ezt az azonosítót használja a publisher bővítmények jegyzékfájljában lévő attribútum értékeként.
    • Adja meg a közzétevő megjelenítendő nevét, például: My Team.
  3. Tekintse át a Marketplace-közzétevői szerződést , és válassza a Létrehozás lehetőséget.

A közzétevő definiálva van. Egy későbbi kiadásban engedélyeket adhat a közzétevő bővítményeinek megtekintéséhez és kezeléséhez. Egyszerűbb és biztonságosabb a bővítmények közzététele egy közös közzétevőben anélkül, hogy hitelesítő adatokat kellene megosztaniuk a felhasználók között.

Bővítmény feltöltése

Keresse meg az Új bővítmény feltöltése gombot, nyissa meg a csomagolt .vsix-fájlt, és válassza a Feltöltés lehetőséget.

  1. A bővítményt a parancssori felületen (CLI) is feltöltheti úgy, hogy a parancsot használja ahelyett tfx extension publish tfx extension create , hogy egy lépésben csomagolja és közzétegye a bővítményt. A bővítményt tetszés szerint --share-with megoszthatja egy vagy több fiókkal a közzététel után.

    tfx extension publish --manifest-globs your-manifest.json --share-with yourOrganization
    
  2. Személyes hozzáférési jogkivonat (PAT) létrehozása.

    • Válassza ki a "Marketplace (publish)" hatókört. Ez a hatókör korlátozza a jogkivonatot, hogy csak bővítményeket tegyen közzé a Marketplace-en.

A bővítmény megosztása

Most, hogy feltöltötte a bővítményt, a Marketplace-en van, de senki sem láthatja. Ossza meg a szervezettel, hogy telepítheti és tesztelheti.

Válassza ki a jobb gombbal a bővítményt, és válassza a Megosztás lehetőséget, majd adja meg a szervezeti adatokat. Megoszthatja más fiókokkal is, amelyekhez hozzá szeretne férni a bővítményhez.

Fontos

A közzétevőket ellenőrizni kell a bővítmények nyilvános megosztásához. További információ: Csomag/Közzététel/Telepítés.

Most, hogy a bővítmény meg van osztva a Marketplace-en, minden használni kívánt felhasználónak telepítenie kell.

6. Hozzon létre egy buildelési és kiadási folyamatot a bővítmény Marketplace-en való közzétételéhez

Hozzon létre egy buildelési és kiadási folyamatot az Azure DevOpsban, amely segít fenntartani az egyéni feladatot a Marketplace-en.

Előfeltételek

Szoftver/eszköz

Tájékoztatás

Azure DevOps-projekt

Azure DevOps Extension Tasks bővítmény

Telepítse ingyenesen az Azure DevOps-bővítményfeladatokat a szervezetében.

Folyamattár változócsoportja

Hozzon létre egy folyamattár változócsoportot a folyamat által használt változók tárolásához. További információ: Változócsoportok hozzáadása és használata. Változócsoportokat az Azure DevOps Library lapjáról vagy a parancssori felületről hozhat létre. Használja a csoporton belüli változókat a folyamatban. Emellett deklarálja a következő változókat a változócsoportban:

  • publisherId: A marketplace-közzétevő azonosítója
  • extensionId: A bővítmény azonosítója a vss-extension.json fájlban deklarált módon
  • extensionName: A bővítmény neve a vss-extension.json fájlban deklarált módon
  • artifactName: A VSIX-fájlhoz létrehozott összetevő neve

Szolgáltatáskapcsolat

Hozzon létre egy új Marketplace-szolgáltatáskapcsolatot, és adjon hozzáférési engedélyeket az összes folyamathoz.

YAML-folyamat

Az alábbi példában létrehozhat egy új folyamatot a YAML használatával. További információ: Az első folyamat és a YAML-séma létrehozása.

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'

További információ: Folyamatok eseményindító eseményeinek megadása.

Feljegyzés

Minden feladat új felhasználói ügynököt használ, és függőségeket kell telepítenie.

Folyamatszakaszok

Az alábbi szakasz segít megérteni a folyamat szakaszainak működését.

1. szakasz: Egységtesztek futtatása és közzététele

Ez a szakasz egységteszteket futtat, és közzéteszi a teszteredményeket az Azure DevOpsban.

Az egységtesztek futtatásához adjon hozzá egy egyéni szkriptet a package.json fájlhoz az alábbi példához hasonlóan.

"scripts": {
    "testScript": "mocha ./TestFile --reporter xunit --reporter-option output=ResultsFile.xml"
},
  1. Adja hozzá a "Node CLI használata az Azure DevOpshoz (tfx-cli)" parancsot a tfx-cli buildügynökre való telepítéséhez.

  2. Adja hozzá az "npm" feladatot a "install" paranccsal, és célozza meg a mappát a package.json fájllal.

  3. Adja hozzá a "Bash" feladatot a TypeScript JavaScriptbe való fordításához.

  4. Adja hozzá az "npm" feladatot az "egyéni" paranccsal, célozza meg az egységteszteket tartalmazó mappát, és adja meg a bemenetet testScript parancsként. Használja a következő bemeneteket:

    • Parancs: egyéni
    • Package.json tartalmazó munkamappa: /TestsDirectory
    • Parancsok és argumentumok: testScript
  5. Adja hozzá a "Teszteredmények közzététele" feladatot. Ha a Mocha XUnit-riportert használja, győződjön meg arról, hogy az eredmény formátuma "JUnit" és nem "XUnit". Állítsa a keresési mappát a gyökérkönyvtárra. Használja a következő bemeneteket:

    • Teszteredmény formátuma: JUnit
    • Teszteredmény-fájlok: **/ResultsFile.xml
    • Keresési mappa: $(System.DefaultWorkingDirectory)

    A teszteredmények közzététele után a tesztek lap kimenetének az alábbi példához hasonlóan kell kinéznie.

    Képernyőkép a teszteredmény példájáról.

2. szakasz: A bővítmény csomagolása és buildösszetevők közzététele

  1. Adja hozzá a "Node CLI használata az Azure DevOpshoz (tfx-cli)" parancsot a tfx-cli buildügynökre való telepítéséhez.

  2. Adja hozzá az "npm" feladatot a "install" paranccsal, és célozza meg a mappát a package.json fájllal.

  3. Adja hozzá a "Bash" feladatot a TypeScript JavaScriptbe való fordításához.

  4. Adja hozzá a "Lekérdezésbővítmény verziója" feladatot a meglévő bővítményverzió lekérdezéséhez. Használja a következő bemeneteket:

    • Csatlakozás a következőhöz: Visual Studio Marketplace
    • Visual Studio Marketplace (szolgáltatáskapcsolat): Szolgáltatáskapcsolat
    • Közzétevő azonosítója: A Visual Studio Marketplace-közzétevő azonosítója
    • Bővítmény azonosítója: A bővítmény azonosítója a vss-extension.json fájlban
    • Verzió növelése: Javítás
    • Kimeneti változó: Task.Extension.Version
  5. Adja hozzá a "Csomagbővítmény" feladatot a bővítmények Json-jegyzék alapján történő csomagolásához. Használja a következő bemeneteket:

    • Gyökérjegyzék-mappa: A jegyzékfájlt tartalmazó gyökérkönyvtárra mutat. Például a $(System.DefaultWorkingDirectory) a gyökérkönyvtár
    • Jegyzékfájl(ok): vss-extension.json
    • Közzétevő azonosítója: A Visual Studio Marketplace-közzétevő azonosítója
    • Bővítmény azonosítója: A bővítmény azonosítója a vss-extension.json fájlban
    • Bővítmény neve: A bővítmény neve a vss-extension.json fájlban
    • Bővítmény verziója: $(Task.Extension.Version)
    • Feladatverzió felülbírálása: bejelölve (igaz)
    • Felülbírálás típusa: Csak a javítás cseréje (1.0.r)
    • Bővítmény láthatósága: Ha a bővítmény még fejlesztés alatt áll, állítsa be az értéket privátra. A bővítmény nyilvános kiadásához állítsa az értéket nyilvánosra
  6. Adja hozzá a "Fájlok másolása" feladatot a közzétett fájlok másolásához. Használja a következő bemeneteket:

    • Tartalom: Az összes másolandó fájl összetevőként való közzétételéhez
    • Célmappa: Az a mappa, amelybe a fájlok át lesznek másolva
      • Például: $(Build.ArtifactStagingDirectory)
  7. A "Buildösszetevők közzététele" lehetőséggel közzéteheti az összetevőket más feladatokban vagy folyamatokban való használatra. Használja a következő bemeneteket:

    • Közzététel elérési útja: A közzétett fájlokat tartalmazó mappa elérési útja
      • Például: $(Build.ArtifactStagingDirectory)
    • Összetevő neve: Az összetevőnek adott név
    • Összetevők közzétételi helye: Válassza az "Azure Pipelines" lehetőséget az összetevő későbbi feladatokban való használatához

3. szakasz: Buildösszetevők letöltése és a bővítmény közzététele

  1. Adja hozzá a "Node CLI használata az Azure DevOpshoz (tfx-cli)" parancsot a tfx-cli buildügynökre való telepítéséhez.

  2. Adja hozzá a "Build-összetevők letöltése" feladatot, hogy letöltse az összetevőket egy új feladatra. Használja a következő bemeneteket:

    • A következő által létrehozott összetevők letöltése: Ha az összetevőt egy új feladatra tölti le ugyanabból a folyamatból, válassza az "Aktuális build" lehetőséget. Ha új folyamatra tölt le, válassza az "Adott build" lehetőséget.
    • Letöltés típusa: Válassza az "Adott összetevő" lehetőséget az összes közzétett fájl letöltéséhez.
    • Összetevő neve: A közzétett összetevő neve.
    • Célkönyvtár: Az a mappa, ahová a fájlokat le kell tölteni.
  3. Az utolsó szükséges feladat a "Bővítmény közzététele" tevékenység. Használja a következő bemeneteket:

    • Csatlakozás a következőhöz: Visual Studio Marketplace
    • Visual Studio Marketplace-kapcsolat: ServiceConnection
    • Bemeneti fájl típusa: VSIX-fájl
    • VSIX-fájl: /Publisher.*.vsix
    • Közzétevő azonosítója: A Visual Studio Marketplace-közzétevő azonosítója
    • Bővítmény azonosítója: A bővítmény azonosítója a vss-extension.json fájlban
    • Bővítmény neve: A bővítmény neve a vss-extension.json fájlban
    • Bővítmény láthatósága: Privát vagy nyilvános

Nem kötelező: A bővítmény telepítése és tesztelése

Telepítsen egy önnel néhány lépésben megosztott bővítményt:

  1. A szervezet vezérlőpultján (https://dev.azure.com/{organization}/_admin) lépjen a projektgyűjtemény felügyeleti lapjára.
  2. A Bővítmények lapon keresse meg a bővítményt a "Velem megosztva" csoportban, és válassza ki a bővítményhivatkozást.
  3. Telepítse a bővítményt.

Ha nem látja a Bővítmények lapot, győződjön meg arról, hogy a vezérlőpulton van (a projektgyűjtemény szintjén található adminisztrációs lap), https://dev.azure.com/{organization}/_adminés nem a projekt adminisztrációs lapján.

Ha nem látja a Bővítmények lapot, akkor a bővítmények nem engedélyezettek a szervezet számára. A Visual Studio Partner Programhoz való csatlakozással korai hozzáférést kaphat a bővítmények funkcióhoz.

Az Azure DevOps-bővítmények Visual Studio Marketplace-en való csomagolásához és közzétételéhez letöltheti az Azure DevOps Bővítményfeladatokat.

GYIK

Tekintse meg az alábbi gyakori kérdéseket (GYIK) az egyéni buildelési vagy kiadási feladatok Azure DevOps-bővítményekben való hozzáadásával kapcsolatban.

K: Hogyan korlátozhatjam az Azure Pipelines-parancsok használatát a feladathoz?

Korlátozhatja az Azure Pipelines-parancsok használatát és változóit, amelyek feladat szerint lesznek beállítva. Ez a művelet hasznos lehet, ha megakadályozza a változókhoz/vso parancsokhoz való korlátlan hozzáférést azokhoz az egyéni szkriptekhez, amelyeket a feladat végrehajt. Javasoljuk, hogy új feladatokhoz állítsa be. Az alkalmazáshoz a következő utasítást kell hozzáadnia a task.json fájlhoz:

  "restrictions": {
    "commands": {
      "mode": "restricted"
    },
    "settableVariables": {
      "allowed": ["variable1", "test*"]
    }
}

Ha restricted az érték meg van adva mode – csak a következő parancsokat hajthatja végre a feladattal:

  • logdetail
  • logissue
  • complete
  • setprogress
  • setsecret
  • setvariable
  • debug
  • settaskvariable
  • prependpath
  • publish

A settableVariables korlátozások lehetővé teszik a változók engedélyezési listájának átadását, amelyeket a rendszer beállít vagy prependpath parancsok alapján setvariable állít be. Az alapszintű reguláris kifejezéseket is lehetővé teszi. Ha például az engedélyezési lista a következő volt: ['abc', 'test*'], beállítás abc, testvagy test1 változóként bármilyen értékkel, vagy az elérési útra való előpendálásuk sikeres lenne, de ha egy változóproxyt próbál beállítani, az figyelmeztetést adna. Az üres lista azt jelenti, hogy a tevékenység nem módosítja a változókat.

Ha a kulcs vagy commands a settableVariables kulcs hiányzik, a rendszer nem alkalmazza a vonatkozó korlátozást.

A korlátozási funkció a 2.182.1 ügynök verziójától érhető el.

K: Hogyan kezeli egy feladat a lemondási jelet?

Válasz: A folyamatügynök elküldi SIGINT és SIGTERM jelzi a megfelelő gyermekfolyamatot. A feladattárban nincsenek explicit módon feldolgozandó eszközök. További információ: Ügynökfeladatok lemondása.

K: Hogyan távolíthatom el a feladatot a projektgyűjteményből?

Válasz: Nem támogatjuk a tevékenységek automatikus törlését. Az automatikus törlés nem biztonságos, és megszakítja az ilyen feladatokat már használó meglévő folyamatokat. A tevékenységeket azonban elavultként jelölheti meg. Ehhez hajtsa végre a feladatverziót, és jelölje meg a feladatot elavultként.

K: Hogyan frissíthetem az egyéni feladatomat a legújabb csomópontra?

V: Javasoljuk, hogy frissítsen a legújabb Node-verzióra. További információ : Tevékenységek frissítése a Node 20-ra.

Mivel a Microsoft által üzemeltetett ügynökök és az Azure DevOps Server különböző verziói különböző életciklussal rendelkeznek, a feladat futási helyétől függően különböző Node-futóverziók telepíthetők. Ha ugyanazt a feladatot különböző Node-futtató verziójú ügynökökön szeretné futtatni, a task.json fájl több végrehajtási szakaszt is tartalmazhat. Az alábbi példában a Node 20 futót tartalmazó Azure Pipeline-ügynökök alapértelmezés szerint kiválasztják, és azok, amelyek nem fognak visszatérni a Node 10 implementációhoz.

  "execution": {
    "Node10": {
      "target": "bash.js",
      "argumentFormat": ""
    },
    "Node20_1": {
      "target": "bash.js",
      "argumentFormat": ""
    }

A feladatok frissítése:

  • Tesztelje a feladat(oka)t a Node különböző futóverzióiban, hogy a kód a várt módon viselkedjen.

  • A feladat végrehajtási szakaszában frissítsen a feladatról vagy a másikra Node Node16 Node20.Node10

  • A régebbi kiszolgálóverziók támogatásához el kell hagynia a Node/Node10 célt. Előfordulhat, hogy a régebbi Azure DevOps Server-verziók nem tartalmazzák a Node legújabb futóverzióit.

  • Megadhatja, hogy megosztja-e a célban definiált belépési pontot, vagy hogy a célokat a használt csomópontverzióra optimalizálja.

    "execution": {
       "Node10": {
         "target": "bash10.js",
         "argumentFormat": ""
    },
    "Node16": {
       "target": "bash16.js",
       "argumentFormat": ""
    },
    "Node20_1": {
       "target": "bash20.js",
       "argumentFormat": ""
    }
    

Fontos

Ha nem támogatja a Node 20 futót az egyéni tevékenységeken, a feladatok meghiúsulnak a kiadási pipelines-agent-* hírcsatornából telepített ügynökökön.