Sdílet prostřednictvím


Kanály pro javascriptové aplikace

Tento článek vysvětluje, jak Azure Pipelines funguje s aplikacemi v JavaScriptu. Agenti hostovaní Microsoftem předinstalují běžné nástroje javascriptového sestavení, testování a nasazení, jako je npm, Node.js, Yarn a Gulp, aniž byste museli nastavit jakoukoli infrastrukturu. Můžete také nakonfigurovat agenty v místním prostředí.

Pokud chcete rychle vytvořit kanál pro JavaScript, přečtěte si rychlý start pro JavaScript.

Instalační programy nástrojů Node

Pokud chcete nainstalovat verze Node.js a npm, které nejsou předinstalované, nebo nainstalovat nástroje na agenty v místním prostředí:

Pokud chcete nainstalovat konkrétní Node.js verzi, přidejte do souboru azure-pipelines.yml následující kód:

- task: UseNode@1
  inputs:
    version: '16.x' # replace with the version you need

Poznámka:

Tato úloha může při každém spuštění zpracovatelského řetězce vyžadovat významné množství času na aktualizaci na novější podverzi. Agenti hostovaní Microsoftem se pravidelně aktualizují, proto tuto úlohu použijte jenom k instalaci konkrétních verzí Node, které nejsou předinstalované. Informace o tom, jaké verze Node.js a npm jsou předinstalované na agentech hostovaných Microsoftem, najdete v tématu Software.

Použití více verzí uzlů

Pomocí úlohy ekosystému Use Node.js v1 a strategie můžete vytvořit a otestovat aplikaci s více verzemi Node.js. Další informace najdete v tématu Konfigurace více úloh.

pool:
  vmImage: 'ubuntu-latest'
strategy:
  matrix:
    node_16_x:
      node_version: 16.x
    node_13_x:
      node_version: 18.x

steps:
- task: UseNode@1
  inputs:
    version: $(node_version)

- script: npm install

Instalace nástroje pro správu závislostí

Pokud máte nástroje pro vývoj závislostí v projektu package.json nebo package-lock.json souboru, nainstalujte nástroje a závislosti prostřednictvím npm. Soubor projektu definuje přesnou verzi nástrojů nezávisle na ostatních verzích, které existují v agentu sestavení.

Pokud chcete tyto nástroje nainstalovat do agenta sestavení, použijte skript, úlohu npm nebo úlohu příkazového řádku v pipeline.

Použití skriptu:

- script: npm install --only=dev

Použití úlohy npm:

- task: Npm@1
  inputs:
     command: 'install'

Nástroje, které nainstalujete tímto způsobem, používají spouštěč balíčků npm npx , který rozpozná nástroje v jeho řešení PATH. Následující příklad volá mocha spouštěč testů a používá verzi vývojových závislostí místo verze nainstalované globálně prostřednictvím npm install -g.

- script: npx mocha

Pokud chcete nainstalovat nástroje, které váš projekt potřebuje a nejsou nastaveny jako vývojové závislosti v package.json, zavolejte npm install -g z nějakého skriptu ve vašem pipeline. Následující příklad nainstaluje nejnovější verzi Angular CLI pomocí npm. Další skripty v zpracovatelském řetězci mohou poté používat příkazy Angular ng.

- script: npm install -g @angular/cli

Poznámka:

Na agentech Linuxu hostovaných Microsoftem si před příkazem předvádět sudo, například sudo npm install -g.

Tyto úlohy instalace nástrojů se spouštějí při každém spuštění pipeliny, takže uvědomte si jejich dopad na dobu sestavení. Pokud režie vážně ovlivňuje výkon sestavení, zvažte použití vlastních předkonfigurovaných agentů s potřebnými verzemi nástrojů.

Poznámka:

Tyto úlohy instalace nástrojů se spouštějí při každém spuštění pipeliny, takže uvědomte si jejich dopad na dobu sestavení.

Stažení balíčku závislostí

Ke stažení balíčků z veřejného registru npm nebo privátního registru npm, který zadáte v souboru *.npmrc, můžete použít Yarn nebo Azure Artifacts. Pokud chcete zadat registr npm, přidejte jeho adresu URL do souboru *.npmrc v úložišti kódu.

Použití npm

