
In case of aws spot instances, the node can drop the connection anytime. Ansible loops do not fail when the first item fails, instead they execute all items before reporting the failure. This leads to a big overhead, if we sync repositories, when the node has dropped the connection beforehand. Therefore i used include_tasks, which fails for the first unsuccessful item. Change-Id: Id6079a2cda10a825384d52d47750d9c05d323e00
86 lines
3.2 KiB
YAML
86 lines
3.2 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: Include tasks to synchronize src repos to workspace directory
|
|
include_tasks: sync-project.yaml
|
|
with_dict: "{{ _zuul_projects }}"
|
|
loop_control:
|
|
loop_var: zj_project
|
|
|
|
# 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
|