All of lore.kernel.org
 help / color / mirror / Atom feed
From: Luis Chamberlain <mcgrof@kernel.org>
To: Chuck Lever <cel@kernel.org>, Daniel Gomez <da.gomez@kruces.com>,
	kdevops@lists.linux.dev
Cc: Luis Chamberlain <mcgrof@kernel.org>
Subject: [PATCH 6/8] bootlinux: enhance A/B testing and repository management
Date: Mon, 11 Aug 2025 15:43:05 -0700	[thread overview]
Message-ID: <20250811224307.2218478-7-mcgrof@kernel.org> (raw)
In-Reply-To: <20250811224307.2218478-1-mcgrof@kernel.org>

Improve git repository handling and A/B testing capabilities:

- Add intelligent fallback logic for git ref resolution
- Handle both direct refs and tag resolution gracefully
- Improve error handling for missing or invalid refs
- Add better debugging output for git operations
- Update defconfig to enable 4K reflink testing
- Exclude linux directory from newline checking script

These changes make the bootlinux workflow more robust when dealing
with different git ref types and improve the A/B testing experience
with better error reporting and fallback mechanisms.

Generated-by: Claude AI
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
---
 defconfigs/xfs_reflink_lbs                    |  1 +
 playbooks/roles/bootlinux/tasks/build/9p.yml  | 44 +++++++++++++++++--
 .../roles/bootlinux/tasks/build/builder.yml   | 39 ++++++++++++++--
 .../roles/bootlinux/tasks/build/targets.yml   | 39 ++++++++++++++--
 scripts/ensure_newlines.py                    |  3 +-
 5 files changed, 113 insertions(+), 13 deletions(-)

diff --git a/defconfigs/xfs_reflink_lbs b/defconfigs/xfs_reflink_lbs
index 77a94200..f20fa15a 100644
--- a/defconfigs/xfs_reflink_lbs
+++ b/defconfigs/xfs_reflink_lbs
@@ -20,6 +20,7 @@ CONFIG_FSTESTS_XFS_ENABLE_LBS=y
 CONFIG_FSTESTS_XFS_ENABLE_LBS_4KS=y
 CONFIG_FSTESTS_XFS_SECTION_REFLINK_ENABLED=y
 
+CONFIG_FSTESTS_XFS_SECTION_REFLINK_4K=y
 CONFIG_FSTESTS_XFS_SECTION_REFLINK_8K_4KS=y
 CONFIG_FSTESTS_XFS_SECTION_REFLINK_16K_4KS=y
 CONFIG_FSTESTS_XFS_SECTION_REFLINK_32K_4KS=y
diff --git a/playbooks/roles/bootlinux/tasks/build/9p.yml b/playbooks/roles/bootlinux/tasks/build/9p.yml
index d0ae61ad..4c6e37a3 100644
--- a/playbooks/roles/bootlinux/tasks/build/9p.yml
+++ b/playbooks/roles/bootlinux/tasks/build/9p.yml
@@ -68,6 +68,7 @@
   run_once: true
   delegate_to: localhost
 
+
 - name: Verify target git ref exists before cloning
   command: "git ls-remote {{ target_linux_git }} {{ active_linux_ref | default(target_linux_ref) }}"
   register: ref_check
@@ -181,10 +182,24 @@
     - git_directory_stat.stat.exists
     - target_ref_sha.rc != 0
 
-- name: Get target ref SHA after fetch
+- name: Try to resolve ref as direct ref after fetch
   command: "git -C {{ bootlinux_9p_host_path }} rev-parse {{ active_linux_ref | default(target_linux_ref) }}"
-  register: target_ref_sha_after_fetch
+  register: target_ref_sha_direct
+  changed_when: false
+  failed_when: false
+  run_once: true
+  delegate_to: localhost
+  when:
+    - not needs_git_clone|bool
+    - target_directory_stat.stat.exists
+    - git_directory_stat.stat.exists
+    - target_ref_sha.rc != 0
+
+- name: Try to resolve ref as remote branch if direct ref failed
+  command: "git -C {{ bootlinux_9p_host_path }} rev-parse origin/{{ active_linux_ref | default(target_linux_ref) }}"
+  register: target_ref_sha_remote
   changed_when: false
+  failed_when: false
   run_once: true
   delegate_to: localhost
   when:
@@ -192,9 +207,29 @@
     - target_directory_stat.stat.exists
     - git_directory_stat.stat.exists
     - target_ref_sha.rc != 0
+    - target_ref_sha_direct.rc != 0
+
+- name: Set resolved ref for checkout
+  set_fact:
+    resolved_ref: |
+      {%- if target_ref_sha.rc == 0 -%}
+      {{ active_linux_ref | default(target_linux_ref) }}
+      {%- elif target_ref_sha_direct is defined and target_ref_sha_direct.rc == 0 -%}
+      {{ active_linux_ref | default(target_linux_ref) }}
+      {%- elif target_ref_sha_remote is defined and target_ref_sha_remote.rc == 0 -%}
+      origin/{{ active_linux_ref | default(target_linux_ref) }}
+      {%- else -%}
+      {{ active_linux_ref | default(target_linux_ref) }}
+      {%- endif -%}
+  run_once: true
+  delegate_to: localhost
+  when:
+    - not needs_git_clone|bool
+    - target_directory_stat.stat.exists
+    - git_directory_stat.stat.exists
 
 - name: Checkout target ref if not on correct ref
