Skip to content

Commit 296bbb6

Browse files
scbeddjalauzon-msftAutorestCI
authored
Enable Build of Non-Universal Wheels (Azure#32911)
* Temporarily Scaffold new azure-storage-extensions package * Update parse_functions.py to pick up extension modules and package names * Add additional code testing parse_function for the new functionality * Update build.py to invoke cibuildwheel to produce platform-specific wheels where necessary Co-authored-by: Jacob Lauzon <jalauzon@microsoft.com> Co-authored-by: Azure SDK Bot <adxpysdk@microsoft.com>
1 parent e4b044a commit 296bbb6

File tree

15 files changed

+1175
-86
lines changed

15 files changed

+1175
-86
lines changed

.vscode/cspell.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
"conda/conda-releaselogs/azure-mgmt.md"
128128
],
129129
"words": [
130+
"cibuildwheel",
130131
"aoai",
131132
"pyprojects",
132133
"certifi",
@@ -650,7 +651,7 @@
650651
"engelska",
651652
"fhir",
652653
"FHIR",
653-
"naam",
654+
"naam"
654655
]
655656
},
656657
{

eng/ci_tools.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ wrapt==1.12.1; python_version <= '3.10'
1313
wrapt==1.15.0; python_version >= '3.11'
1414
typing-extensions<=4.6.3
1515
pyproject-api<1.6
16+
cibuildwheel==2.16.2 ; python_version > '3.8'
1617

1718
# requirements leveraged for testing
1819
pytest==7.3.1

eng/pipelines/templates/jobs/ci.yml

Lines changed: 93 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,31 +61,105 @@ parameters:
6161
- name: GenerateApiReviewForManualOnly
6262
type: boolean
6363
default: false
64+
- name: AdvancedBuild
65+
type: boolean
66+
default: false
6467

6568
jobs:
66-
- job: 'Build'
67-
timeoutInMinutes: 90
69+
70+
- ${{ if eq(parameters['AdvancedBuild'], false) }}:
71+
- job: 'Build'
72+
timeoutInMinutes: 90
6873

69-
pool:
70-
name: azsdk-pool-mms-ubuntu-2004-general
71-
vmImage: MMSUbuntu20.04
74+
pool:
75+
name: azsdk-pool-mms-ubuntu-2004-general
76+
vmImage: MMSUbuntu20.04
7277

73-
steps:
74-
- template: /eng/pipelines/templates/steps/targeting-string-resolve.yml
75-
parameters:
76-
BuildTargetingString: ${{ parameters.BuildTargetingString }}
78+
steps:
79+
- template: /eng/pipelines/templates/steps/targeting-string-resolve.yml
80+
parameters:
81+
BuildTargetingString: ${{ parameters.BuildTargetingString }}
7782

78-
- template: ../steps/build-package-artifacts.yml
79-
parameters:
80-
ServiceDirectory: ${{ parameters.ServiceDirectory }}
81-
BeforePublishSteps: ${{ parameters.BeforePublishSteps }}
82-
TestPipeline: ${{ parameters.TestPipeline }}
83-
Artifacts: ${{ parameters.Artifacts }}
83+
- template: ../steps/build-package-artifacts.yml
84+
parameters:
85+
ServiceDirectory: ${{ parameters.ServiceDirectory }}
86+
BeforePublishSteps: ${{ parameters.BeforePublishSteps }}
87+
TestPipeline: ${{ parameters.TestPipeline }}
88+
Artifacts: ${{ parameters.Artifacts }}
89+
90+
- ${{ if eq(parameters['AdvancedBuild'], true) }}:
91+
- job: 'Build'
92+
timeoutInMinutes: 90
93+
94+
strategy:
95+
matrix:
96+
Linux:
97+
imageName: 'MMSUbuntu22.04'
98+
poolName: 'azsdk-pool-mms-ubuntu-2204-general'
99+
ArtifactName: 'linux'
100+
Windows:
101+
imageName: 'MMS2022'
102+
poolName: 'azsdk-pool-mms-win-2022-general'
103+
ArtifactName: 'windows'
104+
Mac:
105+
imageName: 'macos-11'
106+
poolName: 'Azure Pipelines'
107+
ArtifactName: 'mac'
108+
109+
pool:
110+
name: $(poolName)
111+
vmImage: $(imageName)
112+
113+
steps:
114+
- template: /eng/pipelines/templates/steps/targeting-string-resolve.yml
115+
parameters:
116+
BuildTargetingString: ${{ parameters.BuildTargetingString }}
117+
118+
- template: ../steps/build-package-artifacts.yml
119+
parameters:
120+
ServiceDirectory: ${{ parameters.ServiceDirectory }}
121+
BeforePublishSteps: ${{ parameters.BeforePublishSteps }}
122+
TestPipeline: ${{ parameters.TestPipeline }}
123+
Artifacts: ${{ parameters.Artifacts }}
124+
ArtifactSuffix: $(ArtifactName)
125+
126+
- job: 'CoalesceBuildArtifacts'
127+
displayName: Combine Built Artifacts
128+
dependsOn:
129+
- 'Build'
130+
timeoutInMinutes: 90
131+
132+
pool:
133+
name: azsdk-pool-mms-ubuntu-2004-general
134+
vmImage: MMSUbuntu20.04
135+
136+
steps:
137+
- task: DownloadPipelineArtifact@2
138+
inputs:
139+
artifactName: 'packages_windows'
140+
targetPath: $(Build.ArtifactStagingDirectory)/packages
141+
142+
- task: DownloadPipelineArtifact@2
143+
inputs:
144+
artifactName: 'packages_mac'
145+
targetPath: $(Build.ArtifactStagingDirectory)/packages
146+
147+
- task: DownloadPipelineArtifact@2
148+
inputs:
149+
artifactName: 'packages_linux'
150+
targetPath: $(Build.ArtifactStagingDirectory)/packages
151+
152+
- template: /eng/common/pipelines/templates/steps/publish-artifact.yml
153+
parameters:
154+
ArtifactPath: '$(Build.ArtifactStagingDirectory)/packages'
155+
ArtifactName: 'packages'
84156

85157
- job: 'Build_Extended'
86158
displayName: Build Extended
87159
dependsOn:
88160
- 'Build'
161+
- ${{ if eq(parameters['AdvancedBuild'], true) }}:
162+
- 'CoalesceBuildArtifacts'
89163
timeoutInMinutes: 90
90164

91165
pool:
@@ -173,6 +247,8 @@ jobs:
173247
JobTemplatePath: /eng/pipelines/templates/jobs/ci.tests.yml
174248
DependsOn:
175249
- 'Build'
250+
- ${{ if eq(parameters['AdvancedBuild'], true) }}:
251+
- 'CoalesceBuildArtifacts'
176252
MatrixConfigs: ${{ parameters.MatrixConfigs }}
177253
MatrixFilters: ${{ parameters.MatrixFilters }}
178254
MatrixReplace: ${{ parameters.MatrixReplace }}
@@ -220,6 +296,8 @@ jobs:
220296
Cloud: Public
221297
DependsOn:
222298
- 'Build'
299+
- ${{ if eq(parameters['AdvancedBuild'], true) }}:
300+
- 'CoalesceBuildArtifacts'
223301
AdditionalParameters:
224302
BuildTargetingString: ${{ parameters.BuildTargetingString }}
225303
ServiceDirectory: ${{ parameters.ServiceDirectory }}

eng/pipelines/templates/stages/archetype-sdk-client.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ parameters:
7272
- name: GenerateApiReviewForManualOnly
7373
type: boolean
7474
default: false
75+
- name: AdvancedBuild
76+
type: boolean
77+
default: false
7578

7679
variables:
7780
- template: /eng/pipelines/templates/variables/globals.yml
@@ -106,6 +109,7 @@ stages:
106109
ValidateFormatting: ${{ parameters.ValidateFormatting }}
107110
TestProxy: ${{ parameters.TestProxy }}
108111
GenerateApiReviewForManualOnly: ${{ parameters.GenerateApiReviewForManualOnly }}
112+
AdvancedBuild: ${{ parameters.AdvancedBuild }}
109113

110114
# The Prerelease and Release stages are conditioned on whether we are building a pull request and the branch.
111115
- ${{if and(ne(variables['Build.Reason'], 'PullRequest'), eq(variables['System.TeamProject'], 'internal'))}}:

eng/pipelines/templates/steps/build-package-artifacts.yml

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,22 @@ parameters:
1414
- name: DevFeedName
1515
type: string
1616
default: 'public/azure-sdk-for-python'
17+
- name: ArtifactSuffix
18+
type: string
19+
default: ''
20+
1721
# The variable TargetingString is set by template `eng/pipelines/templates/steps/targeting-string-resolve.yml`. This template is invoked from yml files:
1822
# eng/pipelines/templates/jobs/ci.tests.yml
1923
# eng/pipelines/templates/jobs/ci.yml
2024
# eng/pipelines/templates/jobs/live.test.yml
2125

2226
# Please use `$(TargetingString)` to refer to the python packages glob string. This was previously `${{ parameters.BuildTargetingString }}`.
27+
28+
# The variable '$(ArtifactName)' is set at runtime by the strategy for the `Build` job.
29+
# Specifically, one of 3 values `linux`, `mac`, or `windows` will always be populated when invoked from `jobs/ci.yml`.
30+
31+
# However, please note that this variable will not ALWAYS be set. If using `build-artifacts.yml`, ensure that this variable is set AT LEAST
32+
# to "linux", otherwise the primary tasks will not be run as expected. APIStub, Docs, etc are NOT run on machines that aren't linux.
2333
steps:
2434
- template: /eng/common/pipelines/templates/steps/set-test-pipeline-version.yml
2535
parameters:
@@ -71,31 +81,50 @@ steps:
7181
twine check $(Build.ArtifactStagingDirectory)/**/*.tar.gz
7282
displayName: 'Verify Readme'
7383
74-
- ${{if eq(variables['System.TeamProject'], 'internal') }}:
75-
- template: auth-dev-feed.yml
84+
- ${{ parameters.BeforePublishSteps }}
85+
86+
- ${{ if eq(parameters.ArtifactSuffix, '') }}:
87+
- template: /eng/common/pipelines/templates/steps/publish-artifact.yml
7688
parameters:
77-
DevFeedName: ${{ parameters.DevFeedName }}
89+
ArtifactPath: '$(Build.ArtifactStagingDirectory)'
90+
ArtifactName: 'packages'
7891

79-
- ${{ parameters.BeforePublishSteps }}
92+
- template: /eng/common/pipelines/templates/steps/publish-artifact.yml
93+
parameters:
94+
ArtifactPath: '$(Build.SourcesDirectory)/.logs'
95+
ArtifactName: 'build_logs'
8096

81-
- template: /eng/common/pipelines/templates/steps/publish-artifact.yml
82-
parameters:
83-
ArtifactPath: '$(Build.ArtifactStagingDirectory)'
84-
ArtifactName: 'packages'
97+
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
98+
- task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0
99+
displayName: 'Generate BOM'
100+
condition: succeededOrFailed()
101+
inputs:
102+
BuildDropPath: $(Build.ArtifactStagingDirectory)
85103

86-
- template: /eng/common/pipelines/templates/steps/publish-artifact.yml
87-
parameters:
88-
ArtifactPath: '$(Build.SourcesDirectory)/.logs'
89-
ArtifactName: 'build_logs'
104+
- template: /eng/common/pipelines/templates/steps/publish-artifact.yml
105+
parameters:
106+
ArtifactPath: '$(Build.ArtifactStagingDirectory)/_manifest'
107+
ArtifactName: 'packages_manifest'
90108

91-
- ${{if eq(variables['System.TeamProject'], 'internal') }}:
92-
- task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0
93-
displayName: 'Generate BOM'
94-
condition: succeededOrFailed()
95-
inputs:
96-
BuildDropPath: $(Build.ArtifactStagingDirectory)
109+
- ${{ if ne(parameters.ArtifactSuffix, '') }}:
110+
- template: /eng/common/pipelines/templates/steps/publish-artifact.yml
111+
parameters:
112+
ArtifactPath: '$(Build.ArtifactStagingDirectory)'
113+
ArtifactName: 'packages_${{ parameters.ArtifactSuffix }}'
97114

98115
- template: /eng/common/pipelines/templates/steps/publish-artifact.yml
99116
parameters:
100-
ArtifactPath: '$(Build.ArtifactStagingDirectory)/_manifest'
101-
ArtifactName: 'packages_manifest'
117+
ArtifactPath: '$(Build.SourcesDirectory)/.logs'
118+
ArtifactName: 'build_logs_${{ parameters.ArtifactSuffix }}'
119+
120+
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
121+
- task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0
122+
displayName: 'Generate BOM'
123+
condition: succeededOrFailed()
124+
inputs:
125+
BuildDropPath: $(Build.ArtifactStagingDirectory)
126+
127+
- template: /eng/common/pipelines/templates/steps/publish-artifact.yml
128+
parameters:
129+
ArtifactPath: '$(Build.ArtifactStagingDirectory)/_manifest'
130+
ArtifactName: 'packages_manifest_${{ parameters.ArtifactSuffix }}'

eng/tox/create_package_and_install.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ def discover_packages(setuppy_path, args):
6161
args.target_setup,
6262
args.package_type,
6363
)
64+
6465
return packages
6566

