Share via


Een taakextensie voor aangepaste pijplijnen toevoegen

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Meer informatie over het installeren van extensies voor uw organisatie voor aangepaste build- of releasetaken in Azure DevOps. Zie Wat is Azure Pipelines voor meer informatie ?

Notitie

In dit artikel worden agenttaken behandeld in extensies op basis van agents. Zie de GitHub-documentatie voor servertaken voor meer informatie over servertaken en serverextensies.

Vereisten

Voor het maken van extensies voor Azure DevOps hebt u de volgende software en hulpprogramma's nodig.

Software/hulpprogramma Gegevens
Azure DevOps-organisatie Maak een organisatie.
Een teksteditor Voor veel procedures gebruiken we Visual Studio Code, dat ondersteuning biedt voor intellisense en foutopsporing. Download de nieuwste versie.
Node.js Download de nieuwste versie.
npmjs.com 4.0.2 of hoger TypeScript Compiler. Download de nieuwste versie.
tfx-cli Verpak uw extensie met platformoverschrijdende CLI voor Azure DevOps. gebruikt npm, een onderdeel van Node.js, door uit te voeren npm i -g tfx-cli.
Azure DevOps-extensie-SDK Installeer het pakket azure-devops-extension-sdk.
Een home map voor uw project De home map van een build- of releasetaakextensie moet eruitzien als in het volgende voorbeeld nadat u de stappen in dit artikel hebt voltooid.
|--- README.md    
|--- images                        
    |--- extension-icon.png  
|--- buildandreleasetask            // where your task scripts are placed
|--- vss-extension.json             // extension's manifest

Belangrijk

De ontwikkelcomputer moet de nieuwste versie van Node uitvoeren om ervoor te zorgen dat de geschreven code compatibel is met de productieomgeving op de agent en de nieuwste niet-preview-versie van azure-pipelines-task-lib. Werk uw task.json bestand bij volgens de volgende opdracht:

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

1. Een aangepaste taak maken

Voer elk deel van deze procedure uit in de buildandreleasetask map.

Notitie

In dit voorbeeld wordt Windows gebruikt met PowerShell. We hebben het algemeen gemaakt voor alle platforms, maar de syntaxis voor het verkrijgen van omgevingsvariabelen is anders. Als u een Mac of Linux gebruikt, vervangt u alle exemplaren van $env:<var>=<val> export <var>=<val>.

Taakstructuur maken

  1. Maak de mapstructuur voor de taak en installeer de vereiste bibliotheken en afhankelijkheden.

  2. Open een PowerShell-opdrachtvenster, ga naar uw buildandreleasetask map en voer de volgende opdracht uit.

    npm init --yes
    

    npm init maakt het package.json bestand. We hebben de --yes parameter toegevoegd om alle standaardopties npm init te accepteren.

    Tip

    De agent installeert niet automatisch de vereiste modules omdat de taakmap de knooppuntmodules verwacht. Als u dit wilt verhelpen, kopieert u het node_modules naar buildandreleasetask. Naarmate uw taak groter wordt, is het eenvoudig om de maximale grootte (50 MB) van een VSIX-bestand te overschrijden. Voordat u de knooppuntmap kopieert, kunt u het beste uitvoeren npm install --production of npm prune --productioneen script schrijven om alles te bouwen en in te pakken.

  3. Toevoegen azure-pipelines-task-lib aan uw bibliotheek.

    npm install azure-pipelines-task-lib --save
    
  4. Zorg ervoor dat TypeScript-typen zijn geïnstalleerd voor externe afhankelijkheden.

    npm install @types/node --save-dev
    npm install @types/q --save-dev
    
  5. Maak een .gitignore bestand en voeg er node_modules aan toe. Uw buildproces moet een npm install en een typings install zodanig uitvoeren dat node_modules elke keer worden gebouwd en niet hoeven te worden ingecheckt.

    echo node_modules > .gitignore
    
  6. Installeer Mocha als een ontwikkelingsafhankelijkheid.

    npm install mocha --save-dev -g
    npm install sync-request --save-dev
    npm install @types/mocha --save-dev
    
  7. Kies TypeScript-versie 2.3.4 of 4.6.3.

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

    Notitie

    Zorg ervoor dat TypeScript wereldwijd is geïnstalleerd met npm in uw ontwikkelomgeving, zodat de tsc opdracht beschikbaar is. Als u deze stap overslaat, wordt TypeScript-versie 2.3.4 standaard gebruikt en moet u het pakket nog steeds globaal installeren om de tsc opdracht beschikbaar te maken.

  8. Compileropties maken tsconfig.json . Dit bestand zorgt ervoor dat uw TypeScript-bestanden worden gecompileerd naar JavaScript-bestanden.

    tsc --init --target es2022
    

