aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Austein <sra@arrcus.com>2018-06-30 00:52:37 -0400
committerRob Austein <sra@arrcus.com>2018-06-30 00:52:37 -0400
commitc751bca1b9517a9b2a15cbe5c789777329448c02 (patch)
treeccb7e6f124dc67c4dddf874dffbc40268bd1f30e
parent744b079a96510b468f2cc641b39167e1aeee32e3 (diff)
Builds Docker image. Does not yet build .debs.
-rwxr-xr-xbaiji53
1 files changed, 39 insertions, 14 deletions
diff --git a/baiji b/baiji
index 45b6822..854bd52 100755
--- a/baiji
+++ b/baiji
@@ -2,6 +2,7 @@
import debian.deb822
import subprocess
+import textwrap
import argparse
import tempfile
import tarfile
@@ -41,11 +42,11 @@ class tempdir(object):
# Debian version of that has a wildly different API than the version
# on GitHub.
-class DockerError(Exception):
- "Docker returned failure."
-
class Docker(subprocess.Popen):
+ class DockerError(Exception):
+ "Docker returned failure."
+
def __init__(self, *args, **kwargs):
super(Docker, self).__init__(("docker",) + args, **kwargs)
@@ -55,7 +56,7 @@ class Docker(subprocess.Popen):
def __exit__(self, *oops):
status = self.wait()
if status and all(o is None for o in oops):
- raise DockerError()
+ raise self.DockerError()
# Filter which acts like fakeroot for tarfile.TarFile.add()
@@ -87,11 +88,11 @@ def create_base(args):
docker.stdin.close()
with Docker("build", "-t", args.tag, "-", stdin = subprocess.PIPE) as docker:
- docker.communicate('''\
+ docker.communicate(textwrap.dedent('''\
FROM {args.tag}
RUN sed -i '/mount -t proc /d; /mount -t sysfs /d' /debootstrap/functions && /debootstrap/debootstrap --second-stage
- RUN apt-get update && apt-get install -y --no-install-recommends build-essential fakeroot git
- '''.format(args = args))
+ RUN apt-get update && apt-get install -y --no-install-recommends build-essential fakeroot git apt-utils
+ '''.format(args = args)))
@cmd(arg("--tag", default = "baiji:jessie", help = "tag of base docker image to update"),
@@ -102,15 +103,15 @@ def update_base(args):
"""
with Docker("build", "-t", args.tag, "-", stdin = subprocess.PIPE) as docker:
- docker.communicate('''\
+ docker.communicate(textwrap.dedent('''\
FROM {args.tag}
RUN apt-get update && apt-get upgrade -y --with-new-pkgs --no-install-recommends && apt-get autoremove && apt-get clean
- '''.format(args = args))
+ '''.format(args = args)))
@cmd(arg("--tag", default = "baiji:jessie", help = "tag of base docker image to use"),
arg("--dsc", required = True, type = argparse.FileType("r"), help = ".dsc file to build"),
- arg("--local-package", nargs = "+", help = "local packages to make available to build"),
+ arg("--local-package", default = [], nargs = "+", help = "local packages to make available to build"),
)
def build(args):
"""
@@ -122,23 +123,47 @@ def build(args):
"""
dsc = debian.deb822.Dsc(args.dsc)
- files = [os.path.join(os.path.dirname(args.dsc.name), f["name"]) for f in dsc["Files"]]
+
dummy = debian.deb822.Deb822()
- dummy_name = dsc["Source"] + "-build-depends"
+ dummy_name = "baiji-depends-" + dsc["Source"]
dummy_fn = "{}_{}_all.deb".format(dummy_name, dsc["Version"])
dummy["Depends"] = dsc["Build-Depends"]
dummy["Package"] = dummy_name
for tag in ("Version", "Maintainer", "Homepage"):
dummy[tag] = dsc[tag]
+ source_files = [os.path.join(os.path.dirname(args.dsc.name), f["name"]) for f in dsc["Files"]]
+
+ build_image = "baiji/build/{}:{}".format(dsc["Source"], dsc["Version"])
+
with tempdir() as dn:
equivs = subprocess.Popen(("equivs-build", "/dev/stdin"), stdin = subprocess.PIPE, stdout = subprocess.PIPE, cwd = dn)
equivs.communicate(str(dummy))
if equivs.wait():
sys.exit("Couldn't generate dummy dependency package")
- # Do something useful with generated file here
- subprocess.check_call(("dpkg", "-c", os.path.join(dn, dummy_fn)))
+ dockerfile_fn = os.path.join(dn, "Dockerfile")
+ with open(dockerfile_fn, "w") as f:
+ f.write(textwrap.dedent('''\
+ FROM {args.tag}
+ COPY micro-apt /micro-apt/
+ RUN cd /micro-apt && apt-ftparchive packages . > Packages
+ RUN echo 'deb [trusted=yes] file:///micro-apt ./' > /etc/apt/sources.list.d/micro-apt.list
+ RUN apt-get update && apt-get install -y --no-install-recommends {dummy_name} && apt-get clean
+ '''.format(args = args, dummy_name = dummy_name)))
+
+ with open(dockerfile_fn) as f:
+ sys.stderr.write("# Dockerfile:\n" + f.read() + "\n")
+
+ with Docker("build", "-t", build_image, "-", stdin = subprocess.PIPE) as docker:
+ tar = tarfile.open(mode = "w|", fileobj = docker.stdin)
+ tar.add(dockerfile_fn, "Dockerfile", filter = fakeroot_filter)
+ for pkg in [os.path.join(dn, dummy_fn)] + args.local_package:
+ tar.add(pkg, os.path.join("micro-apt", os.path.basename(pkg)), filter = fakeroot_filter)
+ tar.close()
+ docker.stdin.close()
+
+ # Continue here with actual build once we have environment set up
# Parse arguments and dispatch to one of the commands above.