zuul-jobs/roles/upload-git-mirror/tasks/main.yaml
Thierry Carrez a6fab9c48f upload-git-mirror: use retries to avoid races
To avoid errors in case of mirror race conditions, we currently
(try to) ignore mirror errors, and check for presence of the
reference after the mirror try. This requires having to play
tricks to avoid errors when the job is run in the check pipeline,
due to missing zuul.newrev. And for some reason, it does not seem
to work[1].

Instead of ignoring errors and running an additional check, let's
just retry the mirror operation three times.

The race is rare-enough that it's very unlikely that we would
hit it three times in a row.

[1] https://zuul.openstack.org/build/4966cd5617624d348fa0048de14f1f96

Change-Id: Ifa4f25ad8c961a1b2dbd9f07a3a1e4652b790c9c
2020-06-26 13:15:41 +02:00

66 lines
2.0 KiB
YAML

- block:
- name: Create SSH private key tempfile
tempfile:
state: file
register: ssh_private_key_tmp
- name: Set up private key
copy:
content: "{{ git_mirror_credentials.ssh_key }}"
dest: "{{ ssh_private_key_tmp.path }}"
mode: 0600
- name: Generate SSH configuration
set_fact:
ssh_config: |
host {{ git_mirror_credentials.host }}
HostName {{ git_mirror_credentials.host }}
IdentityFile {{ ssh_private_key_tmp.path }}
User {{ git_mirror_credentials.user }}
- name: Write SSH configuration to ~/.ssh/config
blockinfile:
state: present
path: "{{ ansible_user_dir }}/.ssh/config"
create: yes
mode: 0600
block: "{{ ssh_config }}"
- name: Add host key to known hosts
known_hosts:
state: present
name: "{{ git_mirror_credentials.host }}"
key: "{{ git_mirror_credentials.host_key }}"
- name: Mirror the git repository
command: git push --mirror {{ git_mirror_credentials.user }}@{{ git_mirror_credentials.host }}:{{ git_mirror_repository }}
args:
chdir: "{{ ansible_user_dir }}/{{ zuul.project.src_dir }}"
tags:
- skip_ansible_lint
register: result
retries: 3
delay: 5
until: result is not failed
always:
# Registered variables below are only used for integration testing
- name: Remove SSH private key from disk
command: "shred --remove {{ ssh_private_key_tmp.path }}"
register: git_mirror_key_removed
- name: Remove SSH configuration in ~/.ssh/config
blockinfile:
state: absent
path: "{{ ansible_user_dir }}/.ssh/config"
mode: 0600
block: "{{ ssh_config }}"
register: git_mirror_ssh_config_removed
- name: Remove host key from known hosts
known_hosts:
state: absent
name: "{{ git_mirror_credentials.host }}"
key: "{{ git_mirror_credentials.host_key }}"
register: git_mirror_host_key_removed