This is a revert of commitf28cc33bc3which was a revert of the original attempt at moving to zuul._projects (df98773573). The issue was that the order of projects in "Determine local HEAD" was not the same as "Update remote repository state" and we ended up checking out the wrong thing. To avoid this, build the projects and their current heads on the exectutor into a separate dict, and as we iterate the projects look up the correct values in that. Change-Id: I0d9a66435714efe42fb653aafc6cb71b08ca6b8a
55 lines
2.0 KiB
YAML
55 lines
2.0 KiB
YAML
- name: Allow pushing to non-bare repo
|
|
git_config:
|
|
name: receive.denyCurrentBranch ignore
|
|
value: ignore
|
|
scope: local
|
|
repo: "{{ ansible_user_dir }}/{{ item.value.src_dir}}"
|
|
with_dict: "{{ zuul._projects }}"
|
|
|
|
- name: Synchronize src repos to workspace directory
|
|
command: "git push --mirror git+ssh://{{ ansible_user }}@{{ ansible_host }}/{{ ansible_user_dir }}/{{ item.value.src_dir}}"
|
|
args:
|
|
chdir: "{{ zuul.executor.work_root }}/{{ item.value.src_dir }}"
|
|
with_dict: "{{ zuul._projects }}"
|
|
delegate_to: localhost
|
|
# ANSIBLE0006: Skip linting since it triggers on the "git" command,
|
|
# but push is not supported by ansible git module.
|
|
tags:
|
|
- skip_ansible_lint
|
|
|
|
- name: Determine local HEAD of projects
|
|
# Output yaml-valid dict data for projects and their current HEAD
|
|
shell: "echo '{{ item.key }}:' $(git status | head -1 |awk '{ print $NF }')"
|
|
args:
|
|
chdir: "{{ zuul.executor.work_root }}/{{ item.value.src_dir }}"
|
|
with_dict: "{{ zuul._projects }}"
|
|
delegate_to: localhost
|
|
register: project_heads_yaml
|
|
# ANSIBLE0006: Skip linting since it triggers on the "git" command,
|
|
# but status is not supported by ansible git module.
|
|
tags:
|
|
- skip_ansible_lint
|
|
|
|
- name: Build dict to map project and current head HEAD
|
|
set_fact:
|
|
project_heads: "{{ project_heads|default({}) | combine( item.stdout | from_yaml ) }}"
|
|
with_items: '{{ project_heads_yaml.results }}'
|
|
|
|
# Do this as a multi-line shell so that we can do the loop once
|
|
- name: Update remote repository state correctly
|
|
shell: |
|
|
# Reset is needed because we pushed to a non-bare repo
|
|
git reset --hard
|
|
# 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 {{ project_heads[item.key] }}
|
|
args:
|
|
chdir: "{{ ansible_user_dir }}/{{ item.value.src_dir }}"
|
|
with_dict:
|
|
- "{{ zuul._projects }}"
|
|
# ANSIBLE0006: Skip linting since it triggers on the "git" command,
|
|
# but we prefer the shell above
|
|
tags:
|
|
- skip_ansible_lint
|