Merge "download-artifact : support recursive download"
This commit is contained in:
commit
eed60ad916
@ -32,3 +32,16 @@ many artifacts as match the selection criteria.
|
|||||||
:default: {{ zuul.executor.work_root }}
|
:default: {{ zuul.executor.work_root }}
|
||||||
|
|
||||||
The directory in which to place the downloaded artifacts.
|
The directory in which to place the downloaded artifacts.
|
||||||
|
|
||||||
|
.. zuul:rolevar:: download_artifact_recurse
|
||||||
|
:default: False
|
||||||
|
|
||||||
|
If the ``type`` describes a directory, this can be used to download
|
||||||
|
it recursively. Note this requires ``wget`` on the host. The
|
||||||
|
*last* component of the artifact URL should be a directory, and
|
||||||
|
that will be the directory saved to
|
||||||
|
``download_artifact_directory``.
|
||||||
|
|
||||||
|
For example, the contents of
|
||||||
|
``https://foo.com/abc/123/test/the_artifact/`` will be saved to
|
||||||
|
``{{ download_artifact_directory }}/the_artifact/``.
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
---
|
---
|
||||||
download_artifact_query: "change={{ zuul.change }}&patchset={{ zuul.patchset }}&pipeline={{ download_artifact_pipeline }}&job_name={{ download_artifact_job }}"
|
download_artifact_query: "change={{ zuul.change }}&patchset={{ zuul.patchset }}&pipeline={{ download_artifact_pipeline }}&job_name={{ download_artifact_job }}"
|
||||||
download_artifact_directory: "{{ zuul.executor.work_root }}"
|
download_artifact_directory: "{{ zuul.executor.work_root }}"
|
||||||
|
download_artifact_recurse: False
|
||||||
|
@ -1,3 +1,24 @@
|
|||||||
|
- name: Look for wget
|
||||||
|
shell: |
|
||||||
|
command -v wget || exit 1
|
||||||
|
args:
|
||||||
|
executable: /bin/bash
|
||||||
|
register: _wget_installed
|
||||||
|
failed_when: false
|
||||||
|
when: download_artifact_recurse
|
||||||
|
|
||||||
|
- name: Fail if no wget
|
||||||
|
fail:
|
||||||
|
msg: 'wget not found, can not recurse'
|
||||||
|
when:
|
||||||
|
- _wget_installed.rc != 0
|
||||||
|
- download_artifact_recurse
|
||||||
|
|
||||||
|
- name: Ensure the download directory
|
||||||
|
file:
|
||||||
|
name: '{{ download_artifact_directory }}'
|
||||||
|
state: directory
|
||||||
|
|
||||||
- name: Query Zuul API for artifact information
|
- name: Query Zuul API for artifact information
|
||||||
uri:
|
uri:
|
||||||
url: "{{ download_artifact_api }}/builds?{{ download_artifact_query }}"
|
url: "{{ download_artifact_api }}/builds?{{ download_artifact_query }}"
|
||||||
@ -5,6 +26,14 @@
|
|||||||
- name: Parse build response
|
- name: Parse build response
|
||||||
set_fact:
|
set_fact:
|
||||||
build: "{{ build.json[0] }}"
|
build: "{{ build.json[0] }}"
|
||||||
|
|
||||||
|
- name: Recursive downloads
|
||||||
|
loop: "{{ build.artifacts }}"
|
||||||
|
include_tasks: recursive.yaml
|
||||||
|
loop_control:
|
||||||
|
loop_var: zj_artifact
|
||||||
|
when: "'metadata' in zj_artifact and 'type' in zj_artifact.metadata and (zj_artifact.metadata.type == download_artifact_type or ((download_artifact_type | type_debug) == 'list' and zj_artifact.metadata.type in download_artifact_type)) and download_artifact_recurse"
|
||||||
|
|
||||||
- name: Download archive by type
|
- name: Download archive by type
|
||||||
uri:
|
uri:
|
||||||
url: "{{ zj_artifact.url }}"
|
url: "{{ zj_artifact.url }}"
|
||||||
@ -12,4 +41,4 @@
|
|||||||
loop: "{{ build.artifacts }}"
|
loop: "{{ build.artifacts }}"
|
||||||
loop_control:
|
loop_control:
|
||||||
loop_var: zj_artifact
|
loop_var: zj_artifact
|
||||||
when: "'metadata' in zj_artifact and 'type' in zj_artifact.metadata and (zj_artifact.metadata.type == download_artifact_type or ((download_artifact_type | type_debug) == 'list' and zj_artifact.metadata.type in download_artifact_type))"
|
when: "'metadata' in zj_artifact and 'type' in zj_artifact.metadata and (zj_artifact.metadata.type == download_artifact_type or ((download_artifact_type | type_debug) == 'list' and zj_artifact.metadata.type in download_artifact_type)) and not download_artifact_recurse"
|
||||||
|
27
roles/download-artifact/tasks/recursive.yaml
Normal file
27
roles/download-artifact/tasks/recursive.yaml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
- name: Find directories to strip
|
||||||
|
set_fact:
|
||||||
|
# - take the url, strip of any trailing "/"
|
||||||
|
# - find everything on the // side
|
||||||
|
# - split it at /'s, then disregrad the host (ignored by parent
|
||||||
|
# flag) and the final directory (the one we want) i.e. -2
|
||||||
|
cut_dirs: '{{ zj_artifact.url.rpartition("//")[-1].rstrip("/").split("/") | length - 2 }}'
|
||||||
|
|
||||||
|
- name: Recursive download
|
||||||
|
# NOTE(ianw): something weird about wget recursive, you want to make
|
||||||
|
# sure the directory to download has a trailing "/" or you can get
|
||||||
|
# directory errors; something like
|
||||||
|
# http://savannah.gnu.org/bugs/?29647
|
||||||
|
# Otherwise this
|
||||||
|
# - drops the host (-nH)
|
||||||
|
# - doesn't walk upwards (--no-parent)
|
||||||
|
# - doesn't save index.html files (maybe this should be optional for docs?)
|
||||||
|
# - cuts out the all the parent directories but the last one
|
||||||
|
#
|
||||||
|
# so "https://foo.com/logs/123/abc/dir/the_artifact" gets saved to
|
||||||
|
# {{ download_artifact_directory }}/the_artifact
|
||||||
|
command: |
|
||||||
|
wget -nH --no-parent --reject="index.html*" --cut-dirs={{ cut_dirs }} -P {{ download_artifact_directory }} -m {{ zj_artifact.url.rstrip("/") + "/" }}
|
||||||
|
args:
|
||||||
|
# We really want to use wget here, because the get_url type things
|
||||||
|
# don't do recursive.
|
||||||
|
warn: false
|
35
test-playbooks/download-artifact.yaml
Normal file
35
test-playbooks/download-artifact.yaml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
- name: Run the download-artifacts role
|
||||||
|
hosts: all
|
||||||
|
roles:
|
||||||
|
- ensure-output-dirs
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
# NOTE(ianw) : This has probably expired and thus broken this
|
||||||
|
# test. You need to choose a new artifact to download to test
|
||||||
|
# this as part of updating the download-artifact role
|
||||||
|
|
||||||
|
- name: Download centos 7 x86 artifact on host
|
||||||
|
include_role:
|
||||||
|
name: download-artifact
|
||||||
|
vars:
|
||||||
|
download_artifact_query: "change=733420&patchset=1&pipeline=gate&job_name=openafs-rpm-package-build-centos-7-x86"
|
||||||
|
download_artifact_api: "https://zuul.opendev.org/api/tenant/openstack"
|
||||||
|
download_artifact_type: rpm
|
||||||
|
download_artifact_pipeline: gate
|
||||||
|
download_artifact_job: openafs-rpm-package-build-centos-7-x86
|
||||||
|
download_artifact_directory: '/tmp/'
|
||||||
|
download_artifact_recurse: yes
|
||||||
|
|
||||||
|
- name: Download centos 7 x86 artifact on executor
|
||||||
|
include_role:
|
||||||
|
name: download-artifact
|
||||||
|
apply:
|
||||||
|
delegate_to: localhost
|
||||||
|
vars:
|
||||||
|
download_artifact_query: "change=733420&patchset=1&pipeline=gate&job_name=openafs-rpm-package-build-centos-7-x86"
|
||||||
|
download_artifact_api: "https://zuul.opendev.org/api/tenant/openstack"
|
||||||
|
download_artifact_type: rpm
|
||||||
|
download_artifact_pipeline: gate
|
||||||
|
download_artifact_job: openafs-rpm-package-build-centos-7-x86
|
||||||
|
download_artifact_directory: '{{ zuul.executor.work_root }}/test-artifacts/'
|
||||||
|
download_artifact_recurse: yes
|
159
zuul-tests.d/artifact-jobs.yaml
Normal file
159
zuul-tests.d/artifact-jobs.yaml
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
- job:
|
||||||
|
name: zuul-jobs-test-download-artifact
|
||||||
|
tags: all-platforms
|
||||||
|
description: |
|
||||||
|
Test artifact roles
|
||||||
|
parent: base-minimal
|
||||||
|
run: test-playbooks/download-artifact.yaml
|
||||||
|
files:
|
||||||
|
- ^roles/download-artifact/.*
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: zuul-jobs-test-download-artifact-centos-7
|
||||||
|
description: Test artifact roles on centos-7
|
||||||
|
parent: zuul-jobs-test-download-artifact
|
||||||
|
tags: auto-generated
|
||||||
|
nodeset:
|
||||||
|
nodes:
|
||||||
|
- name: centos-7
|
||||||
|
label: centos-7
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: zuul-jobs-test-download-artifact-centos-8
|
||||||
|
description: Test artifact roles on centos-8
|
||||||
|
parent: zuul-jobs-test-download-artifact
|
||||||
|
tags: auto-generated
|
||||||
|
nodeset:
|
||||||
|
nodes:
|
||||||
|
- name: centos-8
|
||||||
|
label: centos-8
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: zuul-jobs-test-download-artifact-debian-stretch
|
||||||
|
description: Test artifact roles on debian-stretch
|
||||||
|
parent: zuul-jobs-test-download-artifact
|
||||||
|
tags: auto-generated
|
||||||
|
nodeset:
|
||||||
|
nodes:
|
||||||
|
- name: debian-stretch
|
||||||
|
label: debian-stretch
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: zuul-jobs-test-download-artifact-fedora-31
|
||||||
|
description: Test artifact roles on fedora-31
|
||||||
|
parent: zuul-jobs-test-download-artifact
|
||||||
|
tags: auto-generated
|
||||||
|
nodeset:
|
||||||
|
nodes:
|
||||||
|
- name: fedora-31
|
||||||
|
label: fedora-31
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: zuul-jobs-test-download-artifact-gentoo-17-0-systemd
|
||||||
|
description: Test artifact roles on gentoo-17-0-systemd
|
||||||
|
parent: zuul-jobs-test-download-artifact
|
||||||
|
tags: auto-generated
|
||||||
|
nodeset:
|
||||||
|
nodes:
|
||||||
|
- name: gentoo-17-0-systemd
|
||||||
|
label: gentoo-17-0-systemd
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: zuul-jobs-test-download-artifact-opensuse-15
|
||||||
|
description: Test artifact roles on opensuse-15
|
||||||
|
parent: zuul-jobs-test-download-artifact
|
||||||
|
tags: auto-generated
|
||||||
|
nodeset:
|
||||||
|
nodes:
|
||||||
|
- name: opensuse-15
|
||||||
|
label: opensuse-15
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: zuul-jobs-test-download-artifact-opensuse-tumbleweed-nv
|
||||||
|
voting: false
|
||||||
|
description: Test artifact roles on opensuse-tumbleweed
|
||||||
|
parent: zuul-jobs-test-download-artifact
|
||||||
|
tags: auto-generated
|
||||||
|
nodeset:
|
||||||
|
nodes:
|
||||||
|
- name: opensuse-tumbleweed
|
||||||
|
label: opensuse-tumbleweed
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: zuul-jobs-test-download-artifact-ubuntu-bionic
|
||||||
|
description: Test artifact roles on ubuntu-bionic
|
||||||
|
parent: zuul-jobs-test-download-artifact
|
||||||
|
tags: auto-generated
|
||||||
|
nodeset:
|
||||||
|
nodes:
|
||||||
|
- name: ubuntu-bionic
|
||||||
|
label: ubuntu-bionic
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: zuul-jobs-test-download-artifact-ubuntu-xenial
|
||||||
|
description: Test artifact roles on ubuntu-xenial
|
||||||
|
parent: zuul-jobs-test-download-artifact
|
||||||
|
tags: auto-generated
|
||||||
|
nodeset:
|
||||||
|
nodes:
|
||||||
|
- name: ubuntu-xenial
|
||||||
|
label: ubuntu-xenial
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: zuul-jobs-test-download-artifact-ubuntu-bionic-plain
|
||||||
|
description: Test artifact roles on ubuntu-bionic-plain
|
||||||
|
parent: zuul-jobs-test-download-artifact
|
||||||
|
tags: auto-generated
|
||||||
|
nodeset:
|
||||||
|
nodes:
|
||||||
|
- name: ubuntu-bionic-plain
|
||||||
|
label: ubuntu-bionic-plain
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: zuul-jobs-test-download-artifact-ubuntu-xenial-plain
|
||||||
|
description: Test artifact roles on ubuntu-xenial-plain
|
||||||
|
parent: zuul-jobs-test-download-artifact
|
||||||
|
tags: auto-generated
|
||||||
|
nodeset:
|
||||||
|
nodes:
|
||||||
|
- name: ubuntu-xenial-plain
|
||||||
|
label: ubuntu-xenial-plain
|
||||||
|
|
||||||
|
- job:
|
||||||
|
name: zuul-jobs-test-download-artifact-centos-8-plain
|
||||||
|
description: Test artifact roles on centos-8-plain
|
||||||
|
parent: zuul-jobs-test-download-artifact
|
||||||
|
tags: auto-generated
|
||||||
|
nodeset:
|
||||||
|
nodes:
|
||||||
|
- name: centos-8-plain
|
||||||
|
label: centos-8-plain
|
||||||
|
|
||||||
|
- project:
|
||||||
|
check:
|
||||||
|
jobs:
|
||||||
|
- zuul-jobs-test-download-artifact-centos-7
|
||||||
|
- zuul-jobs-test-download-artifact-centos-8
|
||||||
|
- zuul-jobs-test-download-artifact-debian-stretch
|
||||||
|
- zuul-jobs-test-download-artifact-fedora-31
|
||||||
|
- zuul-jobs-test-download-artifact-gentoo-17-0-systemd
|
||||||
|
- zuul-jobs-test-download-artifact-opensuse-15
|
||||||
|
- zuul-jobs-test-download-artifact-opensuse-tumbleweed-nv
|
||||||
|
- zuul-jobs-test-download-artifact-ubuntu-bionic
|
||||||
|
- zuul-jobs-test-download-artifact-ubuntu-xenial
|
||||||
|
- zuul-jobs-test-download-artifact-ubuntu-bionic-plain
|
||||||
|
- zuul-jobs-test-download-artifact-ubuntu-xenial-plain
|
||||||
|
- zuul-jobs-test-download-artifact-centos-8-plain
|
||||||
|
gate:
|
||||||
|
jobs:
|
||||||
|
- zuul-jobs-test-download-artifact-centos-7
|
||||||
|
- zuul-jobs-test-download-artifact-centos-8
|
||||||
|
- zuul-jobs-test-download-artifact-debian-stretch
|
||||||
|
- zuul-jobs-test-download-artifact-fedora-31
|
||||||
|
- zuul-jobs-test-download-artifact-gentoo-17-0-systemd
|
||||||
|
- zuul-jobs-test-download-artifact-opensuse-15
|
||||||
|
- zuul-jobs-test-download-artifact-ubuntu-bionic
|
||||||
|
- zuul-jobs-test-download-artifact-ubuntu-xenial
|
||||||
|
- zuul-jobs-test-download-artifact-ubuntu-bionic-plain
|
||||||
|
- zuul-jobs-test-download-artifact-ubuntu-xenial-plain
|
||||||
|
- zuul-jobs-test-download-artifact-centos-8-plain
|
Loading…
x
Reference in New Issue
Block a user