Skip to content

Commit e2550ba

Browse files
CopilotXiaofeiCaoCopilot
authored
eng sys: retain only TypeSpec generation path in eng/automation (#49549)
* Initial plan * Remove AutoRest generation path; retain only TypeSpec path in eng/automation Co-authored-by: XiaofeiCao <92354331+XiaofeiCao@users.noreply.github.com> * Fix comment typo in parameters.py (related -> relative) Co-authored-by: XiaofeiCao <92354331+XiaofeiCao@users.noreply.github.com> * Remove unused generation.yml pipeline and its manual --tsp-config path in generate.py Co-authored-by: XiaofeiCao <92354331+XiaofeiCao@users.noreply.github.com> * Remove unused eng/automation/changelog.py standalone script Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Require exactly two config arguments in generate.py main() Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: XiaofeiCao <92354331+XiaofeiCao@users.noreply.github.com> Co-authored-by: Xiaofei Cao (from Dev Box) <xiaofeicao@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 3237ed4 commit e2550ba

9 files changed

Lines changed: 10 additions & 1428 deletions

File tree

eng/automation/changelog.py

Lines changed: 0 additions & 48 deletions
This file was deleted.

eng/automation/generate.py

Lines changed: 7 additions & 256 deletions
Original file line numberDiff line numberDiff line change
@@ -21,86 +21,19 @@
2121
is_first_release,
2222
)
2323
from generate_data import (
24-
sdk_automation as sdk_automation_data,
2524
sdk_automation_typespec_project as sdk_automation_typespec_project_data,
2625
)
2726
from generate_utils import (
2827
compare_with_maven_package,
2928
compile_arm_package,
30-
generate,
31-
get_and_update_service_from_api_specs,
32-
get_suffix_from_api_specs,
33-
update_spec,
3429
generate_typespec_project,
35-
is_mgmt_premium,
3630
)
3731

3832
os.chdir(pwd)
3933

4034