Taak maken

Nu de steiger is voltooid, kunnen we onze aangepaste taak maken.

  1. Maak een task.json bestand in de buildandreleasetask map. Het task.json bestand beschrijft de build/release-taak en is wat het build-/releasesysteem gebruikt om configuratieopties voor de gebruiker weer te geven en om te weten welke scripts moeten worden uitgevoerd op build-/releasetijd.

  2. Kopieer de volgende code en vervang de {{placeholders}} gegevens van uw taak. De belangrijkste tijdelijke aanduiding is de taskguiden moet uniek zijn.

    {
     "$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. Maak een index.ts bestand met behulp van de volgende code als verwijzing. Deze code wordt uitgevoerd wanneer de taak wordt aangeroepen.

    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. Voer 'tsc' uit de buildandreleasetask map in om een index.js bestand uit index.tste compileren.

task.json onderdelen

Zie de volgende beschrijvingen van enkele onderdelen van het task.json bestand.

Eigenschappen Beschrijving
id Een unieke GUID voor uw taak.
name Naam zonder spaties.
friendlyName Beschrijvende naam (toegestane spaties).
description Gedetailleerde beschrijving van wat uw taak doet.
author Korte tekenreeks die de entiteit beschrijft die de build- of releasetaak ontwikkelt, bijvoorbeeld: 'Microsoft Corporation'.
instanceNameFormat Hoe de taak wordt weergegeven in de lijst met build-/releasestappen. U kunt variabele waarden gebruiken met behulp van $(variablename).
groups Beschrijft de logische groepering van taakeigenschappen in de gebruikersinterface.
inputs Invoer die moet worden gebruikt wanneer uw build- of releasetaak wordt uitgevoerd. Deze taak verwacht een invoer met de naamsvoorbeelden.
execution Uitvoeringsopties voor deze taak, inclusief scripts.
restrictions Beperkingen die worden toegepast op de taak over de opdrachtopdracht GitHub Codespaces kunnen aanroepen en variabelentaak kan worden ingesteld. U wordt aangeraden de beperkingsmodus voor nieuwe taken op te geven.

Notitie

Maak een id met de volgende opdracht in PowerShell:

(New-Guid).Guid

Zie de naslaginformatie over build-/releasetaken voor meer informatie.

De taak uitvoeren

Voer de taak uit vanuit node index.js PowerShell.

In het volgende voorbeeld mislukt de taak omdat er geen invoer is opgegeven (samplestring is een vereiste invoer).

 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

Als oplossing kunnen we de samplestring invoer instellen en de taak opnieuw uitvoeren.

$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

Deze keer is de taak voltooid omdat samplestring deze is opgegeven en de juiste uitvoer 'Hallo mens!' is uitgevoerd

Tip

Zie de richtlijnen voor het bijwerken van knooppunten voor Node Pipelines voor informatie over verschillende taaklopers en het opnemen van de meest recente knooppuntversie in de task.json.

2. Test uw taakscripts per eenheid

Voer eenheidstests uit om het taakscript snel te testen en niet de externe hulpprogramma's die worden aanroepen. Test alle aspecten van zowel geslaagde als mislukte paden.

  1. Testhulpprogramma's installeren. In deze procedure gebruiken we Mocha als teststuurprogramma.

    npm install mocha --save-dev -g
    npm install sync-request --save-dev
    npm install @types/mocha --save-dev
    
  2. Maak een tests map met een _suite.ts bestand met de volgende inhoud:

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

    Tip

    De testmap moet zich in de map buildandreleasetask bevinden. Als er een synchronisatieaanvraagfout optreedt, kunt u deze omzeilen door een synchronisatieaanvraag toe te voegen aan de map buildandreleasetask met de opdracht npm i --save-dev sync-request.

  3. Maak een success.ts bestand in uw testmap met de volgende inhoud. Met dit bestand wordt het uitvoeren van de taak gesimuleerd en worden alle aanroepen naar externe methoden gesimuleerd.

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

    De geslaagde test valideert dat met de juiste invoer, het slaagt zonder fouten of waarschuwingen en retourneert de juiste uitvoer.

  4. Voeg de volgende voorbeeldtest toe aan uw _suite.ts bestand om de taaksimuleerde runner uit te voeren.

        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. Maak een failure.ts bestand in de testmap als uw taaksimuleerderunner met de volgende inhoud:

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

    De fouttest valideert dat wanneer het hulpprogramma ongeldige of onvolledige invoer krijgt, deze op de verwachte manier mislukt met nuttige uitvoer.

  6. Voeg de volgende code toe aan uw _suite.ts bestand om de taaksimuleerde runner uit te voeren.

    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. Voer de tests uit.

    tsc
    mocha tests/_suite.js
    

    Beide tests moeten worden uitgevoerd. Als u de tests wilt uitvoeren met uitgebreidere uitvoer (wat u in de build-console zou zien), stelt u de omgevingsvariabele in: TASK_TEST_TRACE=1.

    $env:TASK_TEST_TRACE=1
    

3. Maak het extensiemanifestbestand

Het extensiemanifest bevat alle informatie over uw extensie. Het bevat koppelingen naar uw bestanden, waaronder uw taakmappen en afbeeldingenmappen. Zorg ervoor dat u een map met afbeeldingen hebt gemaakt met extension-icon.png. Het volgende voorbeeld is een uitbreidingsmanifest dat de build- of releasetaak bevat.

Kopieer de volgende .json code en sla deze op als uw vss-extension.json bestand in uw home map.

Maak dit bestand niet in de map 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"
            }
        }
    ]
}

