@@ -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 )} \n Created 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