Skip to content

Commit e0b3863

Browse files
scbeddlmazuel
andauthored
Add NameReserve Build (#44419)
Co-authored-by: Laurent Mazuel <[email protected]>
1 parent b2b490c commit e0b3863

File tree

4 files changed

+258
-2
lines changed

4 files changed

+258
-2
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
parameters:
2+
- name: NameForReservation
3+
type: string
4+
- name: VersionForReservation
5+
type: string
6+
7+
jobs:
8+
- job: generate_namereserve_package
9+
displayName: Generate Name Reservation Package Artifacts
10+
pool:
11+
name: azsdk-pool
12+
image: windows-2022
13+
os: windows
14+
steps:
15+
- task: UsePythonVersion@0
16+
inputs:
17+
versionSpec: '3.13'
18+
19+
- pwsh: |
20+
python -m pip install -r eng/ci_tools.txt
21+
displayName: Install Dependencies
22+
23+
- pwsh: |
24+
$ErrorActionPreference = 'Stop'
25+
$PSNativeCommandUseErrorActionPreference = $true
26+
27+
generate_namereserve_package `
28+
--package_version "${{ parameters.VersionForReservation }}" `
29+
--output_dir "$(Build.ArtifactStagingDirectory)" `
30+
"${{ parameters.NameForReservation }}"
31+
displayName: Generate Name Reservation Package
32+
33+
- template: /eng/common/pipelines/templates/steps/publish-1es-artifact.yml
34+
parameters:
35+
ArtifactPath: '$(Build.ArtifactStagingDirectory)'
36+
ArtifactName: 'NameReservePackage'
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
parameters:
2+
- name: NameForReservation
3+
type: string
4+
- name: VersionForReservation
5+
type: string
6+
default: '0.0.0'
7+
8+
extends:
9+
template: /eng/pipelines/templates/stages/1es-redirect.yml
10+
parameters:
11+
stages:
12+
- stage: Build
13+
displayName: 'Build ${{ parameters.NameForReservation }}==${{ parameters.VersionForReservation }}'
14+
jobs:
15+
- template: ../jobs/build-namereserve-package.yml
16+
parameters:
17+
NameForReservation: ${{ parameters.NameForReservation }}
18+
VersionForReservation: ${{ parameters.VersionForReservation }}
19+
20+
- stage: Publish
21+
displayName: 'Publish Name Reservation Package'
22+
dependsOn: Build
23+
jobs:
24+
- deployment: PublishPackage
25+
displayName: "Publish to PyPI"
26+
environment: package-publish
27+
28+
variables:
29+
PUBLISHDIRECTORY: "$(Pipeline.Workspace)/esrp-release/"
30+
31+
templateContext:
32+
type: releaseJob
33+
isProduction: true
34+
inputs:
35+
- input: pipelineArtifact
36+
artifactName: NameReservePackage
37+
targetPath: $(Pipeline.Workspace)/NameReservePackage
38+
39+
pool:
40+
image: ubuntu-24.04
41+
name: azsdk-pool
42+
os: linux
43+
44+
strategy:
45+
runOnce:
46+
deploy:
47+
steps:
48+
- pwsh: |
49+
New-Item -ItemType Directory -Force -Path "$(PUBLISHDIRECTORY)"
50+
51+
Get-ChildItem -Path "$(Pipeline.Workspace)/NameReservePackage/${{parameters.NameForReservation}}" `
52+
| Where-Object { ($_.Name -like "*.tar.gz" -or $_.Name -like "*.whl") } `
53+
| Copy-Item -Destination "$(PUBLISHDIRECTORY)"
54+
Get-ChildItem "$(PUBLISHDIRECTORY)"
55+
displayName: Isolate files for ESRP Publish
56+
57+
- task: EsrpRelease@9
58+
displayName: 'Publish to ESRP'
59+
inputs:
60+
ConnectedServiceName: 'Azure SDK PME Managed Identity'
61+
ClientId: '5f81938c-2544-4f1f-9251-dd9de5b8a81b'
62+
DomainTenantId: '975f013f-7f24-47e8-a7d3-abc4752bf346'
63+
UseManagedIdentity: true
64+
KeyVaultName: 'kv-azuresdk-codesign'
65+
SignCertName: 'azure-sdk-esrp-release-certificate'
66+
Intent: 'PackageDistribution'
67+
ContentType: 'PyPI'
68+
FolderLocation: "$(PUBLISHDIRECTORY)"
69+
Owners: $(Build.RequestedForEmail)
70+
Approvers: $(Build.RequestedForEmail)
71+
ServiceEndpointUrl: 'https://api.esrp.microsoft.com'
72+
MainPublisher: 'ESRPRELPACMANTEST'
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
"""Utilities for generating a placeholder package to reserve a name on PyPI."""
2+
3+
import argparse
4+
import shutil
5+
import tempfile
6+
from pathlib import Path
7+
from typing import Optional
8+
9+
from ci_tools.build import build_packages
10+
11+
12+
def _parse_args(argv: Optional[list[str]] = None) -> argparse.Namespace:
13+
parser = argparse.ArgumentParser(
14+
description=(
15+
"Generate a minimal Python distribution that can be published to PyPI "
16+
"in order to reserve a package name."
17+
)
18+
)
19+
parser.add_argument(
20+
"--working_dir",
21+
help=(
22+
"Temporary workspace used to author the placeholder project. "
23+
"Defaults to the current platform temp directory."
24+
),
25+
default=None,
26+
)
27+
parser.add_argument(
28+
"--output_dir",
29+
required=True,
30+
help="Directory where the built distributions will be written.",
31+
)
32+
parser.add_argument(
33+
"--package_version",
34+
default="0.0.0",
35+
help="The distribution version to reserve on PyPI (Defaults to 0.0.0).",
36+
)
37+
38+
parser.add_argument(
39+
"package_name",
40+
help="The distribution name to reserve on PyPI (e.g. azure-mgmt-servicename).",
41+
)
42+
return parser.parse_args(argv)
43+
44+
45+
def _normalise_module_name(dist_name: str) -> str:
46+
return dist_name.replace("-", "_")
47+
48+
49+
def _write_placeholder_project(project_dir: Path, package_name: str, package_version: str) -> None:
50+
module_name = _normalise_module_name(package_name)
51+
src_dir = project_dir / "src" / module_name
52+
src_dir.mkdir(parents=True, exist_ok=True)
53+
54+
readme = project_dir / "README.md"
55+
readme.write_text(
56+
(
57+
f"""
58+
# This package will be `{package_name}`
59+
60+
The `Azure SDK` team is planning to release this package for public usage soon. This is a placeholder on PyPI for planning purposes and do not yet contain any code.
61+
62+
If you have any questions about the future availability of this package, please create an issue on https://github.com/Azure/azure-sdk-for-python/issues or contact the email on this PyPI page.
63+
"""
64+
),
65+
encoding="utf-8",
66+
)
67+
68+
pyproject = project_dir / "pyproject.toml"
69+
pyproject.write_text(
70+
(
71+
f"""
72+
[build-system]
73+
requires = ["setuptools>=77.0.3", "wheel"]
74+
build-backend = "setuptools.build_meta"
75+
76+
[project]
77+
name = "{package_name}"
78+
authors = [
79+
{{name = "Microsoft Corporation", email = "[email protected]"}},
80+
]
81+
description = "This package will be released in the near future. Stay tuned!"
82+
keywords = ["azure", "azure sdk"]
83+
requires-python = ">=3.9"
84+
license = "MIT"
85+
version = "{package_version}"
86+
classifiers = [
87+
"Development Status :: 1 - Planning",
88+
"Programming Language :: Python",
89+
"Programming Language :: Python :: 3 :: Only",
90+
"Programming Language :: Python :: 3",
91+
"Programming Language :: Python :: 3.9",
92+
"Programming Language :: Python :: 3.10",
93+
"Programming Language :: Python :: 3.11",
94+
"Programming Language :: Python :: 3.12",
95+
"Programming Language :: Python :: 3.13",
96+
"Programming Language :: Python :: 3.14",
97+
]
98+
dependencies = []
99+
dynamic = ["readme"]
100+
101+
[project.urls]
102+
"Bug Reports" = "https://github.com/Azure/azure-sdk-for-python/issues"
103+
repository = "https://github.com/Azure/azure-sdk-for-python"
104+
105+
[tool.setuptools.dynamic]
106+
readme = {{file = ["README.md"], content-type = "text/markdown"}}
107+
"""
108+
),
109+
encoding="utf-8",
110+
)
111+
112+
113+
def _build_distributions(project_dir: str, output_dir: str) -> None:
114+
build_packages([project_dir], distribution_directory=output_dir)
115+
116+
117+
def generate_main(argv: Optional[list[str]] = None) -> int:
118+
args = _parse_args(argv)
119+
120+
print(f"Generating name reservation package for {args.package_name}=={args.package_version}")
121+
122+
work_root = Path(args.working_dir) if args.working_dir else Path(tempfile.gettempdir())
123+
work_root.mkdir(parents=True, exist_ok=True)
124+
125+
project_dir = work_root / f"{args.package_name}"
126+
127+
if project_dir.exists():
128+
print(f"Removing existing project directory {project_dir}")
129+
shutil.rmtree(project_dir)
130+
131+
project_dir.mkdir(parents=True, exist_ok=True)
132+
133+
print(f"Creating placeholder project for {args.package_name} in {project_dir}")
134+
_write_placeholder_project(project_dir, args.package_name, args.package_version)
135+
136+
try:
137+
_build_distributions(str(project_dir), args.output_dir)
138+
finally:
139+
print(f"Cleaning up working directory {project_dir}")
140+
shutil.rmtree(project_dir, ignore_errors=True)
141+
142+
print(f"Finished generating distributions for {args.package_name}")
143+
return 0
144+
145+
146+
if __name__ == "__main__":
147+
raise SystemExit(generate_main())

eng/tools/azure-sdk-tools/pyproject.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ dependencies = [
3333
generate_package = "packaging_tools.generate_package:generate_main"
3434
generate_sdk = "packaging_tools.generate_sdk:generate_main"
3535
generate_client = "packaging_tools.generate_client:generate_main"
36-
perfstress = "devtools_testutils.perfstress_tests:run_perfstress_cmd"
37-
perfstressdebug = "devtools_testutils.perfstress_tests:run_perfstress_debug_cmd"
36+
generate_namereserve_package = "packaging_tools.generate_namereserve_package:generate_main"
3837
sdk_generator = "packaging_tools.sdk_generator:generate_main"
3938
sdk_changelog = "packaging_tools.sdk_changelog:generate_main"
4039
sdk_update_version = "packaging_tools.sdk_update_version:generate_main"
@@ -48,6 +47,8 @@ sdk_increment_version = "ci_tools.versioning.version_increment:version_increment
4847
sdk_analyze_deps = "ci_tools.dependency_analysis:analyze_dependencies"
4948
sdk_find_invalid_versions = "ci_tools.versioning.find_invalid_versions:find_invalid_versions_main"
5049
sdk_verify_keywords = "ci_tools.keywords_verify:entrypoint"
50+
perfstress = "devtools_testutils.perfstress_tests:run_perfstress_cmd"
51+
perfstressdebug = "devtools_testutils.perfstress_tests:run_perfstress_debug_cmd"
5152
systemperf = "devtools_testutils.perfstress_tests:run_system_perfstress_tests_cmd"
5253
azpysdk = "azpysdk.main:main"
5354

0 commit comments

Comments
 (0)