6667

scripts/devops_tasks/common_tasks.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from packaging.version import Version
2727
from packaging.version import parse
2828

29-
from ci_tools.functions import MANAGEMENT_PACKAGE_IDENTIFIERS, lambda_filter_azure_pkg, str_to_bool
29+
from ci_tools.functions import MANAGEMENT_PACKAGE_IDENTIFIERS, NO_TESTS_ALLOWED, lambda_filter_azure_pkg, str_to_bool
3030
from ci_tools.parsing import parse_require, ParsedSetup
3131

3232
DEV_REQ_FILE = "dev_requirements.txt"
@@ -126,6 +126,7 @@ def is_error_code_5_allowed(target_pkg, pkg_name):
126126
)
127127
)
128128
or pkg_name in MANAGEMENT_PACKAGE_IDENTIFIERS
129+
or pkg_name in NO_TESTS_ALLOWED
129130
):
130131
return True
131132
else:

tools/azure-sdk-tools/ci_tools/build.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,12 @@ def build() -> None:
106106
target_dir = repo_root
107107

108108
targeted_packages = discover_targeted_packages(
109-
args.glob_string, target_dir, args.package_filter_string, filter_type="Build", compatibility_filter=True, include_inactive=args.inactive
109+
args.glob_string,
110+
target_dir,
111+
args.package_filter_string,
112+
filter_type="Build",
113+
compatibility_filter=True,
114+
include_inactive=args.inactive,
110115
)
111116
artifact_directory = get_artifact_directory(args.distribution_directory)
112117