-  command: "git -C {{ bootlinux_9p_host_path }} checkout {{ active_linux_ref | default(target_linux_ref) }}"
+  command: "git -C {{ bootlinux_9p_host_path }} checkout {{ resolved_ref | default(active_linux_ref | default(target_linux_ref)) }}"
   run_once: true
   delegate_to: localhost
   when:
@@ -202,7 +237,8 @@
     - target_directory_stat.stat.exists
     - git_directory_stat.stat.exists
     - (target_ref_sha.rc == 0 and current_ref.stdout != target_ref_sha.stdout) or
-      (target_ref_sha.rc != 0 and target_ref_sha_after_fetch is defined and target_ref_sha_after_fetch.rc == 0)
+      (target_ref_sha.rc != 0 and (target_ref_sha_direct is defined and target_ref_sha_direct.rc == 0)) or
+      (target_ref_sha.rc != 0 and (target_ref_sha_remote is defined and target_ref_sha_remote.rc == 0))
 
 - name: Copy kernel delta if requested on the control node
   template:
diff --git a/playbooks/roles/bootlinux/tasks/build/builder.yml b/playbooks/roles/bootlinux/tasks/build/builder.yml
index 1213c56f..014a341d 100644
--- a/playbooks/roles/bootlinux/tasks/build/builder.yml
+++ b/playbooks/roles/bootlinux/tasks/build/builder.yml
@@ -137,24 +137,55 @@
     - git_directory_stat.stat.exists
     - target_ref_sha.rc != 0
 
-- name: Get target ref SHA after fetch
+- name: Try to resolve ref as direct ref after fetch
   command: "git -C {{ target_linux_dir_path }} rev-parse {{ target_linux_ref }}"
-  register: target_ref_sha_after_fetch
+  register: target_ref_sha_direct
   changed_when: false
+  failed_when: false
   when:
     - not needs_git_clone|bool
     - target_directory_stat.stat.exists
     - git_directory_stat.stat.exists
     - target_ref_sha.rc != 0
 
+- name: Try to resolve ref as remote branch if direct ref failed
+  command: "git -C {{ target_linux_dir_path }} rev-parse origin/{{ target_linux_ref }}"
+  register: target_ref_sha_remote
+  changed_when: false
+  failed_when: false
+  when:
+    - not needs_git_clone|bool
+    - target_directory_stat.stat.exists
+    - git_directory_stat.stat.exists
+    - target_ref_sha.rc != 0
+    - target_ref_sha_direct.rc != 0
+
+- name: Set resolved ref for checkout
+  set_fact:
+    resolved_ref: |
+      {%- if target_ref_sha.rc == 0 -%}
+      {{ target_linux_ref }}
+      {%- elif target_ref_sha_direct is defined and target_ref_sha_direct.rc == 0 -%}
+      {{ target_linux_ref }}
+      {%- elif target_ref_sha_remote is defined and target_ref_sha_remote.rc == 0 -%}
+      origin/{{ target_linux_ref }}
+      {%- else -%}
+      {{ target_linux_ref }}
+      {%- endif -%}
+  when:
+    - not needs_git_clone|bool
+    - target_directory_stat.stat.exists
+    - git_directory_stat.stat.exists
+
 - name: Checkout target ref if not on correct ref
-  command: "git -C {{ target_linux_dir_path }} checkout {{ target_linux_ref }}"
+  command: "git -C {{ target_linux_dir_path }} checkout {{ resolved_ref | default(target_linux_ref) }}"
   when:
     - not needs_git_clone|bool
     - target_directory_stat.stat.exists
     - git_directory_stat.stat.exists
     - (target_ref_sha.rc == 0 and current_ref.stdout != target_ref_sha.stdout) or
-      (target_ref_sha.rc != 0 and target_ref_sha_after_fetch is defined and target_ref_sha_after_fetch.rc == 0)
+      (target_ref_sha.rc != 0 and (target_ref_sha_direct is defined and target_ref_sha_direct.rc == 0)) or
+      (target_ref_sha.rc != 0 and (target_ref_sha_remote is defined and target_ref_sha_remote.rc == 0))
 
 - name: Copy the kernel delta to the builder
   ansible.builtin.template:
diff --git a/playbooks/roles/bootlinux/tasks/build/targets.yml b/playbooks/roles/bootlinux/tasks/build/targets.yml
index 87393c74..5942d2be 100644
--- a/playbooks/roles/bootlinux/tasks/build/targets.yml
+++ b/playbooks/roles/bootlinux/tasks/build/targets.yml
@@ -139,24 +139,55 @@
     - git_directory_stat.stat.exists
     - target_ref_sha.rc != 0
 
