Lägga till ett tillägg för anpassade pipelines-aktiviteter

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

Lär dig hur du installerar tillägg till din organisation för anpassade bygg- eller versionsaktiviteter i Azure DevOps. Mer information finns i Vad är Azure Pipelines?

Kommentar

Den här artikeln beskriver agentuppgifter i agentbaserade tillägg. Mer information om serveruppgifter och serverbaserade tillägg finns i GitHub-dokumentationen för serveruppgift.

Förutsättningar

För att skapa tillägg för Azure DevOps behöver du följande programvara och verktyg.

Programvara/verktyg Information
Azure DevOps organisation Skapa en organisation.
En textredigerare För många procedurer använder vi Visual Studio Code, som ger stöd för intellisense och felsökning. Ladda ned den senaste versionen.
Node.js Ladda ned den senaste versionen.
npmjs.com 4.0.2 eller senare TypeScript-kompilator. Ladda ned den senaste versionen.
tfx-cli Paketera tillägget med plattformsoberoende CLI för Azure DevOps. med hjälp npmav , en komponent i Node.js genom att köra npm i -g tfx-cli.
SDK för Azure DevOps-tillägg Installera paketet azure-devops-extension-sdk.
En home katalog för projektet Katalogen home för ett versions- eller versionsaktivitetstillägg bör se ut som i följande exempel när du har slutfört stegen i den här artikeln.
|--- README.md    
|--- images                        
    |--- extension-icon.png  
|--- buildandreleasetask            // where your task scripts are placed
|--- vss-extension.json             // extension's manifest

Viktigt!

Utvecklingsdatorn måste köra den senaste versionen av Node för att säkerställa att den skrivna koden är kompatibel med produktionsmiljön på agenten och den senaste versionen av azure-pipelines-task-lib. Uppdatera din task.json-fil enligt följande kommando:

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

1. Skapa en anpassad uppgift

Gör varje del av den här proceduren i buildandreleasetask mappen.

Kommentar

Den här exempelgenomgången använder Windows med PowerShell. Vi gjorde det allmänt för alla plattformar, men syntaxen för att hämta miljövariabler är annorlunda. Om du använder en Mac eller Linux ersätter du alla instanser av $env:<var>=<val> med export <var>=<val>.

Skapa aktivitetsställningar

  1. Skapa mappstrukturen för uppgiften och installera de bibliotek och beroenden som krävs.

  2. Öppna ett PowerShell-kommandofönster, gå till mappen buildandreleasetask och kör följande kommando.

    npm init --yes
    

    npm initpackage.json skapar filen. Vi har lagt till parametern --yes för att acceptera alla standardalternativ npm init .

    Dricks

    Agenten installerar inte automatiskt de moduler som krävs eftersom den förväntar sig att aktivitetsmappen ska innehålla nodmodulerna. För att minimera detta kopierar du node_modules till buildandreleasetask. När uppgiften blir större är det enkelt att överskrida storleksgränsen (50 MB) för en VSIX-fil. Innan du kopierar nodmappen kanske du vill köra npm install --production eller npm prune --production, eller så kan du skriva ett skript för att skapa och packa allt.

  3. Lägg till azure-pipelines-task-lib i biblioteket.

    npm install azure-pipelines-task-lib --save
    
  4. Kontrollera att TypeScript-skrivningar är installerade för externa beroenden.

    npm install @types/node --save-dev
    npm install @types/q --save-dev
    
  5. Skapa en .gitignore fil och lägg till node_modules i den. Din byggprocess bör göra en npm install och en typings install så att node_modules skapas varje gång och inte behöver checkas in.

    echo node_modules > .gitignore
    
  6. Installera Mocha som ett utvecklingsberoende.

    npm install mocha --save-dev -g
    npm install sync-request --save-dev
    npm install @types/mocha --save-dev
    
  7. Välj TypeScript version 2.3.4 eller 4.6.3.

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

    Kommentar

    Kontrollera att TypeScript är installerat globalt med npm i utvecklingsmiljön, så att tsc kommandot är tillgängligt. Om du hoppar över det här steget används TypeScript version 2.3.4 som standard, och du måste fortfarande installera paketet globalt för att kommandot ska vara tsc tillgängligt.

  8. Skapa tsconfig.json kompilatoralternativ. Den här filen ser till att dina TypeScript-filer kompileras till JavaScript-filer.

    tsc --init --target es2022
    

