Allow choosing which OS to run tests against using labels

This commit is contained in:
Pedro Algarvio 2024-03-26 08:55:37 +00:00
parent 0d27cf6c1f
commit fb58df01f4
9 changed files with 1186 additions and 38 deletions

1136
.github/workflows/ci.yml vendored

File diff suppressed because it is too large Load diff

View file

@ -87,7 +87,8 @@ jobs:
jobs: ${{ steps.define-jobs.outputs.jobs }}
runners: ${{ steps.runner-types.outputs.runners }}
changed-files: ${{ steps.process-changed-files.outputs.changed-files }}
pull-labels: ${{ steps.get-pull-labels.outputs.labels }}
os-labels: ${{ steps.get-pull-labels.outputs.os-labels }}
pull-labels: ${{ steps.get-pull-labels.outputs.test-labels }}
testrun: ${{ steps.define-testrun.outputs.testrun }}
salt-version: ${{ steps.setup-salt-version.outputs.salt-version }}
cache-seed: ${{ steps.set-cache-seed.outputs.cache-seed }}

View file

@ -77,7 +77,8 @@ jobs:
jobs: ${{ steps.define-jobs.outputs.jobs }}
runners: ${{ steps.runner-types.outputs.runners }}
changed-files: ${{ steps.process-changed-files.outputs.changed-files }}
pull-labels: ${{ steps.get-pull-labels.outputs.labels }}
os-labels: ${{ steps.get-pull-labels.outputs.os-labels }}
pull-labels: ${{ steps.get-pull-labels.outputs.test-labels }}
testrun: ${{ steps.define-testrun.outputs.testrun }}
salt-version: ${{ steps.setup-salt-version.outputs.salt-version }}
cache-seed: ${{ steps.set-cache-seed.outputs.cache-seed }}

View file

@ -73,7 +73,8 @@ jobs:
jobs: ${{ steps.define-jobs.outputs.jobs }}
runners: ${{ steps.runner-types.outputs.runners }}
changed-files: ${{ steps.process-changed-files.outputs.changed-files }}
pull-labels: ${{ steps.get-pull-labels.outputs.labels }}
os-labels: ${{ steps.get-pull-labels.outputs.os-labels }}
pull-labels: ${{ steps.get-pull-labels.outputs.test-labels }}
testrun: ${{ steps.define-testrun.outputs.testrun }}
salt-version: ${{ steps.setup-salt-version.outputs.salt-version }}
cache-seed: ${{ steps.set-cache-seed.outputs.cache-seed }}

View file

@ -91,7 +91,8 @@ jobs:
jobs: ${{ steps.define-jobs.outputs.jobs }}
runners: ${{ steps.runner-types.outputs.runners }}
changed-files: ${{ steps.process-changed-files.outputs.changed-files }}
pull-labels: ${{ steps.get-pull-labels.outputs.labels }}
os-labels: ${{ steps.get-pull-labels.outputs.os-labels }}
pull-labels: ${{ steps.get-pull-labels.outputs.test-labels }}
testrun: ${{ steps.define-testrun.outputs.testrun }}
salt-version: ${{ steps.setup-salt-version.outputs.salt-version }}
cache-seed: ${{ steps.set-cache-seed.outputs.cache-seed }}

View file

@ -4,7 +4,11 @@
<{ job_name }>:
<%- do test_salt_pkg_needs.append(job_name) %>
name: <{ display_name }> Package Test
<%- if workflow_slug != "ci" or slug in mandatory_os %>
if: ${{ fromJSON(needs.prepare-workflow.outputs.jobs)['test-pkg'] && fromJSON(needs.prepare-workflow.outputs.runners)['self-hosted'] }}
<%- else %>
if: ${{ fromJSON(needs.prepare-workflow.outputs.jobs)['test-pkg'] && fromJSON(needs.prepare-workflow.outputs.runners)['self-hosted'] && contains(fromJSON('["<{ slug }>", "all"]'), needs.prepare-workflow.outputs.os-labels) }}
<%- endif %>
needs:
- prepare-workflow
- build-pkgs-onedir
@ -36,7 +40,11 @@
<{ job_name }>:
<%- do test_salt_pkg_needs.append(job_name) %>
name: <{ display_name }> Package Test
<%- if workflow_slug != "ci" or slug in mandatory_os %>
if: ${{ fromJSON(needs.prepare-workflow.outputs.jobs)['test-pkg'] && fromJSON(needs.prepare-workflow.outputs.runners)['github-hosted'] }}
<%- else %>
if: ${{ fromJSON(needs.prepare-workflow.outputs.jobs)['test-pkg'] && fromJSON(needs.prepare-workflow.outputs.runners)['github-hosted'] && contains(fromJSON('["<{ slug }>", "all"]'), needs.prepare-workflow.outputs.os-labels) }}
<%- endif %>
needs:
- prepare-workflow
- build-pkgs-onedir
@ -65,7 +73,11 @@
<{ job_name }>:
<%- do test_salt_pkg_needs.append(job_name) %>
name: <{ display_name }> <{ pkg_type }> Package Test
<%- if workflow_slug != "ci" or slug in mandatory_os %>
if: ${{ fromJSON(needs.prepare-workflow.outputs.jobs)['test-pkg'] && fromJSON(needs.prepare-workflow.outputs.runners)['self-hosted'] }}
<%- else %>
if: ${{ fromJSON(needs.prepare-workflow.outputs.jobs)['test-pkg'] && fromJSON(needs.prepare-workflow.outputs.runners)['self-hosted'] && contains(fromJSON('["<{ slug }>", "all"]'), needs.prepare-workflow.outputs.os-labels) }}
<%- endif %>
needs:
- prepare-workflow
- build-pkgs-onedir

View file

