From 8fed1dfaa6d00ad7bedd1f9622a4346d0087fc98 Mon Sep 17 00:00:00 2001 From: Clark Boylan Date: Thu, 22 Sep 2022 10:46:40 -0700 Subject: [PATCH] Test speedup change to prepare-workspace-git The child change to prepare-workspace-git explains this in more detail. We're reducing the number of ansible loops these roles run to reduce ansible task startup overhead and speed up the role. This change is made first to the test role so that we can ensure this all works properly before affecting production zuul installs. Change-Id: I3d33bb0001e65f449e1026ed323514097088f664 --- .../tasks/main.yaml | 64 +++++-------------- 1 file changed, 16 insertions(+), 48 deletions(-) diff --git a/roles/test-prepare-workspace-git/tasks/main.yaml b/roles/test-prepare-workspace-git/tasks/main.yaml index b946911b6..0ebcadcd1 100644 --- a/roles/test-prepare-workspace-git/tasks/main.yaml +++ b/roles/test-prepare-workspace-git/tasks/main.yaml @@ -1,59 +1,27 @@ -- name: Find locally cached git repos - stat: - path: "{{ cached_repos_root }}/{{ zj_project.canonical_name }}" - with_items: "{{ zuul.projects.values() | list }}" - loop_control: - loop_var: zj_project - register: cached_repos - -# We do a bare clone here first so that we skip creating a working copy that -# will be overwritten later anyway. -- name: Clone cached repo to workspace +# Do all the steps in a single shell script. This reduces the number of times +# ansible must loop over the list of projects which reduces the amount of +# task startup time we incur. +- name: Set initial repo states in workspace shell: | - set -e - git clone --bare {{ cached_repos_root }}/{{ zj_project.0.canonical_name }} {{ ansible_user_dir }}/{{ zj_project.0.src_dir }}/.git - cd {{ ansible_user_dir }}/{{ zj_project.0.src_dir }} + 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 }} {{ ansible_user_dir }}/{{ zj_project.src_dir }}/.git + else + git init {{ ansible_user_dir }}/{{ zj_project.src_dir }} + fi + cd {{ ansible_user_dir }}/{{ zj_project.src_dir }} git config --local --bool core.bare false - args: - creates: "{{ ansible_user_dir }}/{{ zj_project.0.src_dir }}" - when: zj_project.1.stat.exists - with_together: - - "{{ zuul.projects.values() | list }}" - - "{{ cached_repos.results }}" - loop_control: - loop_var: zj_project - # ANSIBLE0006: If we use the git module, we get warning - # ANSIBLE0004 since we do not give an explicit version - tags: - - skip_ansible_lint - -- name: Initialize non-cached repos - command: "git init {{ ansible_user_dir }}/{{ zj_project.0.src_dir }}" - args: - creates: "{{ ansible_user_dir }}/{{ zj_project.0.src_dir }}" - when: not zj_project.1.stat.exists - with_together: - - "{{ zuul.projects.values() | list }}" - - "{{ cached_repos.results }}" - loop_control: - loop_var: zj_project - # ANSIBLE0006: If we use the git module, we get warning - # ANSIBLE0004 since we do not give an explicit version - tags: - - skip_ansible_lint - -- name: Remove origin from local git repos and replace it by the zuul fake origin - # To be idempotent, remove origin only if it's found in the local list. - shell: | - set -e git remote -v | grep origin && git remote rm origin || true git remote add origin file:///dev/null args: - chdir: "{{ ansible_user_dir }}/{{ zj_project.src_dir }}" + creates: "{{ ansible_user_dir }}/{{ zj_project.src_dir }}" with_items: "{{ zuul.projects.values() | list }}" loop_control: loop_var: zj_project - # ANSIBLE0006: git remote is not supported by ansible module + # We're using git in a shell script because it is faster and the module + # doesn't support features we need. tags: - skip_ansible_lint