diff --git a/.azure-pipelines/cd-publish-python.yml b/.azure-pipelines/cd-publish-python.yml new file mode 100644 index 00000000..0058e52f --- /dev/null +++ b/.azure-pipelines/cd-publish-python.yml @@ -0,0 +1,152 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +# Build, package, and deploy msgraph-sdk-python-core to PyPI. + +name: $(BuildDefinitionName)_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r) + +trigger: + branches: + include: + - main + tags: + include: + - "v*" + +pr: none + +variables: + pythonVersion: "3.14" + +resources: + repositories: + - repository: 1ESPipelineTemplates + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release + +extends: + template: v1/1ES.Official.PipelineTemplate.yml@1ESPipelineTemplates + parameters: + pool: + name: Azure-Pipelines-1ESPT-ExDShared + image: ubuntu-latest + os: linux + sdl: + sourceAnalysisPool: + name: Azure-Pipelines-1ESPT-ExDShared + image: windows-2022 + os: windows + stages: + - stage: build + displayName: "Build and Package msgraph-sdk-python-core" + condition: or(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'), eq(variables['Build.Reason'], 'Manual')) + jobs: + - job: build_python + displayName: "Build, Test, and Package" + pool: + name: Azure-Pipelines-1ESPT-ExDShared + image: ubuntu-latest + os: linux + steps: + - checkout: self + + - task: UsePythonVersion@0 + displayName: "Install Python $(pythonVersion)" + inputs: + versionSpec: "$(pythonVersion)" + addToPath: true + + - script: python -m pip install --upgrade pip + displayName: "Upgrade pip" + + - task: PipAuthenticate@1 + displayName: "Authenticate pip to Azure Artifacts" + inputs: + artifactFeeds: "$(System.TeamProject)/msgraph-python-dev" + + - script: pip install -r requirements-dev.txt + displayName: "Install dependencies" + + - script: yapf -dr src + displayName: "Check code format" + + - script: isort src + displayName: "Check import order" + + - script: mypy src + displayName: "Static type checking with Mypy" + + - script: pylint src --disable=W --rcfile=.pylintrc + displayName: "Lint with Pylint" + + - script: pytest + displayName: "Run unit tests" + + - script: pip install build + displayName: "Install package builder" + + - script: python -m build + displayName: "Build package artifacts" + + - task: CopyFiles@2 + displayName: "Copy package artifacts to staging" + inputs: + CleanTargetFolder: true + sourceFolder: "$(Build.SourcesDirectory)" + targetFolder: "$(Build.ArtifactStagingDirectory)/python/msgraph_core" + Contents: | + dist/*.tar.gz + dist/*.whl + flattenFolders: true + + templateContext: + outputs: + - output: pipelineArtifact + displayName: "Stage msgraph-core package artifacts" + artifactName: pypi_msgraph_core_package + targetPath: "$(Build.ArtifactStagingDirectory)/python/msgraph_core" + condition: or(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'), eq(variables['Build.Reason'], 'Manual')) + + - stage: deploy + displayName: "Publish msgraph-sdk-python-core to PyPI" + dependsOn: build + condition: or(and(startsWith(variables['Build.SourceBranch'], 'refs/tags/v'), succeeded()), eq(variables['Build.Reason'], 'Manual')) + jobs: + - deployment: publish_python_package + displayName: "Publish msgraph-core package" + environment: pypi_prod + pool: + name: Azure-Pipelines-1ESPT-ExDShared + image: ubuntu-latest + os: linux + templateContext: + type: releaseJob + isProduction: true + inputs: + - input: pipelineArtifact + artifactName: pypi_msgraph_core_package + targetPath: "$(Build.ArtifactStagingDirectory)/python" + strategy: + runOnce: + deploy: + steps: + - task: EsrpRelease@9 + displayName: "Publish msgraph-core package via ESRP Release" + inputs: + connectedservicename: "Federated DevX ESRP Managed Identity Connection" + usemanagedidentity: false + keyvaultname: "akv-prod-eastus" + authcertname: "ReferenceLibraryPrivateCert" + signcertname: "ReferencePackagePublisherCertificate" + clientid: "65035b7f-7357-4f29-bf25-c5ee5c3949f8" + intent: "PackageDistribution" + contenttype: "PYPI" + contentsource: "Folder" + folderlocation: "$(Build.ArtifactStagingDirectory)/python" + waitforreleasecompletion: true + owners: "graphtooling+python@microsoft.com" + approvers: "graphtooling+python@microsoft.com" + serviceendpointurl: "https://api.esrp.microsoft.com" + mainpublisher: "ESRPRELPACMAN" + domaintenantid: "cdc5aeea-15c5-4db6-b079-fcadd2505dc2" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index 75da478e..00000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Publish package to PyPI and create release - -on: - push: - tags: - - "v*" # Push events to matching v*, i.e. v1.0, v20.15.10 - -jobs: - build: - uses: ./.github/workflows/build.yml - - publish: - name: Publish distribution to PyPI - runs-on: ubuntu-latest - if: startsWith(github.ref, 'refs/tags/v') - environment: pypi_prod - needs: [build] - steps: - - name: Checkout code - uses: actions/checkout@v6 - - name: Set up Python 3.13 - uses: actions/setup-python@v6 - with: - python-version: 3.13 - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install build - - name: Build package - run: python -m build - - name: Publish package - uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b - with: - user: __token__ - password: ${{ secrets.PYPI_TOKEN }} diff --git a/.vscode/settings.json b/.vscode/settings.json index 0df470aa..f5e20fd7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,5 +4,6 @@ "tests" ], "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true + "python.testing.pytestEnabled": true, + "azure-pipelines.1ESPipelineTemplatesSchemaFile": true } \ No newline at end of file diff --git a/requirements-dev.txt b/requirements-dev.txt index 054faa02..f9e28294 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -27,7 +27,7 @@ coverage[toml]==7.10.6 ; python_version >= '3.7' cryptography==46.0.7 ; python_version >= '3.7' -dill==0.4.0 ; python_version < '3.11' +dill==0.4.0 exceptiongroup==1.3.0 ; python_version < '3.11' @@ -116,7 +116,7 @@ urllib3==2.7.0 ; python_version >= '3.7' typing-extensions==4.15.0 ; python_version >= '3.7' -wrapt==1.17.3 ; python_version < '3.11' +wrapt==1.17.3 yapf==0.43.0