The upload-git-mirror job currently reports failure when multiple jobs run concurrently for the same repository (one of them succeeds, the other fails because the state of the mirror was changed by the successful one). However, since the job generally runs a few minutes after the commit that triggered it merged, the successful job usually mirrored the two needed commits, so the failed mirror operation does not mean the mirror is out-of-sync. This results in false negatives. If zuul.newrev is provided, rather than report failure if the mirror operation fails, we should report failure if, after the mirror operation, the commit that triggered the job is still not present on the mirror. Change-Id: Iadae26473f4c937384c8cea74329e389c563aeed
71 lines
2.3 KiB
YAML
71 lines
2.3 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
|
|
ignore_errors: zuul.newrev is defined
|
|
|
|
- name: Check if the mirror contains the desired reference
|
|
command: git fetch {{ git_mirror_credentials.user }}@{{ git_mirror_credentials.host }}:{{ git_mirror_repository }} {{ zuul.newrev }}
|
|
args:
|
|
chdir: "{{ ansible_user_dir }}/{{ zuul.project.src_dir }}"
|
|
tags:
|
|
- skip_ansible_lint
|
|
when: zuul.newrev is defined
|
|
|
|
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
|