Pomocí npm můžete stáhnout balíčky sestavení v rámci potrubí následujícími způsoby:

  • Nejjednodušší způsob, jak stáhnout balíčky bez ověřování, spusťte npm installpřímo .
  • Pokud chcete použít ověřený registr, přidejte úlohu npm .
  • Pokud chcete spustit npm install uvnitř task runnerů Gulp, Grunt nebo Maven, použijte úlohu npm authenticate.

Poznámka:

Pokud váš informační kanál npm používá ověřování, musíte vytvořit připojení služby npm na kartě Služby v nastavení projektu Azure DevOps ke správě přihlašovacích údajů.

Pokud chcete balíčky npm nainstalovat přímo, použijte v azure-pipelines.yml následující skript. Pokud váš agent sestavení nepotřebuje vývojové závislosti, můžete urychlit časy sestavení přidáním --only=prod možnosti do npm install.

- script: npm install --only=prod

Pokud chcete použít privátní registr zadaný v souboru *.npmrc , přidejte Npm@1 úlohu do azure-pipelines.yml.

- task: Npm@1
  inputs:
    customEndpoint: <Name of npm service connection>

Pokud chcete předat přihlašovací údaje registru příkazům npm prostřednictvím spouštěčů úloh, jako je Gulp, přidejte npmAuthenticate@0 úlohu do azure-pipelines.yml před voláním spouštěče úkolů.

- task: npmAuthenticate@0
  inputs:
    customEndpoint: <Name of npm service connection>

Poznámka:

Agenti hostovaní Microsoftem používají nový počítač s každým sestavením. Obnovení závislostí může trvat značné množství času. Pokud chcete tento problém zmírnit, můžete použít Azure Artifacts nebo agenta v místním prostředí s mezipamětí balíčků.

Pokud se vaše sestavení občas nezdaří kvůli problémům s připojením při obnovování balíčků z registru npm, můžete balíčky ukládat do mezipaměti pomocí Azure Artifacts s upstreamovými zdroji . Azure Artifacts používá automaticky přihlašovací údaje potrubí, které jsou obvykle odvozeny z účtu Project Collection Build Service.

Poznámka:

Obnovení závislostí může trvat značné množství času. Pokud chcete tento problém zmírnit, můžete použít Azure Artifacts nebo agenta v místním prostředí s mezipamětí balíčků.

Pokud se vaše sestavení občas nezdaří kvůli problémům s připojením při obnovování balíčků z registru npm, můžete balíčky ukládat do mezipaměti pomocí Azure Artifacts s upstreamovými zdroji . Azure Artifacts používá automaticky přihlašovací údaje potrubí, které jsou obvykle odvozeny z účtu Project Collection Build Service.

Použití příze Yarn

Pomocí skriptu nainstalujte Yarn pro obnovení závislostí. Yarn je předinstalovaný na některých agentech hostovaných Microsoftem. Yarn můžete nainstalovat a nakonfigurovat na agenty v místním prostředí stejně jako jakýkoli jiný nástroj.

- script: yarn install

K vyvolání Yarn můžete také použít úlohu CLI nebo Bash ve vašem pipeline.

Kompilátory JavaScriptu

JavaScriptové aplikace používají kompilátory, jako je Babel a kompilátor TypeScripttsc , k převodu zdrojového kódu na verze použitelné Node.js runtime nebo ve webových prohlížečích. Pokud máte v projektu nastavený skriptový objekt v souboru package.json ke spuštění kompilátoru, můžete ho vyvolat ve svém kanálu zpracování.

- script: npm run compile

Kompilátory můžete také volat přímo z kanálu pomocí skriptu. Tyto příkazy se spouští z kořenového adresáře naklonovaného úložiště zdrojového kódu.

- script: tsc --target ES6 --strict true --project tsconfigs/production.json

Úlohu npm můžete použít k sestavení kódu, pokud projekt package.json definuje kompilační skript. Pokud nedefinujete kompilační skript, můžete ke kompilaci kódu použít úlohu Bash .

Testování jednotek

Kanály můžete nakonfigurovat tak, aby spouštěly testy JavaScriptu, aby vytvářely výsledky ve formátu JUnit XML. Výsledky pak můžete publikovat pomocí úlohy Publikovat výsledky testu .

