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 npm av , 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
Skapa mappstrukturen för uppgiften och installera de bibliotek och beroenden som krävs.
Öppna ett PowerShell-kommandofönster, gå till mappen
buildandreleasetask
och kör följande kommando.npm init --yes
npm init
package.json
skapar filen. Vi har lagt till parametern--yes
för att acceptera alla standardalternativnpm 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
tillbuildandreleasetask
. 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öranpm install --production
ellernpm prune --production
, eller så kan du skriva ett skript för att skapa och packa allt.Lägg till
azure-pipelines-task-lib
i biblioteket.npm install azure-pipelines-task-lib --save
Kontrollera att TypeScript-skrivningar är installerade för externa beroenden.
npm install @types/node --save-dev npm install @types/q --save-dev
Skapa en
.gitignore
fil och lägg till node_modules i den. Din byggprocess bör göra ennpm install
och entypings install
så att node_modules skapas varje gång och inte behöver checkas in.echo node_modules > .gitignore
Installera Mocha som ett utvecklingsberoende.
npm install mocha --save-dev -g npm install sync-request --save-dev npm install @types/mocha --save-dev
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 varatsc
tillgängligt.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.
Skapa en
task.json
fil ibuildandreleasetask
mappen. Filentask.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.Kopiera följande kod och ersätt
{{placeholders}}
med uppgiftens information. Den viktigaste platshållaren ärtaskguid
, 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" } } }
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();
Ange "tsc" från
buildandreleasetask
mappen för att kompilera enindex.js
fil frånindex.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
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.
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
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
.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.
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 }); });
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.
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(); });
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.
- Logga in på Visual Studio Marketplace-publiceringsportalen.
- 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.
- Den här identifieraren används som värde för
- Ange ett visningsnamn för utgivaren, till exempel:
My Team
.
- Ange en identifierare för utgivaren, till exempel:
- 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.
Du kan också ladda upp tillägget via kommandoradsgränssnittet (CLI) med hjälp
tfx extension publish
avtfx 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
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-utgivarenextensionId
: ID för ditt tillägg enligt beskrivningen i filen vss-extension.jsonextensionName
: Namnet på tillägget enligt vss-extension.json-filenartifactName
: 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"
},
Lägg till "Använd Node CLI för Azure DevOps (tfx-cli)" för att installera tfx-cli på byggagenten.
Lägg till uppgiften "npm" med kommandot "install" och rikta mappen mot package.json-filen.
Lägg till aktiviteten "Bash" för att kompilera TypeScript till JavaScript.
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
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.
Steg 2: Paketera tillägget och publicera byggartefakter
Lägg till "Använd Node CLI för Azure DevOps (tfx-cli)" för att installera tfx-cli på byggagenten.
Lägg till uppgiften "npm" med kommandot "install" och rikta mappen mot package.json-filen.
Lägg till aktiviteten "Bash" för att kompilera TypeScript till JavaScript.
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
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
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)
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
- Sökväg att publicera: Sökvägen till mappen som innehåller de filer som publiceras
Steg 3: Ladda ned byggartefakter och publicera tillägget
Lägg till "Använd Node CLI för Azure DevOps (tfx-cli)" för att installera tfx-cli på byggagenten.
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.
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:
- Gå till administrationssidan för projektsamlingen från organisationens kontrollpanel (
https://dev.azure.com/{organization}/_admin
). - På fliken Tillägg letar du reda på tillägget i gruppen "Tillägg delas med mig" och väljer tilläggslänken.
- 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}/_admin
och 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
, test
eller 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
ellerNode10
tillNode16
ellerNode20
.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.