5eca8feda9
The prepare_workspace_sync_required_projects_only variable allows users to define which projects to sync to the node. This can prevent syncing of unnecessary repositories. For some builds e.g. the depends-on repositories dont need to be synced. The projects are filtered based on the 'required' flag present in each zuul.project entry and the required projects list also does not contain projects which are present due to Depends-On or gate queue sequencing. Having unnecessary repos in the workspace can for example also break the analysis phase of bazel. Change-Id: I3cc36cbfc60c81956caf5137da63973aeade4e21 Co-Authored-By: James E. Blair <jim@acmegating.com> Co-Authored-By: Bernhard Berg <bernhard.berg@bearingpoint.com>
107 lines
4.3 KiB
YAML
107 lines
4.3 KiB
YAML
- name: Filter zuul projects if sync-only-required-projects flag is set
|
|
set_fact:
|
|
_zuul_projects: >
|
|
{{ _zuul_projects | default({}) |
|
|
combine({ zj_project.key : zj_project.value }) }}
|
|
with_dict: "{{ zuul.projects }}"
|
|
loop_control:
|
|
loop_var: zj_project
|
|
when:
|
|
- prepare_workspace_sync_required_projects_only
|
|
- zj_project.value.canonical_name == zuul.project.canonical_name or zj_project.value.required
|
|
|
|
- name: Don't filter zuul projects if flag is false
|
|
set_fact:
|
|
_zuul_projects: "{{ zuul.projects }}"
|
|
when: not prepare_workspace_sync_required_projects_only
|
|
|
|
# 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 -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 }}
|
|
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
|
|
args:
|
|
creates: "{{ zuul_workspace_root }}/{{ zj_project.src_dir }}"
|
|
with_items: "{{ _zuul_projects.values() }}"
|
|
loop_control:
|
|
loop_var: zj_project
|
|
# 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
|
|
|
|
- name: Allow pushing to non-bare repo
|
|
git_config:
|
|
name: receive.denyCurrentBranch
|
|
value: ignore
|
|
scope: local
|
|
repo: "{{ zuul_workspace_root }}/{{ zj_project.value.src_dir }}"
|
|
with_dict: "{{ _zuul_projects }}"
|
|
loop_control:
|
|
loop_var: zj_project
|
|
|
|
- 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
|
|
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
|
|
shell: |
|
|
set -eu
|
|
|
|
# Reset is needed because we pushed to a non-bare repo
|
|
git reset --hard
|
|
# Clean is needed because we pushed to a non-bare repo
|
|
git clean -xdf
|
|
# Undo the config setting we did above
|
|
git config --local --unset receive.denyCurrentBranch
|
|
# checkout the branch matching the branch set up by the executor
|
|
git checkout {% if mirror_workspace_quiet %}--quiet{% endif %} {{ zj_project.value.checkout }}
|
|
# put out a status line with the current HEAD
|
|
echo "{{ zj_project.value.canonical_name }} checked out to:"
|
|
git log --pretty=oneline -1
|
|
args:
|
|
chdir: "{{ zuul_workspace_root }}/{{ zj_project.value.src_dir }}"
|
|
with_dict: "{{ _zuul_projects }}"
|
|
loop_control:
|
|
loop_var: zj_project
|
|
# ANSIBLE0006: Skip linting since it triggers on the "git" command,
|
|
# but we prefer the shell above
|
|
tags:
|
|
- skip_ansible_lint
|