Cvičení – sestavení více konfigurací pomocí šablon

Dokončeno

V předchozích cvičeních jste implementovali kanál, který sestaví web Space Game . Začali jste skriptem, který provedl každou akci sestavení a namapoval každou akci na odpovídající úlohu kanálu. Výstupem kanálu je soubor .zip , který obsahuje zkompilovanou webovou aplikaci.

V tomto cvičení použijete šablonu k definování úkolů sestavení, které můžou sestavit jakoukoli konfiguraci definovanou v souboru projektu. Šablony umožňují definovat logiku jednou a pak ji několikrát znovu použít. Šablony spojují obsah více souborů YAML do jednoho kanálu.

Tip

Tento krok v modulu je volitelný. Pokud se v tuto chvíli nechcete o šablonách dozvědět, přejděte k dalšímu kroku a vyčistíte prostředí Azure DevOps. Další informace o šablonách najdete v tématu Typy šablon a použití.

Začneme setkáním s Marou a Amitou.

Ukázka

Mara chce s nadšením sdílet své výsledky a vyhledá Amitu, aby jí ukázala kanál buildu.

Amita: Jsem ohromen, že jste to udělal tak rychle! Ve skutečnosti jsem tě právě přišel vidět, protože jsem dostal e-mail s oznámením, že sestavení bylo připravené. Děkujeme! Vidím, že kanál sestavuje pouze konfiguraci verze. Používáme také buildy Ladění, abychom mohli zachytit další informace, pokud dojde k chybovému ukončení aplikace. Můžeme je přidat?

Mara: Naprosto. Když jsem to nastavovala, zapomněla jsem vzít sestavení pro ladění v potaz. Co kdybychom je přidali společně?

Amita: Ukázali jste mi soubor YAML, který definuje kroky sestavení, ale nejsem si jistý, že vím, jak ho upravit.

Mara: To je v pořádku. Můžeš se dívat a já budu psát. Projdeme to společně.

Jak byste definovali obě konfigurace sestavení?

Vezměte v úvahu následující úlohy, které sestavují a publikují konfiguraci webového projektu Space Game pro vydání. (Nepřidávejte tento kód do vašeho souboru azure-pipelines.yml.)

- task: DotNetCoreCLI@2
  displayName: 'Build the project - Release'
  inputs:
    command: 'build'
    arguments: '--no-restore --configuration Release'
    projects: '**/*.csproj'

- task: DotNetCoreCLI@2
  displayName: 'Publish the project - Release'
  inputs:
    command: 'publish'
    projects: '**/*.csproj'
    publishWebProjects: false
    arguments: '--no-build --configuration Release --output $(Build.ArtifactStagingDirectory)/Release'
    zipAfterPublish: true

Chcete-li sestavit konfiguraci ladění, můžete tyto dvě úlohy opakovat, ale nahradit Release .Debug

Tím získáte výsledek, který hledáte, ale co se stane, když se sestavení stane složitějším nebo se změní vaše požadavky? Ručně byste museli vyhledat a změnit obě varianty jednotlivých úloh sestavení. Po přidání dalšíchpožadavkůch

Lepším řešením je použití šablony.

Co jsou šablony?

Šablona umožňuje definovat běžné úlohy sestavení jednou a opakovaně je používat.

Šablonu z nadřazeného kanálu zavoláte jako krok sestavení. Z nadřazeného kanálu můžete do šablony předávat parametry.

Mara může definovat úkoly pro sestavení a publikování aplikace jako šablony a pak tuto šablonu použít pro každou konfiguraci, kterou potřebuje.

Definování šablony

Nezapomeňte, že šablona umožňuje definovat běžné úlohy sestavení jednou a opakovaně tyto úkoly opakovaně používat. Šablonu zavoláte z její nadřazené šablony jako krok sestavení a předáte do ní parametry z nadřazeného kanálu.

Teď vytvoříte šablonu, která může sestavit jakoukoli konfiguraci definovanou v souboru projektu.

  1. V integrované konzole editoru Visual Studio Code v kořenovém adresáři projektu vytvořte adresář šablon .

    mkdir templates
    

    V praxi můžete soubor šablony umístit do libovolného umístění. Nemusíte je vkládat do adresáře šablon .

  2. V editoru Visual Studio Code vyberte Soubor > nový soubor. Pokud chcete prázdný soubor uložit jako build.yml v adresáři šablon projektu, vyberte Uložit soubor>. Příkladem může být ~/mslearn-tailspin-spacegame-web/templates.

    Důležité

    Stejně jako předtím ve Windows v seznamu Uložit jako typ vyberte YAML.

  3. V editoru Visual Studio Code přidejte tento kód do build.yml:

    parameters:
      buildConfiguration: 'Release'
    
    steps:
    - task: DotNetCoreCLI@2
      displayName: 'Build the project - ${{ parameters.buildConfiguration }}'
      inputs:
        command: 'build'
        arguments: '--no-restore --configuration ${{ parameters.buildConfiguration }}'
        projects: '**/*.csproj'
    
    - task: DotNetCoreCLI@2
      displayName: 'Publish the project - ${{ parameters.buildConfiguration }}'
      inputs:
        command: 'publish'
        projects: '**/*.csproj'
        publishWebProjects: false
        arguments: '--no-build --configuration ${{ parameters.buildConfiguration }} --output $(Build.ArtifactStagingDirectory)/${{ parameters.buildConfiguration }}'
        zipAfterPublish: true
    

    Tyto úlohy vypadají jako ty, které jste definovali dříve pro sestavení a publikování aplikace; ale v šabloně pracujete s vstupními parametry jinak, než pracujete s normálními proměnnými. Tady jsou dva rozdíly:

    • V souboru šablony místo definování vstupů použijte parameters oddíl variables .
    • V souboru šablony místo čtení hodnoty parametru použijte ${{ }} syntaxi $() . Při čtení hodnoty parametru zahrnete parameters část do jejího názvu. Například ${{ parameters.buildConfiguration }}.