Pokud vaše testovací architektura nepodporuje výstup JUnit, přidejte podporu prostřednictvím modulu pro vytváření sestav partnerů, jako je například mocha-junit-reporter. Testovací skript můžete aktualizovat tak, aby používal reportér JUnit, nebo tyto možnosti předat do definice úlohy, pokud zpravodaj podporuje možnosti příkazového řádku.

Následující tabulka uvádí nejčastěji používané spouštěče testů a reportéry, které můžete použít k vytváření výsledků XML:

Spouštěč testů Reportery pro sestavy XML
Mocha mocha-junit-reporter
cypress-multi-reportery
Jasmín jasmine-reportéři
Žert jest-junit
jest-junit-reporter
Karma karma-junit-reporter
Ava tap-xunit

Následující příklad používá mocha-junit-reporter a vyvolá mocha test přímo pomocí skriptu. Tento skript vytvoří výstup XML JUnit ve výchozím umístění ./test-results.xml.

- script: mocha test --reporter mocha-junit-reporter

Pokud jste v projektu definovali skript v souboru testpackage.json, můžete ho vyvolat pomocí npm test.

- script: npm test

Publikování výsledků testu

K publikování výsledků testu použijte úlohu Publikovat výsledky testu .

- task: PublishTestResults@2
  condition: succeededOrFailed()
  inputs:
    testRunner: JUnit
    testResultsFiles: '**/test-results.xml'

Publikování výsledků pokrytí kódu

Pokud vaše testovací skripty spustí nástroj pro pokrytí kódu, například Istanbul, přidejte úlohu Publikovat výsledky pokrytí kódu . Pak můžete zobrazit metriky pokrytí v souhrnu sestavení a stáhnout sestavy HTML pro další analýzu.

Úloha očekává výstup reportování nástrojem Cobertura nebo JaCoCo. Ujistěte se, že váš nástroj pokrytí kódu běží s potřebnými možnostmi pro vygenerování správného výstupu, například --report cobertura.

Následující příklad používá příkazové rozhraní nástroje Istanbul nyc spolu s nástrojem mocha-junit-reporter a vyvolá npm test.

- script: |
    nyc --reporter=cobertura --reporter=html \
    npm test -- --reporter mocha-junit-reporter --reporter-options mochaFile=./test-results.xml
  displayName: 'Build code coverage report'

