Dela via


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

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

Den här artikeln beskriver 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?

Anmärkning

Den här artikeln beskriver agentuppgifter i agentbaserade tillägg. Mer information om serveruppgifter och serverbaserade tillägg finns i Redigering av serveraktivitet.

Förutsättningar

  • En organisation i Azure DevOps. Skapa en organisation.

  • En textredigerare. I många självstudier använder vi Visual Studio Code, som ger stöd för intellisense och felsökning.

  • Den senaste versionen av Node.js.

  • npmjs.com 4.0.2 eller senare. Installera den senaste versionen av den här TypeScript-kompilatorn.

  • Plattformsoberoende CLI för Azure DevOps (tfx-cli) för att paketera dina tillägg.

    • tfx-cli kan installeras med hjälp av npm, en komponent i Node.js, genom att köra npm i -g tfx-cli.
  • SDK för Azure DevOps-tillägget. Installera paketet azure-devops-extension-sdk .

  • En home katalog för projektet. Ett build- eller release-uppgiftstilläggs katalog home bör ha följande struktur 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 icke-förhandsversionen av azure-pipelines-task-lib. task.json Uppdatera filen enligt följande kommando:

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

1. Skapa en anpassad uppgift

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

Anmärkning

I den här exempelgenomgången används Windows med PowerShell. Stegen är allmänna 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 uppgiftsstruktur

  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 init skapar package.json-filen. Vi har lagt till parametern --yes för att acceptera alla standardalternativ npm init .

    Tips

    Agenten installerar inte automatiskt de moduler som krävs eftersom den förväntar sig att aktivitetsmappen ska innehålla nodmodulerna. För att mildra, kopiera 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. Säkerställ att TypeScript-typer ä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
    

    Anmärkning

    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 du skapa din 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. Om du vill kompilera en index.js-fil från index.ts anger du tsc från mappen buildandreleasetask.

task.json komponenter

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

Egendom beskrivning
id Ett unikt GUID för din uppgift.
name Namn utan blanksteg.
friendlyName Beskrivande namn (mellanslag är tillåtet).
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 uppgiften förväntar sig en indata med namnet samplestring.
execution Det finns flera exekveringsalternativ för den här uppgiften, inklusive skript, som Node, PowerShell, PowerShell3 eller Process.
restrictions Begränsningar som tillämpas på uppgiften om GitHub Codespaces-kommandon som aktiviteten kan anropa och variabler som aktiviteten kan ange. Vi rekommenderar att du anger begränsningsläge för nya uppgifter.

Anmärkning

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 hjälp node index.js av 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 anger du samplestring indata och kör 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 lyckas uppgiften eftersom samplestring den har angetts, och den matar ut Hello Human på rätt sätt!

Tips

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

2. Enhetstesta dina skript för uppgifter

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 förlopp.

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

    Tips

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

  3. Skapa en success.ts fil i testkatalogen med följande innehåll. Det här skapandet av filen simulerar körning av uppgiften och imiterar 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 det, med lämpliga indata, lyckas utan fel eller varningar och returnerar rätt utdata.

  4. För att köra task mock runner, lägg till följande exempel på ett lyckat test i din _suite.ts-fil.

         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 din testkatalog som en mock runner för uppgiften 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. För att köra task mock runner, lägg till följande kod i din _suite.ts fil.

    it('should fail if tool returns 1', function(done: Mocha.Done) {
        this.timeout(1000);
    
        const tp = path.join(__dirname, 'failure.js');
        const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);
    
        tr.runAsync().then(() => {
            console.log(tr.succeeded);
            assert.equal(tr.succeeded, false, 'should have failed');
            assert.equal(tr.warningIssues.length, 0, 'should have no warnings');
            assert.equal(tr.errorIssues.length, 1, 'should have 1 error issue');
            assert.equal(tr.errorIssues[0], 'Bad input was given', 'error issue output');
            assert.equal(tr.stdout.indexOf('Hello bad'), -1, 'Should not display Hello bad');
            done();
        });
    });
    
  7. Kör testerna.

    tsc
    mocha tests/_suite.js
    

    Båda testerna bör klara sig. 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 mapp för bilder 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"
            }
        }
    ]
}

Anmärkning

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

Bidrag

Egendom beskrivning
id Identifierare för bidraget. Måste vara unikt inom 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 detta bidrag riktar sig till. 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

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

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

