ci/regen-workflow.py

Summary

Maintainability
A
0 mins
Test Coverage
#!/usr/bin/env python3
import json
import os
import sys

try:
    import yaml
except ImportError:
    sys.exit("Please install pyyaml. (In some package managers, this is called python-yaml or python3-yaml.)")

# Why is this script necessary? Well, the different jobs run in the CI build have a lot of shared steps.
# To avoid duplication, the CI YAML file relies on a lot of anchors (look up "YAML anchors" for details) to
# riuse pieces of information
# Unfortunately, GitHub does not support YAML anchors in workflow files:
# https://github.community/t/support-for-yaml-anchors/16128/33
# The only way to get it to work is to have an intermediary script like this.

repo_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))

with open(os.path.join(repo_dir, "ci/spec.yml")) as f:
    loader = yaml.SafeLoader(f)

    loader.bool_values = dict(yaml.SafeLoader.bool_values)
    # GitHub Actions has an "on" key that gets translated to 'true' without this.
    loader.bool_values.update({"on": "on"})

    ci_spec = loader.get_single_data()

ci_spec.pop(".anchors", None)

with open(os.path.join(repo_dir, ".github/workflows/ci.yml"), "w") as f:
    f.write("# WARNING: Do not edit this file manually! Edit ci/spec.yml and run ci/regen-workflow.py.\n\n")

    json.dump(ci_spec, f, indent=4)