- task: PublishCodeCoverageResults@2
  inputs: 
    summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/*coverage.xml'

Kompletní testování prohlížeče

Pipeline může používat nástroje, jako je Protractor nebo Karma, ke spouštění testů v bezhlavých prohlížečích a poté publikovat výsledky testů. Pokud chcete nakonfigurovat testování a publikování výsledků prohlížeče, postupujte takto:

  1. Nainstalujte na agenta buildu bezhlavý testovací ovladač prohlížeče, jako je bezhlavý Chrome nebo Firefox, nebo nástroj pro napodobování prohlížeče, jako je PhantomJS.
  2. Nakonfigurujte testovací architekturu tak, aby používala bezobjemový prohlížeč nebo možnost ovladače podle dokumentace nástroje.
  3. Nakonfigurujte testovací framework tak, aby byl výstup výsledků testů ve formátu JUnit, obvykle s pluginem nebo konfigurací reportéru.
  4. Přidejte skript nebo úlohu rozhraní příkazového řádku pro spuštění bezobsadových instancí prohlížeče.
  5. Spusťte kompletní testy ve fázích kanálu spolu s testy jednotek.
  6. Výsledky publikujte spolu s testy jednotek pomocí stejné úlohy publikovat výsledky testu .

Balení a doručování

Po sestavení a otestování aplikace můžete:

  • Nahrajte výstup sestavení do Azure Pipelines.
  • Vytvořte a publikujte balíček npm nebo Maven.
  • Zabalte výstup sestavení do archivu ZIP pro nasazení do webové aplikace.

Publikování souborů do Azure Pipelines

Pokud chcete nahrát celý pracovní adresář, přidejte do souboru azure-pipelines.yml úlohu Publikovat artefakty sestavení.

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(System.DefaultWorkingDirectory)'

Pokud chcete nahrát podmnožinu souborů, nejprve zkopírujte potřebné soubory z pracovního adresáře do přípravného adresáře pomocí úlohy Kopírovat soubory a pak použijte úlohu Publikovat artefakty sestavení .

- task: CopyFiles@2
  inputs:
    SourceFolder: '$(System.DefaultWorkingDirectory)'
    Contents: |
      **\*.js
      package.json
    TargetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1

Publikování modulu do registru npm

Pokud je npm výstupem projektu modul pro použití jiných projektů a nejedná se o webovou aplikaci, publikujte modul do místního registru nebo do veřejného registru npm pomocí úlohy npm . Při každém publikování zadejte jedinečnou kombinaci názvu nebo verze.

Následující příklad používá skript k publikování do veřejného registru npm. V příkladu se předpokládá, že spravujete informace o verzi, jako je verze npm , prostřednictvím souborupackage.json ve správě verzí.

- script: npm publish

Následující příklad publikuje do vlastního registru definovaného v souboru *.npmrc vašeho úložiště. Nastavte připojení ke službě npm tak, aby při spuštění sestavení vložil ověřovací přihlašovací údaje do připojení.

- task: Npm@1
  inputs:
     command: publish
     publishRegistry: useExternalRegistry
     publishEndpoint: https://my.npmregistry.com

Následující příklad publikuje modul do kanálu správy balíčků Azure DevOps Services.

- task: Npm@1
  inputs:
     command: publish
     publishRegistry: useFeed
     publishFeed: https://my.npmregistry.com

Další informace o správě verzí a publikování balíčků npm najdete v tématu Publikování balíčků npm a jak můžu v rámci procesu sestavení vydávat balíčky npm.

Zabalení a nasazení webové aplikace

Aplikace můžete zabalit a sloučit všechny moduly společně s mezivýstupy a závislostmi do statických prostředků připravených k nasazení. Po kompilaci a testování přidejte úroveň sestavení pro spuštění nástroje, jako je webpack nebo příkaz Angular CLI ng build.

Následující příklad volá webpack. Aby tento proces fungoval, ujistěte se, že webpack je v souboru projektu package.json nakonfigurovaná jako vývojová závislost. Tento skript se spustí webpack s výchozí konfigurací, pokud nemáte souborwebpack.config.js v kořenové složce projektu.

- script: webpack

Následující příklad používá npm run build k volání build objektu skriptu definovaného v projektu package.json souboru. Použití objektu skriptu ve vašem projektu přemístí logiku sestavení do zdrojového kódu a mimo aplikační rozhraní.

- script: npm run build

Můžete také použít úlohu CLI nebo Bash ve svém pipeline ke spuštění nástroje pro balení, jako je webpack nebo Angularng build.

Pokud chcete vytvořit *.zip archiv souborů, který je připravený k publikování do webové aplikace, použijte úlohu Archivovat soubory .

- task: ArchiveFiles@2
  inputs:
    rootFolderOrFile: '$(System.DefaultWorkingDirectory)'
    includeRootFolder: false

Pokud chcete tento archiv publikovat do webové aplikace, přečtěte si téma Nasazení do služby Azure App Service pomocí Azure Pipelines.

JavaScriptové architektury

Balíčky můžete nainstalovat do své pipeliny, aby podporovaly různé JavaScriptové frameworky.

Angular

Pro aplikace Angular můžete spouštět příkazy specifické pro Angular, například ng test, ng builda ng e2e. Pokud chcete ve svém kanálu použít příkazy Angular CLI, nainstalujte do agenta sestavení balíček npm angular/cli.

- script: |
    npm install -g @angular/cli
    npm install
    ng build --prod

Poznámka:

Na agentech Linuxu hostovaných Microsoftem si před příkazem předvádět sudo, například sudo npm install -g.

Pro testy v rámci vaší pipeline, které vyžadují spuštění prohlížeče, jako je spuštění testovacího nástroje Karma s příkazem ng test, použijte místo standardního prohlížeče prohlížeč bez uživatelského rozhraní. V úvodní aplikaci Angular:

  • browsers Změňte položku v souboru projektu karma.conf.js z browsers: ['Chrome'] na browsers: ['ChromeHeadless'].
  • singleRun Změňte položku v souboru projektu karma.conf.js z false na true. Tato změna pomáhá zajistit, aby se proces Karma po spuštění zastavil.

React a Vue

Všechny závislosti pro aplikace React a Vue se zaznamenávají do souboru package.json . Soubor azure-pipelines.yml obsahuje standardní npm skripty.

- script: |
    npm install
  displayName: 'npm install'

- script: |
    npm run build
  displayName: 'npm build'

Soubory sestavení jsou v nové složce, dist for Vue nebo build for React. Následující příklad sestaví artefakt, wwwkterý je připravený k vydání. Kanál používá úlohy Použít Node.js, Kopírování souboru a Publikování artefaktů sestavení.

trigger:
- main

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: UseNode@1
  inputs:
    version: '16.x'
  displayName: 'Install Node.js'

- script: npm install
  displayName: 'npm install'

- script: npm run build
  displayName: 'npm build'

- task: CopyFiles@2
  inputs:
    Contents: 'build/**' # Pull the build directory (React)
    TargetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  inputs: 
    PathtoPublish: $(Build.ArtifactStagingDirectory) # dist or build files
    ArtifactName: 'www' # output artifact named www

Pokud chcete aplikaci uvolnit, nasměrujte úlohu vydání na artefakt dist nebo build a použijte úlohu Azure Webová aplikace.

Webpack

Konfigurační soubor webpacku můžete použít k určení kompilátoru, jako je Babel nebo TypeScript, k transpilování JavaScript XML (JSX) nebo TypeScriptu do prostého JavaScriptu a k vytvoření sady aplikací.

- script: |
    npm install webpack webpack-cli --save-dev
    npx webpack --config webpack.config.js

Sestavení spouštěčů úloh

K vytváření a testování javascriptových aplikací je běžné používat Gulp nebo Grunt jako spouštěče úkolů.

Gulp

Gulp je předinstalovaný na agentech hostovaných Microsoftem.

Příkaz můžete spustit gulp v YAML kanálovém souboru.

- script: gulp # add any needed options

Pokud kroky v souborugulpfile.js vyžadují ověření pomocí registru npm, přidejte úlohu ověření npm .

- task: npmAuthenticate@0
  inputs:
    customEndpoint: <Name of npm service connection>

- script: gulp

Pokud chcete publikovat výsledky testu JUnit nebo xUnit na server, přidejte úlohu Publikovat výsledky testu .

- task: PublishTestResults@2
  inputs:
    testResultsFiles: '**/TEST-RESULTS.xml'
    testRunTitle: 'Test results for JavaScript using gulp'