Notitie

Wijzig de uitgever in de naam van uw uitgever. Zie Een uitgever maken voor meer informatie.

Bijdragen

Eigenschappen Beschrijving
id Id van de bijdrage. Moet uniek zijn binnen de extensie. Hoeft niet overeen te komen met de naam van de build- of releasetaak. Normaal gesproken bevindt de naam van de build- of releasetaak zich in de id van de bijdrage.
type Het type bijdrage. Moet ms.vss-distributed-task.task zijn.
targets Bijdragen "gericht" op deze bijdrage. Moet ms.vss-distributed-task.tasks zijn.
properties.name Naam van de taak. Deze naam moet overeenkomen met de mapnaam van de bijbehorende zelfstandige build- of release-pijplijntaak.

Bestanden

Eigenschap Beschrijving
path Pad van het bestand of de map ten opzichte van de home map.

Notitie

Zie de verwijzing naar het extensiemanifest voor meer informatie over het extensiemanifestbestand, zoals de eigenschappen en wat ze doen.

4. Uw extensie verpakken

Pak al uw bestanden samen om uw extensie op te halen in Visual Studio Marketplace. Alle extensies zijn verpakt als VSIX 2.0-compatibele .vsix-bestanden. Microsoft biedt een platformoverschrijdende opdrachtregelinterface (CLI) om uw extensie te verpakken.

Zodra u de tfx-cli hebt, gaat u naar de basismap van uw extensie en voert u de volgende opdracht uit:

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

Notitie

De versie van een extensie of integratie moet bij elke update worden verhoogd. Wanneer u een bestaande extensie bijwerkt, werkt u de versie in het manifest bij of geeft u de --rev-version opdrachtregelswitch door. Hiermee wordt het patchversienummer van uw extensie verhoogd en wordt de nieuwe versie opgeslagen in uw manifest. U moet zowel de taakversie als de extensieversie bekijken om een update uit te voeren. tfx extension create --manifest-globs vss-extension.json --rev-version werkt alleen de extensieversie bij en niet de taakversie. Zie Build Task in GitHub voor meer informatie.

