From 68241982eda754a28f9f0b26b6e79605013970de Mon Sep 17 00:00:00 2001 From: John Barker Date: Wed, 3 Feb 2021 11:40:48 +0000 Subject: [PATCH] Initial Azure Pipelines configuration --- .azure-pipelines/README.md | 3 + .azure-pipelines/azure-pipelines.yml | 126 ++++++++++++++++++ .../scripts/aggregate-coverage.sh | 20 +++ .azure-pipelines/scripts/combine-coverage.py | 60 +++++++++ .azure-pipelines/scripts/process-results.sh | 24 ++++ .azure-pipelines/scripts/publish-codecov.sh | 27 ++++ .azure-pipelines/scripts/report-coverage.sh | 15 +++ .azure-pipelines/scripts/run-tests.sh | 34 +++++ .azure-pipelines/scripts/time-command.py | 25 ++++ .azure-pipelines/templates/coverage.yml | 39 ++++++ .azure-pipelines/templates/matrix.yml | 55 ++++++++ .azure-pipelines/templates/test.yml | 45 +++++++ shippable.yml | 56 -------- tests/utils/shippable/sanity.sh | 27 +--- tests/utils/shippable/shippable.sh | 29 ++-- 15 files changed, 496 insertions(+), 89 deletions(-) create mode 100644 .azure-pipelines/README.md create mode 100644 .azure-pipelines/azure-pipelines.yml create mode 100755 .azure-pipelines/scripts/aggregate-coverage.sh create mode 100755 .azure-pipelines/scripts/combine-coverage.py create mode 100755 .azure-pipelines/scripts/process-results.sh create mode 100755 .azure-pipelines/scripts/publish-codecov.sh create mode 100755 .azure-pipelines/scripts/report-coverage.sh create mode 100755 .azure-pipelines/scripts/run-tests.sh create mode 100755 .azure-pipelines/scripts/time-command.py create mode 100644 .azure-pipelines/templates/coverage.yml create mode 100644 .azure-pipelines/templates/matrix.yml create mode 100644 .azure-pipelines/templates/test.yml delete mode 100644 shippable.yml diff --git a/.azure-pipelines/README.md b/.azure-pipelines/README.md new file mode 100644 index 0000000..385e70b --- /dev/null +++ b/.azure-pipelines/README.md @@ -0,0 +1,3 @@ +## Azure Pipelines Configuration + +Please see the [Documentation](https://github.com/ansible/community/wiki/Testing:-Azure-Pipelines) for more information. diff --git a/.azure-pipelines/azure-pipelines.yml b/.azure-pipelines/azure-pipelines.yml new file mode 100644 index 0000000..4f9ceaa --- /dev/null +++ b/.azure-pipelines/azure-pipelines.yml @@ -0,0 +1,126 @@ +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 + - stable-* + +variables: + - name: checkoutPath + value: ansible_collections/hetzner/hcloud + - name: coverageBranches + value: main + - name: pipelinesCoverage + value: coverage + - name: entryPoint + value: tests/utils/shippable/shippable.sh + - name: fetchDepth + value: 0 + +resources: + containers: + - container: default + image: quay.io/ansible/azure-pipelines-test-container:1.7.1 + +pool: Standard + +stages: +### Sanity + - stage: Ansible_devel + displayName: Sanity devel + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + targets: + - name: Sanity + test: 'devel/sanity/1' + - stage: Ansible_2_10 + displayName: Sanity & Units 2.10 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + targets: + - name: Sanity + test: '2.10/sanity/1' + - stage: Ansible_2_9 + displayName: Sanity 2.9 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + targets: + - name: Sanity + test: '2.9/sanity/1' + +## Integration tests (remote) + - stage: Hetzner_devel + displayName: Hetzner devel + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + nameFormat: Python 3.8 {0} + testFormat: devel/hcloud/3.8/{0} + targets: + - test: '' + groups: + - 1 + - 2 + - stage: Hetzner_2_10 + displayName: Hetzner 2.10 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + nameFormat: Python 3.8 {0} + testFormat: 2.10/hcloud/3.8/{0} + targets: + - test: '' + groups: + - 1 + - 2 + - 3 + - stage: Hetzner_2_9 + displayName: Hetzner 2.9 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + nameFormat: Python 3.8 {0} + testFormat: 2.9/hcloud/3.8/{0} + targets: + - test: '' + groups: + - 1 + - 2 + - 3 +### Finally + - stage: Summary + condition: succeededOrFailed() + dependsOn: + - Ansible_devel + - Ansile_2_10 + - Ansile_2_9 + - Hetzner_devel + - Hetzner_2_10 + - Hetzner_2_9 + jobs: + - template: templates/coverage.yml diff --git a/.azure-pipelines/scripts/aggregate-coverage.sh b/.azure-pipelines/scripts/aggregate-coverage.sh new file mode 100755 index 0000000..f3113dd --- /dev/null +++ b/.azure-pipelines/scripts/aggregate-coverage.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# Aggregate code coverage results for later processing. + +set -o pipefail -eu + +agent_temp_directory="$1" + +PATH="${PWD}/bin:${PATH}" + +mkdir "${agent_temp_directory}/coverage/" + +options=(--venv --venv-system-site-packages --color -v) + +ansible-test coverage combine --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/.azure-pipelines/scripts/combine-coverage.py b/.azure-pipelines/scripts/combine-coverage.py new file mode 100755 index 0000000..506ade6 --- /dev/null +++ b/.azure-pipelines/scripts/combine-coverage.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python +""" +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