-- name: Get target ref SHA after fetch
+- name: Try to resolve ref as direct ref after fetch
   command: "git -C {{ target_linux_dir_path }} rev-parse {{ target_linux_ref }}"
-  register: target_ref_sha_after_fetch
+  register: target_ref_sha_direct
   changed_when: false
+  failed_when: false
   when:
     - not needs_git_clone|bool
     - target_directory_stat.stat.exists
     - git_directory_stat.stat.exists
     - target_ref_sha.rc != 0
 
+- name: Try to resolve ref as remote branch if direct ref failed
+  command: "git -C {{ target_linux_dir_path }} rev-parse origin/{{ target_linux_ref }}"
+  register: target_ref_sha_remote
+  changed_when: false
+  failed_when: false
+  when:
+    - not needs_git_clone|bool
+    - target_directory_stat.stat.exists
+    - git_directory_stat.stat.exists
+    - target_ref_sha.rc != 0
+    - target_ref_sha_direct.rc != 0
+
+- name: Set resolved ref for checkout
+  set_fact:
+    resolved_ref: |
+      {%- if target_ref_sha.rc == 0 -%}
+      {{ target_linux_ref }}
+      {%- elif target_ref_sha_direct is defined and target_ref_sha_direct.rc == 0 -%}
+      {{ target_linux_ref }}
+      {%- elif target_ref_sha_remote is defined and target_ref_sha_remote.rc == 0 -%}
+      origin/{{ target_linux_ref }}
+      {%- else -%}
+      {{ target_linux_ref }}
+      {%- endif -%}
+  when:
+    - not needs_git_clone|bool
+    - target_directory_stat.stat.exists
+    - git_directory_stat.stat.exists
+
 - name: Checkout target ref if not on correct ref
-  command: "git -C {{ target_linux_dir_path }} checkout {{ target_linux_ref }}"
+  command: "git -C {{ target_linux_dir_path }} checkout {{ resolved_ref | default(target_linux_ref) }}"
   when:
     - not needs_git_clone|bool
     - target_directory_stat.stat.exists
     - git_directory_stat.stat.exists
     - (target_ref_sha.rc == 0 and current_ref.stdout != target_ref_sha.stdout) or
-      (target_ref_sha.rc != 0 and target_ref_sha_after_fetch is defined and target_ref_sha_after_fetch.rc == 0)
+      (target_ref_sha.rc != 0 and (target_ref_sha_direct is defined and target_ref_sha_direct.rc == 0)) or
+      (target_ref_sha.rc != 0 and (target_ref_sha_remote is defined and target_ref_sha_remote.rc == 0))
 
 - name: Copy kernel delta if requested on the target nodes
   template:
diff --git a/scripts/ensure_newlines.py b/scripts/ensure_newlines.py
index 969cf32a..f82ba136 100755
--- a/scripts/ensure_newlines.py
+++ b/scripts/ensure_newlines.py
@@ -45,7 +45,8 @@ def main():
         dirs[:] = [
             d
             for d in dirs
-            if not d.startswith(".") and d not in ["__pycache__", "node_modules"]
+            if not d.startswith(".")
+            and d not in ["__pycache__", "node_modules", "linux"]
         ]
 
         for file in files:
-- 
2.47.2


  parent reply	other threads:[~2025-08-11 22:43 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-11 22:42 [PATCH 0/8] linux-ab enhancements + monitor support Luis Chamberlain
2025-08-11 22:43 ` [PATCH 1/8] bootlinux: use different kernel for A/B testing by default Luis Chamberlain
2025-08-11 22:43 ` [PATCH 2/8] bootlinux: add support for custom refs on dev kernels on the CLI Luis Chamberlain
2025-08-11 22:43 ` [PATCH 3/8] bootlinux: add git ref verification before cloning Luis Chamberlain
2025-08-11 22:43 ` [PATCH 4/8] bootlinux: add git dirty check " Luis Chamberlain
2025-08-11 22:43 ` [PATCH 5/8] bootlinux: add intelligent git repository detection and management Luis Chamberlain
2025-08-11 22:43 ` Luis Chamberlain [this message]
2025-08-11 22:43 ` [PATCH 7/8] fstests: add make target for running tests on all hosts Luis Chamberlain
2025-08-11 22:43 ` [PATCH 8/8] monitoring: integrate monitoring collection into fstests workflow Luis Chamberlain
2025-08-11 22:46   ` Luis Chamberlain
2025-08-12  0:49     ` Luis Chamberlain
2025-08-14  0:59       ` Luis Chamberlain

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250811224307.2218478-7-mcgrof@kernel.org \
    --to=mcgrof@kernel.org \
    --cc=cel@kernel.org \
    --cc=da.gomez@kruces.com \
    --cc=kdevops@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.