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": {
   "Node16": {
     "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

  1. Buat struktur folder untuk tugas dan instal pustaka dan dependensi yang diperlukan.

  2. Buka jendela perintah PowerShell, buka folder Anda buildandreleasetask , dan jalankan perintah berikut.

    npm init --yes
    

    npm initpackage.json membuat file. Kami menambahkan --yes parameter untuk menerima semua opsi default npm init .

    Tip

    Agen tidak secara otomatis menginstal modul yang diperlukan karena mengharapkan folder tugas Anda menyertakan modul simpul. Untuk mengurangi ini, salin ke node_modulesbuildandreleasetask. Saat tugas Anda semakin besar, mudah untuk melebihi batas ukuran (50MB) file VSIX. Sebelum menyalin folder simpul, Anda mungkin ingin menjalankan npm install --production atau npm prune --production, atau Anda dapat menulis skrip untuk membangun dan mengemas semuanya.

  3. Tambahkan azure-pipelines-task-lib ke pustaka Anda.

    npm install azure-pipelines-task-lib --save
    
  4. Pastikan bahwa pengetikan TypeScript diinstal untuk dependensi eksternal.

    npm install @types/node --save-dev
    npm install @types/q --save-dev
    
  5. Buat .gitignore file dan tambahkan node_modules ke dalamnya. Proses build Anda harus melakukan npm install dan typings install sehingga node_modules dibangun setiap kali dan tidak perlu diperiksa.

    echo node_modules > .gitignore
    
  6. Instal Mocha sebagai dependensi pengembangan.

    npm install mocha --save-dev -g
    npm install sync-request --save-dev
    npm install @types/mocha --save-dev
    
  7. 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 agar tsc perintah tersedia.

  8. 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.

  1. Buat task.json file di buildandreleasetask folder . File menjelaskan task.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.

  2. Salin kode berikut dan ganti {{placeholders}} dengan informasi tugas Anda. Tempat penampung yang paling penting adalah taskguid, 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": {
         "Node": {
             "target": "index.js"
         }
     }
     }
    
  3. 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();
    
  4. Masukkan "tsc" dari buildandreleasetask folder untuk mengkompilasi index.js file dari index.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.

  1. 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
    
  2. 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.

  3. 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.

  4. 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
        });
    });
    
  5. 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.

  6. 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();
    });
    
  7. 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.

  1. Masuk ke Portal Penerbitan Marketplace Visual Studio.
  2. 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.
    • Tentukan nama tampilan untuk penerbit Anda, misalnya: My Team.
  3. 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.

  1. Anda juga dapat mengunggah ekstensi melalui antarmuka baris perintah (CLI) dengan menggunakan tfx extension publish perintah alih-alih tfx 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
    
  2. 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 mempelajari lebih lanjut, 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 Anda
  • extensionId: ID ekstensi Anda, seperti yang dinyatakan dalam file vss-extension.json
  • extensionName: Nama ekstensi Anda, seperti yang dinyatakan dalam file vss-extension.json
  • artifactName: 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"
},
  1. Tambahkan "Gunakan Node CLI untuk Azure DevOps (tfx-cli)" untuk menginstal tfx-cli ke agen build Anda.

  2. Tambahkan tugas "npm" dengan perintah "instal" dan targetkan folder dengan file package.json.

  3. Tambahkan tugas "Bash" untuk mengkompilasi TypeScript ke Dalam JavaScript.

  4. 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
  5. 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.

    Cuplikan layar contoh hasil pengujian.

Tahap 2: Mengemas ekstensi dan menerbitkan artefak build

  1. Tambahkan "Gunakan Node CLI untuk Azure DevOps (tfx-cli)" untuk menginstal tfx-cli ke agen build Anda.

  2. Tambahkan tugas "npm" dengan perintah "instal" dan targetkan folder dengan file package.json.

  3. Tambahkan tugas "Bash" untuk mengkompilasi TypeScript ke Dalam JavaScript.

  4. Tambahkan tugas "Versi Ekstensi Kueri" untuk mengkueri versi ekstensi yang ada. Gunakan input berikut:

    • Koneksi 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
  5. 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
  6. 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)
  7. 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

Tahap 3: Unduh artefak build dan terbitkan ekstensi

  1. Tambahkan "Gunakan Node CLI untuk Azure DevOps (tfx-cli)" untuk menginstal tfx-cli ke agen build Anda.

  2. 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.
  3. Tugas terakhir yang Anda butuhkan adalah tugas "Terbitkan Ekstensi". Gunakan input berikut:

    • Koneksi ke: Visual Studio Marketplace
    • Koneksi Visual Studio Marketplace: Layanan Koneksi ion
    • 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:

  1. Dari panel kontrol organisasi Anda (https://dev.azure.com/{organization}/_admin), buka halaman administrasi kumpulan proyek.
  2. Di tab Ekstensi , temukan ekstensi Anda di grup "Ekstensi Dibagikan Dengan Saya" dan pilih tautan ekstensi.
  3. 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, , testatau 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 ke Simpul terbaru?

A: Sebaiknya tingkatkan ke versi Node terbaru. Misalnya informasi, lihat Meningkatkan tugas ke Simpul 16.