mirror of
https://github.com/pyTooling/Actions.git
synced 2026-02-12 02:56:56 +08:00
283 lines
13 KiB
YAML
283 lines
13 KiB
YAML
# ==================================================================================================================== #
|
|
# Authors: #
|
|
# Patrick Lehmann #
|
|
# Unai Martinez-Corral #
|
|
# #
|
|
# ==================================================================================================================== #
|
|
# Copyright 2020-2022 The pyTooling Authors #
|
|
# #
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); #
|
|
# you may not use this file except in compliance with the License. #
|
|
# You may obtain a copy of the License at #
|
|
# #
|
|
# http://www.apache.org/licenses/LICENSE-2.0 #
|
|
# #
|
|
# Unless required by applicable law or agreed to in writing, software #
|
|
# distributed under the License is distributed on an "AS IS" BASIS, #
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
|
|
# See the License for the specific language governing permissions and #
|
|
# limitations under the License. #
|
|
# #
|
|
# SPDX-License-Identifier: Apache-2.0 #
|
|
# ==================================================================================================================== #
|
|
name: Parameters
|
|
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
name:
|
|
description: 'Name of the tool.'
|
|
required: true
|
|
type: string
|
|
python_version:
|
|
description: 'Python version.'
|
|
required: false
|
|
default: '3.11'
|
|
type: string
|
|
python_version_list:
|
|
description: 'Space separated list of Python versions to run tests with.'
|
|
required: false
|
|
default: '3.7 3.8 3.9 3.10 3.11'
|
|
type: string
|
|
system_list:
|
|
description: 'Space separated list of systems to run tests on.'
|
|
required: false
|
|
default: 'ubuntu windows mingw64 macos'
|
|
type: string
|
|
include_list:
|
|
description: 'Space separated list of system:python items to be included into the list of test.'
|
|
required: false
|
|
default: ''
|
|
type: string
|
|
exclude_list:
|
|
description: 'Space separated list of system:python items to be excluded from the list of test.'
|
|
required: false
|
|
default: ''
|
|
type: string
|
|
disable_list:
|
|
description: 'Space separated list of system:python items to be disabled from the list of test.'
|
|
required: false
|
|
default: ''
|
|
type: string
|
|
|
|
outputs:
|
|
python_version:
|
|
description: "Default Python version for other jobs."
|
|
value: ${{ jobs.Parameters.outputs.python_version }}
|
|
python_jobs:
|
|
description: "List of Python versions (and system combinations) to be used in the matrix of other jobs."
|
|
value: ${{ jobs.Parameters.outputs.python_jobs }}
|
|
artifact_names:
|
|
description: "Pre-defined artifact names for other jobs."
|
|
value: ${{ jobs.Parameters.outputs.artifact_names }}
|
|
params:
|
|
description: "Parameters to be used in other jobs."
|
|
value: ${{ jobs.Parameters.outputs.params }}
|
|
|
|
jobs:
|
|
Parameters:
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
python_version: ${{ steps.params.outputs.python_version }}
|
|
python_jobs: ${{ steps.params.outputs.python_jobs }}
|
|
artifact_names: ${{ steps.params.outputs.artifact_names }}
|
|
params: ${{ steps.params.outputs.params }}
|
|
|
|
steps:
|
|
- name: Generate 'params' and 'python_jobs'
|
|
id: params
|
|
shell: python
|
|
run: |
|
|
from json import dumps as json_dumps
|
|
from os import getenv
|
|
from pathlib import Path
|
|
from pprint import pprint
|
|
from textwrap import dedent
|
|
|
|
name = "${{ inputs.name }}".strip()
|
|
python_version = "${{ inputs.python_version }}".strip()
|
|
systems = "${{ inputs.system_list }}".strip()
|
|
versions = "${{ inputs.python_version_list }}".strip()
|
|
include_list = "${{ inputs.include_list }}".strip()
|
|
exclude_list = "${{ inputs.exclude_list }}".strip()
|
|
disable_list = "${{ inputs.disable_list }}".strip()
|
|
|
|
currentMSYS2Version = "3.10"
|
|
currentAlphaVersion = "3.12"
|
|
currentAlphaRelease = "3.12.0-alpha.1"
|
|
|
|
if systems == "":
|
|
print("::error title=Parameter::system_list is empty.")
|
|
else:
|
|
systems = [sys.strip() for sys in systems.split(" ")]
|
|
|
|
if versions == "":
|
|
versions = [ python_version ]
|
|
else:
|
|
versions = [ver.strip() for ver in versions.split(" ")]
|
|
|
|
if include_list == "":
|
|
includes = []
|
|
else:
|
|
includes = [tuple(include.strip().split(":")) for include in include_list.split(" ")]
|
|
|
|
if exclude_list == "":
|
|
excludes = []
|
|
else:
|
|
excludes = [exclude.strip() for exclude in exclude_list.split(" ")]
|
|
|
|
if disable_list == "":
|
|
disabled = []
|
|
else:
|
|
disabled = [disable.strip() for disable in disable_list.split(" ")]
|
|
|
|
if "3.6" in versions:
|
|
print("::warning title=Deprecated::Support for Python 3.6 ended in 2021.12.23.")
|
|
if "msys2" in systems:
|
|
print("::warning title=Deprecated::System 'msys2' will be replaced by 'mingw64'.")
|
|
if currentAlphaVersion in versions:
|
|
print(f"::notice title=Experimental::Python {currentAlphaVersion} ({currentAlphaRelease}) is a pre-release.")
|
|
for disable in disabled:
|
|
print(f"::warning title=Disabled Python Job::System '{disable}' temporary disabled.")
|
|
|
|
data = {
|
|
# Python and PyPy versions supported by "setup-python" action
|
|
"python": {
|
|
"3.6": { "icon": "⚫", "until": "2021.12.23" },
|
|
"3.7": { "icon": "🔴", "until": "2023.06.27" },
|
|
"3.8": { "icon": "🟠", "until": "2024.10" },
|
|
"3.9": { "icon": "🟡", "until": "2025.10" },
|
|
"3.10": { "icon": "🟢", "until": "2026.10" },
|
|
"3.11": { "icon": "🟢", "until": "2027.10" },
|
|
"3.12": { "icon": "🟣", "until": "2028.10" },
|
|
"pypy-3.7": { "icon": "⟲🔴", "until": "????.??" },
|
|
"pypy-3.8": { "icon": "⟲🟠", "until": "????.??" },
|
|
"pypy-3.9": { "icon": "⟲🟡", "until": "????.??" },
|
|
},
|
|
# Runner systems (runner images) supported by GitHub Actions
|
|
"sys": {
|
|
"ubuntu": { "icon": "🐧", "runs-on": "ubuntu-latest", "shell": "bash", "name": "Linux (x86-64)" },
|
|
"windows": { "icon": "🪟", "runs-on": "windows-latest", "shell": "pwsh", "name": "Windows (x86-64)" },
|
|
"macos": { "icon": "🍎", "runs-on": "macos-latest", "shell": "bash", "name": "MacOS (x86-64)" },
|
|
},
|
|
# Runtimes provided by MSYS2
|
|
"runtime": {
|
|
"msys": { "icon": "🪟🟪", "name": "Windows+MSYS2 (x86-64) - MSYS" },
|
|
"mingw32": { "icon": "🪟⬛", "name": "Windows+MSYS2 (x86-64) - MinGW32" },
|
|
"mingw64": { "icon": "🪟🟦", "name": "Windows+MSYS2 (x86-64) - MinGW64" },
|
|
"clang32": { "icon": "🪟🟫", "name": "Windows+MSYS2 (x86-64) - Clang32" },
|
|
"clang64": { "icon": "🪟🟧", "name": "Windows+MSYS2 (x86-64) - Clang64" },
|
|
"ucrt64": { "icon": "🪟🟨", "name": "Windows+MSYS2 (x86-64) - UCRT64" },
|
|
}
|
|
}
|
|
|
|
print(f"includes ({len(includes)}):")
|
|
for system,version in includes:
|
|
print(f"- {system}:{version}")
|
|
print(f"excludes ({len(excludes)}):")
|
|
for exclude in excludes:
|
|
print(f"- {exclude}")
|
|
print(f"disabled ({len(disabled)}):")
|
|
for disable in disabled:
|
|
print(f"- {disable}")
|
|
|
|
combinations = [
|
|
(system, version)
|
|
for system in systems
|
|
if system in data["sys"]
|
|
for version in versions
|
|
if version in data["python"]
|
|
and f"{system}:{version}" not in excludes
|
|
and f"{system}:{version}" not in disabled
|
|
] + [
|
|
(system, currentMSYS2Version)
|
|
for system in systems
|
|
if system in data["runtime"]
|
|
and f"{system}:{currentMSYS2Version}" not in excludes
|
|
and f"{system}:{currentMSYS2Version}" not in disabled
|
|
] + [
|
|
(system, version)
|
|
for system, version in includes
|
|
if system in data["sys"]
|
|
and version in data["python"]
|
|
and f"{system}:{version}" not in disabled
|
|
]
|
|
print(f"Combinations ({len(combinations)}):")
|
|
for system, version in combinations:
|
|
print(f"- {system}:{version}")
|
|
|
|
jobs = [
|
|
{
|
|
"sysicon": data["sys"][system]["icon"],
|
|
"system": system,
|
|
"runs-on": data["sys"][system]["runs-on"],
|
|
"shell": data["sys"][system]["shell"],
|
|
"pyicon": data["python"][version]["icon"],
|
|
"python": currentAlphaRelease if version == currentAlphaVersion else version,
|
|
"envname": data["sys"][system]["name"],
|
|
}
|
|
for system, version in combinations if system in data["sys"]
|
|
] + [
|
|
{
|
|
"sysicon": data["runtime"][runtime]["icon"],
|
|
"system": "msys2",
|
|
"runs-on": "windows-latest",
|
|
"runtime": runtime.upper(),
|
|
"shell": "msys2 {0}",
|
|
"pyicon": data["python"][currentMSYS2Version]["icon"],
|
|
"python": version,
|
|
"envname": data["runtime"][runtime]["name"],
|
|
}
|
|
for runtime, version in combinations if runtime not in data["sys"]
|
|
]
|
|
|
|
artifact_names = {
|
|
"unittesting_xml": f"{name}-TestReportSummary-XML",
|
|
"codecoverage_xml": f"{name}-CodeCoverage-XML",
|
|
"codecoverage_html": f"{name}-CodeCoverage-HTML",
|
|
"statictyping_html": f"{name}-StaticTyping-HTML",
|
|
"package_all": f"{name}-Packages",
|
|
"documentation_pdf": f"{name}-Documentation-PDF",
|
|
"documentation_html": f"{name}-Documentation-HTML",
|
|
}
|
|
|
|
# Deprecated structure
|
|
params = {
|
|
"python_version": python_version,
|
|
"artifacts": {
|
|
"unittesting": f"{artifact_names['unittesting_xml']}",
|
|
"coverage": f"{artifact_names['codecoverage_html']}",
|
|
"typing": f"{artifact_names['statictyping_html']}",
|
|
"package": f"{artifact_names['package_all']}",
|
|
"doc": f"{artifact_names['documentation_html']}",
|
|
}
|
|
}
|
|
|
|
print("Parameters:")
|
|
print(f" python_version: {python_version}")
|
|
print(f" python_jobs ({len(jobs)}):\n" +
|
|
"".join([f" {{ " + ", ".join([f"\"{key}\": \"{value}\"" for key, value in job.items()]) + f" }},\n" for job in jobs])
|
|
)
|
|
print(f" artifact_names ({len(artifact_names)}):")
|
|
for id, name in artifact_names.items():
|
|
print(f" {id:>20}: {name}")
|
|
|
|
# Write jobs to special file
|
|
github_output = Path(getenv("GITHUB_OUTPUT"))
|
|
print(f"GITHUB_OUTPUT: {github_output}")
|
|
with github_output.open("a+", encoding="utf-8") as f:
|
|
f.write(dedent(f"""\
|
|
python_version={python_version}
|
|
python_jobs={json_dumps(jobs)}
|
|
artifact_names={json_dumps(artifact_names)}
|
|
params={json_dumps(params)}
|
|
"""))
|
|
|
|
- name: Verify out parameters
|
|
id: verify
|
|
run: |
|
|
echo 'python_version: ${{ steps.params.outputs.python_version }}'
|
|
echo 'python_jobs: ${{ steps.params.outputs.python_jobs }}'
|
|
echo 'artifact_names: ${{ steps.params.outputs.artifact_names }}'
|
|
echo 'params: ${{ steps.params.outputs.params }}'
|