Menambahkan ekstensi tugas alur kustom
Layanan Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019
Pelajari cara menginstal ekstensi ke organisasi Anda untuk tugas build atau rilis kustom di Azure DevOps. Untuk informasi selengkapnya, lihat Apa itu Azure Pipelines?
Catatan
Artikel ini membahas tugas agen dalam ekstensi berbasis agen. Untuk informasi selengkapnya tentang tugas server dan ekstensi berbasis server, lihat Dokumentasi GitHub Tugas Server.
Prasyarat
Untuk membuat ekstensi untuk Azure DevOps, Anda memerlukan perangkat lunak dan alat berikut.
Perangkat lunak/alat | Informasi |
---|---|
Organisasi Azure DevOps | Membuat organisasi. |
Editor teks. | Untuk banyak prosedur, kami menggunakan Visual Studio Code, yang menyediakan dukungan intellisense dan debugging. Unduh versi terbaru. |
Node.js | Unduh versi terbaru. |
npmjs.com 4.0.2 atau yang lebih baru | Pengkompilasi TypeScript. Unduh versi terbaru. |
tfx-cli | Kemas ekstensi Anda dengan CLI Lintas platform untuk Azure DevOps. menggunakan npm , komponen Node.js, dengan menjalankan npm i -g tfx-cli . |
SDK ekstensi Azure DevOps | Instal paket azure-devops-extension-sdk. |
home Direktori untuk proyek Anda |
home Direktori ekstensi tugas build atau rilis akan terlihat seperti contoh berikut setelah Anda menyelesaikan langkah-langkah dalam artikel ini. |
|--- README.md
|--- images
|--- extension-icon.png
|--- buildandreleasetask // where your task scripts are placed
|--- vss-extension.json // extension's manifest
Penting
Komputer dev harus menjalankan versi terbaru Node untuk memastikan bahwa kode tertulis kompatibel dengan lingkungan produksi pada agen dan versi non-pratinjau terbaru dari azure-pipelines-task-lib
. Perbarui file task.json Anda sesuai perintah berikut:
"execution": {
"Node20_1": {
"target": "index.js"
}
}
1. Buat tugas kustom
Lakukan setiap bagian dari prosedur ini dalam buildandreleasetask
folder.
Catatan
Contoh panduan ini menggunakan Windows dengan PowerShell. Kami membuatnya generik untuk semua platform, tetapi sintaks untuk mendapatkan variabel lingkungan berbeda. Jika Anda menggunakan Mac atau Linux, ganti instans $env:<var>=<val>
apa pun dengan export <var>=<val>
.
Membuat perancah tugas
Buat struktur folder untuk tugas dan instal pustaka dan dependensi yang diperlukan.
Buka jendela perintah PowerShell, buka folder Anda
buildandreleasetask
, dan jalankan perintah berikut.npm init --yes
npm init
package.json
membuat file. Kami menambahkan--yes
parameter untuk menerima semua opsi defaultnpm init
.Tip
Agen tidak secara otomatis menginstal modul yang diperlukan karena mengharapkan folder tugas Anda menyertakan modul simpul. Untuk mengurangi ini, salin ke
node_modules
buildandreleasetask
. Saat tugas Anda semakin besar, mudah untuk melebihi batas ukuran (50MB) file VSIX. Sebelum menyalin folder simpul, Anda mungkin ingin menjalankannpm install --production
ataunpm prune --production
, atau Anda dapat menulis skrip untuk membangun dan mengemas semuanya.Tambahkan
azure-pipelines-task-lib
ke pustaka Anda.npm install azure-pipelines-task-lib --save
Pastikan bahwa pengetikan TypeScript diinstal untuk dependensi eksternal.
npm install @types/node --save-dev npm install @types/q --save-dev
Buat
.gitignore
file dan tambahkan node_modules ke dalamnya. Proses build Anda harus melakukannpm install
dantypings install
sehingga node_modules dibangun setiap kali dan tidak perlu diperiksa.echo node_modules > .gitignore
Instal Mocha sebagai dependensi pengembangan.
npm install mocha --save-dev -g npm install sync-request --save-dev npm install @types/mocha --save-dev
Pilih TypeScript versi 2.3.4 atau 4.6.3.
npm install typescript@4.6.3 -g --save-dev
Catatan
Pastikan TypeScript diinstal secara global dengan npm di lingkungan pengembangan Anda, sehingga
tsc
perintah tersedia. Jika Anda melewati langkah ini, TypeScript versi 2.3.4 akan digunakan secara default, dan Anda masih harus menginstal paket secara global agartsc
perintah tersedia.Buat
tsconfig.json
opsi pengkompilasi. File ini memastikan bahwa file TypeScript Anda dikompilasi ke file JavaScript.tsc --init --target es2022
Buat tugas
Sekarang setelah perancah selesai, kita dapat membuat tugas kustom kita.
Buat
task.json
file dibuildandreleasetask
folder . File menjelaskantask.json
tugas build/rilis dan apa yang digunakan sistem build/rilis untuk merender opsi konfigurasi kepada pengguna dan untuk mengetahui skrip mana yang akan dijalankan pada waktu build/rilis.Salin kode berikut dan ganti
{{placeholders}}
dengan informasi tugas Anda. Tempat penampung yang paling penting adalahtaskguid
, dan harus 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" } } }
Buat
index.ts
file dengan menggunakan kode berikut sebagai referensi. Kode ini berjalan ketika tugas dipanggil.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();
Masukkan "tsc" dari
buildandreleasetask
folder untuk mengkompilasiindex.js
file dariindex.ts
.
komponen task.json
Lihat deskripsi berikut dari beberapa komponen task.json
file.
Properti | Deskripsi |
---|---|
id |
GUID unik untuk tugas Anda. |
name |
Nama tanpa spasi. |
friendlyName |
Nama deskriptif (spasi diizinkan). |
description |
Deskripsi terperinci tentang apa yang dilakukan tugas Anda. |
author |
String pendek yang menjelaskan entitas yang mengembangkan tugas build atau rilis, misalnya: "Microsoft Corporation." |
instanceNameFormat |
Bagaimana tugas ditampilkan dalam daftar langkah build/rilis. Anda dapat menggunakan nilai variabel dengan menggunakan $(variablename). |
groups |
Menjelaskan pengelompokan logis properti tugas di UI. |
inputs |
Input yang akan digunakan saat tugas build atau rilis Anda berjalan. Tugas ini mengharapkan input dengan nama samplestring. |
execution |
Opsi eksekusi untuk tugas ini, termasuk skrip. |
restrictions |
Pembatasan yang diterapkan ke tugas tentang tugas perintah GitHub Codespaces dapat memanggil, dan tugas variabel dapat diatur. Kami menyarankan agar Anda menentukan mode pembatasan untuk tugas baru. |
Catatan
id
Buat dengan perintah berikut di PowerShell:
(New-Guid).Guid
Untuk informasi selengkapnya, lihat referensi tugas Build/release.
Menjalankan tugas
Jalankan tugas dengan node index.js
dari PowerShell.
Dalam contoh berikut, tugas gagal karena input tidak disediakan (samplestring
adalah input yang diperlukan).
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
Sebagai perbaikan, kita dapat mengatur samplestring
input dan menjalankan tugas lagi.
$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
Kali ini, tugas berhasil karena samplestring
disediakan dan menghasilkan "Halo Manusia!" dengan benar
Tip
Untuk informasi tentang berbagai pelari tugas dan cara menyertakan versi simpul terbaru dalam task.json, lihat Panduan pembaruan pelari simpul untuk penulis tugas Azure Pipelines.
2. Unit menguji skrip tugas Anda
Lakukan pengujian unit untuk menguji skrip tugas dengan cepat, dan bukan alat eksternal yang dipanggilnya. Uji semua aspek jalur keberhasilan dan kegagalan.
Instal alat pengujian. Kami menggunakan Mocha sebagai driver uji dalam prosedur ini.
npm install mocha --save-dev -g npm install sync-request --save-dev npm install @types/mocha --save-dev
Buat folder yang
tests
_suite.ts
berisi file dengan konten berikut: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
Folder pengujian Anda harus terletak di folder buildandreleasetask. Jika Anda mendapatkan kesalahan permintaan sinkronisasi, Anda dapat mengatasinya dengan menambahkan permintaan sinkronisasi ke folder buildandreleasetask dengan perintah
npm i --save-dev sync-request
.Buat
success.ts
file di direktori pengujian Anda dengan konten berikut. Pembuatan file ini mensimulasikan menjalankan tugas dan meniru semua panggilan ke metode luar.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();
Pengujian keberhasilan memvalidasi bahwa dengan input yang sesuai, pengujian berhasil tanpa kesalahan atau peringatan dan mengembalikan output yang benar.
Tambahkan contoh pengujian keberhasilan berikut ke file Anda
_suite.ts
untuk menjalankan pelari tiruan tugas.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 }); });
Buat
failure.ts
file di direktori pengujian Anda sebagai pelari tiruan tugas Anda dengan konten berikut: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();
Pengujian kegagalan memvalidasi bahwa ketika alat mendapatkan input yang buruk atau tidak lengkap, itu gagal dengan cara yang diharapkan dengan output yang bermanfaat.
Tambahkan kode berikut ke file Anda
_suite.ts
untuk menjalankan pelari tiruan tugas.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(); });
Jalankan pengujian.
tsc mocha tests/_suite.js
Kedua tes harus lulus. Jika Anda ingin menjalankan pengujian dengan lebih banyak output verbose (apa yang akan Anda lihat di konsol build), atur variabel lingkungan:
TASK_TEST_TRACE=1
.$env:TASK_TEST_TRACE=1
3. Buat file manifes ekstensi
Manifes ekstensi berisi semua informasi tentang ekstensi Anda. Ini termasuk tautan ke file Anda, termasuk folder tugas dan folder gambar Anda. Pastikan Anda membuat folder gambar dengan extension-icon.png. Contoh berikut adalah manifes ekstensi yang berisi tugas build atau rilis.
Salin kode .json berikut dan simpan sebagai file Anda vss-extension.json
di direktori Anda home
.
Jangan buat file ini di folder 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"
}
}
]
}
Catatan
Ubah penerbit ke nama penerbit Anda. Untuk informasi selengkapnya, lihat Membuat penerbit.
Kontribusi
Properti | Deskripsi |
---|---|
id |
Pengidentifikasi kontribusi. Harus unik dalam ekstensi. Tidak perlu mencocokkan nama tugas build atau rilis. Biasanya nama tugas build atau rilis ada di ID kontribusi. |
type |
Jenis kontribusi. Harus ms.vss-distributed-task.task. |
targets |
Kontribusi "ditargetkan" oleh kontribusi ini. Harus ms.vss-distributed-task.tasks. |
properties.name |
Nama tugas. Nama ini harus cocok dengan nama folder dari tugas alur build atau rilis mandiri yang sesuai. |
File
Properti | Deskripsi |
---|---|
path |
Jalur file atau folder relatif terhadap home direktori. |
Catatan
Untuk informasi selengkapnya tentang file manifes ekstensi, seperti propertinya dan apa yang mereka lakukan, lihat referensi manifes ekstensi.
4. Mengemas ekstensi Anda
Kemas semua file Anda bersama-sama untuk mendapatkan ekstensi Anda ke Visual Studio Marketplace. Semua ekstensi dimas sebagai file .vsix yang kompatibel dengan VSIX 2.0. Microsoft menyediakan antarmuka baris perintah lintas platform (CLI) untuk mengemas ekstensi Anda.
Setelah Anda memiliki tfx-cli, buka direktori beranda ekstensi Anda, dan jalankan perintah berikut:
tfx extension create --manifest-globs vss-extension.json
Catatan
Versi ekstensi atau integrasi harus ditahapkan pada setiap pembaruan.
Saat Anda memperbarui ekstensi yang ada, perbarui versi dalam manifes atau lewati --rev-version
sakelar baris perintah. Ini akan menaikkan nomor versi patch ekstensi Anda dan menyimpan versi baru ke manifes Anda.
Anda harus merev versi tugas dan versi ekstensi agar pembaruan terjadi. tfx extension create --manifest-globs vss-extension.json --rev-version
hanya memperbarui versi ekstensi dan bukan versi tugas. Untuk informasi selengkapnya, lihat Membangun Tugas di GitHub.
Setelah ekstensi paket Anda berada dalam file .vsix, Anda siap untuk menerbitkan ekstensi Anda ke Marketplace.
5. Terbitkan ekstensi Anda
Untuk menerbitkan ekstensi, Anda terlebih dahulu membuat penerbit, lalu mengunggah ekstensi Anda, dan akhirnya membagikannya.
Membuat penerbit Anda
Semua ekstensi, termasuk ekstensi dari Microsoft, diidentifikasi sebagai disediakan oleh penerbit. Jika Anda belum menjadi anggota penerbit yang sudah ada, Anda membuatnya.
- Masuk ke Portal Penerbitan Marketplace Visual Studio.
- Jika Anda belum menjadi anggota penerbit yang sudah ada, Anda akan diminta untuk membuat penerbit. Jika Anda tidak diminta untuk membuat penerbit, gulir ke bawah ke bagian bawah halaman dan pilih Terbitkan ekstensi di bawah Situs Terkait.
- Tentukan pengidentifikasi untuk penerbit Anda, misalnya:
mycompany-myteam
.- Pengidentifikasi ini digunakan sebagai nilai untuk
publisher
atribut dalam file manifes ekstensi Anda.
- Pengidentifikasi ini digunakan sebagai nilai untuk
- Tentukan nama tampilan untuk penerbit Anda, misalnya:
My Team
.
- Tentukan pengidentifikasi untuk penerbit Anda, misalnya:
- Tinjau Perjanjian Penerbit Marketplace dan pilih Buat.
Penerbit Anda ditentukan. Dalam rilis mendatang, Anda dapat memberikan izin untuk melihat dan mengelola ekstensi penerbit Anda. Lebih mudah dan lebih aman untuk menerbitkan ekstensi di bawah penerbit umum, tanpa perlu berbagi sekumpulan kredensial di seluruh pengguna.
Unggah ekstensi Anda
Temukan tombol Unggah ekstensi baru, buka file .vsix paket Anda, dan pilih Unggah.
Anda juga dapat mengunggah ekstensi melalui antarmuka baris perintah (CLI) dengan menggunakan
tfx extension publish
perintah alih-alihtfx extension create
mengemas dan menerbitkan ekstensi Anda dalam satu langkah. Anda dapat secara opsional menggunakan--share-with
untuk berbagi ekstensi Anda dengan satu atau beberapa akun setelah diterbitkan.tfx extension publish --manifest-globs your-manifest.json --share-with yourOrganization
Membuat token akses pribadi (PAT).
- Pilih cakupan "Marketplace (terbitkan)". Cakupan ini membatasi token untuk hanya dapat menerbitkan ekstensi ke Marketplace.
Bagikan ekstensi Anda
Sekarang setelah Anda mengunggah ekstensi Anda, ekstensi tersebut ada di Marketplace, tetapi tidak ada yang dapat melihatnya. Bagikan dengan organisasi Anda sehingga Anda dapat menginstal dan mengujinya.
Pilih kanan ekstensi Anda dan pilih Bagikan, dan masukkan informasi organisasi Anda. Anda juga dapat membagikannya dengan akun lain yang ingin Anda akses ke ekstensi Anda.
Penting
Penerbit harus diverifikasi untuk berbagi ekstensi secara publik. Untuk informasi selengkapnya, lihat Paket/Terbitkan/Instal.
Sekarang setelah ekstensi Anda dibagikan di Marketplace, siapa pun yang ingin menggunakannya harus menginstalnya.
6. Buat alur build dan rilis untuk menerbitkan ekstensi ke Marketplace
Buat alur build dan rilis di Azure DevOps untuk membantu mempertahankan tugas kustom di Marketplace.
Prasyarat
Perangkat lunak/alat
Informasi
Proyek Azure DevOps
Ekstensi Tugas Ekstensi Azure DevOps
Instal secara gratis, Tugas Ekstensi Azure DevOps di organisasi Anda.
Grup variabel pustaka alur
Buat grup variabel pustaka alur untuk menahan variabel yang digunakan oleh alur. Untuk informasi selengkapnya, lihat Menambahkan dan menggunakan grup variabel. Anda dapat membuat grup variabel dari tab Pustaka Azure DevOps atau melalui CLI. Gunakan variabel dalam grup ini di alur Anda. Selain itu, deklarasikan variabel berikut dalam grup variabel:
publisherId
: ID penerbit marketplace AndaextensionId
: ID ekstensi Anda, seperti yang dinyatakan dalam file vss-extension.jsonextensionName
: Nama ekstensi Anda, seperti yang dinyatakan dalam file vss-extension.jsonartifactName
: Nama artefak yang sedang dibuat untuk file VSIX
Koneksi layanan
Buat koneksi layanan Marketplace baru dan berikan izin akses untuk semua alur.
Alur YAML
Gunakan contoh berikut untuk membuat alur baru dengan YAML. Untuk informasi selengkapnya, lihat Membuat alur pertama dan skema YAML Anda.
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'
Untuk informasi selengkapnya, lihat Menentukan peristiwa yang memicu alur.
Catatan
Setiap pekerjaan menggunakan agen pengguna baru dan memerlukan dependensi untuk diinstal.
Tahapan alur
Bagian berikut membantu Anda memahami cara kerja tahapan alur.
Tahap 1: Menjalankan dan menerbitkan pengujian unit
Tahap ini menjalankan pengujian unit dan menerbitkan hasil pengujian ke Azure DevOps.
Untuk menjalankan pengujian unit, tambahkan skrip kustom ke file package.json seperti contoh berikut.
"scripts": {
"testScript": "mocha ./TestFile --reporter xunit --reporter-option output=ResultsFile.xml"
},
Tambahkan "Gunakan Node CLI untuk Azure DevOps (tfx-cli)" untuk menginstal tfx-cli ke agen build Anda.
Tambahkan tugas "npm" dengan perintah "instal" dan targetkan folder dengan file package.json.
Tambahkan tugas "Bash" untuk mengkompilasi TypeScript ke Dalam JavaScript.
Tambahkan tugas "npm" dengan perintah "kustom", targetkan folder yang berisi pengujian unit, dan input
testScript
sebagai perintah . Gunakan input berikut:- Perintah: kustom
- Folder kerja yang berisi package.json: /TestsDirectory
- Perintah dan argumen:
testScript
Tambahkan tugas "Terbitkan Hasil Pengujian". Jika Anda menggunakan wartawan Mocha XUnit, pastikan format hasilnya adalah "JUnit" dan bukan "XUnit." Atur folder pencarian ke direktori akar. Gunakan input berikut:
- Format hasil pengujian: JUnit
- File hasil pengujian: **/ResultsFile.xml
- Folder pencarian:
$(System.DefaultWorkingDirectory)
Setelah hasil pengujian diterbitkan, output di bawah tab pengujian akan terlihat seperti contoh berikut.
Tahap 2: Mengemas ekstensi dan menerbitkan artefak build
Tambahkan "Gunakan Node CLI untuk Azure DevOps (tfx-cli)" untuk menginstal tfx-cli ke agen build Anda.
Tambahkan tugas "npm" dengan perintah "instal" dan targetkan folder dengan file package.json.
Tambahkan tugas "Bash" untuk mengkompilasi TypeScript ke Dalam JavaScript.
Tambahkan tugas "Versi Ekstensi Kueri" untuk mengkueri versi ekstensi yang ada. Gunakan input berikut:
- Menyambungkan ke: Visual Studio Marketplace
- Visual Studio Marketplace (Koneksi layanan): Koneksi Layanan
- ID Penerbit: ID penerbit Visual Studio Marketplace Anda
- ID Ekstensi: ID ekstensi Anda dalam file vss-extension.json
- Tingkatkan versi: Patch
- Variabel Output: Task.Extension.Version
Tambahkan tugas "Ekstensi Paket" untuk mengemas ekstensi berdasarkan Json manifes. Gunakan input berikut:
- Folder manifes akar: Menunjuk ke direktori akar yang berisi file manifes. Misalnya, $(System.DefaultWorkingDirectory) adalah direktori akar
- File manifes: vss-extension.json
- ID Penerbit: ID penerbit Visual Studio Marketplace Anda
- ID Ekstensi: ID ekstensi Anda dalam file vss-extension.json
- Nama Ekstensi: Nama ekstensi Anda dalam file vss-extension.json
- Versi Ekstensi: $(Task.Extension.Version)
- Mengambil alih versi tugas: dicentang (benar)
- Jenis Penimpaan: Ganti Hanya Patch (1.0.r)
- Visibilitas Ekstensi: Jika ekstensi masih dalam pengembangan, atur nilai ke privat. Untuk merilis ekstensi ke publik, atur nilai ke publik
Tambahkan tugas "Salin file" untuk menyalin file yang diterbitkan. Gunakan input berikut:
- Isi: Semua file yang akan disalin untuk menerbitkannya sebagai artefak
- Folder target: Folder tempat file disalin
- Misalnya: $(Build.ArtifactStagingDirectory)
Tambahkan "Terbitkan artefak build" untuk menerbitkan artefak untuk digunakan dalam pekerjaan atau alur lain. Gunakan input berikut:
- Jalur untuk diterbitkan: Jalur ke folder yang berisi file yang sedang diterbitkan
- Misalnya: $(Build.ArtifactStagingDirectory)
- Nama artefak: Nama yang diberikan ke artefak
- Lokasi penerbitan artefak: Pilih "Azure Pipelines" untuk menggunakan artefak dalam pekerjaan di masa mendatang
- Jalur untuk diterbitkan: Jalur ke folder yang berisi file yang sedang diterbitkan
Tahap 3: Unduh artefak build dan terbitkan ekstensi
Tambahkan "Gunakan Node CLI untuk Azure DevOps (tfx-cli)" untuk menginstal tfx-cli ke agen build Anda.
Tambahkan tugas "Unduh artefak build" untuk mengunduh artefak ke pekerjaan baru. Gunakan input berikut:
- Unduh artefak yang diproduksi oleh: Jika Anda mengunduh artefak pada pekerjaan baru dari alur yang sama, pilih "Build saat ini." Jika Anda mengunduh pada alur baru, pilih "Build tertentu."
- Jenis unduhan: Pilih "Artefak tertentu" untuk mengunduh semua file yang diterbitkan.
- Nama artefak: Nama artefak yang diterbitkan.
- Direktori tujuan: Folder tempat file harus diunduh.
Tugas terakhir yang Anda butuhkan adalah tugas "Terbitkan Ekstensi". Gunakan input berikut:
- Menyambungkan ke: Visual Studio Marketplace
- Koneksi Visual Studio Marketplace: ServiceConnection
- Jenis file input: File VSIX
- File VSIX: /Publisher.*.vsix
- ID Penerbit: ID penerbit Visual Studio Marketplace Anda
- ID Ekstensi: ID ekstensi Anda dalam file vss-extension.json
- Nama Ekstensi: Nama ekstensi Anda dalam file vss-extension.json
- Visibilitas ekstensi: Baik privat atau publik
Opsional: Menginstal dan menguji ekstensi Anda
Instal ekstensi yang dibagikan dengan Anda hanya dalam beberapa langkah:
- Dari panel kontrol organisasi Anda (
https://dev.azure.com/{organization}/_admin
), buka halaman administrasi kumpulan proyek. - Di tab Ekstensi , temukan ekstensi Anda di grup "Ekstensi Dibagikan Dengan Saya" dan pilih tautan ekstensi.
- Pasang ekstensi .
Jika Anda tidak dapat melihat tab Ekstensi , pastikan Anda berada di panel kontrol (halaman administrasi di tingkat kumpulan proyek, https://dev.azure.com/{organization}/_admin
) dan bukan halaman administrasi untuk proyek.
Jika Anda tidak melihat tab Ekstensi , ekstensi tidak diaktifkan untuk organisasi Anda. Anda bisa mendapatkan akses awal ke fitur ekstensi dengan bergabung dengan Program Mitra Visual Studio.
Untuk mengemas dan menerbitkan Ekstensi Azure DevOps ke Visual Studio Marketplace, Anda dapat mengunduh Tugas Ekstensi Azure DevOps.
Tanya Jawab Umum
Lihat tanya jawab umum (FAQ) berikut tentang menambahkan tugas build atau rilis kustom dalam ekstensi untuk Azure DevOps.
T: Bagaimana cara membatasi penggunaan perintah Azure Pipelines untuk tugas?
Anda dapat membatasi penggunaan dan variabel perintah Azure Pipelines, yang diatur berdasarkan tugas. Tindakan ini dapat berguna untuk mencegah akses tidak terbatas ke perintah variabel/vso untuk skrip kustom yang dijalankan tugas. Kami menyarankan agar Anda menyiapkannya untuk tugas baru. Untuk menerapkan, Anda mungkin perlu menambahkan pernyataan berikut ke file task.json Anda:
"restrictions": {
"commands": {
"mode": "restricted"
},
"settableVariables": {
"allowed": ["variable1", "test*"]
}
}
Jika restricted
nilai ditentukan untuk mode
- Anda hanya dapat menjalankan perintah berikut oleh tugas:
logdetail
logissue
complete
setprogress
setsecret
setvariable
debug
settaskvariable
prependpath
publish
Pembatasan settableVariables
memungkinkan Anda untuk meneruskan daftar variabel yang diizinkan, yang diatur oleh setvariable
atau prependpath
perintah. Ini juga memungkinkan ekspresi reguler dasar. Misalnya, jika daftar izin Anda adalah: ['abc', 'test*']
, mengatur abc
, , test
atau test1
sebagai variabel dengan nilai apa pun atau menambahkannya ke jalur akan berhasil, tetapi jika Anda mencoba mengatur proksi variabel, itu akan diperingatkan. Daftar kosong berarti tidak ada variabel yang diubah oleh tugas.
Jika kunci atau commands
dihilangkansettableVariables
, pembatasan yang relevan tidak diterapkan.
Fitur pembatasan tersedia dari versi agen 2.182.1 .
T: Bagaimana sinyal pembatalan ditangani oleh tugas?
A: Agen alur mengirim SIGINT
dan SIGTERM
memberi sinyal ke proses anak yang relevan. Tidak ada cara eksplisit dalam pustaka tugas untuk diproses. Untuk informasi selengkapnya, lihat Pembatalan pekerjaan agen.
T: Bagaimana cara menghapus tugas dari koleksi proyek?
J: Kami tidak mendukung penghapusan tugas secara otomatis. Penghapusan otomatis tidak aman dan merusak alur yang ada yang sudah menggunakan tugas tersebut. Tapi, Anda bisa menandai tugas sebagai tidak digunakan lagi. Untuk melakukannya, benjolan versi tugas dan tandai tugas sebagai tidak digunakan lagi.
T: Bagaimana cara memutakhirkan tugas kustom saya ke Simpul terbaru?
A: Sebaiknya tingkatkan ke versi Node terbaru. Misalnya informasi, lihat Meningkatkan tugas ke Node 20.
Karena agen yang Dihosting Microsoft dan berbagai versi Azure DevOps Server memiliki siklus hidup yang berbeda, mungkin ada versi runner Node yang berbeda yang diinstal tergantung di mana tugas berjalan. Agar dapat menjalankan tugas yang sama pada agen dengan versi runner Node yang berbeda, file task.json dapat berisi beberapa bagian eksekusi. Dalam contoh berikut, agen Azure Pipeline yang menyertakan runner Node 20 akan memilihnya secara default, dan yang tidak akan kembali ke implementasi Node 10.
"execution": {
"Node10": {
"target": "bash.js",
"argumentFormat": ""
},
"Node20_1": {
"target": "bash.js",
"argumentFormat": ""
}
Untuk meningkatkan tugas Anda:
Uji tugas Anda pada berbagai versi runner Node untuk memastikan kode Anda berperilaku seperti yang diharapkan.
Di bagian eksekusi tugas Anda, perbarui dari
Node
atauNode10
keNode16
atauNode20
.Untuk mendukung versi server yang lebih lama, Anda harus meninggalkan
Node
/Node10
target. Versi Azure DevOps Server yang lebih lama mungkin tidak menyertakan versi runner Node terbaru.Anda dapat memilih untuk berbagi titik entri yang ditentukan dalam target atau memiliki target yang dioptimalkan ke versi Node yang digunakan.
"execution": { "Node10": { "target": "bash10.js", "argumentFormat": "" }, "Node16": { "target": "bash16.js", "argumentFormat": "" }, "Node20_1": { "target": "bash20.js", "argumentFormat": "" }
Penting
Tidak menambahkan dukungan untuk runner Node 20 pada tugas kustom Anda akan menyebabkan tugas gagal pada agen yang diinstal dari pipelines-agent-*
umpan rilis.