Skip to content

Commit 1b0c0ae

Browse files
authored
Merge branch 'antalya-25.6.5' into backport/antalya-25.6.5/82304
2 parents 59f9b39 + 0ff5e8a commit 1b0c0ae

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+624
-545
lines changed

.github/actions/create_workflow_report/ci_run_report.html.jinja

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@
152152
</tr>
153153
<tr>
154154
<th class="hth no-sort">Build Report</th>
155-
<td><a href="https://s3.amazonaws.com/{{ s3_bucket }}/{{ pr_number }}/{{ commit_sha }}/builds/report.html">Build Report</a></td>
155+
<td>{% for job_name, link in build_report_links.items() %}<a href="{{ link }}">[{{ job_name }}]</a> {% endfor %}</td>
156156
</tr>
157157
<tr>
158158
<th class="hth no-sort">Date</th>

.github/actions/create_workflow_report/create_workflow_report.py

Lines changed: 112 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from datetime import datetime
88
from functools import lru_cache
99
from glob import glob
10+
import urllib.parse
1011

1112
import pandas as pd
1213
from jinja2 import Environment, FileSystemLoader
@@ -478,11 +479,15 @@ def format_test_name_for_linewrap(text: str) -> str:
478479

479480
def format_test_status(text: str) -> str:
480481
"""Format the test status for better readability."""
481-
color = (
482-
"red"
483-
if text.lower().startswith("fail")
484-
else "orange" if text.lower() in ("error", "broken", "pending") else "green"
485-
)
482+
if text.lower().startswith("fail"):
483+
color = "red"
484+
elif text.lower() == "skipped":
485+
color = "grey"
486+
elif text.lower() in ("success", "ok", "passed", "pass"):
487+
color = "green"
488+
else:
489+
color = "orange"
490+
486491
return f'<span style="font-weight: bold; color: {color}">{text}</span>'
487492

488493

@@ -510,6 +515,101 @@ def format_results_as_html_table(results) -> str:
510515
return html
511516

512517