Pokud chcete publikovat výsledky pokrytí kódu na server, přidejte úlohu Publikovat výsledky pokrytí kódu . Metriky pokrytí najdete v souhrnu sestavení a můžete si stáhnout sestavy HTML pro další analýzu.

- task: PublishCodeCoverageResults@1
  inputs: 
    codeCoverageTool: Cobertura
    summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/*coverage.xml'
    reportDirectory: '$(System.DefaultWorkingDirectory)/**/coverage'

Grunt

Grunt je předinstalovaný na agentech hostovaných Microsoftem.

Příkaz grunt můžete spustit v souboru YAML.

- script: grunt # add any needed options

Pokud kroky v souboruGruntfile.js vyžadují ověření pomocí registru npm, přidejte úlohu ověření npm .

- task: npmAuthenticate@0
  inputs:
    customEndpoint: <Name of npm service connection>

- script: grunt

Řešení problémů

Pokud můžete projekt sestavit na vývojovém počítači, ale nemůžete ho sestavit v Azure Pipelines, prozkoumejte následující možné příčiny a opravné akce.

  • Zkontrolujte, jestli verze Node.js a spouštěč úloh na vývojovém počítači odpovídají verzím agenta.

    Můžete zahrnout skripty příkazového řádku, například node --version, do vašeho pipelinu, abyste zkontrolovali verze nainstalované na agentovi. Buď pomocí Use Node.js úlohy nainstalujte stejnou verzi na agenta, nebo spusťte npm install příkazy pro aktualizaci verzí nástrojů.

  • Pokud se sestavení při obnovování balíčků přerušovaně nezdaří, dojde k problémům s registrem npm nebo dojde k problémům se sítí mezi datovým centrem Azure a registrem. Prozkoumejte, jestli použití Azure Artifacts s registrem npm jako nadřazeného zdroje zlepšuje spolehlivost sestavení.

  • Pokud používáte nvm ke správě různých verzí Node.js, zvažte místo toho přepnutí na úlohu Použít Node.js (UseNode@1). nvm se instaluje z historických důvodů na imagi macOS. nvm spravuje více verzí Node.js přidáním aliasů shellu a úpravou PATH, která není kompatibilní se způsobem, jakým Azure Pipelines spouští každou úlohu v novém procesu. Další informace najdete v tématu Procesy pipeliny.

    Úloha Use Node.js zpracovává tento model správně. Pokud ale vaše práce vyžaduje použití nvm, můžete na začátek každého kanálu přidat následující skript:

    steps:
    - bash: |
        NODE_VERSION=16  # or your preferred version
        npm config delete prefix  # avoid a warning
        . ${NVM_DIR}/nvm.sh
        nvm use ${NODE_VERSION}
        nvm alias default ${NODE_VERSION}
        VERSION_PATH="$(nvm_version_path ${NODE_VERSION})"
        echo "##vso[task.prependPath]$VERSION_PATH"
    

    node Potom a další nástroje příkazového řádku fungují pro zbytek úlohy kanálu. V každém kroku, ve kterém příkaz použijete nvm , spusťte skript následujícím kódem:

    - bash: |
        . ${NVM_DIR}/nvm.sh
        nvm <command>
    