41-
def update_parameters(suffix):
42-
# update changeable parameters in parameters.py
43-
global SUFFIX, NAMESPACE_SUFFIX, ARTIFACT_SUFFIX, NAMESPACE_FORMAT, ARTIFACT_FORMAT, OUTPUT_FOLDER_FORMAT
44-
45-
SUFFIX = suffix
46-
47-
NAMESPACE_SUFFIX = ".{0}".format(SUFFIX) if SUFFIX else ""
48-
ARTIFACT_SUFFIX = "-{0}".format(SUFFIX) if SUFFIX else ""
49-
NAMESPACE_FORMAT = "com.azure.resourcemanager.{{0}}{0}".format(NAMESPACE_SUFFIX)
50-
ARTIFACT_FORMAT = "azure-resourcemanager-{{0}}{0}".format(ARTIFACT_SUFFIX)
51-
OUTPUT_FOLDER_FORMAT = "sdk/{{0}}/{0}".format(ARTIFACT_FORMAT)
52-
53-
5435
def parse_args() -> (argparse.ArgumentParser, argparse.Namespace):
5536
parser = argparse.ArgumentParser()
56-
parser.add_argument(
57-
"--spec-root",
58-
default="https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/",
59-
help="Spec root folder",
60-
)
61-
parser.add_argument(
62-
"-r",
63-
"--readme",
64-
help='Readme path, Sample: "storage" or "specification/storage/resource-manager/readme.md"',
65-
)
66-
parser.add_argument(
67-
"-c",
68-
"--tsp-config",
69-
help="The top level directory where the tspconfig.yaml for the service lives. "
70-
"Currently only support remote url with specific commitID "
71-
"e.g. https://github.com/Azure/azure-rest-api-specs/blob/042e4045dedff4baaf5ae551bf6c8087fbdacd40/specification/deviceregistry/DeviceRegistry.Management/tspconfig.yaml",
72-
)
73-
parser.add_argument("-t", "--tag", help="Specific tag")
74-
parser.add_argument("-v", "--version", help="Specific sdk version")
75-
parser.add_argument(
76-
"-s",
77-
"--service",
78-
help="Service Name if not the same as spec name",
79-
)
80-
parser.add_argument(
81-
"-u",
82-
"--use",
83-
default=AUTOREST_JAVA,
84-
help="Autorest java plugin",
85-
)
86-
parser.add_argument(
87-
"--autorest",
88-
default=AUTOREST_CORE_VERSION,
89-
help="Autorest version",
90-
)
91-
parser.add_argument(
92-
"--autorest-options",
93-
default="",
94-
help="Additional autorest options",
95-
)
96-
parser.add_argument("--suffix", help="Suffix for namespace and artifact")
97-
parser.add_argument(
98-
"--auto-commit-external-change",
99-
action="store_true",
100-
help="Automatic commit the generated code",
101-
)
102-
parser.add_argument("--user-name", help="User Name for commit")
103-
parser.add_argument("--user-email", help="User Email for commit")
10437
parser.add_argument(
10538
"config",
10639
nargs="*",
@@ -119,9 +52,6 @@ def sdk_automation(input_file: str, output_file: str):
11952
try:
12053
# typespec
12154
packages = sdk_automation_typespec(config)
122-
# autorest
123-
if not packages:
124-
packages = sdk_automation_autorest(config)
12555
except ValueError:
12656
logging.error("[VALIDATION] Parameter validation failed.", exc_info=True)
12757
sys.exit(1)
@@ -141,109 +71,6 @@ def sdk_automation(input_file: str, output_file: str):
14171
sys.exit(1)
14272

14373

144-
def sdk_automation_autorest(config: dict) -> List[dict]:
145-
base_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
146-
sdk_root = os.path.abspath(os.path.join(base_dir, SDK_ROOT))
147-
api_specs_file = os.path.join(base_dir, API_SPECS_FILE)
148-
149-
packages = []
150-
breaking = False
151-
changelog = ""
152-
breaking_change_items = []
153-
if "relatedReadmeMdFiles" not in config or not config["relatedReadmeMdFiles"]:
154-
return packages
155-
156-
for readme in config["relatedReadmeMdFiles"]:
157-
match = re.search(
158-
r"specification/([^/]+)/resource-manager((?:/[^/]+)*)/readme.md",
159-
readme,
160-
re.IGNORECASE,
161-
)
162-
if not match:
163-
logging.info("[Skip] readme path does not format as specification/*/resource-manager/*/readme.md")
164-
else:
165-
spec = match.group(1)
166-
spec = update_spec(spec, match.group(2))
167-
service = get_and_update_service_from_api_specs(api_specs_file, spec, truncate_service=True)
168-
169-
pre_suffix = SUFFIX
170-
suffix = get_suffix_from_api_specs(api_specs_file, spec)
171-
if suffix is None:
172-
suffix = SUFFIX
173-
update_parameters(suffix)
174-
175-
# TODO: use specific function to detect tag in "resources" spec/service
176-
tag = None
177-
if service == "resources" and spec == service:
178-
with open(os.path.join(config["specFolder"], readme)) as fin:
179-
tag_match = re.search(r"tag: (package-resources-\S+)", fin.read())
180-
if tag_match:
181-
tag = tag_match.group(1)
182-
else:
183-
tag = "package-resources-2025-04"
184-
185-
module = ARTIFACT_FORMAT.format(service)
186-
output_folder = OUTPUT_FOLDER_FORMAT.format(service)
187-
namespace = NAMESPACE_FORMAT.format(service)
188-
stable_version, current_version = set_or_increase_version(sdk_root, GROUP_ID, module)
189-
succeeded = generate(
190-
sdk_root,
191-
service,
192-
spec_root=config["specFolder"],
193-
readme=readme,
194-
autorest=AUTOREST_CORE_VERSION,
195-
use=AUTOREST_JAVA,
196-
output_folder=output_folder,
197-
module=module,
198-
namespace=namespace,
199-
tag=tag,
200-
premium=is_mgmt_premium(module),
201-
)
202-
if succeeded:
203-
succeeded = compile_arm_package(sdk_root, module)
204-
if succeeded:
205-
stable_version = get_latest_ga_version(GROUP_ID, module, stable_version)
206-
breaking, changelog, breaking_change_items = compare_with_maven_package(
207-
sdk_root, GROUP_ID, service, stable_version, current_version, module
208-
)
209-
210-
packages.append(
211-
{
212-
"packageName": "{0}".format(ARTIFACT_FORMAT.format(service)),
213-
"path": [
214-
output_folder,
215-
CI_FILE_FORMAT.format(service),
216-
POM_FILE_FORMAT.format(service),
217-
"eng/versioning",
218-
"pom.xml",
219-
],
220-
"readmeMd": [readme],
221-
"artifacts": (
222-
["{0}/pom.xml".format(output_folder)]
223-
+ [jar for jar in glob.glob("{0}/target/*.jar".format(output_folder))]
224-
if succeeded
225-
else []
226-
),
227-
"apiViewArtifact": next(iter(glob.glob("{0}/target/*-sources.jar".format(output_folder))), None),
228-
"language": "Java",
229-
"result": "succeeded" if succeeded else "failed",
230-
"changelog": {
231-
"content": changelog,
232-
"hasBreakingChange": breaking,
233-
"breakingChangeItems": breaking_change_items,
234-
},
235-
}
236-
)
237-
238-
update_parameters(pre_suffix)
239-
240-
if not packages:
241-
# try data-plane codegen
242-
packages = sdk_automation_data(config)
243-
244-
return packages
245-
246-
24774
def sdk_automation_typespec(config: dict) -> List[dict]:
24875

24976
packages = []
@@ -491,90 +318,14 @@ def main():
491318
(parser, args) = parse_args()
492319
args = vars(args)
493320

494-
if args.get("config"):
495-
return sdk_automation(args["config"][0], args["config"][1])
496-
497-
base_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
498-
sdk_root = os.path.abspath(os.path.join(base_dir, SDK_ROOT))
499-
api_specs_file = os.path.join(base_dir, API_SPECS_FILE)
500-
501-
if args.get("tsp_config"):
502-
tsp_config = args["tsp_config"]
321+
config = args.get("config")
322+
if config:
323+
if len(config) != 2:
324+
parser.error("config requires exactly two arguments: generationInput and generationOutput")
325+
return sdk_automation(config[0], config[1])
503326

504-
succeeded, require_sdk_integration, sdk_folder, service, module = generate_typespec_project(
505-
tsp_project=tsp_config, sdk_root=sdk_root, remove_before_regen=True, group_id=GROUP_ID, **args
506-
)
507-
508-
stable_version, current_version = set_or_increase_version(sdk_root, GROUP_ID, module, **args)
509-
args["version"] = current_version
510-
511-
if require_sdk_integration:
512-
update_service_files_for_new_lib(sdk_root, service, GROUP_ID, module)
513-
update_root_pom(sdk_root, service)
514-
515-
output_folder = sdk_folder
516-
update_version(sdk_root, output_folder)
517-
update_changelog_version(sdk_root, output_folder, current_version)
518-
else:
519-
if not args.get("readme"):
520-
parser.print_help()
521-
sys.exit(0)
522-
523-
readme = args["readme"]
524-
match = re.match(
525-
r"specification/([^/]+)/resource-manager((?:/[^/]+)*)/readme.md",
526-
readme,
527-
re.IGNORECASE,
528-
)
529-
if not match:
530-
spec = readme
531-
readme = "specification/{0}/resource-manager/readme.md".format(spec)
532-
else:
533-
spec = match.group(1)
534-
spec = update_spec(spec, match.group(2))
535-
536-
args["readme"] = readme
537-
args["spec"] = spec
538-
539-
suffix = args.get("suffix") or get_suffix_from_api_specs(api_specs_file, spec)
540-
update_parameters(suffix)
541-
service = get_and_update_service_from_api_specs(api_specs_file, spec, args["service"], suffix)
542-
args["service"] = service
543-
module = ARTIFACT_FORMAT.format(service)
544-
premium = is_mgmt_premium(module)
545-
stable_version, current_version = set_or_increase_version(sdk_root, GROUP_ID, module, **args)
546-
args["version"] = current_version
547-
output_folder = OUTPUT_FOLDER_FORMAT.format(service)
548-
namespace = NAMESPACE_FORMAT.format(service)
549-
succeeded = generate(
550-
sdk_root, module=module, output_folder=output_folder, namespace=namespace, premium=premium, **args
551-
)
552-
553-
if succeeded:
554-
succeeded = compile_arm_package(sdk_root, module)
555-
if succeeded:
556-
latest_release_version = get_latest_release_version(stable_version, current_version)
557-
compare_with_maven_package(sdk_root, GROUP_ID, service, latest_release_version, current_version, module)
558-
559-
if args.get("auto_commit_external_change") and args.get("user_name") and args.get("user_email"):
560-
pwd = os.getcwd()
561-
try:
562-
os.chdir(sdk_root)
563-
os.system(
564-
"git add eng/versioning eng/automation pom.xml {0} {1}".format(
565-
CI_FILE_FORMAT.format(service), POM_FILE_FORMAT.format(service)
566-
)
567-
)
568-
os.system(
569-
'git -c user.name={0} -c user.email={1} commit -m "[Automation] External Change"'.format(
570-
args["user_name"], args["user_email"]
571-
)
572-
)
573-
finally:
574-
os.chdir(pwd)
575-
576-
if not succeeded:
577-
raise RuntimeError("Failed to generate code or compile the package")
327+
parser.print_help()
328+
sys.exit(0)
578329

579330

580331
if __name__ == "__main__":

0 commit comments

Comments
 (0)