Skip to content

Commit 6bee2b1

Browse files
Merge pull request #2642 from mbiarnes/re-use-microshift-advisory
ART-14766: re-use existing microshift advisory
2 parents e4a5dea + 1216e13 commit 6bee2b1

File tree

2 files changed

+388
-17
lines changed

2 files changed

+388
-17
lines changed

pyartcd/pyartcd/pipelines/build_microshift.py

Lines changed: 64 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,12 @@ async def run(self):
115115
# Check if microshift advisory is defined in assembly
116116
if ('microshift' not in advisories or advisories.get("microshift") <= 0) and not self.skip_prepare_advisory:
117117
self.advisory_num = await self.create_microshift_advisory()
118+
# Immediately save advisory to assembly config to prevent race conditions
119+
self._logger.info("Saving advisory %s to assembly config", self.advisory_num)
120+
pr_url = await self._create_or_update_pull_request(nvrs=None)
121+
await self.slack_client.say_in_thread(
122+
f"Microshift advisory {self.advisory_num} saved to assembly: {pr_url}"
123+
)
118124
await self._rebase_and_build_for_named_assembly()
119125
await self._trigger_microshift_sync()
120126
await self._trigger_build_microshift_bootc()
@@ -512,30 +518,55 @@ async def _rebase_and_build_rpm(
512518
record_log = parse_record_log(file)
513519
return record_log["build_rpm"][-1]["nvrs"].split(",")
514520

515-
def _pin_nvrs(self, nvrs: List[str], releases_config) -> Dict:
516-
"""Update releases.yml to pin the specified NVRs.
521+
def _pin_nvrs(self, nvrs: Optional[List[str]], releases_config) -> Optional[Dict]:
522+
"""Update releases.yml to pin the advisory and optionally the specified NVRs.
523+
524+
If nvrs is None or empty, only saves the advisory number.
525+
517526
Example:
518527
releases:
519528
4.11.7:
520529
assembly:
521-
members:
522-
rpms:
523-
- distgit_key: microshift
524-
metadata:
525-
is:
526-
el8: microshift-4.11.7-202209300751.p0.g7ebffc3.assembly.4.11.7.el8
530+
group:
531+
advisories:
532+
microshift: 12345
533+
members:
534+
rpms:
535+
- distgit_key: microshift
536+
metadata:
537+
is:
538+
el8: microshift-4.11.7-202209300751.p0.g7ebffc3.assembly.4.11.7.el8
527539
"""
540+
# Always save advisory number if available
541+
if self.advisory_num:
542+
advisories = (
543+
releases_config["releases"][self.assembly]
544+
.setdefault("assembly", {})
545+
.setdefault("group", {})
546+
.setdefault("advisories", {})
547+
)
548+
existing = advisories.get("microshift")
549+
if existing and existing > 0 and existing != self.advisory_num:
550+
self._logger.warning(
551+
f"Assembly {self.assembly} already references microshift advisory {existing}; "
552+
f"adopting existing advisory instead of newly created advisory {self.advisory_num}."
553+
)
554+
self.advisory_num = existing
555+
else:
556+
advisories["microshift"] = self.advisory_num
557+
558+
# If no NVRs provided, we're done (advisory-only save)
559+
if not nvrs:
560+
return None
561+
562+
# Pin NVRs
528563
is_entry = {}
529564
dg_key = "microshift"
530565
for nvr in nvrs:
531566
el_version = isolate_el_version_in_release(nvr)
532567
assert el_version is not None
533568
is_entry[f"el{el_version}"] = nvr
534569

535-
if self.advisory_num:
536-
releases_config["releases"][self.assembly].setdefault("assembly", {}).setdefault("group", {}).setdefault(
537-
"advisories", {}
538-
).setdefault("microshift", self.advisory_num)
539570
rpms_entry = (
540571
releases_config["releases"][self.assembly]
541572
.setdefault("assembly", {})
@@ -549,10 +580,17 @@ def _pin_nvrs(self, nvrs: List[str], releases_config) -> Dict:
549580
microshift_entry.setdefault("metadata", {})["is"] = is_entry
550581
return microshift_entry
551582

552-
async def _create_or_update_pull_request(self, nvrs: List[str]):
583+
async def _create_or_update_pull_request(self, nvrs: Optional[List[str]] = None):
553584
branch = f"auto-pin-microshift-{self.group}-{self.assembly}"
554-
title = f"Pin microshift build for {self.group} {self.assembly}"
555-
body = f"Created by job run {jenkins.get_build_url()}"
585+
586+
# Determine PR title and body based on what we're saving
587+
if nvrs:
588+
title = f"Pin microshift build for {self.group} {self.assembly}"
589+
body = f"Pinning builds: {', '.join(nvrs)}\nCreated by job run {jenkins.get_build_url()}"
590+
else:
591+
title = f"Add microshift advisory for {self.group} {self.assembly}"
592+
body = f"Advisory {self.advisory_num} created by job run {jenkins.get_build_url()}"
593+
556594
if self.runtime.dry_run:
557595
self._logger.warning(
558596
"[DRY RUN] Would have created pull-request with head '%s', title '%s', body '%s'",
@@ -561,28 +599,37 @@ async def _create_or_update_pull_request(self, nvrs: List[str]):
561599
body,
562600
)
563601
return "https://github.example.com/foo/bar/pull/1234"
602+
564603
upstream_repo = self.github_client.get_repo("openshift-eng/ocp-build-data")
565604
release_file_content = yaml.load(upstream_repo.get_contents("releases.yml", ref=self.group).decoded_content)
566605
source_file_content = copy.deepcopy(release_file_content)
567606
self._pin_nvrs(nvrs, release_file_content)
607+
568608
if source_file_content == release_file_content:
569-
self._logger.warning("PR is not created: upstream already updated, nothing to change.")
609+
self._logger.info("PR is not created: upstream already updated, nothing to change.")
570610
return "Nothing to change"
611+
612+
# Delete branch if it exists
571613
for b in upstream_repo.get_branches():
572614
if b.name == branch:
573615
upstream_repo.get_git_ref(f"heads/{branch}").delete()
616+
617+
# Create branch and commit changes
574618
upstream_repo.create_git_ref(f"refs/heads/{branch}", upstream_repo.get_branch(self.group).commit.sha)
575619
output = io.BytesIO()
576620
yaml.dump(release_file_content, output)
577621
output.seek(0)
578622
fork_file = upstream_repo.get_contents("releases.yml", ref=branch)
579623
upstream_repo.update_file("releases.yml", body, output.read(), fork_file.sha, branch=branch)
580-
# create pr
624+
625+
# Create and merge PR
581626
try:
582627
pr = upstream_repo.create_pull(title=title, body=body, base=self.group, head=branch)
583628
pr.merge()
629+
self._logger.info("PR created and merged: %s", pr.html_url)
584630
except GithubException as e:
585631
self._logger.warning(f"Failed to create pr: {e}")
632+
raise
586633
return pr.html_url
587634

588635
async def _notify_microshift_alerts(self, version_release: str):

0 commit comments

Comments
 (0)