@ -9,7 +9,11 @@
<{ slug.replace(".", "") }>:
<%- do test_salt_needs.append(slug.replace(".", "")) %>
name: <{ display_name }> Test
<%- if workflow_slug != "ci" or slug in mandatory_os %>
if: ${{ fromJSON(needs.prepare-workflow.outputs.jobs)['test'] && fromJSON(needs.prepare-workflow.outputs.runners)['self-hosted'] }}
<%- else %>
if: ${{ fromJSON(needs.prepare-workflow.outputs.jobs)['test'] && fromJSON(needs.prepare-workflow.outputs.runners)['self-hosted'] && contains(fromJSON('["<{ slug }>", "all"]'), needs.prepare-workflow.outputs.os-labels) }}
<%- endif %>
needs:
- prepare-workflow
- build-ci-deps
@ -36,7 +40,11 @@
<{ slug.replace(".", "") }>:
<%- do test_salt_needs.append(slug.replace(".", "")) %>
name: <{ display_name }> Test
<%- if workflow_slug != "ci" or slug in mandatory_os %>
if: ${{ fromJSON(needs.prepare-workflow.outputs.jobs)['test'] && fromJSON(needs.prepare-workflow.outputs.runners)['github-hosted'] }}
<%- else %>
if: ${{ fromJSON(needs.prepare-workflow.outputs.jobs)['test'] && fromJSON(needs.prepare-workflow.outputs.runners)['github-hosted'] && contains(fromJSON('["<{ slug }>", "all"]'), needs.prepare-workflow.outputs.os-labels) }}
<%- endif %>
needs:
- prepare-workflow
- build-ci-deps
@ -62,7 +70,11 @@
<{ slug.replace(".", "") }>:
<%- do test_salt_needs.append(slug.replace(".", "")) %>
name: <{ display_name }> Test
<%- if workflow_slug != "ci" or slug in mandatory_os %>
if: ${{ fromJSON(needs.prepare-workflow.outputs.jobs)['test'] && fromJSON(needs.prepare-workflow.outputs.runners)['self-hosted'] }}
<%- else %>
if: ${{ fromJSON(needs.prepare-workflow.outputs.jobs)['test'] && fromJSON(needs.prepare-workflow.outputs.runners)['self-hosted'] && contains(fromJSON('["<{ slug }>", "all"]'), needs.prepare-workflow.outputs.os-labels) }}
<%- endif %>
needs:
- prepare-workflow
- build-ci-deps

View file

@ -949,10 +949,15 @@ def get_pr_test_labels(
pr = gh_event["pull_request"]["number"]
labels = _get_pr_test_labels_from_event_payload(gh_event)
os_labels = []
test_labels = []
if labels:
ctx.info(f"Test labels for pull-request #{pr} on {repository}:")
for name, description in labels:
for name, description in sorted(labels):
ctx.info(f" * [yellow]{name}[/yellow]: {description}")
test_labels.append(name)
if name.startswith("test:os:"):
os_labels.append(name.split("test:os:", 1)[-1])
else:
ctx.info(f"No test labels for pull-request #{pr} on {repository}")
@ -965,7 +970,8 @@ def get_pr_test_labels(
ctx.info("Writing 'labels' to the github outputs file")
with open(github_output, "a", encoding="utf-8") as wfh:
wfh.write(f"labels={json.dumps([label[0] for label in labels])}\n")
wfh.write(f"os-labels={json.dumps([label for label in os_labels])}\n")
wfh.write(f"test-labels={json.dumps([label for label in test_labels])}\n")
ctx.exit(0)

View file

@ -317,21 +317,23 @@ def generate_workflows(ctx: Context):
"test_repo_needs": NeedsTracker(),
"prepare_workflow_needs": NeedsTracker(),
"build_repo_needs": NeedsTracker(),
"test_salt_listing": _filter_jobs_by_workflow(
workflow_slug, test_salt_listing
),
"test_salt_pkg_listing": _filter_jobs_by_workflow(
workflow_slug, test_salt_pkg_listing
),
"test_salt_listing": test_salt_listing,
"test_salt_pkg_listing": test_salt_pkg_listing,
"build_ci_deps_listing": build_ci_deps_listing,
"test_salt_pkg_downloads_listing": _filter_jobs_by_workflow(
workflow_slug, test_salt_pkg_downloads_listing
),
"test_salt_pkg_downloads_listing": test_salt_pkg_downloads_listing,
"test_salt_pkg_downloads_needs_slugs": sorted(
test_salt_pkg_downloads_needs_slugs
),
"build_rpms_listing": build_rpms_listing,
"build_debs_listing": build_debs_listing,
"mandatory_os": (
"almalinux-9",
"amazonlinux-2023-arm64",
"archlinux-lts",
"macos-13",
"ubuntu-22.04-arm64",
"windows-2022",
),
}
shared_context_file = (
tools.utils.REPO_ROOT / "cicd" / "shared-gh-workflows-context.yml"
@ -344,28 +346,6 @@ def generate_workflows(ctx: Context):
workflow_path.write_text(rendered_template.rstrip() + "\n")
def _filter_jobs_by_workflow(
workflow_slug: str, jobs: dict
) -> dict[str, list[tuple[str, str, str]]]:
short_worflow_os = (
"almalinux-9",
"amazonlinux-2023-arm64",
"ubuntu-22.04-arm64",
"windows-2022",
"macos-13",
"archlinux-lts",
)
if workflow_slug != "ci":
return jobs
selected: dict[str, list[tuple[str, str, str]]] = {}
for platform in jobs:
for entry in jobs[platform]:
if entry[0] in short_worflow_os:
selected.setdefault(platform, []).append(entry)
return selected
@cgroup.command(
name="actionlint",
arguments={