518+
def backfill_skipped_statuses(
519+
job_statuses: pd.DataFrame, pr_number: int, branch: str, commit_sha: str
520+
):
521+
"""
522+
Fill in the job statuses for skipped jobs.
523+
"""
524+
525+
if pr_number == 0:
526+
ref_param = f"REF={branch}"
527+
workflow_name = "MasterCI"
528+
else:
529+
ref_param = f"PR={pr_number}"
530+
workflow_name = "PR"
531+
532+
status_file = f"result_{workflow_name.lower()}.json"
533+
s3_path = f"https://{S3_BUCKET}.s3.amazonaws.com/{ref_param.replace('=', 's/')}/{commit_sha}/{status_file}"
534+
response = requests.get(s3_path)
535+
536+
if response.status_code != 200:
537+
return job_statuses
538+
539+
status_data = response.json()
540+
skipped_jobs = []
541+
for job in status_data["results"]:
542+
if job["status"] == "skipped" and len(job["links"]) > 0:
543+
skipped_jobs.append(
544+
{
545+
"job_name": job["name"],
546+
"job_status": job["status"],
547+
"message": job["info"],
548+
"results_link": job["links"][0],
549+
}
550+
)
551+
552+
return pd.concat([job_statuses, pd.DataFrame(skipped_jobs)], ignore_index=True)
553+
554+
555+
def get_build_report_links(
556+
job_statuses: pd.DataFrame, pr_number: int, branch: str, commit_sha: str
557+
):
558+
"""
559+
Get the build report links for the given PR number, branch, and commit SHA.
560+
561+
First checks if a build job submitted a success or skipped status.
562+
If not available, it guesses the links.
563+
"""
564+
build_job_names = [
565+
"Build (amd_release)",
566+
"Build (arm_release)",
567+
"Docker server image",
568+
"Docker keeper image",
569+
]
570+
build_report_links = {}
571+
572+
for job in job_statuses.itertuples():
573+
if (
574+
job.job_name in build_job_names
575+
and job.job_status
576+
in (
577+
"success",
578+
"skipped",
579+
)
580+
and job.results_link
581+
):
582+
build_report_links[job.job_name] = job.results_link
583+
584+
if 0 < len(build_report_links) < len(build_job_names):
585+
# Only have some of the build jobs, guess the rest.
586+
# (It was straightforward to force the build jobs to always appear in the cache,
587+
# however doing the same for the docker image jobs is difficult.)
588+
ref_job, ref_link = list(build_report_links.items())[0]
589+
link_template = ref_link.replace(
590+
urllib.parse.quote(ref_job, safe=""), "{job_name}"
591+
)
592+
for job in build_job_names:
593+
if job not in build_report_links:
594+
build_report_links[job] = link_template.format(job_name=job)
595+
return build_report_links
596+
597+
# No cache or build result was found, guess the links
598+
if pr_number == 0:
599+
ref_param = f"REF={branch}"
600+
workflow_name = "MasterCI"
601+
else:
602+
ref_param = f"PR={pr_number}"
603+
workflow_name = "PR"
604+
605+
build_report_link_base = f"https://{S3_BUCKET}.s3.amazonaws.com/json.html?{ref_param}&sha={commit_sha}&name_0={urllib.parse.quote(workflow_name, safe='')}"
606+
build_report_links = {
607+
job_name: f"{build_report_link_base}&name_1={urllib.parse.quote(job_name, safe='')}"
608+
for job_name in build_job_names
609+
}
610+
return build_report_links
611+
612+
513613
def parse_args() -> argparse.Namespace:
514614
parser = argparse.ArgumentParser(description="Create a combined CI report.")
515615
parser.add_argument( # Need the full URL rather than just the ID to query the databases
@@ -626,6 +726,10 @@ def create_workflow_report(
626726
except Exception as e:
627727
pr_info_html = e
628728

729+
fail_results["job_statuses"] = backfill_skipped_statuses(
730+
fail_results["job_statuses"], pr_number, branch_name, commit_sha
731+
)
732+
629733
high_cve_count = 0
630734
if not cves_not_checked and len(fail_results["docker_images_cves"]) > 0:
631735
high_cve_count = (
@@ -666,6 +770,9 @@ def create_workflow_report(
666770
),
667771
"pr_new_fails": len(fail_results["pr_new_fails"]),
668772
},
773+
"build_report_links": get_build_report_links(
774+
fail_results["job_statuses"], pr_number, branch_name, commit_sha
775+
),
669776
"ci_jobs_status_html": format_results_as_html_table(
670777
fail_results["job_statuses"]
671778
),

.github/workflows/backport_branches.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1507,7 +1507,7 @@ jobs:
15071507

15081508
RegressionTestsRelease:
15091509
needs: [config_workflow, build_amd_release]
1510-
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'QnVpbGQgKGFtZF9yZWxlYXNlKQ==') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_regression')}}
1510+
if: ${{ !failure() && !cancelled() && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_regression')}}
15111511
uses: ./.github/workflows/regression.yml
15121512
secrets: inherit
15131513
with:
@@ -1519,7 +1519,7 @@ jobs:
15191519
workflow_config: ${{ needs.config_workflow.outputs.data }}
15201520
RegressionTestsAarch64:
15211521
needs: [config_workflow, build_arm_release]
1522-
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'QnVpbGQgKGFybV9yZWxlYXNlKQ==') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_regression') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_aarch64')}}
1522+
if: ${{ !failure() && !cancelled() && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_regression') && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_aarch64')}}
15231523
uses: ./.github/workflows/regression.yml
15241524
secrets: inherit
15251525
with:

.github/workflows/master.yml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,7 @@ jobs:
609609
EOF
610610
cat > ./ci/tmp/workflow_status.json << 'EOF'
611611
${{ toJson(needs) }}
612-
EOFUpdate reusable_build.yml
612+
EOF
613613
ENV_SETUP_SCRIPT_EOF
614614
615615
- name: Run
@@ -3595,7 +3595,7 @@ jobs:
35953595
35963596
stateless_tests_amd_coverage_1_6:
35973597
runs-on: [self-hosted, altinity-on-demand, altinity-func-tester-aarch64]
3598-
needs: [config_workflow, dockers_build_amd, dockers_build_arm, dockers_build_multiplatform_manifest, stateless_tests_amd_asan_distributed_plan_1_2, stateless_tests_amd_asan_distributed_plan_2_2, build_arm_coverage]
3598+
needs: [config_workflow, dockers_build_amd, dockers_build_arm, dockers_build_multiplatform_manifest, build_arm_coverage]
35993599
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'U3RhdGVsZXNzIHRlc3RzIChhbWRfY292ZXJhZ2UsMS82KQ==') }}
36003600
name: "Stateless tests (amd_coverage,1/6)"
36013601
outputs:
@@ -3640,7 +3640,7 @@ jobs:
36403640
36413641
stateless_tests_amd_coverage_2_6:
36423642
runs-on: [self-hosted, altinity-on-demand, altinity-func-tester-aarch64]
3643-
needs: [config_workflow, dockers_build_amd, dockers_build_arm, dockers_build_multiplatform_manifest, stateless_tests_amd_asan_distributed_plan_1_2, stateless_tests_amd_asan_distributed_plan_2_2, build_arm_coverage]
3643+
needs: [config_workflow, dockers_build_amd, dockers_build_arm, dockers_build_multiplatform_manifest, build_arm_coverage]
36443644
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'U3RhdGVsZXNzIHRlc3RzIChhbWRfY292ZXJhZ2UsMi82KQ==') }}
36453645
name: "Stateless tests (amd_coverage,2/6)"
36463646
outputs:
@@ -3685,7 +3685,7 @@ jobs:
36853685
36863686
stateless_tests_amd_coverage_3_6:
36873687
runs-on: [self-hosted, altinity-on-demand, altinity-func-tester-aarch64]
3688-
needs: [config_workflow, dockers_build_amd, dockers_build_arm, dockers_build_multiplatform_manifest, stateless_tests_amd_asan_distributed_plan_1_2, stateless_tests_amd_asan_distributed_plan_2_2, build_arm_coverage]
3688+
needs: [config_workflow, dockers_build_amd, dockers_build_arm, dockers_build_multiplatform_manifest, build_arm_coverage]
36893689
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'U3RhdGVsZXNzIHRlc3RzIChhbWRfY292ZXJhZ2UsMy82KQ==') }}
36903690
name: "Stateless tests (amd_coverage,3/6)"
36913691
outputs:
@@ -3730,7 +3730,7 @@ jobs:
37303730
37313731
stateless_tests_amd_coverage_4_6:
37323732
runs-on: [self-hosted, altinity-on-demand, altinity-func-tester-aarch64]
3733-
needs: [config_workflow, dockers_build_amd, dockers_build_arm, dockers_build_multiplatform_manifest, stateless_tests_amd_asan_distributed_plan_1_2, stateless_tests_amd_asan_distributed_plan_2_2, build_arm_coverage]
3733+
needs: [config_workflow, dockers_build_amd, dockers_build_arm, dockers_build_multiplatform_manifest, build_arm_coverage]
37343734
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'U3RhdGVsZXNzIHRlc3RzIChhbWRfY292ZXJhZ2UsNC82KQ==') }}
37353735
name: "Stateless tests (amd_coverage,4/6)"
37363736
outputs:
@@ -3775,7 +3775,7 @@ jobs:
37753775
37763776
stateless_tests_amd_coverage_5_6:
37773777
runs-on: [self-hosted, altinity-on-demand, altinity-func-tester-aarch64]
3778-
needs: [config_workflow, dockers_build_amd, dockers_build_arm, dockers_build_multiplatform_manifest, stateless_tests_amd_asan_distributed_plan_1_2, stateless_tests_amd_asan_distributed_plan_2_2, build_arm_coverage]
3778+
needs: [config_workflow, dockers_build_amd, dockers_build_arm, dockers_build_multiplatform_manifest, build_arm_coverage]
37793779
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'U3RhdGVsZXNzIHRlc3RzIChhbWRfY292ZXJhZ2UsNS82KQ==') }}
37803780
name: "Stateless tests (amd_coverage,5/6)"
37813781
outputs:
@@ -3820,7 +3820,7 @@ jobs:
38203820
38213821
stateless_tests_amd_coverage_6_6:
38223822
runs-on: [self-hosted, altinity-on-demand, altinity-func-tester-aarch64]
3823-
needs: [config_workflow, dockers_build_amd, dockers_build_arm, dockers_build_multiplatform_manifest, stateless_tests_amd_asan_distributed_plan_1_2, stateless_tests_amd_asan_distributed_plan_2_2, build_arm_coverage]
3823+
needs: [config_workflow, dockers_build_amd, dockers_build_arm, dockers_build_multiplatform_manifest, build_arm_coverage]
38243824
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'U3RhdGVsZXNzIHRlc3RzIChhbWRfY292ZXJhZ2UsNi82KQ==') }}
38253825
name: "Stateless tests (amd_coverage,6/6)"
38263826
outputs:
@@ -4610,7 +4610,7 @@ jobs:
46104610

46114611
RegressionTestsRelease:
46124612
needs: [config_workflow, build_amd_release]
4613-
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'QnVpbGQgKGFtZF9yZWxlYXNlKQ==') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_regression')}}
4613+
if: ${{ !failure() && !cancelled() && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_regression')}}
46144614
uses: ./.github/workflows/regression.yml
46154615
secrets: inherit
46164616
with:
@@ -4622,7 +4622,7 @@ jobs:
46224622
workflow_config: ${{ needs.config_workflow.outputs.data }}
46234623
RegressionTestsAarch64:
46244624
needs: [config_workflow, build_arm_release]
4625-
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'QnVpbGQgKGFybV9yZWxlYXNlKQ==') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_regression') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_aarch64')}}
4625+
if: ${{ !failure() && !cancelled() && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_regression') && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_aarch64')}}
46264626
uses: ./.github/workflows/regression.yml
46274627
secrets: inherit
46284628
with:

.github/workflows/merge_queue.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ jobs:
376376

377377
RegressionTestsRelease:
378378
needs: [config_workflow, build_amd_release]
379-
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'QnVpbGQgKGFtZF9yZWxlYXNlKQ==') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_regression')}}
379+
if: ${{ !failure() && !cancelled() && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_regression')}}
380380
uses: ./.github/workflows/regression.yml
381381
secrets: inherit
382382
with:
@@ -388,7 +388,7 @@ jobs:
388388
workflow_config: ${{ needs.config_workflow.outputs.data }}
389389
RegressionTestsAarch64:
390390
needs: [config_workflow, build_arm_release]
391-
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'QnVpbGQgKGFybV9yZWxlYXNlKQ==') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_regression') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_aarch64')}}
391+
if: ${{ !failure() && !cancelled() && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_regression') && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_aarch64')}}
392392
uses: ./.github/workflows/regression.yml
393393
secrets: inherit
394394
with:

.github/workflows/nightly_fuzzers.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ jobs:
274274

275275
RegressionTestsRelease:
276276
needs: [config_workflow, build_amd_release]
277-
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'QnVpbGQgKGFtZF9yZWxlYXNlKQ==') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_regression')}}
277+
if: ${{ !failure() && !cancelled() && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_regression')}}
278278
uses: ./.github/workflows/regression.yml
279279
secrets: inherit
280280
with:
@@ -286,7 +286,7 @@ jobs:
286286
workflow_config: ${{ needs.config_workflow.outputs.data }}
287287
RegressionTestsAarch64:
288288
needs: [config_workflow, build_arm_release]
289-
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'QnVpbGQgKGFybV9yZWxlYXNlKQ==') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_regression') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_aarch64')}}
289+
if: ${{ !failure() && !cancelled() && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_regression') && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_aarch64')}}
290290
uses: ./.github/workflows/regression.yml
291291
secrets: inherit
292292
with:

.github/workflows/nightly_jepsen.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ jobs:
274274

275275
RegressionTestsRelease:
276276
needs: [config_workflow, build_amd_release]
277-
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'QnVpbGQgKGFtZF9yZWxlYXNlKQ==') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_regression')}}
277+
if: ${{ !failure() && !cancelled() && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_regression')}}
278278
uses: ./.github/workflows/regression.yml
279279
secrets: inherit
280280
with:
@@ -286,7 +286,7 @@ jobs:
286286
workflow_config: ${{ needs.config_workflow.outputs.data }}
287287
RegressionTestsAarch64:
288288
needs: [config_workflow, build_arm_release]
289-
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'QnVpbGQgKGFybV9yZWxlYXNlKQ==') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_regression') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_aarch64')}}
289+
if: ${{ !failure() && !cancelled() && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_regression') && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_aarch64')}}
290290
uses: ./.github/workflows/regression.yml
291291
secrets: inherit
292292
with:

.github/workflows/nightly_statistics.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ jobs:
134134

135135
RegressionTestsRelease:
136136
needs: [config_workflow, build_amd_release]
137-
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'QnVpbGQgKGFtZF9yZWxlYXNlKQ==') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_regression')}}
137+
if: ${{ !failure() && !cancelled() && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_regression')}}
138138
uses: ./.github/workflows/regression.yml
139139
secrets: inherit
140140
with:
@@ -146,7 +146,7 @@ jobs:
146146
workflow_config: ${{ needs.config_workflow.outputs.data }}
147147
RegressionTestsAarch64:
148148
needs: [config_workflow, build_arm_release]
149-
if: ${{ !failure() && !cancelled() && !contains(fromJson(needs.config_workflow.outputs.data).cache_success_base64, 'QnVpbGQgKGFybV9yZWxlYXNlKQ==') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_regression') && !contains(fromJson(needs.config_workflow.outputs.data).pull_request.body, '[x] <!---ci_exclude_aarch64')}}
149+
if: ${{ !failure() && !cancelled() && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_regression') && !contains(github.event.pull_request.body, '[x] <!---ci_exclude_aarch64')}}
150150
uses: ./.github/workflows/regression.yml
151151
secrets: inherit
152152
with:

0 commit comments

Comments
 (0)