
In cases where the HEAD branch of a repository is deleted, prepare-workspace-git will be unable to propagate that deletion from the executor repos to a clone of a cached repo on a remote node. Correct this by unsetting the receive.delyDeleteCurrent flag. This was correctly set in mirror-workspace-git, but did not make it into prepare-workspace-git. Change-Id: I159fb1f9f9cee873466f11be2f155bed6892472e
81 lines
3.2 KiB
YAML
81 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
|
|
# 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
|
|
# 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: 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
|
|
git config --local --unset receive.denyDeleteCurrent
|
|
# 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
|