Zodra uw pakketextensie zich in een VSIX-bestand bevindt, kunt u de extensie publiceren naar Marketplace.

5. Uw extensie publiceren

Als u uw extensie wilt publiceren, maakt u eerst uw uitgever, uploadt u vervolgens uw extensie en deelt u deze ten slotte.

Uw uitgever maken

Alle extensies, inclusief extensies van Microsoft, worden geïdentificeerd als geleverd door een uitgever. Als u nog geen lid bent van een bestaande uitgever, maakt u er een.

  1. Meld u aan bij de Visual Studio Marketplace-publicatieportal.
  2. Als u nog geen lid bent van een bestaande uitgever, wordt u gevraagd een uitgever te maken. Als u niet wordt gevraagd om een uitgever te maken, schuift u omlaag naar de onderkant van de pagina en selecteert u Extensies publiceren onder Verwante sites.
    • Geef een id op voor uw uitgever, bijvoorbeeld: mycompany-myteam.
      • Deze id wordt gebruikt als de waarde voor het kenmerk in het publisher manifestbestand van uw extensies.
    • Geef een weergavenaam op voor uw uitgever, bijvoorbeeld: My Team.
  3. Controleer de Marketplace Publisher-overeenkomst en selecteer Maken.

Uw uitgever is gedefinieerd. In een toekomstige release kunt u machtigingen verlenen om de extensies van uw uitgever weer te geven en te beheren. Het is eenvoudiger en veiliger om extensies te publiceren onder een gemeenschappelijke uitgever, zonder dat u een set referenties hoeft te delen tussen gebruikers.

Uw extensie uploaden

Zoek de knop Nieuwe extensie uploaden, ga naar het verpakte .vsix-bestand en selecteer Uploaden.

  1. U kunt uw extensie ook uploaden via de opdrachtregelinterface (CLI) met behulp van de tfx extension publish opdracht in plaats van tfx extension create uw extensie in één stap te verpakken en uw extensie te publiceren. U kunt eventueel --share-with uw extensie delen met een of meer accounts nadat deze is gepubliceerd.

    tfx extension publish --manifest-globs your-manifest.json --share-with yourOrganization
    
  2. Maak een persoonlijk toegangstoken (PAT).

    • Selecteer het bereik Marketplace (publiceren). Dit bereik beperkt het token totdat alleen extensies naar Marketplace kunnen worden gepubliceerd.

Uw extensie delen

Nu u uw extensie hebt geüpload, bevindt deze zich in Marketplace, maar niemand kan deze zien. Deel het met uw organisatie, zodat u deze kunt installeren en testen.

Selecteer met de rechtermuisknop uw extensie en selecteer Delen en voer uw organisatiegegevens in. U kunt deze ook delen met andere accounts die u toegang wilt geven tot uw extensie.

Belangrijk

Uitgevers moeten worden geverifieerd om extensies openbaar te delen. Zie Package/Publish/Install voor meer informatie.

Nu uw extensie wordt gedeeld in Marketplace, moet iedereen die deze wil gebruiken, de extensie installeren.

6. Maak een build- en release-pijplijn om de extensie te publiceren naar Marketplace

Maak een build- en release-pijplijn in Azure DevOps om de aangepaste taak op Marketplace te behouden.

Vereisten

Software/hulpprogramma

Informatie

Azure DevOps-project

Azure DevOps Extension Tasks-extensie

Installeer gratis Azure DevOps-extensietaken in uw organisatie.

Groep met variabelen voor pijplijnbibliotheek

Maak een pijplijnbibliotheekvariabelegroep voor het opslaan van de variabelen die door de pijplijn worden gebruikt. Zie Variabelengroepen toevoegen en gebruiken voor meer informatie. U kunt variabele groepen maken via het tabblad Azure DevOps Library of via de CLI. Gebruik de variabelen in deze groep in uw pijplijn. Declareer ook de volgende variabelen in de variabelegroep:

  • publisherId: id van uw marketplace-uitgever
  • extensionId: Id van uw extensie, zoals gedeclareerd in het bestand vss-extension.json
  • extensionName: Naam van uw extensie, zoals gedeclareerd in het vss-extension.json-bestand
  • artifactName: Naam van het artefact dat wordt gemaakt voor het VSIX-bestand

