Dostosowywanie języka Python dla usługi Azure Pipelines

Usługa Azure Pipelines umożliwia tworzenie aplikacji w języku Python bez konieczności konfigurowania własnej infrastruktury. Narzędzia, których często używasz do kompilowania, testowania i uruchamiania aplikacji języka Python — takich jak pip — pobierz wstępnie zainstalowanych agentów hostowanych przez firmę Microsoft w usłudze Azure Pipelines.

Aby utworzyć pierwszy potok przy użyciu języka Python, zobacz przewodnik Szybki start języka Python.

Korzystanie z określonej wersji języka Python

Aby użyć określonej wersji języka Python w potoku, dodaj zadanie Używanie wersji języka Python do pliku azure-pipelines.yml. Ten fragment kodu ustawia potok do używania języka Python 3.11:

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

Korzystanie z wielu wersji języka Python

Aby uruchomić potok z wieloma wersjami języka Python, na przykład w celu przetestowania pakietu względem tych wersji, zdefiniuj job element z wersją matrix języka Python. Następnie ustaw UsePythonVersion zadanie, aby odwoływać się do zmiennej matrix .

jobs:
- job: 'Test'
  pool:
    vmImage: 'ubuntu-latest' # other options: 'macOS-latest', 'windows-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)'

Zadania podrzędne można dodawać do uruchamiania przy użyciu każdej wersji języka Python w macierzy.

Uruchamianie skryptów języka Python

Aby uruchomić skrypty języka Python w repozytorium, użyj script elementu i określ nazwę pliku. Na przykład:

- script: python src/example.py

Możesz również uruchamiać wbudowane skrypty języka Python za pomocą zadania Skrypt języka Python:

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

Aby sparametryzować wykonywanie skryptu, użyj PythonScript zadania z wartościami arguments , aby przekazać argumenty do procesu wykonywania. Możesz użyć sys.argv lub bardziej wyrafinowanej argparse biblioteki, aby przeanalizować argumenty.

- 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

Instalowanie zależności

Za pomocą skryptów można zainstalować określone pakiety PyPI za pomocą polecenia pip. Na przykład ten kod YAML instaluje lub uaktualnia pip oraz setuptools pakiety i wheel .

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

Wymagania dotyczące instalacji

Po zaktualizowaniu pip i przyjaciołom typowym następnym krokiem jest zainstalowanie zależności z requirements.txt:

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

Uruchom testy

Użyj skryptów, aby zainstalować i uruchomić różne testy w potoku.

Uruchamianie testów lint za pomocą flake8

Aby zainstalować lub uaktualnić flake8 i użyć go do uruchamiania testów lint, użyj następującego kodu YAML:

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

Testowanie za pomocą narzędzia pytest i zbieranie metryk pokrycia za pomocą narzędzia pytest-cov

Użyj tego kodu YAML, aby zainstalować pytest i pytest-cov, uruchomić testy, wyniki testu wyjściowego w formacie JUnit i wynikowe pokrycie kodu w formacie XML Cobertura:

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

Uruchamianie testów za pomocą narzędzia Tox

Usługa Azure Pipelines może uruchamiać równoległe zadania testowe tox, aby podzielić pracę. Na komputerze deweloperów musisz uruchamiać środowiska testowe w serii. W tym przykładzie użyto tox -e py do uruchamiania niezależnie od wersji języka Python, która jest aktywna dla bieżącego zadania.

- 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'

Publikowanie wyników testu

Dodaj zadanie Publikuj wyniki testu, aby opublikować wyniki testu JUnit lub xUnit na serwerze:

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

Publikowanie wyników pokrycia kodu

Dodaj zadanie Publikuj wyniki pokrycia kodu , aby opublikować wyniki pokrycia kodu na serwerze. Metryki pokrycia można wyświetlić w podsumowaniu kompilacji i pobrać raporty HTML w celu dalszej analizy.

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

Pakowanie i dostarczanie kodu

Aby uwierzytelnić się twinew usłudze , użyj zadania Twine Authentication do przechowywania poświadczeń uwierzytelniania w zmiennej środowiskowej PYPIRC_PATH .

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

Następnie dodaj skrypt niestandardowy, który używa twine do publikowania pakietów.

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

Za pomocą usługi Azure Pipelines można również utworzyć obraz dla aplikacji języka Python i wypchnąć go do rejestru kontenerów.