Skip to main content

Génération et test de code PowerShell

DĂ©couvrez comment crĂ©er un flux de travail d’intĂ©gration continue (CI) pour gĂ©nĂ©rer et tester votre projet PowerShell.

Introduction

Ce guide explique comment utiliser PowerShell pour l’intĂ©gration continue. Il explique comment utiliser Pester, installer des dĂ©pendances, tester votre module et publier dans PowerShell Gallery.

Les exĂ©cuteurs hĂ©bergĂ©s dans GitHub ont un cache d’outils oĂč sont prĂ©installĂ©s des logiciels, notamment PowerShell et Pester.

Pour obtenir la liste complĂšte des logiciels les plus rĂ©cents et des versions prĂ©installĂ©es de PowerShell et Pester, consultez « ExĂ©cuteurs hĂ©bergĂ©s par GitHub Â».

Prérequis

Vous devez ĂȘtre familiarisĂ© avec YAML et la syntaxe GitHub Actions. Pour plus d’informations, consultez « Ă‰criture de workflows Â».

Il est recommandĂ© de connaĂźtre les bases de PowerShell et de Pester. Pour plus d'informations, consultez les pages suivantes :

Ajout d’un workflow pour Pester

Pour automatiser vos tests avec PowerShell et Pester, vous pouvez ajouter un workflow qui s’exĂ©cute chaque fois qu’une modification est poussĂ©e vers votre dĂ©pĂŽt. Dans l’exemple suivant, Test-Path permet de vĂ©rifier la prĂ©sence d’un fichier nommĂ© resultsfile.log.

Cet exemple de fichier de workflow doit ĂȘtre ajoutĂ© au rĂ©pertoire de votre dĂ©pĂŽt .github/workflows/ :

name: Test PowerShell on Ubuntu
on: push

jobs:
  pester-test:
    name: Pester test
    runs-on: ubuntu-latest
    steps:
      - name: Check out repository code
        uses: actions/checkout@v4
      - name: Perform a Pester test from the command-line
        shell: pwsh
        run: Test-Path resultsfile.log | Should -Be $true
      - name: Perform a Pester test from the Tests.ps1 file
        shell: pwsh
        run: |
          Invoke-Pester Unit.Tests.ps1 -Passthru
  • shell: pwsh - Configure le travail pour qu’il utilise PowerShell lors de l’exĂ©cution des commandes run.

  • run: Test-Path resultsfile.log - VĂ©rifie si un fichier nommĂ© resultsfile.log se trouve dans le rĂ©pertoire racine du dĂ©pĂŽt.

  • Should -Be $true - Utilise Pester pour dĂ©finir un rĂ©sultat attendu. Si le rĂ©sultat est inattendu, GitHub Actions le signale comme un Ă©chec de test. Par exemple :

    Capture d’écran d’un Ă©chec d’exĂ©cution de workflow pour un test Pester. Le test indique « Expected $true, but got $false Â» et « Error: Process completed with exit code 1 Â».

  • Invoke-Pester Unit.Tests.ps1 -Passthru - Utilise Pester pour exĂ©cuter des tests dĂ©finis dans un fichier nommĂ© Unit.Tests.ps1. Par exemple, pour effectuer le mĂȘme test que celui dĂ©crit ci-dessus, Unit.Tests.ps1 contiendra les Ă©lĂ©ments suivants :

    Describe "Check results file is present" {
        It "Check results file is present" {
            Test-Path resultsfile.log | Should -Be $true
        }
    }
    

Emplacements des modules PowerShell

Le tableau ci-dessous décrit les emplacements des différents modules PowerShell pour chaque exécuteur hébergé dans GitHub.

