Přidání rozšíření vlastních úloh kanálů
Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019
Zjistěte, jak nainstalovat rozšíření do vaší organizace pro vlastní úlohy sestavení nebo vydání v Azure DevOps. Další informace najdete v tématu Co je Azure Pipelines?
Poznámka:
Tento článek popisuje úlohy agenta v rozšířeních založených na agentech. Další informace o úlohách serveru a serverových rozšířeních najdete v dokumentaci k úloze serveru na GitHubu.
Požadavky
Software/nástroj | Informace |
---|---|
Organizace Azure DevOps | Vytvořte organizaci. |
Textový editor | Pro mnoho postupů používáme Visual Studio Code, který poskytuje podporu IntelliSense a ladění. Stáhněte si nejnovější verzi. |
Node.js | Stáhněte si nejnovější verzi. |
npmjs.com 4.0.2 nebo novější | Kompilátor TypeScriptu Stáhněte si nejnovější verzi. |
tfx-cli | Zabalte své rozšíření pomocí příkazového řádku pro více platforem pro Azure DevOps. pomocí npm , součástí Node.js, spuštěním npm i -g tfx-cli . |
SDK pro rozšíření Azure DevOps | Nainstalujte balíček azure-devops-extension-sdk. |
Adresář home pro váš projekt |
Po home dokončení kroků v tomto článku by měl adresář rozšíření úlohy sestavení nebo verze vypadat jako v následujícím příkladu. |
|--- README.md
|--- images
|--- extension-icon.png
|--- buildandreleasetask // where your task scripts are placed
|--- vss-extension.json // extension's manifest
Důležité
Vývojový počítač musí spouštět nejnovější verzi Node , aby byl napsaný kód kompatibilní s produkčním prostředím v agentu a nejnovější verzí azure-pipelines-task-lib
, která není ve verzi Preview . Aktualizujte soubor task.json podle následujícího příkazu:
"execution": {
"Node20_1": {
"target": "index.js"
}
}
1. Vytvoření vlastního úkolu
Proveďte všechny části tohoto postupu ve buildandreleasetask
složce.
Poznámka:
Tento příklad návodu používá Windows s PowerShellem. Pro všechny platformy jsme ho vytvořili obecně, ale syntaxe pro získání proměnných prostředí se liší. Pokud používáte Mac nebo Linux, nahraďte všechny instance $env:<var>=<val>
.export <var>=<val>
Vytvořte strukturu úkolů
Vytvořte strukturu složek pro úlohu a nainstalujte požadované knihovny a závislosti.
Otevřete příkazové okno PowerShellu, přejděte do složky
buildandreleasetask
a spusťte následující příkaz.npm init --yes
npm init
vytvoří souborpackage.json
. Přidali jsme parametr--yes
pro přijetí všech výchozích možnostínpm init
.Doporučení
Agent automaticky nenainstaluje požadované moduly, protože očekává, že složka úloh zahrne moduly uzlu. Pokud chcete tento problém zmírnit, zkopírujte
node_modules
dobuildandreleasetask
. S tím, jak se váš úkol zvětší, je snadné překročit limit velikosti (50 MB) souboru VSIX. Než zkopírujete složku uzlu, možná budete chtít spustitnpm install --production
nebonpm prune --production
nebo můžete napsat skript pro sestavení a zabalení všeho.Přidejte
azure-pipelines-task-lib
do knihovny.npm install azure-pipelines-task-lib --save
Ujistěte se, že jsou typy TypeScriptu nainstalované pro externí závislosti.
npm install @types/node --save-dev npm install @types/q --save-dev
Vytvořte
.gitignore
soubor a přidejte do něj node_modules. Proces sestavení by měl provéstnpm install
atypings install
operaci, aby se node_modules sestavily pokaždé a nemusely být uloženy do úložiště.echo node_modules > .gitignore
Nainstalujte Mocha jako vývojovou závislost.
npm install mocha --save-dev -g npm install sync-request --save-dev npm install @types/mocha --save-dev
Zvolte TypeScript verze 2.3.4 nebo 4.6.3.
npm install typescript@4.6.3 -g --save-dev
Poznámka:
Ujistěte se, že je TypeScript nainstalovaný globálně s npm ve vašem vývojovém prostředí, takže
tsc
je příkaz k dispozici. Pokud tento krok přeskočíte, použije se ve výchozím nastavení TypeScript verze 2.3.4 a budete muset balíček nainstalovat globálně, aby byltsc
příkaz k dispozici.Vytvořte
tsconfig.json
možnosti kompilátoru Tento soubor zajistí, že se vaše soubory TypeScript zkompilují do souborů JavaScriptu.tsc --init --target es2022
Vytvořit úkol
Teď, když je lešení hotové, můžeme vytvořit vlastní úkol.
Vytvořte soubor
task.json
ve složcebuildandreleasetask
. Tentotask.json
soubor popisuje úlohu sestavení/vydání a je to, co systém sestavení/verze používá k vykreslení možností konfigurace uživateli a ke zjištění, které skripty se mají spustit v době sestavení/vydání.Zkopírujte následující kód a nahraďte
{{placeholders}}
informacemi o úkolu. Nejdůležitější zástupný symbol jetaskguid
a musí být jedinečný.{ "$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" } } }
Vytvořte
index.ts
soubor pomocí následujícího kódu jako odkazu. Tento kód se spustí, když se úloha zavolá.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();
Chcete-li zkompilovat soubor
index.js
zindex.ts
, zadejtetsc
ze složkybuildandreleasetask
.
komponenty task.json
Podívejte se na následující popis některých součástí task.json
souboru.
Vlastnost | Popis |
---|---|
id |
Jedinečný GUID pro váš úkol. |
name |
Název bez mezer |
friendlyName |
Popisný název (povolené mezery) |
description |
Podrobný popis toho, co váš úkol dělá. |
author |
Krátký řetězec popisující entitu, která vyvíjí úlohu sestavení nebo vydání, například:"Microsoft Corporation". |
instanceNameFormat |
Jak se úloha zobrazí v seznamu kroků sestavení nebo nasazení. Hodnoty proměnných můžete použít pomocí $(variablename). |
groups |
Popisuje logické seskupení vlastností úloh v uživatelském rozhraní. |
inputs |
Vstupy, které se použijí při spuštění úkolu sestavení či vydání. Tento úkol očekává vstup s názvem samplestring. |
execution |
Pro tuto úlohu existuje několik možností spuštění, včetně skriptů, jako jsou Node , PowerShell , PowerShell3 nebo Process . |
restrictions |
Omezení použitá na úkol, která se týkají příkazů pro GitHub Codespaces, které může úkol volat, a proměnných, které může úkol nastavit. Doporučujeme zadat režim omezení pro nové úlohy. |
Poznámka:
Vytvořte id
pomocí tohoto příkazu v PowerShellu:
(New-Guid).Guid
Pro více informací se podívejte na referenci úlohy sestavení/vydání.
Spusťte úlohu
Spusťte úlohu node index.js
z PowerShellu.
V následujícím příkladu úloha selže, protože nebyly zadány vstupy (samplestring
je povinný vstup).
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
Jako opravu můžeme nastavit samplestring
vstup a spustit úlohu znovu.
$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
Tentokrát byl úkol úspěšný, protože samplestring
byl zadán a správně vypíše text "Hello Human!".
Tip
Pro informace o různých spouštěčích úloh a o tom, jak zahrnout nejnovější verzi Node do souboru task.json, vizte Návod na aktualizaci spouštěče Node pro autory úloh v Azure Pipelines.
Jednotkové testování vašich skriptů úkolů
Proveďte jednotkové testy, abyste rychle otestovali skript úkolu, a nikoli externí nástroje, které volá. Otestujte všechny aspekty cesty úspěchu i selhání.
Nainstalujte testovací nástroje. V tomto postupu používáme Mocha jako testovací ovladač.
npm install mocha --save-dev -g npm install sync-request --save-dev npm install @types/mocha --save-dev
Vytvořte
tests
složku obsahující soubor s následujícím obsahem_suite.ts
: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
Testovací složka by měla být umístěná ve složce buildandreleasetask. Pokud se zobrazí chyba žádosti o synchronizaci, můžete ji obejít přidáním žádosti sync-request do složky buildandreleasetask pomocí příkazu
npm i --save-dev sync-request
.V testovacím adresáři vytvořte
success.ts
soubor s následujícím obsahem. Toto vytvoření souboru simuluje spuštění úlohy a napodobuje všechna volání vnějších metod.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();
Test úspěchu ověří, že s příslušnými vstupy proběhne úspěšně bez chyb nebo upozornění a vrátí správný výstup.
Pokud chcete spustit simulátor úkolů, přidejte do souboru
_suite.ts
následující ukázkový test úspěchu.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 }); });
Ve svém testovacím adresáři vytvořte
failure.ts
soubor jako spouštěč úkolů s následujícím obsahem: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();
Test selhání ověří, že když nástroj získá chybný nebo neúplný vstup, selže očekávaným způsobem s užitečným výstupem.
Pokud chcete spustit spouštěč úloh, přidejte do souboru
_suite.ts
následující kód.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(); }); });
Spusťte testy.
tsc mocha tests/_suite.js
Oba testy by měly proběhnout. Pokud chcete spustit testy s podrobnějším výstupem (co byste viděli v konzole sestavení), nastavte proměnnou prostředí:
TASK_TEST_TRACE=1
.$env:TASK_TEST_TRACE=1
3. Vytvořte soubor manifestu rozšíření
Manifest rozšíření obsahuje všechny informace o vašem rozšíření. Obsahuje odkazy na vaše soubory, včetně složek úkolů a složek obrázků. Ujistěte se, že jste vytvořili složku obrázků s extension-icon.png. Následující příklad je manifest rozšíření, který obsahuje úlohu sestavení nebo vydání.
Zkopírujte následující .json kód a uložte jako svůj vss-extension.json
soubor do adresáře home
.
Nevytvářit tento soubor ve složce 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"
}
}
]
}
Poznámka:
Změňte vydavatele na váš název vydavatele. Další informace najdete v tématu Vytvoření vydavatele.
Příspěvky
Vlastnost | Popis |
---|---|
id |
Identifikátor příspěvku. Musí být v rámci rozšíření jedinečný. Nemusí odpovídat názvu úlohy sestavení nebo vydání. Název úlohy sestavení nebo verze je obvykle v ID příspěvku. |
type |
Typ příspěvku Měla by být ms.vss-distributed-task.task. |
targets |
Příspěvky "zaměřené" tímto příspěvkem. Měl by být ms.vss-distributed-task.tasks. |
properties.name |
Název úkolu. Tento název se musí shodovat s názvem složky odpovídající samostatné úlohy kanálu sestavení nebo verze. |
Soubory
Vlastnost | Popis |
---|---|
path |
Cesta k souboru nebo složce vzhledem k adresáři home |
Další informace o souboru manifestu přípony, včetně popisu jeho vlastností a jejich funkcí, naleznete v referenčních informacích k manifestu přípony.
4. Zabalte rozšíření
Zabalte všechny soubory dohromady, abyste získali rozšíření do Visual Studio Marketplace. Všechna rozšíření jsou zabalená jako soubory .vsix kompatibilní s VSIX 2.0. Microsoft poskytuje rozhraní příkazového řádku (CLI) pro více platforem pro zabalení rozšíření.
Jakmile budete mít tfx-cli, přejděte do domovského adresáře rozšíření a spusťte následující příkaz:
tfx extension create --manifest-globs vss-extension.json
Poznámka:
Při každé aktualizaci se musí zvýšit verze rozšíření nebo integrace.
Při aktualizaci existujícího rozšíření buď aktualizujte verzi v manifestu, nebo použijte přepínač --rev-version
příkazového řádku. Tím se zvýší číslo verze opravy vašeho rozšíření a uloží se nová verze do manifestu.
Aby aktualizace nastala, musíte zrušit verzi úlohy i verzi rozšíření.
tfx extension create --manifest-globs vss-extension.json --rev-version
aktualizuje pouze verzi rozšíření, nikoli verzi úlohy. Další informace naleznete v tématu Úloha sestavení na GitHubu.
Jakmile je vaše zabalená přípona v souboru .vsix, jste připraveni publikovat své rozšíření na Marketplace.
5. Publikování rozšíření
Pokud chcete rozšíření publikovat, nejprve vytvoříte vydavatele, pak nahrajete své rozšíření a nakonec ho nasdílíte.
Vytvořte svého vydavatele
Všechna rozšíření, včetně rozšíření od Microsoftu, jsou identifikována jako poskytovaná vydavatelem. Pokud ještě nejste členem existujícího vydavatele, vytvoříte ho.
- Přihlaste se do portálu pro publikování na Visual Studio Marketplace.
- Pokud ještě nejste členem existujícího vydavatele, zobrazí se výzva k vytvoření vydavatele. Pokud se nezobrazí výzva k vytvoření vydavatele, posuňte se dolů na konec stránky a v části Související weby vyberte Publikovat rozšíření.
- Zadejte identifikátor vydavatele, například:
mycompany-myteam
.- Tento identifikátor se používá jako hodnota pro atribut
publisher
v souboru manifestu vašeho rozšíření.
- Tento identifikátor se používá jako hodnota pro atribut
- Zadejte zobrazovaný název vydavatele, například:
My Team
.
- Zadejte identifikátor vydavatele, například:
- Prohlédněte si Smlouvu vydavatele Marketplace a vyberte Vytvořit.
Je definován váš vydavatel. V budoucím vydání můžete udělit oprávnění k zobrazení a správě rozšíření vašeho vydavatele. Publikování rozšíření v rámci běžného vydavatele je jednodušší a bezpečnější, aniž byste museli sdílet sadu přihlašovacích údajů mezi uživateli.
Nahrajte rozšíření
Najděte tlačítko Nahrát novou příponu, přejděte do zabaleného souboru .vsix a vyberte Nahrát.
Můžete také nahrát rozšíření prostřednictvím rozhraní příkazového řádku (CLI) pomocí příkazu
tfx extension publish
místotfx extension create
a tím rozšíření zabalit a publikovat v jednom kroku. Můžete podle potřeby použít--share-with
k sdílení svého rozšíření s jedním nebo více účty poté, co je publikováno.tfx extension publish --manifest-globs your-manifest.json --share-with yourOrganization
Vytvořte osobní přístupový token (PAT).
- Vyberte obor Marketplace (publikování). Tento rozsah omezuje token pouze na publikování rozšíření na tržišti.
Sdílení rozšíření
Teď, když jste nahráli rozšíření, je na Marketplace, ale nikdo ho neuvidí. Sdílejte ji s vaší organizací, abyste ji mohli nainstalovat a otestovat.
Vyberte rozšíření pravým tlačítkem a vyberte Sdílet a zadejte informace o vaší organizaci. Můžete ho sdílet s dalšími účty, kterým chcete udělit přístup k vašemu rozšíření.
Důležité
Aby bylo možné sdílet rozšíření veřejně, musí být vydavatelé ověřeni. Další informace najdete v tématu Balíček, Publikování/ Instalace.
Teď, když je vaše rozšíření sdílené na Marketplace, musí ho nainstalovat každý, kdo ho chce použít.
6. Vytvoření kanálu buildu a verze pro publikování rozšíření na Marketplace
Chcete-li zachovat vlastní úlohu na Marketplace, vytvořte kanál pro sestavení a nasazení v Azure DevOps.
Požadavky
Software/nástroj
Informace
Projekt Azure DevOps
Rozšíření úloh pro Azure DevOps
Nainstalujte si bezplatné úlohy rozšíření Azure DevOps ve vaší organizaci.
Skupina proměnných knihovny kanálů
Vytvořte skupinu proměnných knihovny kanálů pro uložení proměnných používaných kanálem. Další informace najdete v tématu Přidání a použití skupin proměnných. Skupiny proměnných můžete vytvářet na kartě Azure DevOps Library nebo prostřednictvím rozhraní příkazového řádku. Použijte proměnné v rámci této skupiny v pipeline. Deklarujte také následující proměnné ve skupině proměnných:
-
publisherId
: ID vašeho vydavatele na tržišti -
extensionId
: ID vaší přípony, jak je deklarováno v souboru vss-extension.json -
extensionName
: Název vaší přípony, jak je deklarováno v souboru vss-extension.json -
artifactName
: Název artefaktu vytvořeného pro soubor VSIX
Připojení služby
Vytvořte nové připojení ke službě Marketplace a udělte přístupová oprávnění pro všechny kanály.
Kanál YAML
Pomocí následujícího příkladu vytvořte nový kanál s YAML. Další informace najdete v tématu Vytvoření prvního kanálu a schématu YAML.
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'
Další informace naleznete v tématu Určení událostí, které aktivují kanály.
Poznámka:
Každá úloha používá nového uživatelského agenta a vyžaduje instalaci závislostí.
Fáze kanálu
Následující část vám pomůže pochopit, jak fáze kanálu fungují.
Fáze 1: Spuštění a publikování testů jednotek
Tato fáze spouští testy jednotek a publikuje výsledky testů do Azure DevOps.
Pokud chcete spustit testy jednotek, přidejte do souboru package.json vlastní skript, jako je následující příklad.
"scripts": {
"testScript": "mocha ./TestFile --reporter xunit --reporter-option output=ResultsFile.xml"
},
Pro přidání tfx-cli do vašeho agenta sestavení přidejte "Use Node CLI for Azure DevOps (tfx-cli)" (Použijte rozhraní příkazového řádku Node pro Azure DevOps (tfx-cli)).
Přidejte úlohu npm pomocí příkazu install a zacílíte složku se souborem package.json.
Přidejte úlohu Bash, která zkompiluje TypeScript do JavaScriptu.
Přidejte úlohu "npm" pomocí příkazu "custom", zaměřte se na složku, která obsahuje testy jednotek, a zadejte
testScript
jako příkaz. Použijte následující vstupy:- Příkaz: vlastní
- Pracovní složka, která obsahuje package.json: /TestsDirectory
- Příkaz a argumenty:
testScript
Přidejte úlohu Publikovat výsledky testu. Pokud používáte reportér Mocha XUnit, ujistěte se, že je formát výsledku "JUnit" a ne "XUnit". Nastavte složku výsledků hledání na kořenový adresář. Použijte následující vstupy:
- Formát výsledku testu: JUnit
- Soubory výsledků testů: **/ResultsFile.xml
- Složka výsledků hledání:
$(System.DefaultWorkingDirectory)
Po publikování výsledků testu by výstup na kartě testy měl vypadat jako v následujícím příkladu.
Fáze 2: Zabalení rozšíření a publikování výstupů sestavení
Pokud chcete nainstalovat tfx-cli do agenta sestavení, přidejte "Use Node CLI for Azure DevOps (tfx-cli)" (Použít rozhraní příkazového řádku uzlu pro Azure DevOps (tfx-cli).
Přidejte úlohu npm pomocí příkazu install a zacílíte složku se souborem package.json.
Přidejte úlohu Bash, která zkompiluje TypeScript do JavaScriptu.
Pokud chcete zadat dotaz na existující verzi, přidejte úlohu "Verze rozšíření dotazu" pomocí následujících vstupů:
- Připojení: Visual Studio Marketplace
- Visual Studio Marketplace (připojení služby): Připojení ke službě
- ID vydavatele: ID vašeho vydavatele sady Visual Studio Marketplace
- ID přípony: ID vaší přípony v souboru vss-extension.json
- Zvýšení verze: Oprava
- Výstupní proměnná: Task.Extension.Version
Chcete-li zabalit rozšíření na základě kódu JSON manifestu, přidejte úlohu Rozšíření balíčku pomocí následujících vstupů:
- Kořenová složka manifestů: Odkazuje na kořenový adresář, který obsahuje soubor manifestu. Například $(System.DefaultWorkingDirectory) je kořenový adresář.
- Soubor manifestu: vss-extension.json
- ID vydavatele: ID vašeho vydavatele na Visual Studio Marketplace
- ID přípony: ID vaší přípony v souboru vss-extension.json
- Název přípony: Název vaší přípony v souboru vss-extension.json
- Verze rozšíření: $(Task.Extension.Version)
- Přepsání verze úkolů: zaškrtnuto (true)
- Typ přepsání: Nahrazení pouze opravy (1.0.r)
- Viditelnost rozšíření: Pokud je rozšíření stále ve vývoji, nastavte hodnotu na privátní. Pokud chcete rozšíření uvolnit pro veřejnost, nastavte hodnotu na veřejnou.
Pokud chcete kopírovat do publikovaných souborů, přidejte úlohu Kopírovat soubory pomocí následujících vstupů:
- Obsah: Všechny soubory, které se mají zkopírovat pro jejich publikování jako artefakt
- Cílová složka: Složka, do které se soubory zkopírují
- Příklad: $(Build.ArtifactStagingDirectory)
Přidejte "Publikovat artefakty sestavení", abyste mohli publikovat artefakty pro použití v jiných úlohách nebo plánech. Použijte následující vstupy:
- Cesta k publikování: Cesta ke složce, která obsahuje publikované soubory
- Příklad: $(Build.ArtifactStagingDirectory)
- Název artefaktu: Název udělený artefaktu
- Umístění publikování artefaktů: Zvolte "Azure Pipelines", abyste mohli artefakt použít v budoucích úlohách.
- Cesta k publikování: Cesta ke složce, která obsahuje publikované soubory
Fáze 3: Stažení artefaktů sestavení a publikování rozšíření
Chcete-li nainstalovat tfx-cli na agenta sestavení, přidejte položku "Použijte Node CLI pro Azure DevOps (tfx-cli)".
Pokud chcete stáhnout artefakty do nové úlohy, přidejte úlohu Stáhnout artefakty sestavení pomocí následujících vstupů:
- Stažení artefaktů vytvořených: Pokud stahujete artefakt do nové úlohy ze stejného pipeline, vyberte Aktuální sestavení. Pokud stahujete na novém pipeline, vyberte Konkrétní sestavení.
- Typ stahování: Zvolte "Konkrétní artefakt" a stáhněte všechny publikované soubory.
- Název artefaktu: Název publikovaného artefaktu.
- Cílový adresář: Složka, do které se mají soubory stáhnout.
Pokud chcete získat úlohu Publikovat rozšíření, použijte následující vstupy:
- Připojení: Visual Studio Marketplace
- Připojení k Visual Studio Marketplace: ServiceConnection
- Typ vstupního souboru: Soubor VSIX
- Soubor VSIX: /Publisher.*.vsix
- Identifikátor vydavatele: ID vašeho vydavatele v sadě Visual Studio Marketplace
- ID přípony: ID vaší přípony v souboru vss-extension.json
- Název přípony: Název vaší přípony v souboru vss-extension.json
- Viditelnost rozšíření: Soukromá nebo veřejná
Volitelné: Instalace a otestování rozšíření
Během několika kroků nainstalujte rozšíření, které s vámi někdo sdílí:
- V ovládacích panelech organizace (
https://dev.azure.com/{organization}/_admin
) přejděte na stránku správy kolekce projektů. - Na kartě Rozšíření vyhledejte rozšíření ve skupině Rozšíření sdílená se mnou a vyberte odkaz na rozšíření.
- Nainstalujete rozšíření.
Pokud kartu Rozšíření nevidíte, ujistěte se, že jste v ovládacích panelech (stránka správy na úrovni https://dev.azure.com/{organization}/_admin
kolekce projektů) a ne na stránce pro správu projektu.
Pokud kartu Rozšíření nevidíte, nebudou rozšíření pro vaši organizaci povolená. K funkci rozšíření můžete získat přednostní přístup tak, že se připojíte k programu Visual Studio Partner Program.
Pokud chcete zabalit a publikovat rozšíření Azure DevOps na Visual Studio Marketplace, můžete si stáhnout úlohy rozšíření Azure DevOps.
Nejčastější dotazy
Podívejte se na následující nejčastější dotazy týkající se přidání vlastních úloh sestavení nebo úloh vydávání do rozšíření pro Azure DevOps.
Otázka: Jak můžu omezit využití příkazů Azure Pipelines pro úlohu?
Můžete omezit použití příkazů Azure Pipelines a proměnné, které se nastaví podle úlohy. Tato akce může být užitečná k zabránění neomezenému přístupu k proměnným a příkazům VSO ve vlastních skriptech, které úloha vykonává. Doporučujeme, abyste ho nastavili pro nové úkoly. Pro použití možná budete muset do souboru task.json přidat následující příkaz:
"restrictions": {
"commands": {
"mode": "restricted"
},
"settableVariables": {
"allowed": ["variable1", "test*"]
}
}
Je-li restricted
zadána hodnota pro mode
– můžete spustit pouze následující příkazy podle úkolu:
logdetail
logissue
complete
setprogress
setsecret
setvariable
debug
settaskvariable
prependpath
publish
Omezení settableVariables
umožňují předat seznam povolených proměnných, které se nastaví podle setvariable
příkazů nebo prependpath
příkazů. Umožňuje také základní regulární výrazy. Pokud by například seznam povolení byl: ['abc', 'test*']
, nastavení abc
, test
nebo test1
jako proměnných s libovolnou hodnotou nebo jejich přidání na začátek cesty by bylo úspěšné, ale pokud byste se pokusili nastavit proxy proměnnou, zobrazilo by se upozornění. Prázdný seznam znamená, že žádné proměnné se nezmění podle úkolu.
Pokud je vynechán buď klíč settableVariables
, nebo klíč commands
, relevantní omezení se nepoužije.
Funkce omezení je dostupná od verze agenta 2.182.1.
Otázka: Jak úloha zpracovává signál zrušení?
A: Agent kanálu odesílá signály SIGINT
a SIGTERM
do příslušného podřízeného procesu. V knihovně úloh nejsou explicitní prostředky ke zpracování. Další informace naleznete v tématu Zrušení úloh agenta.
Otázka: Jak můžu úkol odebrat z kolekce projektů?
A: Automatické odstraňování úkolů nepodporujeme. Automatické odstranění není bezpečné a přeruší stávající kanály, které už takové úlohy používají. Úkoly ale můžete označit jako zastaralé. Uděláte to tak, že zvýšíte verzi úlohy a označíte ji jako zastaralou.
Otázka: Jak můžu aktualizovat vlastní úlohu na nejnovější verzi Node.js?
A: Doporučujeme upgradovat na nejnovější verzi uzlu. Pro informace viz Upgradování úkolů na Node 20.
Agenti hostovaní Microsoftem a různé verze Azure DevOps Serveru mají různé životní cykly, což vede k instalaci různých verzí Node Runneru v závislosti na tom, kde je úloha spuštěná. Aby se zajistila kompatibilita mezi agenty s různými verzemi Node Runneru, může soubor task.json obsahovat několik oddílů spuštění. V následujícím příkladu agenti Azure Pipeline se spouštěčem Node 20 ho používají ve výchozím nastavení, zatímco agenti bez něj přejdou na implementaci Node 10.
"execution": {
"Node10": {
"target": "bash.js",
"argumentFormat": ""
},
"Node20_1": {
"target": "bash.js",
"argumentFormat": ""
}
Jak vylepšit úkoly:
Abyste zajistili, že se váš kód chová podle očekávání, otestujte úlohy na různých verzích Node Runneru.
V části provádění úkolu aktualizujte z
Node
neboNode10
doNode16
neboNode20
.Pokud chcete podporovat starší verze serveru, měli byste ponechat
Node
/Node10
cíl. Starší verze Azure DevOps Serveru nemusí obsahovat nejnovější verzi Node Runneru.Můžete se rozhodnout sdílet vstupní bod definovaný v cíli nebo mít cíle optimalizované pro použitou verzi uzlu.
"execution": { "Node10": { "target": "bash10.js", "argumentFormat": "" }, "Node16": { "target": "bash16.js", "argumentFormat": "" }, "Node20_1": { "target": "bash20.js", "argumentFormat": "" }
Důležité
Pokud do vlastních úloh nepřidáte podporu pro spouštěč Node 20, úlohy se nezdaří na agentech nainstalovaných ze zdroje verze pipelines-agent-*
.