Compute a hash based on the content of a stage, together with the hash of its parent stage. The output of a pipeline is saved by the id of the last stage. This is largely equivalent to the current logic, where it is the pipeline that contains the id, but this means that the ids are indepedent of how pipelines are split, the only thing that matters is the sequence of stages, not whether or not they are in one or several interdependent pipelines. Signed-off-by: Tom Gundersen <teg@jklm.no>
43 lines
1.5 KiB
Python
Executable file
43 lines
1.5 KiB
Python
Executable file
#!/usr/bin/python3
|
|
|
|
import argparse
|
|
import json
|
|
import os
|
|
import osbuild
|
|
import subprocess
|
|
import sys
|
|
|
|
|
|
RESET = "\033[0m"
|
|
BOLD = "\033[1m"
|
|
RED = "\033[31m"
|
|
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser(description="Build operating system images")
|
|
parser.add_argument("pipeline_path", metavar="PIPELINE",
|
|
help="json file containing the pipeline that should be built")
|
|
parser.add_argument("--objects", metavar="DIRECTORY", type=os.path.abspath,
|
|
default=".osbuild/objects",
|
|
help="the directory where intermediary os trees are stored")
|
|
requiredNamed = parser.add_argument_group('required named arguments')
|
|
requiredNamed.add_argument("-o", "--output", dest="output_dir", metavar="DIRECTORY", type=os.path.abspath,
|
|
help="provide the empty DIRECTORY as output argument to the last stage", required=True)
|
|
args = parser.parse_args()
|
|
|
|
os.makedirs("/run/osbuild", exist_ok=True)
|
|
|
|
with open(args.pipeline_path) as f:
|
|
pipeline = json.load(f)
|
|
pipeline = osbuild.Pipeline(pipeline, args.objects)
|
|
|
|
try:
|
|
pipeline.run(args.output_dir, interactive=True)
|
|
except KeyboardInterrupt:
|
|
print()
|
|
print(f"{RESET}{BOLD}{RED}Aborted{RESET}")
|
|
sys.exit(130)
|
|
except osbuild.StageFailed as error:
|
|
print()
|
|
print(f"{RESET}{BOLD}{RED}{error.stage} failed with code {error.returncode}{RESET}")
|
|
sys.exit(1)
|