Skip to content

Commit b2b5fda

Browse files
committed
create-legacy-oscontainer: use runvm to build legacy oscontainer
This introduces a new command to create a oci-archive of the legacy oscontainer that will be pushed with `cosa push-container-manifest` by the pipeline.
1 parent 3d742f1 commit b2b5fda

File tree

12 files changed

+497
-12
lines changed

12 files changed

+497
-12
lines changed

cmd/coreos-assembler.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313

1414
// commands we'd expect to use in the local dev path
1515
var buildCommands = []string{"init", "fetch", "build", "run", "prune", "clean", "list"}
16-
var advancedBuildCommands = []string{"buildfetch", "buildupload", "oc-adm-release", "push-container", "upload-oscontainer", "buildextend-extensions"}
16+
var advancedBuildCommands = []string{"buildfetch", "buildupload", "oc-adm-release", "push-container", "upload-oscontainer", "buildextend-extensions", "create-legacy-oscontainer"}
1717
var buildextendCommands = []string{"aliyun", "aws", "azure", "digitalocean", "exoscale", "gcp", "ibmcloud", "kubevirt", "live", "metal", "metal4k", "nutanix", "openstack", "qemu", "secex", "virtualbox", "vmware", "vultr"}
1818
var utilityCommands = []string{"aws-replicate", "build-extensions-container", "compress", "generate-hashlist", "koji-upload", "kola", "push-container-manifest", "remote-build-container", "remote-prune", "remote-session", "sign", "update-variant"}
1919
var otherCommands = []string{"shell", "meta"}

docs/cosa.md