Serviceverbinding

Maak een nieuwe Marketplace-serviceverbinding en verken toegangsmachtigingen voor alle pijplijnen.

YAML-pijplijn

Gebruik het volgende voorbeeld om een nieuwe pijplijn te maken met YAML. Zie Uw eerste pijplijn en YAML-schema maken voor meer informatie.

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'

Zie Gebeurtenissen opgeven die pijplijnen activeren voor meer informatie.

Notitie

Elke taak maakt gebruik van een nieuwe gebruikersagent en vereist dat afhankelijkheden worden geïnstalleerd.

Pijplijnfasen

In de volgende sectie leert u hoe de pijplijnfasen werken.

Fase 1: Eenheidstests uitvoeren en publiceren

In deze fase worden eenheidstests uitgevoerd en testresultaten gepubliceerd naar Azure DevOps.

Als u eenheidstests wilt uitvoeren, voegt u een aangepast script toe aan het package.json-bestand, zoals in het volgende voorbeeld.

"scripts": {
    "testScript": "mocha ./TestFile --reporter xunit --reporter-option output=ResultsFile.xml"
},
  1. Voeg Node CLI voor Azure DevOps (tfx-cli) toe om de tfx-cli te installeren op uw buildagent.

  2. Voeg de taak npm toe met de opdracht 'install' en richt u op de map met het package.json-bestand.

  3. Voeg de taak Bash toe om het TypeScript te compileren in JavaScript.

  4. Voeg de taak npm toe met de opdracht 'aangepast', richt u op de map met de eenheidstests en invoer testScript als de opdracht. Gebruik de volgende invoer:

    • Opdracht: aangepast
    • Werkmap met package.json: /TestsDirectory
    • Opdracht en argumenten: testScript
  5. Voeg de taak Testresultaten publiceren toe. Als u de mocha XUnit-rapporter gebruikt, moet u ervoor zorgen dat de resultaatindeling 'JUnit' is en niet 'XUnit'. Stel de zoekmap in op de hoofdmap. Gebruik de volgende invoer:

    • Indeling van testresultaat: JUnit
    • Testresultatenbestanden: **/ResultsFile.xml
    • Zoekmap: $(System.DefaultWorkingDirectory)

    Nadat de testresultaten zijn gepubliceerd, moet de uitvoer op het tabblad Tests eruitzien als in het volgende voorbeeld.

    Schermopname van het voorbeeld van het testresultaat.

