Skip to content

Commit 8e17bb4

Browse files
authored
Add --no-gpg to skip signing with GPG (#150)
1 parent 84070fe commit 8e17bb4

File tree

2 files changed

+34
-14
lines changed

2 files changed

+34
-14
lines changed

release.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,7 @@ def scp(from_loc: str, to_loc: str) -> None:
580580
)
581581

582582

583-
def make_tag(tag: Tag) -> bool:
583+
def make_tag(tag: Tag, *, sign_gpg: bool = True) -> bool:
584584
# make sure we've run blurb export
585585
good_files = glob.glob("Misc/NEWS.d/" + str(tag) + ".rst")
586586
bad_files = list(glob.glob("Misc/NEWS.d/next/*/0*.rst"))
@@ -608,13 +608,21 @@ def make_tag(tag: Tag) -> bool:
608608
):
609609
print("Aborting.")
610610
return False
611-
print("Signing tag")
612-
uid = os.environ.get("GPG_KEY_FOR_RELEASE")
613-
if not uid:
614-
print("List of available private keys:")
615-
run_cmd(['gpg -K | grep -A 1 "^sec"'], shell=True)
616-
uid = input("Please enter key ID to use for signing: ")
617-
run_cmd(["git", "tag", "-s", "-u", uid, tag.gitname, "-m", "Python " + str(tag)])
611+
612+
if sign_gpg:
613+
print("Signing tag")
614+
uid = os.environ.get("GPG_KEY_FOR_RELEASE")
615+
if not uid:
616+
print("List of available private keys:")
617+
run_cmd(['gpg -K | grep -A 1 "^sec"'], shell=True)
618+
uid = input("Please enter key ID to use for signing: ")
619+
run_cmd(
620+
["git", "tag", "-s", "-u", uid, tag.gitname, "-m", "Python " + str(tag)]
621+
)
622+
else:
623+
print("Creating tag")
624+
run_cmd(["git", "tag", tag.gitname, "-m", "Python " + str(tag)])
625+
618626
return True
619627

620628

run_release.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ def __init__(
201201
git_repo: str,
202202
api_key: str,
203203
ssh_user: str,
204+
sign_gpg: bool,
204205
first_state: Task | None = None,
205206
) -> None:
206207
self.tasks = tasks
@@ -223,6 +224,8 @@ def __init__(
223224
self.db["auth_info"] = api_key
224225
if not self.db.get("ssh_user"):
225226
self.db["ssh_user"] = ssh_user
227+
if not self.db.get("sign_gpg"):
228+
self.db["sign_gpg"] = sign_gpg
226229

227230
if not self.db.get("release"):
228231
self.db["release"] = release_tag
@@ -233,7 +236,8 @@ def __init__(
233236
print(f"- Normalized release tag: {release_tag.normalized()}")
234237
print(f"- Git repo: {self.db['git_repo']}")
235238
print(f"- SSH username: {self.db['ssh_user']}")
236-
print(f"- python.org API key : {self.db['auth_info']}")
239+
print(f"- python.org API key: {self.db['auth_info']}")
240+
print(f"- Sign with GPG: {self.db['sign_gpg']}")
237241
print()
238242

239243
def checkpoint(self) -> None:
@@ -465,7 +469,7 @@ def bump_version(db: DbfilenameShelf) -> None:
465469

466470
def create_tag(db: DbfilenameShelf) -> None:
467471
with cd(db["git_repo"]):
468-
if not release_mod.make_tag(db["release"]):
472+
if not release_mod.make_tag(db["release"], sign_gpg=db["sign_gpg"]):
469473
raise ReleaseException("Error when creating tag")
470474
subprocess.check_call(
471475
["git", "commit", "-a", "--amend", "--no-edit"], cwd=db["git_repo"]
@@ -810,7 +814,7 @@ def create_release_object_in_db(db: DbfilenameShelf) -> None:
810814
"Go to https://www.python.org/admin/downloads/release/add/ and create a new release"
811815
)
812816
if not ask_question(f"Have you already created a new release for {db['release']}"):
813-
raise ReleaseException("The django release object has not been created")
817+
raise ReleaseException("The Django release object has not been created")
814818

815819

816820
def wait_until_all_files_are_in_folder(db: DbfilenameShelf) -> None:
@@ -1137,6 +1141,11 @@ def _api_key(api_key: str) -> str:
11371141
help="Username to be used when authenticating via ssh",
11381142
type=str,
11391143
)
1144+
parser.add_argument(
1145+
"--no-gpg",
1146+
action="store_true",
1147+
help="Skip GPG signing",
1148+
)
11401149
args = parser.parse_args()
11411150

11421151
auth_key = args.auth_key or os.getenv("AUTH_INFO")
@@ -1164,7 +1173,7 @@ def _api_key(api_key: str) -> str:
11641173
Task(check_docker, "Checking Docker is available"),
11651174
Task(check_docker_running, "Checking Docker is running"),
11661175
Task(check_autoconf, "Checking autoconf is available"),
1167-
Task(check_gpg_keys, "Checking GPG keys"),
1176+
None if args.no_gpg else Task(check_gpg_keys, "Checking GPG keys"),
11681177
Task(
11691178
check_ssh_connection,
11701179
f"Validating ssh connection to {DOWNLOADS_SERVER} and {DOCS_SERVER}",
@@ -1196,13 +1205,13 @@ def _api_key(api_key: str) -> str:
11961205
"Wait for source and docs artifacts to build",
11971206
),
11981207
Task(build_sbom_artifacts, "Building SBOM artifacts"),
1199-
Task(sign_source_artifacts, "Sign source artifacts"),
1208+
None if args.no_gpg else Task(sign_source_artifacts, "Sign source artifacts"),
12001209
Task(upload_files_to_server, "Upload files to the PSF server"),
12011210
Task(place_files_in_download_folder, "Place files in the download folder"),
12021211
Task(upload_docs_to_the_docs_server, "Upload docs to the PSF docs server"),
12031212
Task(unpack_docs_in_the_docs_server, "Place docs files in the docs folder"),
12041213
Task(wait_until_all_files_are_in_folder, "Wait until all files are ready"),
1205-
Task(create_release_object_in_db, "The django release object has been created"),
1214+
Task(create_release_object_in_db, "The Django release object has been created"),
12061215
Task(post_release_merge, "Merge the tag into the release branch"),
12071216
Task(branch_new_versions, "Branch out new versions and prepare main branch"),
12081217
Task(post_release_tagging, "Final touches for the release"),
@@ -1216,11 +1225,14 @@ def _api_key(api_key: str) -> str:
12161225
Task(purge_the_cdn, "Purge the CDN of python.org/downloads"),
12171226
Task(modify_the_release_to_the_prerelease_pages, "Modify the pre-release page"),
12181227
]
1228+
# Remove any skipped tasks
1229+
tasks = [task for task in tasks if task]
12191230
automata = ReleaseDriver(
12201231
git_repo=args.repo,
12211232
release_tag=release_mod.Tag(args.release),
12221233
api_key=auth_key,
12231234
ssh_user=args.ssh_user,
1235+
sign_gpg=not args.no_gpg,
12241236
tasks=tasks,
12251237
)
12261238
automata.run()

0 commit comments

Comments
 (0)