~canonical-launchpad-branches/launchpad-buildd/trunk

« back to all changes in this revision

Viewing changes to buildsnap

  • Committer: Colin Watson
  • Date: 2017-05-11 08:34:07 UTC
  • mfrom: (215.1.1 extended-snap-status)
  • Revision ID: cjwatson@canonical.com-20170511083407-2jvw6phrd50strdk
[r=wgrant] Record the branch revision used to build a snap and return it along with other XML-RPC status information (LP: #1679157).

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
__metaclass__ = type
10
10
 
11
11
import base64
 
12
import json
12
13
from optparse import OptionParser
13
14
import os
14
15
import subprocess
50
51
        # appropriate certificate for your codehosting system.
51
52
        self.ssl_verify = True
52
53
 
53
 
    def chroot(self, args, echo=False):
 
54
    def chroot(self, args, echo=False, get_output=False):
54
55
        """Run a command in the chroot.
55
56
 
56
57
        :param args: the command and arguments to run.
57
58
        :param echo: if True, print the command before executing it.
 
59
        :param get_output: if True, return the output from the command.
58
60
        """
59
61
        args = set_personality(self.options.arch, args)
60
62
        if echo:
62
64
                "Running in chroot: %s" % ' '.join(
63
65
                "'%s'" % arg for arg in args))
64
66
            sys.stdout.flush()
65
 
        subprocess.check_call([
66
 
            "/usr/bin/sudo", "/usr/sbin/chroot", self.chroot_path] + args)
 
67
        cmd = ["/usr/bin/sudo", "/usr/sbin/chroot", self.chroot_path] + args
 
68
        if get_output:
 
69
            return subprocess.check_output(cmd, universal_newlines=True)
 
70
        else:
 
71
            subprocess.check_call(cmd)
67
72
 
68
 
    def run_build_command(self, args, path="/build", env=None, echo=False):
 
73
    def run_build_command(self, args, path="/build", env=None, echo=False,
 
74
                          get_output=False):
69
75
        """Run a build command in the chroot.
70
76
 
71
77
        This is unpleasant because we need to run it in /build under sudo
77
83
        :param path: the working directory to use in the chroot.
78
84
        :param env: dictionary of additional environment variables to set.
79
85
        :param echo: if True, print the command before executing it.
 
86
        :param get_output: if True, return the output from the command.
80
87
        """
81
88
        args = [shell_escape(arg) for arg in args]
82
89
        path = shell_escape(path)
89
96
            "%s=%s" % (key, shell_escape(value))
90
97
            for key, value in full_env.items()] + args
91
98
        command = "cd %s && %s" % (path, " ".join(args))
92
 
        self.chroot(["/bin/sh", "-c", command], echo=echo)
 
99
        return self.chroot(
 
100
            ["/bin/sh", "-c", command], echo=echo, get_output=get_output)
 
101
 
 
102
    def save_status(self, status):
 
103
        """Save a dictionary of status information about this build.
 
104
 
 
105
        This will be picked up by the build manager and included in XML-RPC
 
106
        status responses.
 
107
        """
 
108
        status_path = get_build_path(self.options.build_id, "status")
 
109
        with open("%s.tmp" % status_path, "w") as status_file:
 
110
            json.dump(status, status_file)
 
111
        os.rename("%s.tmp" % status_path, status_path)
93
112
 
94
113
    def install(self):
95
114
        print("Running install phase...")
122
141
            if not self.ssl_verify:
123
142
                env["GIT_SSL_NO_VERIFY"] = "1"
124
143
        self.run_build_command(cmd, env=env)
 
144
        status = {}
 
145
        if self.options.branch is not None:
 
146
            status["revision_id"] = self.run_build_command(
 
147
                ["bzr", "revno", self.name], get_output=True).rstrip("\n")
 
148
        else:
 
149
            status["revision_id"] = self.run_build_command(
 
150
                ["git", "-C", self.name, "rev-parse", self.options.git_path],
 
151
                get_output=True).rstrip("\n")
 
152
        self.save_status(status)
125
153
 
126
154
    def pull(self):
127
155
        """Run pull phase."""