Fase 2: De extensie verpakken en buildartefacten publiceren

  1. Voeg Node CLI voor Azure DevOps (tfx-cli) toe om de tfx-cli te installeren op uw buildagent.

  2. Voeg de taak npm toe met de opdracht 'install' en richt u op de map met het package.json-bestand.

  3. Voeg de taak Bash toe om het TypeScript te compileren in JavaScript.

  4. Voeg de taak Query-extensieversie toe om een query uit te voeren op de bestaande extensieversie. Gebruik de volgende invoer:

    • Verbinding maken met: Visual Studio Marketplace
    • Visual Studio Marketplace (serviceverbinding): serviceverbinding
    • Uitgever-id: id van uw Visual Studio Marketplace-uitgever
    • Extensie-id: id van uw extensie in het vss-extension.json-bestand
    • Versie verhogen: Patch
    • Uitvoervariabele: Task.Extension.Version
  5. Voeg de taak Pakketextensie toe om de extensies te verpakken op basis van manifest-Json. Gebruik de volgende invoer:

    • Map met hoofdmanifesten: verwijst naar hoofdmap die manifestbestand bevat. $(System.DefaultWorkingDirectory) is bijvoorbeeld de hoofdmap
    • Manifestbestand(en): vss-extension.json
    • Uitgever-id: id van uw Visual Studio Marketplace-uitgever
    • Extensie-id: id van uw extensie in het vss-extension.json-bestand
    • Extensienaam: naam van uw extensie in het vss-extension.json bestand
    • Extensieversie: $(Task.Extension.Version)
    • Versie van taken overschrijven: ingeschakeld (waar)
    • Onderdrukkingstype: Alleen patch vervangen (1.0.r)
    • Zichtbaarheid van extensies: als de extensie nog in ontwikkeling is, stelt u de waarde in op privé. Als u de extensie voor het publiek wilt vrijgeven, stelt u de waarde in op openbaar
  6. Voeg de taak Bestanden kopiëren toe om gepubliceerde bestanden te kopiëren. Gebruik de volgende invoer:

    • Inhoud: Alle bestanden die moeten worden gekopieerd voor publicatie als artefact
    • Doelmap: de map waarnaar de bestanden worden gekopieerd
      • Bijvoorbeeld: $(Build.ArtifactStagingDirectory)
  7. Voeg buildartefacten publiceren toe om de artefacten te publiceren voor gebruik in andere taken of pijplijnen. Gebruik de volgende invoer:

    • Pad om te publiceren: het pad naar de map met de bestanden die worden gepubliceerd
      • Bijvoorbeeld: $(Build.ArtifactStagingDirectory)
    • Artefactnaam: de naam die aan het artefact is gegeven
    • Publicatielocatie voor artefacten: Kies 'Azure Pipelines' om het artefact in toekomstige taken te gebruiken

Fase 3: Build-artefacten downloaden en de extensie publiceren

  1. Voeg Node CLI voor Azure DevOps (tfx-cli) toe om de tfx-cli te installeren op uw buildagent.

  2. Voeg de taak Build-artefacten downloaden toe om de artefacten te downloaden naar een nieuwe taak. Gebruik de volgende invoer:

    • Download artefacten die worden geproduceerd door: Als u het artefact op een nieuwe taak uit dezelfde pijplijn downloadt, selecteert u Huidige build. Als u een nieuwe pijplijn downloadt, selecteert u 'Specifieke build'.
    • Downloadtype: Kies 'Specifiek artefact' om alle bestanden te downloaden die zijn gepubliceerd.
    • Artefactnaam: de naam van het gepubliceerde artefact.
    • Doelmap: de map waarin de bestanden moeten worden gedownload.
  3. De laatste taak die u nodig hebt, is de taak Extensie publiceren. Gebruik de volgende invoer:

    • Verbinding maken met: Visual Studio Marketplace
    • Visual Studio Marketplace-verbinding: ServiceConnection
    • Invoerbestandstype: VSIX-bestand
    • VSIX-bestand: /Publisher.*.vsix
    • Uitgever-id: id van uw Visual Studio Marketplace-uitgever
    • Extensie-id: id van uw extensie in het vss-extension.json-bestand
    • Extensienaam: naam van uw extensie in het vss-extension.json bestand
    • Zichtbaarheid van extensies: privé of openbaar

Optioneel: Uw extensie installeren en testen

