diff options
author | Rob Austein <sra@arrcus.com> | 2018-06-30 00:52:37 -0400 |
---|---|---|
committer | Rob Austein <sra@arrcus.com> | 2018-06-30 00:52:37 -0400 |
commit | c751bca1b9517a9b2a15cbe5c789777329448c02 (patch) | |
tree | ccb7e6f124dc67c4dddf874dffbc40268bd1f30e | |
parent | 744b079a96510b468f2cc641b39167e1aeee32e3 (diff) |
Builds Docker image. Does not yet build .debs.
-rwxr-xr-x | baiji | 53 |
1 files changed, 39 insertions, 14 deletions
@@ -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. |