Zavolání šablony z kanálu

Teď zavoláte šablonu, kterou jste právě vytvořili z kanálu. Provedete to jednou pro konfiguraci ladění a pak opakujte proces konfigurace vydané verze.

  1. V editoru Visual Studio Code upravte azure-pipelines.yml , jak vidíte tady:

    trigger:
    - '*'
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
      buildConfiguration: 'Release'
      wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
      dotnetSdkVersion: '6.x'
    
    steps:
    - task: UseDotNet@2
      displayName: 'Use .NET SDK $(dotnetSdkVersion)'
      inputs:
        version: '$(dotnetSdkVersion)'
    
    - task: Npm@1
      displayName: 'Run npm install'
      inputs:
        verbose: false
    
    - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)'
      displayName: 'Compile Sass assets'
    
    - task: gulp@1
      displayName: 'Run gulp tasks'
    
    - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt'
      displayName: 'Write build info'
      workingDirectory: $(wwwrootDir)
    
    - task: DotNetCoreCLI@2
      displayName: 'Restore project dependencies'
      inputs:
        command: 'restore'
        projects: '**/*.csproj'
    
    - template: templates/build.yml
      parameters:
        buildConfiguration: 'Debug'
    
    - template: templates/build.yml
      parameters:
        buildConfiguration: 'Release'
    
    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact: drop'
      condition: succeeded()
    
    trigger:
    - '*'
    
    pool:
      name: 'Default' #replace if needed with name of your agent pool
    
    variables:
      buildConfiguration: 'Release'
      wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
      dotnetSdkVersion: '6.x'
    
    steps:
    - task: UseDotNet@2
      displayName: 'Use .NET SDK $(dotnetSdkVersion)'
      inputs:
        version: '$(dotnetSdkVersion)'
    
    - task: Npm@1
      displayName: 'Run npm install'
      inputs:
        verbose: false
    
    - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)'
      displayName: 'Compile Sass assets'
    
    - task: gulp@1
      displayName: 'Run gulp tasks'
    
    - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt'
      displayName: 'Write build info'
      workingDirectory: $(wwwrootDir)
    
    - task: DotNetCoreCLI@2
      displayName: 'Restore project dependencies'
      inputs:
        command: 'restore'
        projects: '**/*.csproj'
    
    - template: templates/build.yml
      parameters:
        buildConfiguration: 'Debug'
    
    - template: templates/build.yml
      parameters:
        buildConfiguration: 'Release'
    
    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact: drop'
      condition: succeeded()
    

    Tento soubor vypadá jako původní s tím rozdílem, že nahrazuje úlohy sestavení a publikování voláním šablony, která dělá stejné úkoly.

    Uvidíte, že se šablona volá jednou pro každou konfiguraci. K předání názvu konfigurace šabloně používá parameters každý template úkol argument.

Spuštění kanálu

Teď změny nasdílíte do GitHubu a zobrazí se spuštění kanálu.

  1. V integrovaném terminálu přidejte azure-pipelines.yml a templates/build.yml do indexu, změny potvrďte a nasdílejte do GitHubu.

    git add azure-pipelines.yml templates/build.yml
    git commit -m "Support build configurations"
    git push origin build-pipeline
    
  2. Stejně jako předtím sledujte v Azure Pipelines, jak build prochází všemi kroky.

    Při spuštění kanálu uvidíte, že proces rozbalí úlohy v rámci šablony. Úlohy, které sestaví a publikují projekt, se spustí dvakrát, jednou pro každou konfiguraci sestavení.

    Snímek obrazovky azure Pipelines zobrazující rozbalené úlohy šablon Zahrnuté jsou úlohy sestavení a publikování pro konfiguraci ladění i verze.

  3. Po dokončení sestavení se vraťte na stránku souhrnu a vyberte publikovaný artefakt, jak jste to udělali předtím. Rozbalte složku pro vkládání.

    Uvidíte, že kanál vytvoří soubor .zip pro konfiguraci ladění i konfiguraci vydané verze.

    Snímek obrazovky služby Azure Pipelines znázorňující zabalenou aplikaci pro konfiguraci ladění i verze

Sloučení větve do hlavní

V tuto chvíli máte funkční kanál buildu, který právě teď potřebuje všechno, co Mara potřebuje.

V praxi byste odeslali žádost o přijetí změn, která vaši větev sloučí build-pipeline do main větve.

Prozatím tento krok vynecháme. V dalším modulu se dozvíte několik způsobů, jak spolupracovat s týmem na GitHubu, včetně toho, jak odesílat, kontrolovat a slučovat žádosti o přijetí změn.