Installeer in slechts enkele stappen een extensie die met u wordt gedeeld:

  1. Ga vanuit het configuratiescherm van uw organisatie (https://dev.azure.com/{organization}/_admin) naar de beheerpagina van de projectverzameling.
  2. Zoek op het tabblad Extensies uw extensie in de groep Extensies gedeeld met mij en selecteer de extensiekoppeling.
  3. Installeer de extensie.

Als u het tabblad Extensies niet ziet, controleert u of u zich in het configuratiescherm bevindt (de beheerpagina op projectverzamelingsniveau https://dev.azure.com/{organization}/_admin) en niet de beheerpagina voor een project.

Als u het tabblad Extensies niet ziet, zijn extensies niet ingeschakeld voor uw organisatie. U kunt vroegtijdige toegang krijgen tot de uitbreidingsfunctie door deel te nemen aan het Visual Studio Partner Program.

Als u Azure DevOps-extensies wilt verpakken en publiceren in Visual Studio Marketplace, kunt u Azure DevOps-extensietaken downloaden.

Veelgestelde vragen

Zie de volgende veelgestelde vragen over het toevoegen van aangepaste build- of releasetaken in extensies voor Azure DevOps.

V: Hoe kan ik het gebruik van Azure Pipelines-opdrachten voor taken beperken?

U kunt het gebruik en de variabelen van Azure Pipelines-opdrachten beperken, die worden ingesteld op taak. Deze actie kan nuttig zijn om onbeperkte toegang tot variabelen/vso-opdrachten te voorkomen voor aangepaste scripts die door de taak worden uitgevoerd. U wordt aangeraden deze in te stellen voor nieuwe taken. Als u dit wilt toepassen, moet u mogelijk de volgende instructie toevoegen aan uw task.json-bestand:

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

Als restricted de waarde is opgegeven voor mode : u kunt alleen de volgende opdrachten uitvoeren door de taak:

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

Met de settableVariables beperkingen kunt u een acceptatielijst met variabelen doorgeven, die worden ingesteld door setvariable of prependpath opdrachten. Het maakt ook eenvoudige reguliere expressies mogelijk. Als uw acceptatielijst bijvoorbeeld is: ['abc', 'test*'], instelling abc, testof test1 als variabelen met een waarde of als prepending ervan aan het pad, maar als u probeert een variabeleproxy in te stellen, wordt er een waarschuwing weergegeven. Lege lijst betekent dat er geen variabelen worden gewijzigd per taak.

Als de settableVariables of commands sleutel wordt weggelaten, wordt de relevante beperking niet toegepast.

De beperkingsfunctie is beschikbaar vanaf de agentversie 2.182.1 .

V: Hoe wordt het annuleringssignaal afgehandeld door een taak?

A: De pijplijnagent verzendt SIGINT en SIGTERM signalen naar het relevante onderliggende proces. Er zijn geen expliciete middelen in de taakbibliotheek die moet worden verwerkt. Zie Annulering van agenttaken voor meer informatie.

V: Hoe kan ik de taak verwijderen uit de projectverzameling?

A: Het automatisch verwijderen van taken wordt niet ondersteund. Automatisch verwijderen is niet veilig en onderbreekt bestaande pijplijnen die al dergelijke taken gebruiken. Maar u kunt taken markeren als afgeschaft. U doet dit door de taakversie te stoten en de taak als afgeschaft te markeren.

V: Hoe kan ik mijn aangepaste taak upgraden naar het nieuwste knooppunt?

A: U wordt aangeraden een upgrade uit te voeren naar de nieuwste Versie van Node. Zie Bijvoorbeeld taken upgraden naar Node 20.

Omdat door Microsoft gehoste agents en verschillende Versies van Azure DevOps Server verschillende levenscyclusn hebben, kunnen er verschillende runnerversies van Node worden geïnstalleerd, afhankelijk van waar een taak wordt uitgevoerd. Als u dezelfde taak wilt uitvoeren op agents met verschillende versies van Node runner, kan het task.json bestand meerdere uitvoeringssecties bevatten. In het volgende voorbeeld kiezen Azure Pipeline-agents met de Node 20-runner deze standaard en die niet terugvallen op de Knooppunt 10-implementatie.

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

Uw taken upgraden:

  • Test uw taken op de verschillende runnerversies van Node om ervoor te zorgen dat uw code zich gedraagt zoals verwacht.

  • Werk in de uitvoeringssectie van uw taak bij van Node of naar Node16 of Node20Node10 .

  • Als u oudere serverversies wilt ondersteunen, moet u het Node/Node10 doel verlaten. Oudere Versies van Azure DevOps Server bevatten mogelijk niet de nieuwste versie van Node runner.

  • U kunt ervoor kiezen om het toegangspunt dat is gedefinieerd in het doel te delen of doelen te laten optimaliseren voor de knooppuntversie die wordt gebruikt.

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

Belangrijk

Als u geen ondersteuning toevoegt voor de Node 20-runner voor uw aangepaste taken, mislukken taken op agents die zijn geïnstalleerd vanuit de pipelines-agent-* releasefeed.