@@ -563,21 +563,26 @@ def create_tag(db: ReleaseShelf) -> None:
563563 )
564564
565565
566- def wait_for_source_and_docs_artifacts (db : ReleaseShelf ) -> None :
567- # Determine if we need to wait for docs or only source artifacts .
566+ def wait_for_build_release (db : ReleaseShelf ) -> None :
567+ # Determine if we need to wait for docs.
568568 release_tag = db ["release" ]
569569 should_wait_for_docs = release_tag .includes_docs
570570
571571 # Create the directory so it's easier to place the artifacts there.
572572 release_path = Path (db ["git_repo" ] / str (release_tag ))
573- src_path = release_path / "src "
574- src_path .mkdir (parents = True , exist_ok = True )
573+ downloads_path = release_path / "downloads "
574+ downloads_path .mkdir (parents = True , exist_ok = True )
575575
576576 # Build the list of filepaths we're expecting.
577577 wait_for_paths = [
578- src_path / f"Python-{ release_tag } .tgz" ,
579- src_path / f"Python-{ release_tag } .tar.xz" ,
578+ downloads_path / f"Python-{ release_tag } .tgz" ,
579+ downloads_path / f"Python-{ release_tag } .tar.xz" ,
580580 ]
581+ if release_tag .as_tuple () >= (3 , 14 ):
582+ wait_for_paths += [
583+ downloads_path / f"python-{ release_tag } -{ arch } -linux-android.tar.gz"
584+ for arch in ["aarch64" , "x86_64" ]
585+ ]
581586 if should_wait_for_docs :
582587 docs_path = release_path / "docs"
583588 docs_path .mkdir (parents = True , exist_ok = True )
@@ -595,12 +600,12 @@ def wait_for_source_and_docs_artifacts(db: ReleaseShelf) -> None:
595600 ]
596601 )
597602
598- print (
599- f"Waiting for source{ ' and docs' if should_wait_for_docs else '' } artifacts to be built"
600- )
601- print (f"Artifacts should be placed at '{ release_path } ':" )
603+ print ("Once the build-release workflow is complete:" )
604+ print ("- Download its artifacts from the workflow summary page." )
605+ print (f"- Copy the following files into { release_path } :" )
602606 for path in wait_for_paths :
603- print (f"- '{ os .path .relpath (path , release_path )} '" )
607+ print (f" - { os .path .relpath (path , release_path )} " )
608+ print ("The script will continue once all files are present." )
604609
605610 while not all (path .exists () for path in wait_for_paths ):
606611 time .sleep (1 )
@@ -636,7 +641,7 @@ def sign_source_artifacts(db: ReleaseShelf) -> None:
636641 subprocess .check_call ('gpg -K | grep -A 1 "^sec"' , shell = True )
637642 uid = input ("Please enter key ID to use for signing: " )
638643
639- tarballs_path = Path (db ["git_repo" ] / str (db ["release" ]) / "src " )
644+ tarballs_path = Path (db ["git_repo" ] / str (db ["release" ]) / "downloads " )
640645 tgz = str (tarballs_path / f"Python-{ db ['release' ]} .tgz" )
641646 xz = str (tarballs_path / f"Python-{ db ['release' ]} .tar.xz" )
642647
@@ -678,7 +683,9 @@ def build_sbom_artifacts(db: ReleaseShelf) -> None:
678683 # For each source tarball build an SBOM.
679684 for ext in (".tgz" , ".tar.xz" ):
680685 tarball_name = f"Python-{ release_version } { ext } "
681- tarball_path = str (db ["git_repo" ] / str (db ["release" ]) / "src" / tarball_name )
686+ tarball_path = str (
687+ db ["git_repo" ] / str (db ["release" ]) / "downloads" / tarball_name
688+ )
682689
683690 print (f"Building an SBOM for artifact '{ tarball_name } '" )
684691 sbom_data = sbom .create_sbom_for_source_tarball (tarball_path )
@@ -724,7 +731,7 @@ def upload_files_to_server(db: ReleaseShelf, server: str) -> None:
724731 transport = client .get_transport ()
725732 assert transport is not None , f"SSH transport to { server } is None"
726733
727- destination = Path (f"/home/psf-users/ { db ['ssh_user' ]} /{ db ['release' ]} " )
734+ destination = Path (f"/home/{ db ['ssh_user' ]} /{ db ['release' ]} " )
728735 ftp_client = MySFTPClient .from_transport (transport )
729736 assert ftp_client is not None , f"SFTP client to { server } is None"
730737
@@ -750,7 +757,7 @@ def upload_subdir(subdir: str) -> None:
750757 if server == DOCS_SERVER :
751758 upload_subdir ("docs" )
752759 elif server == DOWNLOADS_SERVER :
753- upload_subdir ("src " )
760+ upload_subdir ("downloads " )
754761 if (artifacts_path / "docs" ).exists ():
755762 upload_subdir ("docs" )
756763
@@ -769,7 +776,7 @@ def place_files_in_download_folder(db: ReleaseShelf) -> None:
769776 transport = client .get_transport ()
770777 assert transport is not None , f"SSH transport to { DOWNLOADS_SERVER } is None"
771778
772- # Sources
779+ # Downloads
773780
774781 source = f"/home/psf-users/{ db ['ssh_user' ]} /{ db ['release' ]} "
775782 destination = f"/srv/www.python.org/ftp/python/{ db ['release' ].normalized ()} "
@@ -781,7 +788,7 @@ def execute_command(command: str) -> None:
781788 raise ReleaseException (channel .recv_stderr (1000 ))
782789
783790 execute_command (f"mkdir -p { destination } " )
784- execute_command (f"cp { source } /src /* { destination } " )
791+ execute_command (f"cp { source } /downloads /* { destination } " )
785792 execute_command (f"chgrp downloads { destination } " )
786793 execute_command (f"chmod 775 { destination } " )
787794 execute_command (f"find { destination } -type f -exec chmod 664 {{}} \\ ;" )
@@ -880,7 +887,7 @@ def get_origin_remote_url(git_repo: Path) -> str:
880887 return origin_remote_url
881888
882889
883- def start_build_of_source_and_docs (db : ReleaseShelf ) -> None :
890+ def start_build_release (db : ReleaseShelf ) -> None :
884891 commit_sha = get_commit_sha (db ["release" ].gitname , db ["git_repo" ])
885892 origin_remote_url = get_origin_remote_url (db ["git_repo" ])
886893 origin_remote_github_owner = extract_github_owner (origin_remote_url )
@@ -922,8 +929,8 @@ def start_build_of_source_and_docs(db: ReleaseShelf) -> None:
922929 )
923930 print ()
924931
925- if not ask_question ("Have you started the source and docs build?" ):
926- raise ReleaseException ("Source and docs build must be started" )
932+ if not ask_question ("Have you started the build-release workflow ?" ):
933+ raise ReleaseException ("build-release workflow must be started" )
927934
928935
929936def send_email_to_platform_release_managers (db : ReleaseShelf ) -> None :
@@ -936,7 +943,7 @@ def send_email_to_platform_release_managers(db: ReleaseShelf) -> None:
936943 print (f"{ github_prefix } /{ db ['release' ].gitname } " )
937944 print (f"Git commit SHA: { commit_sha } " )
938945 print (
939- "Source/docs build: https://github.com/python/release-tools/actions/runs/[ENTER-RUN-ID-HERE]"
946+ "build-release workflow : https://github.com/python/release-tools/actions/runs/[ENTER-RUN-ID-HERE]"
940947 )
941948 print ()
942949
@@ -1363,18 +1370,12 @@ def _api_key(api_key: str) -> str:
13631370 Task (check_cpython_repo_is_clean , "Checking Git repository is clean" ),
13641371 Task (create_tag , "Create tag" ),
13651372 Task (push_to_local_fork , "Push new tags and branches to private fork" ),
1366- Task (
1367- start_build_of_source_and_docs ,
1368- "Start the builds for source and docs artifacts" ,
1369- ),
1373+ Task (start_build_release , "Start the build-release workflow" ),
13701374 Task (
13711375 send_email_to_platform_release_managers ,
13721376 "Platform release managers have been notified of the commit SHA" ,
13731377 ),
1374- Task (
1375- wait_for_source_and_docs_artifacts ,
1376- "Wait for source and docs artifacts to build" ,
1377- ),
1378+ Task (wait_for_build_release , "Wait for build-release workflow" ),
13781379 Task (check_doc_unreleased_version , "Check docs for `(unreleased)`" ),
13791380 Task (build_sbom_artifacts , "Building SBOM artifacts" ),
13801381 * ([] if no_gpg else [Task (sign_source_artifacts , "Sign source artifacts" )]),
0 commit comments