diff --git a/docker/roles/geerlingguy.docker/.github/workflows/ci.yml b/docker/roles/geerlingguy.docker/.github/workflows/ci.yml index bb4b327..bf25c4e 100644 --- a/docker/roles/geerlingguy.docker/.github/workflows/ci.yml +++ b/docker/roles/geerlingguy.docker/.github/workflows/ci.yml @@ -42,14 +42,11 @@ jobs: matrix: distro: - rockylinux9 - - rockylinux8 - ubuntu2404 - ubuntu2204 - - ubuntu2004 - debian12 - debian11 - - debian10 - - fedora39 + - fedora40 steps: - name: Check out the codebase. diff --git a/docker/roles/geerlingguy.docker/README.md b/docker/roles/geerlingguy.docker/README.md index e679eb4..c8dc6ee 100644 --- a/docker/roles/geerlingguy.docker/README.md +++ b/docker/roles/geerlingguy.docker/README.md @@ -1,6 +1,6 @@ # Ansible Role: Docker -[![CI](https://github.com/geerlingguy/ansible-role-docker/workflows/CI/badge.svg?event=push)](https://github.com/geerlingguy/ansible-role-docker/actions?query=workflow%3ACI) +[![CI](https://github.com/geerlingguy/ansible-role-docker/actions/workflows/ci.yml/badge.svg)](https://github.com/geerlingguy/ansible-role-docker/actions/workflows/ci.yml) An Ansible Role that installs [Docker](https://www.docker.com) on Linux. @@ -34,11 +34,19 @@ docker_obsolete_packages: - docker - docker.io - docker-engine + - docker-doc + - docker-compose + - docker-compose-v2 - podman-docker - containerd - runc ``` +`docker_obsolete_packages` for different os-family: + +- [`RedHat.yaml`](./vars/RedHat.yml) +- [`Debian.yaml`](./vars/Debian.yml) + A list of packages to be uninstalled prior to running this role. See [Docker's installation instructions](https://docs.docker.com/engine/install/debian/#uninstall-old-versions) for an up-to-date list of old packages that should be removed. ```yaml @@ -51,7 +59,7 @@ docker_restart_handler_state: restarted Variables to control the state of the `docker` service, and whether it should start on boot. If you're installing Docker inside a Docker container without systemd or sysvinit, you should set `docker_service_manage` to `false`. ```yaml -docker_install_compose_plugin: false +docker_install_compose_plugin: true docker_compose_package: docker-compose-plugin docker_compose_package_state: present ``` @@ -59,9 +67,10 @@ docker_compose_package_state: present Docker Compose Plugin installation options. These differ from the below in that docker-compose is installed as a docker plugin (and used with `docker compose`) instead of a standalone binary. ```yaml -docker_install_compose: true -docker_compose_version: "1.26.0" +docker_install_compose: false +docker_compose_version: "v2.32.1" docker_compose_arch: "{{ ansible_architecture }}" +docker_compose_url: "https://github.com/docker/compose/releases/download/{{ docker_compose_version }}/docker-compose-linux-{{ docker_compose_arch }}" docker_compose_path: /usr/local/bin/docker-compose ``` @@ -82,7 +91,7 @@ The main Docker repo URL, common between Debian and RHEL systems. ```yaml docker_apt_release_channel: stable docker_apt_arch: "{{ 'arm64' if ansible_architecture == 'aarch64' else 'amd64' }}" -docker_apt_repository: "deb [arch={{ docker_apt_arch }}] {{ docker_repo_url }}/{{ ansible_distribution | lower }} {{ ansible_distribution_release }} {{ docker_apt_release_channel }}" +docker_apt_repository: "deb [arch={{ docker_apt_arch }}{{' signed-by=/etc/apt/keyrings/docker.asc' if add_repository_key is not failed}}] {{ docker_repo_url }}/{{ ansible_distribution | lower }} {{ ansible_distribution_release }} {{ docker_apt_release_channel }}" docker_apt_ignore_key_error: True docker_apt_gpg_key: "{{ docker_repo_url }}/{{ ansible_distribution | lower }}/gpg" docker_apt_filename: "docker" @@ -115,7 +124,7 @@ A list of system users to be added to the `docker` group (so they can use Docker ```yaml docker_daemon_options: - storage-driver: "devicemapper" + storage-driver: "overlay2" log-opts: max-size: "100m" ``` diff --git a/docker/roles/geerlingguy.docker/defaults/main.yml b/docker/roles/geerlingguy.docker/defaults/main.yml index 7449b5b..fde06e5 100644 --- a/docker/roles/geerlingguy.docker/defaults/main.yml +++ b/docker/roles/geerlingguy.docker/defaults/main.yml @@ -12,6 +12,9 @@ docker_obsolete_packages: - docker - docker.io - docker-engine + - docker-doc + - docker-compose + - docker-compose-v2 - podman-docker - containerd - runc @@ -29,7 +32,7 @@ docker_compose_package_state: present # Docker Compose options. docker_install_compose: false -docker_compose_version: "v2.11.1" +docker_compose_version: "v2.32.1" docker_compose_arch: "{{ ansible_architecture }}" docker_compose_url: "https://github.com/docker/compose/releases/download/{{ docker_compose_version }}/docker-compose-linux-{{ docker_compose_arch }}" docker_compose_path: /usr/local/bin/docker-compose diff --git a/docker/roles/geerlingguy.docker/meta/.galaxy_install_info b/docker/roles/geerlingguy.docker/meta/.galaxy_install_info index 2e56654..8c0ce9b 100644 --- a/docker/roles/geerlingguy.docker/meta/.galaxy_install_info +++ b/docker/roles/geerlingguy.docker/meta/.galaxy_install_info @@ -1,2 +1,2 @@ -install_date: 'Wed 17 Jul 2024 02:03:32 PM ' -version: 7.3.0 +install_date: 'Fri 11 Apr 2025 09:32:24 AM ' +version: 7.4.7 diff --git a/docker/roles/geerlingguy.docker/meta/main.yml b/docker/roles/geerlingguy.docker/meta/main.yml index a492efe..c614f0d 100644 --- a/docker/roles/geerlingguy.docker/meta/main.yml +++ b/docker/roles/geerlingguy.docker/meta/main.yml @@ -22,6 +22,7 @@ galaxy_info: - bionic - focal - jammy + - noble - name: Alpine version: - all diff --git a/docker/roles/geerlingguy.docker/molecule/default/converge.yml b/docker/roles/geerlingguy.docker/molecule/default/converge.yml index 629095b..6f14c66 100644 --- a/docker/roles/geerlingguy.docker/molecule/default/converge.yml +++ b/docker/roles/geerlingguy.docker/molecule/default/converge.yml @@ -1,7 +1,7 @@ --- - name: Converge hosts: all - become: true + # become: true pre_tasks: - name: Update apt cache. diff --git a/docker/roles/geerlingguy.docker/molecule/default/molecule.yml b/docker/roles/geerlingguy.docker/molecule/default/molecule.yml index 147da5d..3c2f1e5 100644 --- a/docker/roles/geerlingguy.docker/molecule/default/molecule.yml +++ b/docker/roles/geerlingguy.docker/molecule/default/molecule.yml @@ -8,7 +8,7 @@ driver: name: docker platforms: - name: instance - image: "geerlingguy/docker-${MOLECULE_DISTRO:-rockylinux8}-ansible:latest" + image: "geerlingguy/docker-${MOLECULE_DISTRO:-rockylinux9}-ansible:latest" command: ${MOLECULE_DOCKER_COMMAND:-""} volumes: - /sys/fs/cgroup:/sys/fs/cgroup:rw diff --git a/docker/roles/geerlingguy.docker/molecule/default/verify.yml b/docker/roles/geerlingguy.docker/molecule/default/verify.yml new file mode 100644 index 0000000..45e24fc --- /dev/null +++ b/docker/roles/geerlingguy.docker/molecule/default/verify.yml @@ -0,0 +1,51 @@ +--- +- name: Verify Docker Role + hosts: all + tasks: + - name: Verify Docker binary is available + command: docker version + register: docker_version_result + changed_when: false + failed_when: docker_version_result.rc != 0 + + - name: Show Docker version details + debug: + msg: > + Docker Version Output: + {{ docker_version_result.stdout_lines | join('\n') }} + + - name: Verify Docker service is running + command: systemctl is-active docker + register: docker_service_status + when: ansible_service_mgr == 'systemd' + changed_when: false + failed_when: docker_service_status.stdout.strip() != "active" + + - name: Display Docker service status + debug: + msg: "Docker service is {{ docker_service_status.stdout.strip() }}" + when: ansible_service_mgr == 'systemd' + + - name: Pull the 'hello-world' image + command: docker pull hello-world + register: docker_pull_result + changed_when: true + failed_when: docker_pull_result.rc != 0 + + - name: Show result of pulling the 'hello-world' image + debug: + msg: > + Pulling 'hello-world' completed with output: + {{ docker_pull_result.stdout_lines | join('\n') }} + + - name: Run a test container (hello-world) + command: docker run --rm hello-world + register: docker_run_result + changed_when: true + failed_when: docker_run_result.rc != 0 + + - name: Display test container output + debug: + msg: > + Running 'hello-world' container completed with output: + {{ docker_run_result.stdout_lines | join('\n') }} diff --git a/docker/roles/geerlingguy.docker/tasks/setup-Debian.yml b/docker/roles/geerlingguy.docker/tasks/setup-Debian.yml index a864b3f..253876b 100644 --- a/docker/roles/geerlingguy.docker/tasks/setup-Debian.yml +++ b/docker/roles/geerlingguy.docker/tasks/setup-Debian.yml @@ -1,4 +1,22 @@ --- +- name: Ensure apt key is not present in trusted.gpg.d + ansible.builtin.file: + path: /etc/apt/trusted.gpg.d/docker.asc + state: absent + +- name: Ensure old apt source list is not present in /etc/apt/sources.list.d + ansible.builtin.file: + path: "/etc/apt/sources.list.d/download_docker_com_linux_{{ docker_apt_ansible_distribution | lower }}.list" + state: absent + +- name: Ensure the repo referencing the previous trusted.gpg.d key is not present + apt_repository: + repo: "deb [arch={{ docker_apt_arch }} signed-by=/etc/apt/trusted.gpg.d/docker.asc] {{ docker_repo_url }}/{{ docker_apt_ansible_distribution | lower }} {{ ansible_distribution_release }} {{ docker_apt_release_channel }}" + state: absent + filename: "{{ docker_apt_filename }}" + update_cache: true + when: docker_add_repo | bool + - # See https://docs.docker.com/engine/install/debian/#uninstall-old-versions name: Ensure old versions of Docker are not installed. package: @@ -17,13 +35,13 @@ file: path: /etc/apt/keyrings state: directory - mode: '0755' + mode: "0755" - name: Add Docker apt key. ansible.builtin.get_url: url: "{{ docker_apt_gpg_key }}" dest: /etc/apt/keyrings/docker.asc - mode: '0644' + mode: "0644" force: false checksum: "{{ docker_apt_gpg_key_checksum | default(omit) }}" register: add_repository_key diff --git a/docker/roles/geerlingguy.docker/tasks/setup-RedHat.yml b/docker/roles/geerlingguy.docker/tasks/setup-RedHat.yml index d49316e..8a790f6 100644 --- a/docker/roles/geerlingguy.docker/tasks/setup-RedHat.yml +++ b/docker/roles/geerlingguy.docker/tasks/setup-RedHat.yml @@ -1,10 +1,7 @@ --- - name: Ensure old versions of Docker are not installed. package: - name: - - docker - - docker-common - - docker-engine + name: "{{ docker_obsolete_packages }}" state: absent - name: Add Docker GPG key. diff --git a/docker/roles/geerlingguy.docker/vars/Alpine.yml b/docker/roles/geerlingguy.docker/vars/Alpine.yml index b81917a..5fea58d 100755 --- a/docker/roles/geerlingguy.docker/vars/Alpine.yml +++ b/docker/roles/geerlingguy.docker/vars/Alpine.yml @@ -1,2 +1,3 @@ --- docker_packages: "docker" +docker_compose_package: docker-cli-compose diff --git a/docker/roles/geerlingguy.docker/vars/Debian.yml b/docker/roles/geerlingguy.docker/vars/Debian.yml new file mode 100644 index 0000000..9f90a11 --- /dev/null +++ b/docker/roles/geerlingguy.docker/vars/Debian.yml @@ -0,0 +1,14 @@ +--- +# Used only for Debian/Ubuntu (Debian OS-Family) +# https://docs.docker.com/engine/install/debian/#uninstall-old-versions + +docker_obsolete_packages: + - docker + - docker.io + - docker-engine + - docker-doc + - docker-compose + - docker-compose-v2 + - podman-docker + - containerd + - runc diff --git a/docker/roles/geerlingguy.docker/vars/RedHat.yml b/docker/roles/geerlingguy.docker/vars/RedHat.yml new file mode 100644 index 0000000..d8063fb --- /dev/null +++ b/docker/roles/geerlingguy.docker/vars/RedHat.yml @@ -0,0 +1,14 @@ +--- +# Used only for Fedora/Rocky (RedHat OS-Family) +# https://docs.docker.com/engine/install/fedora/#uninstall-old-versions +# https://docs.docker.com/engine/install/centos/#uninstall-old-versions + +docker_obsolete_packages: + - docker + - docker-client + - docker-client-latest + - docker-common + - docker-latest + - docker-latest-logrotate + - docker-logrotate + - docker-engine diff --git a/projet00/collections/ansible_collections/community.docker-4.5.2.info/GALAXY.yml b/projet00/collections/ansible_collections/community.docker-4.5.2.info/GALAXY.yml new file mode 100644 index 0000000..6a10c49 --- /dev/null +++ b/projet00/collections/ansible_collections/community.docker-4.5.2.info/GALAXY.yml @@ -0,0 +1,8 @@ +download_url: https://galaxy.ansible.com/api/v3/plugin/ansible/content/published/collections/artifacts/community-docker-4.5.2.tar.gz +format_version: 1.0.0 +name: docker +namespace: community +server: https://galaxy.ansible.com/api/ +signatures: [] +version: 4.5.2 +version_url: /api/v3/plugin/ansible/content/published/collections/index/community/docker/versions/4.5.2/ diff --git a/projet00/collections/ansible_collections/community.library_inventory_filtering_v1-1.0.2.info/GALAXY.yml b/projet00/collections/ansible_collections/community.library_inventory_filtering_v1-1.0.2.info/GALAXY.yml new file mode 100644 index 0000000..3059472 --- /dev/null +++ b/projet00/collections/ansible_collections/community.library_inventory_filtering_v1-1.0.2.info/GALAXY.yml @@ -0,0 +1,8 @@ +download_url: https://galaxy.ansible.com/api/v3/plugin/ansible/content/published/collections/artifacts/community-library_inventory_filtering_v1-1.0.2.tar.gz +format_version: 1.0.0 +name: library_inventory_filtering_v1 +namespace: community +server: https://galaxy.ansible.com/api/ +signatures: [] +version: 1.0.2 +version_url: /api/v3/plugin/ansible/content/published/collections/index/community/library_inventory_filtering_v1/versions/1.0.2/ diff --git a/projet00/collections/ansible_collections/community/docker/.azure-pipelines/README.md b/projet00/collections/ansible_collections/community/docker/.azure-pipelines/README.md new file mode 100644 index 0000000..9e8ad74 --- /dev/null +++ b/projet00/collections/ansible_collections/community/docker/.azure-pipelines/README.md @@ -0,0 +1,9 @@ + + +## Azure Pipelines Configuration + +Please see the [Documentation](https://github.com/ansible/community/wiki/Testing:-Azure-Pipelines) for more information. diff --git a/projet00/collections/ansible_collections/community/docker/.azure-pipelines/azure-pipelines.yml b/projet00/collections/ansible_collections/community/docker/.azure-pipelines/azure-pipelines.yml new file mode 100644 index 0000000..6963afd --- /dev/null +++ b/projet00/collections/ansible_collections/community/docker/.azure-pipelines/azure-pipelines.yml @@ -0,0 +1,284 @@ +--- +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +trigger: + batch: true + branches: + include: + - main + - stable-* + +pr: + autoCancel: true + branches: + include: + - main + - stable-* + +schedules: + - cron: 0 9 * * * + displayName: Nightly + always: true + branches: + include: + - main + - cron: 0 12 * * 0 + displayName: Weekly (old stable branches) + always: true + branches: + include: + - stable-3 + +variables: + - name: checkoutPath + value: ansible_collections/community/docker + - name: coverageBranches + value: main + - name: entryPoint + value: tests/utils/shippable/shippable.sh + - name: fetchDepth + value: 0 + +resources: + containers: + - container: default + image: quay.io/ansible/azure-pipelines-test-container:6.0.0 + +pool: Standard + +stages: + +### Sanity & units + - stage: Ansible_devel + displayName: Sanity & Units devel + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + targets: + - name: Sanity + test: 'devel/sanity/1' + - name: Sanity Extra # Only on devel + test: 'devel/sanity/extra' + - name: Units + test: 'devel/units/1' + - stage: Ansible_2_18 + displayName: Sanity & Units 2.18 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + targets: + - name: Sanity + test: '2.18/sanity/1' + - name: Units + test: '2.18/units/1' + - stage: Ansible_2_17 + displayName: Sanity & Units 2.17 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + targets: + - name: Sanity + test: '2.17/sanity/1' + - name: Units + test: '2.17/units/1' + - stage: Ansible_2_16 + displayName: Sanity & Units 2.16 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + targets: + - name: Sanity + test: '2.16/sanity/1' + - name: Units + test: '2.16/units/1' + +### Docker + - stage: Docker_devel + displayName: Docker devel + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + testFormat: devel/linux/{0} + targets: + - name: Fedora 41 + test: fedora41 + - name: Ubuntu 22.04 + test: ubuntu2204 + - name: Ubuntu 24.04 + test: ubuntu2404 + - name: Alpine 3.21 + test: alpine321 + groups: + - 4 + - 5 + - stage: Docker_2_18 + displayName: Docker 2.18 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + testFormat: 2.18/linux/{0} + targets: + - name: Fedora 40 + test: fedora40 + - name: Ubuntu 22.04 + test: ubuntu2204 + - name: Alpine 3.20 + test: alpine320 + groups: + - 4 + - 5 + - stage: Docker_2_17 + displayName: Docker 2.17 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + testFormat: 2.17/linux/{0} + targets: + - name: Fedora 39 + test: fedora39 + - name: Ubuntu 20.04 + test: ubuntu2004 + - name: Alpine 3.19 + test: alpine319 + groups: + - 4 + - 5 + - stage: Docker_2_16 + displayName: Docker 2.16 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + testFormat: 2.16/linux/{0} + targets: + - name: Fedora 38 + test: fedora38 + - name: CentOS 7 + test: centos7 + - name: openSUSE 15 + test: opensuse15 + - name: Alpine 3 + test: alpine3 + groups: + - 4 + - 5 + +### Community Docker + - stage: Docker_community_devel + displayName: Docker (community images) devel + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + testFormat: devel/linux-community/{0} + targets: + - name: Debian Bullseye + test: debian-bullseye/3.9 + - name: Debian Bookworm + test: debian-bookworm/3.11 + - name: ArchLinux + test: archlinux/3.13 + groups: + - 4 + - 5 + +### Remote + - stage: Remote_devel + displayName: Remote devel + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + testFormat: devel/{0} + targets: + - name: RHEL 9.5 with Docker SDK, urllib3, requests from sources + test: rhel/9.5-dev-latest + groups: + - 1 + - 2 + - 3 + - 4 + - 5 + - stage: Remote_2_18 + displayName: Remote 2.18 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + testFormat: 2.18/{0} + targets: + - name: RHEL 9.4 + test: rhel/9.4 + groups: + - 1 + - 2 + - 3 + - 4 + - 5 + - stage: Remote_2_17 + displayName: Remote 2.17 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + testFormat: 2.17/{0} + targets: + - name: RHEL 9.3 + test: rhel/9.3 + groups: + - 1 + - 2 + - 3 + - 4 + - 5 + - stage: Remote_2_16 + displayName: Remote 2.16 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + testFormat: 2.16/{0} + targets: + - name: RHEL 9.2 + test: rhel/9.2 + # Currently always hangs in group 2 + # - name: RHEL 8.8 + # test: rhel/8.8 + - name: RHEL 7.9 + test: rhel/7.9 + groups: + - 1 + - 2 + - 3 + - 4 + - 5 + + ## Finally + + - stage: Summary + condition: succeededOrFailed() + dependsOn: + - Ansible_devel + - Ansible_2_18 + - Ansible_2_17 + - Ansible_2_16 + - Remote_devel + - Remote_2_18 + - Remote_2_17 + - Remote_2_16 + - Docker_devel + - Docker_2_18 + - Docker_2_17 + - Docker_2_16 + - Docker_community_devel + jobs: + - template: templates/coverage.yml diff --git a/projet00/collections/ansible_collections/community/docker/.azure-pipelines/scripts/aggregate-coverage.sh b/projet00/collections/ansible_collections/community/docker/.azure-pipelines/scripts/aggregate-coverage.sh new file mode 100755 index 0000000..0ccef35 --- /dev/null +++ b/projet00/collections/ansible_collections/community/docker/.azure-pipelines/scripts/aggregate-coverage.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# Aggregate code coverage results for later processing. + +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +set -o pipefail -eu + +agent_temp_directory="$1" + +PATH="${PWD}/bin:${PATH}" + +mkdir "${agent_temp_directory}/coverage/" + +if [[ "$(ansible --version)" =~ \ 2\.9\. ]]; then + exit +fi + +options=(--venv --venv-system-site-packages --color -v) + +ansible-test coverage combine --group-by command --export "${agent_temp_directory}/coverage/" "${options[@]}" + +if ansible-test coverage analyze targets generate --help >/dev/null 2>&1; then + # Only analyze coverage if the installed version of ansible-test supports it. + # Doing so allows this script to work unmodified for multiple Ansible versions. + ansible-test coverage analyze targets generate "${agent_temp_directory}/coverage/coverage-analyze-targets.json" "${options[@]}" +fi diff --git a/projet00/collections/ansible_collections/community/docker/.azure-pipelines/scripts/combine-coverage.py b/projet00/collections/ansible_collections/community/docker/.azure-pipelines/scripts/combine-coverage.py new file mode 100755 index 0000000..3b2fd99 --- /dev/null +++ b/projet00/collections/ansible_collections/community/docker/.azure-pipelines/scripts/combine-coverage.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# Copyright (c) Ansible Project +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +""" +Combine coverage data from multiple jobs, keeping the data only from the most recent attempt from each job. +Coverage artifacts must be named using the format: "Coverage $(System.JobAttempt) {StableUniqueNameForEachJob}" +The recommended coverage artifact name format is: Coverage $(System.JobAttempt) $(System.StageDisplayName) $(System.JobDisplayName) +Keep in mind that Azure Pipelines does not enforce unique job display names (only names). +It is up to pipeline authors to avoid name collisions when deviating from the recommended format. +""" + +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import os +import re +import shutil +import sys + + +def main(): + """Main program entry point.""" + source_directory = sys.argv[1] + + if '/ansible_collections/' in os.getcwd(): + output_path = "tests/output" + else: + output_path = "test/results" + + destination_directory = os.path.join(output_path, 'coverage') + + if not os.path.exists(destination_directory): + os.makedirs(destination_directory) + + jobs = {} + count = 0 + + for name in os.listdir(source_directory): + match = re.search('^Coverage (?P[0-9]+) (?P