Anpassa Python-pipelines

Den här artikeln beskriver hur du anpassar skapande, testning, paketering och leverans av Python-appar och -kod i Azure Pipelines. Information om hur du skapar din första pipeline med Python finns i Python-snabbstarten.

Med Microsoft-värdbaserade agenter i Azure Pipelines kan du skapa dina Python-appar utan att behöva konfigurera din egen infrastruktur. Verktyg som du ofta använder för att skapa, testa och köra Python-appar, inklusive pip, är förinstallerade.

Du kan behöva begära kostnadsfri beviljande av parallella jobb eller köpa ett parallellt jobb för att köra dina pipelines.

Om du vill skapa Python-appar med Azure Pipelines behöver du en lokalt installerad agent med Python installerat. Information om hur du installerar Python på din agent finns i UsePythonVersion.

Använda en specifik Python-version

Om du vill använda en specifik version av Python i din pipeline lägger du till uppgiften Använd Python-version i azure-pipelines.yml. I följande exempel anger YAML-pipelinedefinitionen att pipelinen ska använda Python 3.11.

steps:
- task: UsePythonVersion@0
  inputs:
    versionSpec: '3.11'

Använda flera Python-versioner

Om du vill köra en pipeline med flera Python-versioner, till exempel för att testa ett paket mot dessa versioner, definierar du en job med en matrix av Python-versioner. Ange UsePythonVersion sedan uppgiften för att referera till variabeln matrix . Till exempel:

jobs:
- job: 'Test'
  pool:
    vmImage: 'ubuntu-latest'
  strategy:
    matrix:
      Python38:
        python.version: '3.8'
      Python39:
        python.version: '3.9'
      Python310:
        python.version: '3.10'

  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '$(python.version)'

Du kan lägga till uppgifter som använder varje Python-version i matrisen.

Kör Python-skript

Om du vill köra Python-skript från lagringsplatsen använder du ett script element och anger ett filnamn. Till exempel:

- script: python src/example.py

Du kan också använda Python-skriptaktiviteten för att köra infogade Python-skript.

- task: PythonScript@0
  inputs:
    scriptSource: 'inline'
    script: |
      print('Hello world 1')
      print('Hello world 2')

Om du vill parametrisera skriptkörning använder du PythonScript uppgiften med arguments värden för att skicka argument till den process som körs. Du kan använda sys.argv eller det mer avancerade argparse biblioteket för att parsa argumenten.

- task: PythonScript@0
  inputs:
    scriptSource: inline
    script: |
      import sys
      print ('Executing script file is:', str(sys.argv[0]))
      print ('The arguments are:', str(sys.argv))
      import argparse
      parser = argparse.ArgumentParser()
      parser.add_argument("--world", help="Provide the name of the world to greet.")
      args = parser.parse_args()
      print ('Hello ', args.world)
    arguments: --world Venus

Installera beroenden

Du kan använda skript för att installera specifika PyPI-paket med pip. I följande exempel installeras eller uppgraderas pip och paketen setuptools och wheel .

- script: python -m pip install --upgrade pip setuptools wheel
  displayName: 'Install tools'

Installationskrav

När du har uppdaterat pip och vänner är ett vanligt nästa steg att installera beroenden från requirements.txt.

- script: pip install -r requirements.txt
  displayName: 'Install requirements'

Köra tester

Du kan använda skript för att installera och köra olika tester i pipelinen.

Kör linttester med flake8

Följande YAML-kod installerar eller uppgraderar flake8 och använder den för att köra linttester.

- script: |
    python -m pip install flake8
    flake8 .
  displayName: 'Run lint tests'

Testa med pytest och samla in täckningsmått med pytest-cov

Följande YAML-kod installerar pytest och pytest-cov kör tester, utdata från testresultat i JUnit-format och utdata för kodtäckning resulterar i Cobertura XML-format.

- script: |
    pip install pytest pytest-azurepipelines
    pip install pytest-cov
    pytest --doctest-modules --junitxml=junit/test-results.xml --cov=. --cov-report=xml
  displayName: 'pytest'

Köra tester med Tox

Azure Pipelines kan köra parallella Tox-testjobb för att dela upp arbetet. På en utvecklingsdator måste du köra testmiljöerna i serie. I följande exempel används tox -e py för att köra den version av Python som är aktiv för det aktuella jobbet.

- job:

  pool:
    vmImage: 'ubuntu-latest'
  strategy:
    matrix:
      Python38:
        python.version: '3.8'
      Python39:
        python.version: '3.9'
      Python310:
        python.version: '3.10'

  steps:
  - task: UsePythonVersion@0
    displayName: 'Use Python $(python.version)'
    inputs:
      versionSpec: '$(python.version)'

  - script: pip install tox
    displayName: 'Install Tox'

  - script: tox -e py
    displayName: 'Run Tox'

Publicera testresultat

Lägg till uppgiften Publicera testresultat för att publicera JUnit- eller xUnit-testresultat på servern.

- task: PublishTestResults@2
  condition: succeededOrFailed()
  inputs:
    testResultsFiles: '**/test-*.xml'
    testRunTitle: 'Publish test results for Python $(python.version)'

Publicera resultat för kodtäckning

Lägg till aktiviteten Publicera kodtäckningsresultat för att publicera kodtäckningsresultat till servern. Du kan se täckningsmått i byggsammanfattningen och ladda ned HTML-rapporter för ytterligare analys.

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

Paketera och leverera kod

Om du vill autentisera med twineanvänder du python-twine-uppladdningsuppgiften för att lagra autentiseringsuppgifter i PYPIRC_PATH miljövariabeln.

- task: TwineAuthenticate@0
  inputs:
    artifactFeed: '<Azure Artifacts feed name>'
    pythonUploadServiceConnection: '<twine service connection from external organization>'

Lägg sedan till ett anpassat skript som använder twine för att publicera dina paket.

- script: |
   twine upload -r "<feed or service connection name>" --config-file $(PYPIRC_PATH) <package path/files>

Du kan också använda Azure Pipelines för att skapa en avbildning för din Python-app och skicka den till ett containerregister.