Skapa uppgift

Nu när byggnadsställningen är klar kan vi skapa vår anpassade uppgift.

  1. Skapa en task.json fil i buildandreleasetask mappen. Filen task.json beskriver bygg-/versionsuppgiften och är vad build/release-systemet använder för att återge konfigurationsalternativ till användaren och för att veta vilka skript som ska köras vid bygg-/lanseringstid.

  2. Kopiera följande kod och ersätt {{placeholders}} med uppgiftens information. Den viktigaste platshållaren är taskguid, och den måste vara unik.

    {
     "$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. Skapa en index.ts fil med hjälp av följande kod som referens. Den här koden körs när aktiviteten anropas.

    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. Ange "tsc" från buildandreleasetask mappen för att kompilera en index.js fil från index.ts.

task.json komponenter

Se följande beskrivningar av några av komponenterna i task.json filen.

Property beskrivning
id Ett unikt GUID för din uppgift.
name Namn utan blanksteg.
friendlyName Beskrivande namn (blanksteg tillåts).
description Detaljerad beskrivning av vad din uppgift gör.
author Kort sträng som beskriver entiteten som utvecklar bygg- eller versionsuppgiften, till exempel: "Microsoft Corporation".
instanceNameFormat Så här visas uppgiften i steglistan build/release. Du kan använda variabelvärden med hjälp av $(variablename).
groups Beskriver den logiska gruppering av aktivitetsegenskaper i användargränssnittet.
inputs Indata som ska användas när bygg- eller versionsaktiviteten körs. Den här aktiviteten förväntar sig indata med namnexempel.
execution Körningsalternativ för den här uppgiften, inklusive skript.
restrictions Begränsningar som tillämpas på uppgiften om GitHub Codespaces-kommandon kan anropas och variabelaktiviteten kan ställas in. Vi rekommenderar att du anger begränsningsläge för nya uppgifter.

Kommentar

Skapa ett id med följande kommando i PowerShell:

(New-Guid).Guid

Mer information finns i aktivitetsreferensen Build/release.

Kör uppgiften

Kör uppgiften med node index.js från PowerShell.

I följande exempel misslyckas uppgiften eftersom indata inte angavs (samplestring är en obligatorisk indata).

 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

Som en korrigering kan vi ange samplestring indata och köra uppgiften igen.

$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

Den här gången lyckades uppgiften eftersom samplestring den angavs och den korrekt utdata "Hello Human!"

Dricks

Information om olika aktivitetslöpare och hur du inkluderar den senaste nodversionen i task.json finns i Avsnittet om uppdateringsvägledning för Node runner för Azure Pipelines-aktivitetsförfattare.

2. Enhetstesta dina aktivitetsskript

Gör enhetstester för att snabbt testa aktivitetsskriptet och inte de externa verktyg som anropas. Testa alla aspekter av både lyckade och misslyckade sökvägar.

  1. Installera testverktyg. Vi använder Mocha som testdrivrutin i den här proceduren.

    npm install mocha --save-dev -g
    npm install sync-request --save-dev
    npm install @types/mocha --save-dev
    
  2. Skapa en tests mapp som innehåller en _suite.ts fil med följande innehåll:

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

    Dricks

    Testmappen ska finnas i mappen buildandreleasetask. Om du får ett fel med synkroniseringsbegäran kan du kringgå det genom att lägga till synkroniseringsbegäran i mappen buildandreleasetask med kommandot npm i --save-dev sync-request.

  3. Skapa en success.ts fil i testkatalogen med följande innehåll. Den här filskapandet simulerar körning av uppgiften och hånar alla anrop till externa metoder.

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

    Lyckat test verifierar att med lämpliga indata lyckas det utan fel eller varningar och returnerar rätt utdata.

  4. Lägg till följande exempel på ett lyckat test _suite.ts i filen för att köra uppgiften mock runner.

        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. Skapa en failure.ts fil i testkatalogen som din uppgifts mock runner med följande innehåll:

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

    Feltestet verifierar att när verktyget får felaktiga eller ofullständiga indata misslyckas det på det förväntade sättet med användbara utdata.

  6. Lägg till följande kod i _suite.ts filen för att köra uppgiften mock runner.

    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. Kör testerna.

    tsc
    mocha tests/_suite.js
    

    Båda testerna bör godkännas. Om du vill köra testerna med mer utförliga utdata (vad du skulle se i byggkonsolen) anger du miljövariabeln: TASK_TEST_TRACE=1.

    $env:TASK_TEST_TRACE=1
    

3. Skapa tilläggsmanifestfilen

Tilläggsmanifestet innehåller all information om tillägget. Den innehåller länkar till dina filer, inklusive dina uppgiftsmappar och bildmappar. Se till att du har skapat en avbildningsmapp med extension-icon.png. Följande exempel är ett tilläggsmanifest som innehåller bygg- eller versionsuppgiften.

Kopiera följande .json kod och spara den som din vss-extension.json fil i katalogen home .

Skapa inte den här filen i mappen buildandreleasetask.

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

Kommentar

Ändra utgivaren till ditt utgivarnamn. Mer information finns i Skapa en utgivare.

Bidrag

Property beskrivning
id Identifierare för bidraget. Måste vara unikt i tillägget. Behöver inte matcha namnet på bygg- eller versionsuppgiften. Vanligtvis finns namnet på bygg- eller versionsaktiviteten i ID:t för bidraget.
type Typ av bidrag. Ska vara ms.vss-distributed-task.task.
targets Bidrag som "riktas" av detta bidrag. Ska vara ms.vss-distributed-task.tasks.
properties.name Namnet på uppgiften. Det här namnet måste matcha mappnamnet för motsvarande fristående bygg- eller versionspipelineuppgift.

Filer

Egenskap beskrivning
path Sökväg till filen eller mappen i förhållande till home katalogen.

Kommentar

Mer information om tilläggsmanifestfilen, till exempel dess egenskaper och vad de gör, finns i referensen för tilläggsmanifestet.

4. Paketera tillägget

Paketera alla dina filer för att få ditt tillägg till Visual Studio Marketplace. Alla tillägg paketeras som VSIX 2.0-kompatibla .vsix-filer. Microsoft tillhandahåller ett plattformsoberoende kommandoradsgränssnitt (CLI) för att paketera tillägget.

När du har tfx-cli går du till tilläggets hemkatalog och kör följande kommando:

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

Kommentar

Ett tillägg eller en integrerings version måste ökas vid varje uppdatering. När du uppdaterar ett befintligt tillägg uppdaterar du antingen versionen i manifestet eller skickar kommandoradsväxeln --rev-version . Detta ökar uppdateringsversionsnumret för tillägget och sparar den nya versionen i manifestet. Du måste återkalla både uppgiftsversionen och tilläggsversionen för att en uppdatering ska ske. tfx extension create --manifest-globs vss-extension.json --rev-version uppdaterar endast tilläggsversionen och inte uppgiftsversionen. Mer information finns i Skapa uppgift i GitHub.

När det paketerade tillägget finns i en .vsix-fil är du redo att publicera tillägget på Marketplace.

5. Publicera tillägget

Om du vill publicera tillägget skapar du först utgivaren, laddar sedan upp tillägget och delar det slutligen.

Skapa utgivaren

Alla tillägg, inklusive tillägg från Microsoft, identifieras som tillhandahållna av en utgivare. Om du inte redan är medlem i en befintlig utgivare skapar du en.

  1. Logga in på Visual Studio Marketplace-publiceringsportalen.
  2. Om du inte redan är medlem i en befintlig utgivare uppmanas du att skapa en utgivare. Om du inte uppmanas att skapa en utgivare rullar du ned till slutet av sidan och väljer Publicera tillägg under Relaterade webbplatser.
    • Ange en identifierare för utgivaren, till exempel: mycompany-myteam.
      • Den här identifieraren används som värde för publisher attributet i tilläggens manifestfil.
    • Ange ett visningsnamn för utgivaren, till exempel: My Team.
  3. Granska Marketplace Publisher-avtalet och välj Skapa.

Utgivaren har definierats. I en framtida version kan du bevilja behörighet att visa och hantera utgivarens tillägg. Det är enklare och säkrare att publicera tillägg under en gemensam utgivare, utan att behöva dela en uppsättning autentiseringsuppgifter mellan användare.

Ladda upp tillägget

Leta upp knappen Ladda upp nytt tillägg, gå till den paketerade .vsix-filen och välj Ladda upp.

  1. Du kan också ladda upp tillägget via kommandoradsgränssnittet (CLI) med hjälp tfx extension publish av tfx extension create kommandot i stället för att paketera och publicera tillägget i ett steg. Du kan också använda --share-with för att dela tillägget med ett eller flera konton när det har publicerats.

    tfx extension publish --manifest-globs your-manifest.json --share-with yourOrganization
    
  2. Skapa en personlig åtkomsttoken (PAT).

    • Välj omfånget "Marketplace (publicera)". Det här omfånget begränsar token till att endast kunna publicera tillägg på Marketplace.

Dela ditt tillägg

Nu när du har laddat upp tillägget finns det på Marketplace, men ingen kan se det. Dela den med din organisation så att du kan installera och testa den.

Högerklicka på tillägget och välj Dela och ange organisationsinformation. Du kan dela det med andra konton som du vill ha åtkomst till ditt tillägg också.

Viktigt!

Utgivare måste verifieras för att dela tillägg offentligt. Mer information finns i Paket/Publicera/Installera.

Nu när tillägget delas på Marketplace måste alla som vill använda det installera det.

6. Skapa en bygg- och versionspipeline för att publicera tillägget på Marketplace

Skapa en bygg- och versionspipeline i Azure DevOps för att underhålla den anpassade uppgiften på Marketplace.

Förutsättningar

Programvara/verktyg

Information

Azure DevOps-projekt

Tilläggsuppgifter för Azure DevOps

Installera kostnadsfritt Azure DevOps-tilläggsuppgifter i din organisation.

Variabelgrupp för pipelinebibliotek

Skapa en pipelinebiblioteksvariabelgrupp för att lagra variablerna som används av pipelinen. Mer information finns i Lägga till och använda variabelgrupper. Du kan skapa variabelgrupper från fliken Azure DevOps-bibliotek eller via CLI. Använd variablerna i den här gruppen i din pipeline. Deklarera även följande variabler i variabelgruppen:

  • publisherId: ID för marketplace-utgivaren
  • extensionId: ID för ditt tillägg enligt beskrivningen i filen vss-extension.json
  • extensionName: Namnet på tillägget enligt vss-extension.json-filen
  • artifactName: Namnet på artefakten som skapas för VSIX-filen

Tjänstanslutning

Skapa en ny Marketplace-tjänstanslutning och bevilja åtkomstbehörigheter för alla pipelines.

YAML-pipeline

Använd följande exempel för att skapa en ny pipeline med YAML. Mer information finns i Skapa din första pipeline och YAML-schema.

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'

Mer information finns i Ange händelser som utlöser pipelines.

Kommentar

Varje jobb använder en ny användaragent och kräver att beroenden installeras.

Pipelinesteg

Följande avsnitt hjälper dig att förstå hur pipelinestegen fungerar.

Steg 1: Köra och publicera enhetstester

Det här steget kör enhetstester och publicerar testresultat till Azure DevOps.

Om du vill köra enhetstester lägger du till ett anpassat skript i filen package.json som i följande exempel.

"scripts": {
    "testScript": "mocha ./TestFile --reporter xunit --reporter-option output=ResultsFile.xml"
},
  1. Lägg till "Använd Node CLI för Azure DevOps (tfx-cli)" för att installera tfx-cli på byggagenten.

  2. Lägg till uppgiften "npm" med kommandot "install" och rikta mappen mot package.json-filen.

  3. Lägg till aktiviteten "Bash" för att kompilera TypeScript till JavaScript.

  4. Lägg till uppgiften "npm" med kommandot "custom", rikta in mappen som innehåller enhetstesterna och ange som testScript kommando. Använd följande indata:

    • Kommando: anpassad
    • Arbetsmapp som innehåller package.json: /TestsDirectory
    • Kommando och argument: testScript
  5. Lägg till aktiviteten "Publicera testresultat". Om du använder Mocha XUnit-reportern kontrollerar du att resultatformatet är "JUnit" och inte "XUnit". Ange sökmappen till rotkatalogen. Använd följande indata:

    • Testresultatformat: JUnit
    • Testresultatfiler: **/ResultsFile.xml
    • Sökmapp: $(System.DefaultWorkingDirectory)

    När testresultaten har publicerats bör utdata under testfliken se ut som i följande exempel.

    Skärmbild av testresultatexemplet.

Steg 2: Paketera tillägget och publicera byggartefakter

  1. Lägg till "Använd Node CLI för Azure DevOps (tfx-cli)" för att installera tfx-cli på byggagenten.

  2. Lägg till uppgiften "npm" med kommandot "install" och rikta mappen mot package.json-filen.

  3. Lägg till aktiviteten "Bash" för att kompilera TypeScript till JavaScript.

  4. Lägg till uppgiften "Frågetilläggsversion" för att köra frågor mot den befintliga tilläggsversionen. Använd följande indata:

    • Anslut till: Visual Studio Marketplace
    • Visual Studio Marketplace (tjänstanslutning): Tjänstanslutning
    • Utgivar-ID: ID för din Visual Studio Marketplace-utgivare
    • Tilläggs-ID: ID för tillägget i filen vss-extension.json
    • Öka version: Korrigering
    • Utdatavariabel: Task.Extension.Version
  5. Lägg till aktiviteten "Pakettillägg" för att paketera tilläggen baserat på manifest-Json. Använd följande indata:

    • Rotmanifestmapp: Pekar på rotkatalogen som innehåller manifestfilen. Till exempel är $(System.DefaultWorkingDirectory) rotkatalogen
    • Manifestfiler: vss-extension.json
    • Utgivar-ID: ID för din Visual Studio Marketplace-utgivare
    • Tilläggs-ID: ID för tillägget i filen vss-extension.json
    • Tilläggsnamn: Namnet på tillägget i filen vss-extension.json
    • Tilläggsversion: $(Task.Extension.Version)
    • Åsidosätt uppgiftsversion: markerad (sant)
    • Åsidosättningstyp: Ersätt endast korrigering (1.0.r)
    • Synlighet för tillägg: Om tillägget fortfarande är under utveckling anger du värdet till privat. Om du vill frigöra tillägget till allmänheten anger du värdet till offentligt
  6. Lägg till uppgiften "Kopiera filer" för att kopiera publicerade filer. Använd följande indata:

    • Innehåll: Alla filer som ska kopieras för att publicera dem som en artefakt
    • Målmapp: Mappen som filerna kopieras till
      • Exempel: $(Build.ArtifactStagingDirectory)
  7. Lägg till "Publicera byggartefakter" för att publicera artefakterna för användning i andra jobb eller pipelines. Använd följande indata:

    • Sökväg att publicera: Sökvägen till mappen som innehåller de filer som publiceras
      • Exempel: $(Build.ArtifactStagingDirectory)
    • Artefaktnamn: Namnet på artefakten
    • Publiceringsplats för artefakter: Välj "Azure Pipelines" för att använda artefakten i framtida jobb

Steg 3: Ladda ned byggartefakter och publicera tillägget

  1. Lägg till "Använd Node CLI för Azure DevOps (tfx-cli)" för att installera tfx-cli på byggagenten.

  2. Lägg till uppgiften "Ladda ned byggartefakter" för att ladda ned artefakterna till ett nytt jobb. Använd följande indata:

    • Ladda ned artefakter som skapats av: Om du laddar ned artefakten på ett nytt jobb från samma pipeline väljer du "Aktuell version". Om du laddar ned på en ny pipeline väljer du "Specifik version".
    • Nedladdningstyp: Välj "Specifik artefakt" för att ladda ned alla filer som har publicerats.
    • Artefaktnamn: Den publicerade artefaktens namn.
    • Målkatalog: Mappen där filerna ska laddas ned.
  3. Den sista uppgiften som du behöver är aktiviteten "Publicera tillägg". Använd följande indata:

    • Anslut till: Visual Studio Marketplace
    • Anslutning till Visual Studio Marketplace: ServiceConnection
    • Indatafiltyp: VSIX-fil
    • VSIX-fil: /Publisher.*.vsix
    • Utgivar-ID: ID för din Visual Studio Marketplace-utgivare
    • Tilläggs-ID: ID för tillägget i filen vss-extension.json
    • Tilläggsnamn: Namnet på tillägget i filen vss-extension.json
    • Synlighet för tillägg: Antingen privat eller offentligt

Valfritt: Installera och testa tillägget

Installera ett tillägg som delas med dig i bara några få steg:

  1. Gå till administrationssidan för projektsamlingen från organisationens kontrollpanel (https://dev.azure.com/{organization}/_admin).
  2. På fliken Tillägg letar du reda på tillägget i gruppen "Tillägg delas med mig" och väljer tilläggslänken.
  3. Installera tillägget.

Om du inte kan se fliken Tillägg kontrollerar du att du är på kontrollpanelen (administrationssidan på projektsamlingsnivå) https://dev.azure.com/{organization}/_adminoch inte på administrationssidan för ett projekt.

Om du inte ser fliken Tillägg aktiveras inte tillägg för din organisation. Du kan få tidig åtkomst till tilläggsfunktionen genom att gå med i Visual Studio Partner Program.

Om du vill paketera och publicera Azure DevOps-tillägg på Visual Studio Marketplace kan du ladda ned Azure DevOps-tilläggsuppgifter.

Vanliga frågor och svar

Se följande vanliga frågor och svar om hur du lägger till anpassade bygg- eller versionsaktiviteter i tillägg för Azure DevOps.

F: Hur kan jag begränsa användningen av Azure Pipelines-kommandon för uppgiften?

Du kan begränsa användning och variabler för Azure Pipelines-kommandon, som anges efter uppgift. Den här åtgärden kan vara användbar för att förhindra obegränsad åtkomst till variabler/vso-kommandon för anpassade skript som aktiviteten körs. Vi rekommenderar att du konfigurerar det för nya uppgifter. Om du vill tillämpa kan du behöva lägga till följande instruktion i din task.json-fil:

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

Om restricted värdet har angetts för mode kan du bara köra följande kommandon av uppgiften:

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

Med settableVariables begränsningarna kan du skicka in en lista över variabler som anges av setvariable eller prependpath kommandon. Det tillåter också grundläggande reguljära uttryck. Om din allowlist till exempel var: ['abc', 'test*'], anger abc, testeller test1 som variabler med något värde eller väntar på dem till sökvägen skulle det lyckas, men om du försöker ange en variabelproxy varnar den. Tom lista innebär att inga variabler ändras per aktivitet.

Om antingen settableVariables nyckeln eller commands utelämnas tillämpas inte relevant begränsning.

Begränsningsfunktionen är tillgänglig från agentversionen 2.182.1 .

F: Hur hanteras avbokningssignalen av en uppgift?

S: Pipelineagenten skickar SIGINT och SIGTERM signalerar till den relevanta underordnade processen. Det finns inga explicita metoder i aktivitetsbiblioteket att bearbeta. Mer information finns i Avbryta agentjobb.

F: Hur tar jag bort uppgiften från projektsamlingen?

S: Vi stöder inte automatisk borttagning av uppgifter. Automatisk borttagning är inte säker och bryter befintliga pipelines som redan använder sådana uppgifter. Men du kan markera aktiviteter som inaktuella. Om du vill göra det stöter du på uppgiftsversionen och markerar aktiviteten som inaktuell.

F: Hur kan jag uppgradera min anpassade uppgift till den senaste noden?

S: Vi rekommenderar att du uppgraderar till den senaste Node-versionen. Mer information finns i Uppgradera aktiviteter till Nod 20.

Eftersom Microsoft Hosted-agenter och olika Azure DevOps Server-versioner har olika livscykeln kan det finnas olika Node runner-versioner installerade beroende på var en uppgift körs. För att kunna köra samma uppgift på agenter med olika Node runner-versioner kan task.json-filen innehålla flera körningsavsnitt. I följande exempel väljer Azure Pipeline-agenter som inkluderar Node 20-löparen det som standard, och de som inte gör det återgår till Node 10-implementeringen.

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

Så här uppgraderar du dina uppgifter:

  • Testa dina uppgifter på de olika node runner-versionerna för att se till att koden fungerar som förväntat.

  • I körningsavsnittet för aktiviteten uppdaterar du från Node eller Node10 till Node16 eller Node20.

  • Om du vill ha stöd för äldre serverversioner bör du lämna Node/Node10 målet. Äldre Azure DevOps Server-versioner kanske inte har den senaste Node Runner-versionen inkluderad.

  • Du kan välja att dela den startpunkt som definierats i målet eller ha mål optimerade för den nodversion som används.

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

Viktigt!

Om du inte lägger till stöd för Node 20-löparen för dina anpassade uppgifter kommer uppgifter att misslyckas på agenter som installerats pipelines-agent-* från versionsflödet.