diff --git a/roles/prepare-workspace-git/tasks/main.yaml b/roles/prepare-workspace-git/tasks/main.yaml index 9b0715d51..ad7da04bf 100644 --- a/roles/prepare-workspace-git/tasks/main.yaml +++ b/roles/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