stages/ostree.commit: port from assembler
Port the `org.osbuild.ostree.commit` assembler to a new assembler like stage. The notable differences are: the fs tree preparation now happens in the `ostree.preptree` stage and there is no option to create a tarball, since that should be handled by a tar stage.
This commit is contained in:
parent
3aa88fe06c
commit
27a65caed3
1 changed files with 118 additions and 0 deletions
118
stages/org.osbuild.ostree.commit
Executable file
118
stages/org.osbuild.ostree.commit
Executable file
|
|
@ -0,0 +1,118 @@
|
|||
#!/usr/bin/python3
|
||||
"""
|
||||
Assemble a file system tree into a ostree commit
|
||||
|
||||
Needs a file system tree that is already conforming to the ostree
|
||||
system layout[1], specified via the `tree` input and commits it
|
||||
to a repository. The repository must have been created at `/repo`.
|
||||
|
||||
Additional metadata is stored in `/compose.json` which contains
|
||||
the commit compose information. This is also returned via the
|
||||
metadata API to osbuild.
|
||||
|
||||
[1] https://ostree.readthedocs.io/en/stable/manual/adapting-existing/
|
||||
"""
|
||||
|
||||
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
from osbuild import api
|
||||
from osbuild.util import ostree
|
||||
|
||||
|
||||
SCHEMA_2 = """
|
||||
"options": {
|
||||
"additionalProperties": false,
|
||||
"required": ["ref"],
|
||||
"properties": {
|
||||
"ref": {
|
||||
"description": "OStree ref to create for the commit",
|
||||
"type": "string",
|
||||
"default": ""
|
||||
},
|
||||
"os_version": {
|
||||
"description": "Set the version of the OS as commit metadata",
|
||||
"type": "string"
|
||||
},
|
||||
"parent": {
|
||||
"description": "commit id of the parent commit",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"inputs": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["tree"],
|
||||
"properties": {
|
||||
"tree": {
|
||||
"type": "object",
|
||||
"additionalProperties": true
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
|
||||
def main(inputs, output_dir, options, meta):
|
||||
tree = inputs["tree"]["path"]
|
||||
|
||||
ref = options["ref"]
|
||||
os_version = options.get("os_version", None)
|
||||
parent = options.get("parent", None)
|
||||
|
||||
# rpm-ostree compose commit wants to consume the commit
|
||||
# so for now, we copy the whole tree and let it have its
|
||||
# way
|
||||
with tempfile.TemporaryDirectory(dir=output_dir) as root:
|
||||
subprocess.run(["cp", "--reflink=auto", "-a",
|
||||
f"{tree}/.", root],
|
||||
check=True)
|
||||
|
||||
repo = os.path.join(output_dir, "repo")
|
||||
|
||||
treefile = ostree.Treefile()
|
||||
treefile["ref"] = ref
|
||||
|
||||
argv = ["rpm-ostree", "compose", "commit"]
|
||||
argv += [f"--repo={repo}"]
|
||||
|
||||
if parent:
|
||||
argv += [f"--parent={parent}"]
|
||||
|
||||
if os_version:
|
||||
argv += [
|
||||
f"--add-metadata-string=version={os_version}",
|
||||
]
|
||||
|
||||
argv += [
|
||||
f"--add-metadata-string=rpmostree.inputhash={meta['id']}",
|
||||
f"--write-composejson-to={output_dir}/compose.json"
|
||||
]
|
||||
|
||||
with treefile.as_tmp_file() as path:
|
||||
argv += [path, root]
|
||||
|
||||
subprocess.run(argv,
|
||||
stdout=sys.stderr,
|
||||
check=True)
|
||||
|
||||
with open(os.path.join(output_dir, "compose.json"), "r") as f:
|
||||
compose = json.load(f)
|
||||
|
||||
api.metadata({"compose": compose})
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
args = api.arguments()
|
||||
|
||||
r = main(args["inputs"],
|
||||
args["tree"],
|
||||
args["options"],
|
||||
args["meta"])
|
||||
|
||||
sys.exit(r)
|
||||
Loading…
Add table
Add a link
Reference in a new issue