časté otázky

Jak mohu opravit selhání pipeline se zprávou 'Závažná chyba: CALL_AND_RETRY_LAST Přidělení selhalo – halda JavaScriptu je mimo paměť'?

K tomuto typu selhání dochází, když balíček Node.js překročí limit využití paměti. Pokud chcete tento problém vyřešit, přidejte proměnnou jako NODE_OPTIONS a přiřaďte jí hodnotu --max_old_space_size=16384.

Jak můžu v rámci procesu sestavení vytvářet verze balíčků npm?

Jednou z možností je použití kombinace správy verzí a verze npm. Na konci spuštění kanálu můžete úložiště aktualizovat novou verzí. Následující kanál YAML obsahuje úložiště GitHub a balíček se nasadí do npmjs. Sestavení selže, pokud dojde k neshodě mezi verzí balíčku v npmjs a souborempackage.json .

variables:
    MAP_NPMTOKEN: $(NPMTOKEN) # Mapping secret var

trigger:
- none

pool:
  vmImage: 'ubuntu-latest'

steps: # Checking out connected repo
- checkout: self
  persistCredentials: true
  clean: true
    
- task: npmAuthenticate@0
  inputs:
    workingFile: .npmrc
    customEndpoint: 'my-npm-connection'
    
- task: UseNode@1
  inputs:
    version: '16.x'
  displayName: 'Install Node.js'

- script: |
    npm install
  displayName: 'npm install'

- script: |
    npm pack
  displayName: 'Package for release'

- bash: | # Grab the package version
    v=`node -p "const p = require('./package.json'); p.version;"`
    echo "##vso[task.setvariable variable=packageVersion]$v"

- task: CopyFiles@2
  inputs:
      contents: '*.tgz'
      targetFolder: $(Build.ArtifactStagingDirectory)/npm
  displayName: 'Copy archives to artifacts staging directory'

- task: CopyFiles@2
  inputs:
    sourceFolder: '$(Build.SourcesDirectory)'
    contents: 'package.json' 
    targetFolder: $(Build.ArtifactStagingDirectory)/npm
  displayName: 'Copy package.json'

- task: PublishBuildArtifacts@1 
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)/npm'
    artifactName: npm
  displayName: 'Publish npm artifact'

- script: |  # Config can be set in .npmrc
    npm config set //registry.npmjs.org/:_authToken=$(MAP_NPMTOKEN) 
    npm config set scope "@myscope"
    # npm config list
    # npm --version
    npm version patch --force
    npm publish --access public

- task: CmdLine@2 # Push changes to GitHub (substitute your repo)
  inputs:
    script: |
      git config --global user.email "username@contoso.com"
      git config --global user.name "Azure Pipeline"
      git add package.json
      git commit -a -m "Test Commit from Azure DevOps"
      git push -u origin HEAD:main