UbuntumacOSWindows
Modules systĂšme PowerShell/opt/microsoft/powershell/7/Modules/*/usr/local/microsoft/powershell/7/Modules/*C:\program files\powershell\7\Modules\*
Modules complémentaires PowerShell/usr/local/share/powershell/Modules/*/usr/local/share/powershell/Modules/*C:\Modules\*
Modules installĂ©s par l’utilisateur/home/runner/.local/share/powershell/Modules/*/Users/runner/.local/share/powershell/Modules/*C:\Users\runneradmin\Documents\PowerShell\Modules\*

Remarque

Sur les exĂ©cuteurs Ubuntu, les modules Azure PowerShell sont stockĂ©s dans /usr/share/ au lieu de l’emplacement par dĂ©faut des modules complĂ©mentaires PowerShell (c’est-Ă -dire /usr/local/share/powershell/Modules/).

Installer les dépendances

PowerShell 7 et Pester sont installĂ©s sur les exĂ©cuteurs hĂ©bergĂ©s dans GitHub. Vous pouvez utiliser Install-Module pour installer des dĂ©pendances supplĂ©mentaires Ă  partir de PowerShell Gallery avant de gĂ©nĂ©rer et de tester votre code.

Remarque

Les packages prĂ©installĂ©s (tels que Pester) qui sont utilisĂ©s par les exĂ©cuteurs hĂ©bergĂ©s dans GitHub sont rĂ©guliĂšrement mis Ă  jour et peuvent entraĂźner des modifications importantes. Par consĂ©quent, il est recommandĂ© de toujours spĂ©cifier les versions de package nĂ©cessaires Ă  l’aide de Install-Module avec -MaximumVersion.

Vous pouvez Ă©galement mettre en cache vos dĂ©pendances pour accĂ©lĂ©rer vos exĂ©cutions de workflow. Pour plus d’informations, consultez « RĂ©fĂ©rence sur la mise en cache des dĂ©pendances Â».

Par exemple, le travail suivant installe les modules SqlServer et PSScriptAnalyzer :

jobs:
  install-dependencies:
    name: Install dependencies
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install from PSGallery
        shell: pwsh
        run: |
          Set-PSRepository PSGallery -InstallationPolicy Trusted
          Install-Module SqlServer, PSScriptAnalyzer

Remarque

Par dĂ©faut, aucun dĂ©pĂŽt n’est approuvĂ© par PowerShell. Lors de l’installation de modules Ă  partir de PowerShell Gallery, vous devez dĂ©finir explicitement la stratĂ©gie d’installation de PSGallery sur Trusted.

Mise en cache des dépendances

Vous pouvez mettre en cache les dĂ©pendances PowerShell Ă  l’aide d’une clĂ© unique, ce qui vous permet de restaurer les dĂ©pendances pour les prochains workflows avec l’action cache. Pour plus d’informations, consultez « RĂ©fĂ©rence sur la mise en cache des dĂ©pendances Â».

PowerShell met en cache ses dĂ©pendances Ă  diffĂ©rents emplacements, selon le systĂšme d’exploitation de l’exĂ©cuteur. Par exemple, l’emplacement path utilisĂ© dans l’exemple Ubuntu suivant sera diffĂ©rent pour un systĂšme d’exploitation Windows.

steps:
  - uses: actions/checkout@v4
  - name: Setup PowerShell module cache
    id: cacher
    uses: actions/cache@v4
    with:
      path: "~/.local/share/powershell/Modules"
      key: ${{ runner.os }}-SqlServer-PSScriptAnalyzer
  - name: Install required PowerShell modules
    if: steps.cacher.outputs.cache-hit != 'true'
    shell: pwsh
    run: |
      Set-PSRepository PSGallery -InstallationPolicy Trusted
      Install-Module SqlServer, PSScriptAnalyzer -ErrorAction Stop

Test de votre code

Vous pouvez utiliser les mĂȘmes commandes que celles que vous utilisez localement pour gĂ©nĂ©rer et tester votre code.

Utilisation de PSScriptAnalyzer pour linter du code

L’exemple suivant installe PSScriptAnalyzer, et l’utilise pour effectuer le linting de tous les fichiers ps1 du dĂ©pĂŽt. Pour plus d’informations, consultez PSScriptAnalyzer sur GitHub.

  lint-with-PSScriptAnalyzer:
    name: Install and run PSScriptAnalyzer
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install PSScriptAnalyzer module
        shell: pwsh
        run: |
          Set-PSRepository PSGallery -InstallationPolicy Trusted
          Install-Module PSScriptAnalyzer -ErrorAction Stop
      - name: Lint with PSScriptAnalyzer
        shell: pwsh
        run: |
          Invoke-ScriptAnalyzer -Path *.ps1 -Recurse -Outvariable issues
          $errors   = $issues.Where({$_.Severity -eq 'Error'})
          $warnings = $issues.Where({$_.Severity -eq 'Warning'})
          if ($errors) {
              Write-Error "There were $($errors.Count) errors and $($warnings.Count) warnings total." -ErrorAction Stop
          } else {
              Write-Output "There were $($errors.Count) errors and $($warnings.Count) warnings total."
          }

Empaquetage des donnĂ©es de workflow en tant qu’artefacts

Vous pouvez charger des artefacts Ă  afficher une fois un workflow terminĂ©. Par exemple, vous devrez peut-ĂȘtre enregistrer des fichiers journaux, des vidages principaux, des rĂ©sultats de test ou des captures d’écran. Pour plus d’informations, consultez « Stocker et partager des donnĂ©es avec les artefacts de workflow Â».

L’exemple suivant montre comment utiliser l’action upload-artifact pour archiver les rĂ©sultats des tests reçus de Invoke-Pester. Pour plus d’informations, consultez l’action upload-artifact.

name: Upload artifact from Ubuntu

on: [push]

jobs:
  upload-pester-results:
    name: Run Pester and upload results
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Test with Pester
        shell: pwsh
        run: Invoke-Pester Unit.Tests.ps1 -Passthru | Export-CliXml -Path Unit.Tests.xml
      - name: Upload test results
        uses: actions/upload-artifact@v4
        with:
          name: ubuntu-Unit-Tests
          path: Unit.Tests.xml
    if: ${{ always() }}

La fonction always() configure le travail de maniĂšre Ă  poursuivre le traitement, mĂȘme en cas d’échec du test. Pour plus d’informations, consultez « RĂ©fĂ©rence sur les contextes Â».

Vous pouvez configurer votre workflow de maniĂšre Ă  publier votre module PowerShell dans PowerShell Gallery lorsque vos tests d’intĂ©gration continue rĂ©ussissent. Vous pouvez utiliser des secrets pour stocker n’importe quels jetons ou informations d’identification nĂ©cessaires Ă  la publication de votre package. Pour plus d’informations, consultez « Utilisation de secrets dans GitHub Actions Â».

L’exemple suivant crĂ©e un package et utilise Publish-Module pour le publier dans PowerShell Gallery :

name: Publish PowerShell Module

on:
  release:
    types: [created]

jobs:
  publish-to-gallery:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build and publish
        env:
          NUGET_KEY: ${{ secrets.NUGET_KEY }}
        shell: pwsh
        run: |
          ./build.ps1 -Path /tmp/samplemodule
          Publish-Module -Path /tmp/samplemodule -NuGetApiKey $env:NUGET_KEY -Verbose