Anmärkning

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 använder kommandoradsväxeln --rev-version. Detta ökar uppdateringsversionsnumret för tillägget och sparar den nya versionen i manifestet. Du måste uppdatera både uppgiftsversionen och tilläggsversionen för att uppdateringen 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 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 avtalet för utgivare på Marketplace 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.

Du kan också ladda upp ditt tillägg via kommandoradsgränssnittet (CLI) genom att använda tfx extension publish-kommandot istället för tfx extension create för att paketera och publicera ditt tillägg 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

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.

När tillägget har delats 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

Om du vill underhålla den anpassade uppgiften på Marketplace skapar du en bygg- och versionspipeline i Azure DevOps.

Krav för publicering

  • Ett Azure DevOps-projekt. Skapa ett projekt.

  • Azure DevOps Extension Tasks-tillägg. Installera det kostnadsfritt 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 som angivet 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.

Anmärkning

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

Steg i pipelines

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 package.json filen 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 install kommandot och rikta mot mappen med package.json filen.

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

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

    • Kommando: custom
    • 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 som 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 install kommandot och rikta mot mappen med package.json filen.

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

  4. Om du vill fråga efter den befintliga versionen, lägg till uppgiften Utökning av frågeversion och använd följande inmatningsdata:

    • 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 vss-extension.json filen
    • Uppdatera version: Patch
    • Utdatavariabel: Task.Extension.Version
  5. Om du vill paketera tilläggen baserat på manifest-Json lägger du till aktiviteten Pakettillägg med hjälp av följande indata:

    • Rotmanifestmapp: Pekar på rotkatalogen som innehåller manifestfilen. Är till exempel $(System.DefaultWorkingDirectory) rotkatalogen
    • Manifestfil: vss-extension.json
    • Utgivar-ID: ID för din Visual Studio Marketplace-utgivare
    • Tilläggs-ID: ID för tillägget i vss-extension.json filen
    • Tilläggsnamn: Namnet på tillägget i vss-extension.json filen
    • Tilläggsversion: $(Task.Extension.Version)
    • Åsidosätt uppgiftens version: markerad som (sant)
    • Åsidosättningstyp: Ersätt endast ändringsfil (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 som offentligt.
  6. Om du vill kopiera till publicerade filer lägger du till aktiviteten Kopiera filer med hjälp av 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
      • Till exempel: $(Build.ArtifactStagingDirectory)
  7. Lägg till Publicera kompileringsartefakter 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
      • Till 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. Om du vill installera tfx-cli på byggagenten lägger du till Använd Node CLI för Azure DevOps (tfx-cli).

  2. Om du vill ladda ned artefakterna till ett nytt jobb lägger du till uppgiften Ladda ned byggartefakter med hjälp av 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. Använd följande indata för att hämta uppgiften Publicera tillägg :

    • 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 vss-extension.json filen
    • Tilläggsnamn: Namnet på tillägget i vss-extension.json filen
    • Tilläggssynlighet: Antingen privat eller offentlig

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 som 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

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 eller vso-kommandon för anpassade skript som aktiviteten kör. Vi rekommenderar att du konfigurerar det för nya uppgifter. För att ansöka kan du behöva lägga till följande instruktion i filen task.json:

"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 efter uppgiftens:

  • 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 agentversion 2.182.1.

F: Hur hanteras avbrytssignalen av en uppgift?

Pipelineagenten skickar SIGINT och SIGTERM signaler till dess relevanta underordnade process. Det finns inga explicita metoder i aktivitetsbiblioteket att bearbeta. Mer information finns i Avbryta agentjobb.

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

Vi stöder inte automatisk borttagning av uppgifter. Automatisk borttagning är inte säker och bryter befintliga processkedjor som redan använder sig av sådana processer. Men du kan markera aktiviteter som inaktuella. För att göra så uppdaterar du uppgiftsversionen och markerar uppgiften som föråldrad.

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

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

Microsoft Hosted-agenter och olika Versioner av Azure DevOps Server har olika livscykel, vilket leder till att olika Node-löparversioner installeras beroende på var en uppgift körs. För att säkerställa kompatibilitet mellan agenter med olika versioner av Node runner task.json kan filen innehålla flera exekveringsavsnitt. I följande exempel använder Azure Pipeline-agenter med Node 20-löparen den som standard, medan agenter utan den å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:

  • För att se till att koden fungerar som förväntat testar du dina uppgifter på de olika Node Runner-versionerna.

  • 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 Versioner av Azure DevOps Server 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-exekveraren till dina anpassade uppgifter misslyckas de på agenter som är installerade från release-feeden.