@@ -159,17 +164,20 @@ def create_package(
159164
"""
160165

161166
dist = get_artifact_directory(dest_folder)
167+
setup_parsed = ParsedSetup.from_path(setup_directory_or_file)
162168

163-
if not os.path.isdir(setup_directory_or_file):
164-
setup_directory_or_file = os.path.dirname(setup_directory_or_file)
169+
if setup_parsed.ext_modules:
170+
run_logged(
171+
[sys.executable, "-m", "cibuildwheel", "--output-dir", dist], prefix="cibuildwheel", cwd=setup_parsed.folder
172+
)
165173

166174
if enable_wheel:
167175
run_logged(
168-
[sys.executable, "setup.py", "bdist_wheel", "-d", dist], prefix="create_wheel", cwd=setup_directory_or_file
176+
[sys.executable, "setup.py", "bdist_wheel", "-d", dist], prefix="create_wheel", cwd=setup_parsed.folder
169177
)
170178
if enable_sdist:
171179
run_logged(
172180
[sys.executable, "setup.py", "sdist", "-d", dist],
173181
prefix="create_sdist",
174-
cwd=setup_directory_or_file,
182+
cwd=setup_parsed.folder,
175183
)

tools/azure-sdk-tools/ci_tools/functions.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828
"azure-ai-anomalydetector",
2929
]
3030

31+
NO_TESTS_ALLOWED = [
32+
]
33+
34+
3135
META_PACKAGES = ["azure", "azure-mgmt", "azure-keyvault"]
3236

3337
REGRESSION_EXCLUDED_PACKAGES = [

0 commit comments

Comments
 (0)