From 78276a58c5cc63e3c6cb2b1261a835b0b29f42e8 Mon Sep 17 00:00:00 2001 From: "James E. Blair" Date: Tue, 23 Jul 2024 16:40:37 -0700 Subject: [PATCH] Fix prepare-workspace-git operating on existing repos Commit 8003cdc76ca177061b1a462d07efaff83e18491b causes problems if the remote repo already exists (e.g., the worker node is static and not ephemeral) because it unconditionally removes settings which are only conditionally set if the workspace is newly cloned. Fix that by remove the Ansible "creates" check from the task and executing the set calls unconditionally (but also, recreate the functionality of the create check for the cloning part of the task, which is what we're really trying to avoid). This will run a few extra command such as clearing the bare flag and also resetting the origin remote. That should be fine in this role since we expect it to do whatever it takes to make the remote repo the same as the local one. Also, resync test-prepare-workspace-git. Change-Id: Ife12992df9ce2b0ce199b3980a4baa255cb0f28a --- roles/prepare-workspace-git/tasks/main.yaml | 23 ++++----- .../tasks/main.yaml | 48 ++++++------------- .../tasks/sync-project.yaml | 23 +++++++++ 3 files changed, 49 insertions(+), 45 deletions(-) create mode 100644 roles/test-prepare-workspace-git/tasks/sync-project.yaml diff --git a/roles/prepare-workspace-git/tasks/main.yaml b/roles/prepare-workspace-git/tasks/main.yaml index 51f554f02..8c4b18c5c 100644 --- a/roles/prepare-workspace-git/tasks/main.yaml +++ b/roles/prepare-workspace-git/tasks/main.yaml @@ -21,23 +21,24 @@ - name: Set initial repo states in workspace shell: | set -ex - if [ -d "{{ cached_repos_root }}/{{ zj_project.canonical_name }}" ] ; then - # We do a bare clone here first so that we skip creating a working - # copy that will be overwritten later anyway. - git clone --bare {{ cached_repos_root }}/{{ zj_project.canonical_name }} {{ zuul_workspace_root }}/{{ zj_project.src_dir }}/.git - else - git init {{ zuul_workspace_root }}/{{ zj_project.src_dir }} + if [ ! -d "{{ zuul_workspace_root }}/{{ zj_project.src_dir }}" ] ; then + if [ -d "{{ cached_repos_root }}/{{ zj_project.canonical_name }}" ] ; then + # We do a bare clone here first so that we skip creating a working + # copy that will be overwritten later anyway. + git clone --bare {{ cached_repos_root }}/{{ zj_project.canonical_name }} {{ zuul_workspace_root }}/{{ zj_project.src_dir }}/.git + else + git init {{ zuul_workspace_root }}/{{ zj_project.src_dir }} + fi + cd {{ zuul_workspace_root }}/{{ zj_project.src_dir }} + git config --local --bool core.bare false + git remote -v | grep origin && git remote rm origin || true + git remote add origin file:///dev/null fi cd {{ zuul_workspace_root }}/{{ zj_project.src_dir }} - git config --local --bool core.bare false # Allow pushing to non-bare repo git config --local receive.denyCurrentBranch ignore # Allow deleting current branch git config --local receive.denyDeleteCurrent ignore - git remote -v | grep origin && git remote rm origin || true - git remote add origin file:///dev/null - args: - creates: "{{ zuul_workspace_root }}/{{ zj_project.src_dir }}" with_items: "{{ _zuul_projects.values() }}" loop_control: loop_var: zj_project diff --git a/roles/test-prepare-workspace-git/tasks/main.yaml b/roles/test-prepare-workspace-git/tasks/main.yaml index 3787b53ac..8c4b18c5c 100644 --- a/roles/test-prepare-workspace-git/tasks/main.yaml +++ b/roles/test-prepare-workspace-git/tasks/main.yaml @@ -21,23 +21,24 @@ - name: Set initial repo states in workspace shell: | set -ex - if [ -d "{{ cached_repos_root }}/{{ zj_project.canonical_name }}" ] ; then - # We do a bare clone here first so that we skip creating a working - # copy that will be overwritten later anyway. - git clone --bare {{ cached_repos_root }}/{{ zj_project.canonical_name }} {{ zuul_workspace_root }}/{{ zj_project.src_dir }}/.git - else - git init {{ zuul_workspace_root }}/{{ zj_project.src_dir }} + if [ ! -d "{{ zuul_workspace_root }}/{{ zj_project.src_dir }}" ] ; then + if [ -d "{{ cached_repos_root }}/{{ zj_project.canonical_name }}" ] ; then + # We do a bare clone here first so that we skip creating a working + # copy that will be overwritten later anyway. + git clone --bare {{ cached_repos_root }}/{{ zj_project.canonical_name }} {{ zuul_workspace_root }}/{{ zj_project.src_dir }}/.git + else + git init {{ zuul_workspace_root }}/{{ zj_project.src_dir }} + fi + cd {{ zuul_workspace_root }}/{{ zj_project.src_dir }} + git config --local --bool core.bare false + git remote -v | grep origin && git remote rm origin || true + git remote add origin file:///dev/null fi cd {{ zuul_workspace_root }}/{{ zj_project.src_dir }} - git config --local --bool core.bare false # Allow pushing to non-bare repo git config --local receive.denyCurrentBranch ignore # Allow deleting current branch git config --local receive.denyDeleteCurrent ignore - git remote -v | grep origin && git remote rm origin || true - git remote add origin file:///dev/null - args: - creates: "{{ zuul_workspace_root }}/{{ zj_project.src_dir }}" with_items: "{{ _zuul_projects.values() }}" loop_control: loop_var: zj_project @@ -46,32 +47,11 @@ tags: - skip_ansible_lint -- name: Synchronize src repos to workspace directory - command: |- - {% if ansible_connection == "kubectl" %} - git push {% if mirror_workspace_quiet %}--quiet{% endif %} --mirror "ext::kubectl --context {{ zuul.resources[inventory_hostname].context }} -n {{ zuul.resources[inventory_hostname].namespace }} exec -i {{ zuul.resources[inventory_hostname].pod }} -- %S {{ zuul_workspace_root }}/{{ zj_project.value.src_dir }}" - {% else %} - git push {% if mirror_workspace_quiet %}--quiet{% endif %} --mirror git+ssh://{{ ansible_user }}@{{ ansible_host | ipwrap }}:{{ ansible_port }}/{{ zuul_workspace_root }}/{{ zj_project.value.src_dir }} - {% endif %} - args: - chdir: "{{ zuul.executor.work_root }}/{{ zj_project.value.src_dir }}" - environment: - GIT_ALLOW_PROTOCOL: ext:ssh +- name: Include tasks to synchronize src repos to workspace directory + include_tasks: sync-project.yaml with_dict: "{{ _zuul_projects }}" loop_control: loop_var: zj_project - delegate_to: localhost - # We occasionally see git pushes in the middle of this loop fail then - # subsequent pushes for other repos succeed. The entire loop ends up - # failing because one of the pushes failed. Mitigate this by retrying - # on failure. - register: git_push - until: git_push is success - retries: 3 - # ANSIBLE0006: Skip linting since it triggers on the "git" command, - # but push is not supported by ansible git module. - tags: - - skip_ansible_lint # Do this as a multi-line shell so that we can do the loop once - name: Update remote repository state correctly diff --git a/roles/test-prepare-workspace-git/tasks/sync-project.yaml b/roles/test-prepare-workspace-git/tasks/sync-project.yaml new file mode 100644 index 000000000..1e499e761 --- /dev/null +++ b/roles/test-prepare-workspace-git/tasks/sync-project.yaml @@ -0,0 +1,23 @@ +- name: "Synchronize {{ zj_project.value.canonical_name }}" + command: |- + {% if ansible_connection == "kubectl" %} + git push {% if mirror_workspace_quiet %}--quiet{% endif %} --mirror "ext::kubectl --context {{ zuul.resources[inventory_hostname].context }} -n {{ zuul.resources[inventory_hostname].namespace }} exec -i {{ zuul.resources[inventory_hostname].pod }} -- %S {{ zuul_workspace_root }}/{{ zj_project.value.src_dir }}" + {% else %} + git push {% if mirror_workspace_quiet %}--quiet{% endif %} --mirror git+ssh://{{ ansible_user }}@{{ ansible_host | ipwrap }}:{{ ansible_port }}/{{ zuul_workspace_root }}/{{ zj_project.value.src_dir }} + {% endif %} + args: + chdir: "{{ zuul.executor.work_root }}/{{ zj_project.value.src_dir }}" + environment: + GIT_ALLOW_PROTOCOL: ext:ssh + delegate_to: localhost + # We occasionally see git pushes in the middle of this loop fail then + # subsequent pushes for other repos succeed. The entire loop ends up + # failing because one of the pushes failed. Mitigate this by retrying + # on failure. + register: git_push + until: git_push is success + retries: 3 + # ANSIBLE0006: Skip linting since it triggers on the "git" command, + # but push is not supported by ansible git module. + tags: + - skip_ansible_lint