+1
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,4 @@ Those less commonly used commands are listed here:
7272
| [tag](https://github.com/coreos/coreos-assembler/blob/main/src/cmd-tag) | Operate on the tags in `builds.json`
7373
| [test-coreos-installer](https://github.com/coreos/coreos-assembler/blob/main/src/cmd-test-coreos-installer) | Automate an end-to-end run of coreos-installer with the metal image
7474
| [upload-oscontainer](https://github.com/coreos/coreos-assembler/blob/main/src/cmd-upload-oscontainer) | Upload an oscontainer (historical wrapper for `cosa oscontainer`)
75+
| [create-legacy-oscontainer](https://github.com/coreos/coreos-assembler/blob/main/src/cmd-create-legacy-oscontainer) | Create an oscontainer oci-archive (historical wrapper for `cosa oscontainer`)

mantle/vendor/github.com/coreos/coreos-assembler/pkg/builds/build.go

+2-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mantle/vendor/github.com/coreos/coreos-assembler/pkg/builds/cosa_v1.go

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mantle/vendor/github.com/coreos/coreos-assembler/pkg/builds/schema_doc.go

+8-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/builds/cosa_v1.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package builds
22

33
// generated by 'make schema'
4-
// source hash: 144450d458f89f637ca487d353af3dfd60096ddbf3179da8e2b42b2bd2d0a6eb
4+
// source hash: 3508b2f150e72b8e24151d870789809cf4070cec6b4716966a4e8bc585e0c5f1
55

66
type AdvisoryDiff []AdvisoryDiffItems
77

@@ -101,6 +101,7 @@ type BuildArtifacts struct {
101101
Iso *Artifact `json:"iso,omitempty"`
102102
Kernel *Artifact `json:"kernel,omitempty"`
103103
KubeVirt *Artifact `json:"kubevirt,omitempty"`
104+
LegacyOscontainer *Artifact `json:"legacy-oscontainer,omitempty"`
104105
LiveInitramfs *Artifact `json:"live-initramfs,omitempty"`
105106
LiveIso *Artifact `json:"live-iso,omitempty"`
106107
LiveKernel *Artifact `json:"live-kernel,omitempty"`

pkg/builds/schema_doc.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Generated by ./generate-schema.sh
2-
// Source hash: 144450d458f89f637ca487d353af3dfd60096ddbf3179da8e2b42b2bd2d0a6eb
2+
// Source hash: 3508b2f150e72b8e24151d870789809cf4070cec6b4716966a4e8bc585e0c5f1
33
// DO NOT EDIT
44

55
package builds
@@ -446,6 +446,7 @@ var generatedSchemaJSON = `{
446446
"digitalocean",
447447
"exoscale",
448448
"extensions-container",
449+
"legacy-oscontainer",
449450
"gcp",
450451
"kubevirt",
451452
"ibmcloud",
@@ -492,6 +493,12 @@ var generatedSchemaJSON = `{
492493
"title": "extensions-container",
493494
"$ref": "#/definitions/artifact"
494495
},
496+
"legacy-oscontainer": {
497+
"$id": "#/properties/images/properties/legacy-oscontainer",
498+
"type": "object",
499+
"title": "legacy-oscontainer",
500+
"$ref": "#/definitions/artifact"
501+
},
495502
"qemu": {
496503
"$id": "#/properties/images/properties/qemu",
497504
"type": "object",

src/build-legacy-oscontainer.sh

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/usr/bin/env bash
2+
# shellcheck disable=SC1091
3+
set -euo pipefail
4+
# Start VM and call buildah
5+
. /usr/lib/coreos-assembler/cmdlib.sh
6+
prepare_build
7+
runvm -- /usr/lib/coreos-assembler/create-legacy-oscontainer.py "$@"

src/cmd-create-legacy-oscontainer

+133
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
#!/usr/bin/python3 -u
2+
# Upload an oscontainer. This is a wrapper for
3+
# `cosa oscontainer` that just for historical reasons
4+
# used to live downstream in the redhat-coreos pipeline.
5+
# In the future we should just have one `cosa oscontainer`
6+
# command.
7+
8+
import argparse
9+
import json
10+
import yaml
11+
import os
12+
import shutil
13+
import subprocess
14+
import sys
15+
from cosalib.cmdlib import sha256sum_file
16+
17+
cosa_dir = os.path.dirname(os.path.abspath(__file__))
18+
sys.path.insert(0, cosa_dir)
19+
20+
from cosalib import cmdlib
21+
22+
23+
with open('builds/builds.json') as f:
24+
builds = json.load(f)['builds']
25+
if len(builds) == 0:
26+
cmdlib.fatal("No builds found")
27+
latest_build = builds[0]['id']
28+
arch = cmdlib.get_basearch()
29+
latest_build_path = f"builds/{latest_build}/{arch}"
30+
31+
metapath = f"{latest_build_path}/meta.json"
32+
with open(metapath) as f:
33+
meta = json.load(f)
34+
35+
name = meta['name'] + '-' + meta['buildid'] + '-oscontainer.' + arch + '.ociarchive'
36+
parser = argparse.ArgumentParser()
37+
parser.add_argument("--arch-tag", help="append arch name to push tag",
38+
action='store_true')
39+
parser.add_argument("--name", help="oscontainer name",
40+
action='store', default=f'{name}')
41+
parser.add_argument("--from", help="Base image", default='scratch',
42+
dest='from_image')
43+
parser.add_argument("--format", help="Format to use for push")
44+
parser.add_argument("--add-directory", help="Copy in all content from referenced directory DIR",
45+
metavar='DIR', action='append', default=[])
46+
47+
args = parser.parse_args()
48+
49+
# for backcompat, we auto-build extensions if they're missing
50+
if os.path.exists('src/config/extensions.yaml'):
51+
if 'extensions' not in meta:
52+
cmdlib.runcmd(['coreos-assembler', 'buildextend-extensions'])
53+
with open(metapath) as f:
54+
meta = json.load(f)
55+
assert 'extensions' in meta
56+
57+
configdir = os.path.abspath('src/config')
58+
oscconfigpath = f'{configdir}/oscontainer.yaml'
59+
# XXX: fold oscontainer.yaml handling into oscontainer.py
60+
configyaml = {}
61+
if os.path.exists(oscconfigpath):
62+
with open(oscconfigpath) as f:
63+
configyaml = yaml.safe_load(f)
64+
65+
if 'base' in configyaml:
66+
args.from_image = configyaml['base']
67+
68+
print("Preparing to upload oscontainer for build: {}".format(latest_build))
69+
ostree_commit = meta['ostree-commit']
70+
71+
tmprepo = "{}/tmp/repo".format(os.getcwd())
72+
# if tmprepo is not a directory, but is unexpectedly a file,
73+
# just nuke it
74+
if not os.path.isdir(tmprepo) and os.path.exists(tmprepo):
75+
os.remove(tmprepo)
76+
77+
# if tmprepo is not a directory and not a file, recreate from
78+
# the tarfile
79+
if not os.path.exists(tmprepo):
80+
os.makedirs(tmprepo, exist_ok=True)
81+
ostree_commit_tar = meta['images']['ostree']['path']
82+
subprocess.check_call(['tar', '-xf',
83+
f'{latest_build_path}/{ostree_commit_tar}',
84+
'-C', tmprepo])
85+
86+
tmp_osreleasedir = 'tmp/usrlib-osrelease'
87+
subprocess.check_call(['rm', '-rf', tmp_osreleasedir])
88+
cmdlib.runcmd(['/usr/bin/ostree', 'checkout', '--repo', tmprepo,
89+
'--user-mode', '--subpath=/usr/lib/os-release', ostree_commit,
90+
tmp_osreleasedir])
91+
display_name = None
92+
with open(os.path.join(tmp_osreleasedir, "os-release")) as f:
93+
display_name = subprocess.check_output(['/bin/sh', '-c', 'set -euo pipefail; . /proc/self/fd/0 && echo $NAME'], stdin=f, encoding='UTF-8').strip()
94+
if display_name == "":
95+
raise SystemExit(f"Failed to find NAME= in /usr/lib/os-release in commit {ostree_commit}")
96+
shutil.rmtree(tmp_osreleasedir)
97+
98+
osc_name_and_tag = f"{args.name}:{latest_build}"
99+
if args.arch_tag:
100+
arch = meta.get("coreos-assembler.basearch", cmdlib.get_basearch)
101+
osc_name_and_tag = f"{args.name}:{latest_build}-{arch}"
102+
103+
# TODO: Use labels for the build hash and avoid pulling the oscontainer
104+
# every time we want to poll.
105+
# TODO: Remove --from
106+
digestfile = "tmp/oscontainer-digest"
107+
print("Entering vm to build oscontainer for build: {}".format(latest_build))
108+
109+
cosa_argv = (['/usr/lib/coreos-assembler/build-legacy-oscontainer.sh', '--workdir=./tmp', 'build', f'--from={args.from_image}'])
110+
for d in args.add_directory:
111+
cosa_argv.append(f'--add-directory="{d}"')
112+
cosa_argv.append(f'--display-name="{display_name}"')
113+
if 'labeled-packages' in configyaml:
114+
pkgs = ' '.join(configyaml['labeled-packages'])
115+
cosa_argv.append(f'--labeled-packages="{pkgs}"')
116+
if args.format is not None:
117+
cosa_argv.append(f'--format={args.format}')
118+
subprocess.check_call(cosa_argv +
119+
[f'--digestfile={digestfile}',
120+
'--push', tmprepo,
121+
meta['ostree-commit'],
122+
osc_name_and_tag])
123+
124+
# Inject the oscontainer with SHA256 into the build metadata
125+
oci_archive = f"{latest_build_path}/{args.name}"
126+
meta['images']['legacy-oscontainer'] = {'path': args.name,
127+
'sha256': sha256sum_file(oci_archive),
128+
'size': os.path.getsize(oci_archive),
129+
"skip-compression": True}
130+
metapath_new = f"{metapath}.new"
131+
with open(metapath_new, 'w') as f:
132+
json.dump(meta, f, sort_keys=True)
133+
shutil.move(metapath_new, metapath)

0 commit comments

Comments
 (0)