Move to dictionary list of projects zuul._projects (take 2)

This is a revert of commit f28cc33bc3
which 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
This commit is contained in:
Ian Wienand 2017-11-10 11:28:40 +11:00 committed by Monty Taylor
parent d7cba9d7d5
commit b1b2537de7
No known key found for this signature in database
GPG Key ID: 7BAE94BC7141A594
2 changed files with 21 additions and 16 deletions

View File

@ -3,32 +3,38 @@
name: receive.denyCurrentBranch ignore
value: ignore
scope: local
repo: "{{ ansible_user_dir }}/{{ item.src_dir}}"
with_items: "{{ zuul.projects }}"
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.src_dir}}"
command: "git push --mirror git+ssh://{{ ansible_user }}@{{ ansible_host }}/{{ ansible_user_dir }}/{{ item.value.src_dir}}"
args:
chdir: "{{ zuul.executor.work_root }}/{{ item.src_dir }}"
with_items: "{{ zuul.projects }}"
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
shell: "git status |head -1 |awk '{ print $NF }'"
- 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.src_dir }}"
with_items: "{{ zuul.projects }}"
chdir: "{{ zuul.executor.work_root }}/{{ item.value.src_dir }}"
with_dict: "{{ zuul._projects }}"
delegate_to: localhost
register: statuses
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: |
@ -37,12 +43,11 @@
# 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 {{ item.1.stdout }}
git checkout {{ project_heads[item.key] }}
args:
chdir: "{{ ansible_user_dir }}/{{ item.0.src_dir }}"
with_together:
- "{{ zuul.projects }}"
- "{{ statuses.results }}"
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:

View File

@ -10,4 +10,4 @@
tox_envlist: "{{ tox_envlist }}"
tox_constraints_file: "{{ tox_constraints_file | default(omit) }}"
project_dir: "{{ zuul_work_dir }}"
projects: "{{ zuul.projects | selectattr('required') | list }}"
projects: "{{ zuul._projects.values() | selectattr('required') | list }}"