phase1: improve Git cloning on the master
[buildbot.git] / phase1 / master.cfg
index b0b5133c5242f61527cc9db434472dc44c84ebc9..2ae92f1aef76e57cf350663a9a45e55e9bf5b4e3 100644 (file)
@@ -25,6 +25,11 @@ c = BuildmasterConfig = {}
 # slave name and password must be configured on the slave.
 from buildbot.buildslave import BuildSlave
 
+slave_port = 9989
+
+if ini.has_option("general", "port"):
+       slave_port = ini.getint("general", "port")
+
 c['slaves'] = []
 
 for section in ini.sections():
@@ -40,7 +45,7 @@ for section in ini.sections():
 # 'slavePortnum' defines the TCP port to listen on for connections from slaves.
 # This must match the value configured into the buildslaves (with their
 # --master option)
-c['slavePortnum'] = 9989
+c['slavePortnum'] = slave_port
 
 # coalesce builds
 c['mergeRequests'] = True
@@ -48,8 +53,16 @@ c['mergeRequests'] = True
 ####### CHANGESOURCES
 
 home_dir = os.path.abspath(ini.get("general", "homedir"))
+tree_expire = 0
+
+if ini.has_option("general", "expire"):
+       tree_expire = ini.getint("general", "expire")
 
 repo_url = ini.get("repo", "url")
+repo_branch = "master"
+
+if ini.has_option("repo", "branch"):
+       repo_branch = ini.get("repo", "branch")
 
 rsync_bin_url = ini.get("rsync", "binary_url")
 rsync_bin_key = ini.get("rsync", "binary_password")
@@ -61,10 +74,14 @@ if ini.has_option("rsync", "source_url"):
        rsync_src_url = ini.get("rsync", "source_url")
        rsync_src_key = ini.get("rsync", "source_password")
 
+gpg_home = "~/.gnupg"
 gpg_keyid = None
 gpg_comment = "Unattended build signature"
 gpg_passfile = "/dev/null"
 
+if ini.has_option("gpg", "home"):
+       gpg_home = ini.get("gpg", "home")
+
 if ini.has_option("gpg", "keyid"):
        gpg_keyid = ini.get("gpg", "keyid")
 
@@ -78,6 +95,11 @@ if ini.has_option("gpg", "passfile"):
 # find targets
 targets = [ ]
 
+if not os.path.isdir(home_dir+'/source.git'):
+       subprocess.call(["git", "clone", "--depth=1", "--branch="+repo_branch, repo_url, home_dir+'/source.git'])
+else:
+       subprocess.call(["git", "pull"], cwd = home_dir+'/source.git')
+
 findtargets = subprocess.Popen([home_dir+'/dumpinfo.pl', 'targets'],
        stdout = subprocess.PIPE, cwd = home_dir+'/source.git')
 
@@ -96,7 +118,7 @@ from buildbot.changes.gitpoller import GitPoller
 c['change_source'] = []
 c['change_source'].append(GitPoller(
        repo_url,
-       workdir=home_dir+'/source.git', branch='master',
+       workdir=home_dir+'/work.git', branch='master',
        pollinterval=300))
 
 ####### SCHEDULERS
@@ -134,67 +156,23 @@ from buildbot.steps.master import MasterShellCommand
 from buildbot.process.properties import WithProperties
 
 
-MakeTargetMap = {
-       "^tools/":                              "tools/clean",
-       "^toolchain/":                  "toolchain/clean",
-       "^target/linux/":               "target/linux/clean",
-       "^(config|include)/":   "dirclean"
-}
+CleanTargetMap = [
+       [ "tools",      "tools/clean"                   ],
+       [ "chain",      "toolchain/clean"               ],
+       [ "linux",      "target/linux/clean"    ],
+       [ "dir",        "dirclean"                              ],
+       [ "dist",       "distclean"                             ]
+]
 
-def IsAffected(pattern):
-       def CheckAffected(change):
-               for request in change.build.requests:
-                       for source in request.sources:
-                               for change in source.changes:
-                                       for file in change.files:
-                                               if re.match(pattern, file):
-                                                       return True
-               return False
-       return CheckAffected
-
-def isPathBuiltin(path):
-       incl = {}
-       pkgs = {}
-       conf = open(".config", "r")
-
-       while True:
-               line = conf.readline()
-               if line == '':
-                       break
-               m = re.match("^(CONFIG_PACKAGE_.+?)=y", line)
-               if m:
-                       incl[m.group(1)] = True
-
-       conf.close()
-
-       deps = open("tmp/.packagedeps", "r")
-
-       while True:
-               line = deps.readline()
-               if line == '':
-                       break
-               m = re.match("^package-\$\((CONFIG_PACKAGE_.+?)\) \+= (\S+)", line)
-               if m and incl.get(m.group(1)) == True:
-                       pkgs["package/%s" % m.group(2)] = True
-
-       deps.close()
-
-       while path != '':
-               if pkgs.get(path) == True:
+def IsCleanRequested(pattern):
+       def CheckCleanProperty(step):
+               val = step.getProperty("clean")
+               if val and re.match(pattern, val):
                        return True
-               path = os.path.dirname(path)
-
-       return False
+               else:
+                       return False
 
-def isChangeBuiltin(change):
-       return True
-#      for request in change.build.requests:
-#              for source in request.sources:
-#                      for change in source.changes:
-#                              for file in change.files:
-#                                      if isPathBuiltin(file):
-#                                              return True
-#      return False
+       return CheckCleanProperty
 
 
 c['builders'] = []
@@ -271,8 +249,32 @@ for target in targets:
                description = "Finding number of CPUs",
                command = ["nproc"]))
 
+       # expire tree if needed
+       if tree_expire > 0:
+               factory.addStep(FileDownload(
+                       mastersrc = "expire.sh",
+                       slavedest = "../expire.sh",
+                       mode = 0755))
+
+               factory.addStep(ShellCommand(
+                       name = "expire",
+                       description = "Checking for build tree expiry",
+                       command = ["./expire.sh", str(tree_expire)],
+                       workdir = ".",
+                       haltOnFailure = True,
+                       timeout = 2400))
+
+       # user-requested clean targets
+       for tuple in CleanTargetMap:
+               factory.addStep(ShellCommand(
+                       name = tuple[1],
+                       description = 'User-requested "make %s"' % tuple[1],
+                       command = ["make", tuple[1], "V=s"],
+                       doStepIf = IsCleanRequested(tuple[0])
+               ))
+
        # check out the source
-       factory.addStep(Git(repourl=repo_url, mode='update'))
+       factory.addStep(Git(repourl=repo_url, branch=repo_branch, mode='update'))
 
        factory.addStep(ShellCommand(
                name = "rmtmp",
@@ -285,6 +287,12 @@ for target in targets:
 #              description = "Copy the feeds.conf",
 #              command='''cp ~/feeds.conf ./feeds.conf''' ))
 
+       # feed
+       factory.addStep(ShellCommand(
+               name = "rmfeedlinks",
+               description = "Remove feed symlinks",
+               command=["rm", "-rf", "package/feeds/"]))
+
        # feed
        factory.addStep(ShellCommand(
                name = "updatefeeds",
@@ -297,27 +305,19 @@ for target in targets:
                description = "Installing feeds",
                command=["./scripts/feeds", "install", "-a"]))
 
+       # seed config
+       factory.addStep(FileDownload(
+               mastersrc = "config.seed",
+               slavedest = ".config",
+               mode = 0644
+       ))
+
        # configure
        factory.addStep(ShellCommand(
                name = "newconfig",
                description = "Seeding .config",
-               command='''cat <<EOT > .config
-CONFIG_TARGET_%s=y
-CONFIG_TARGET_%s_%s=y
-CONFIG_ALL_NONSHARED=y
-CONFIG_SDK=y
-CONFIG_IB=y
-# CONFIG_IB_STANDALONE is not set
-CONFIG_DEVEL=y
-CONFIG_CCACHE=y
-CONFIG_SIGNED_PACKAGES=y
-# CONFIG_PER_FEED_REPO_ADD_COMMENTED is not set
-CONFIG_KERNEL_KALLSYMS=y
-CONFIG_COLLECT_KERNEL_DEBUG=y
-CONFIG_TARGET_ALL_PROFILES=y
-CONFIG_TARGET_MULTI_PROFILE=y
-CONFIG_TARGET_PER_DEVICE_ROOTFS=y
-EOT''' %(ts[0], ts[0], ts[1]) ))
+               command = "printf 'CONFIG_TARGET_%s=y\\nCONFIG_TARGET_%s_%s=y\\n' >> .config" %(ts[0], ts[0], ts[1])
+       ))
 
        factory.addStep(ShellCommand(
                name = "delbin",
@@ -357,11 +357,19 @@ EOT''' %(ts[0], ts[0], ts[1]) ))
        factory.addStep(ShellCommand(
                name = "dldir",
                description = "Preparing dl/",
-               command = "mkdir -p $HOME/dl && ln -sf $HOME/dl ./dl",
+               command = "mkdir -p $HOME/dl && rm -rf ./dl && ln -sf $HOME/dl ./dl",
                logEnviron = False,
                want_stdout = False
        ))
 
+       # prepare tar
+       factory.addStep(ShellCommand(
+               name = "dltar",
+               description = "Building GNU tar",
+               command = ["make", WithProperties("-j%(nproc:~4)s"), "tools/tar/install", "V=s"],
+               haltOnFailure = True
+       ))
+
        # populate dl
        factory.addStep(ShellCommand(
                name = "dlrun",
@@ -377,14 +385,6 @@ EOT''' %(ts[0], ts[0], ts[1]) ))
                command=["make", "package/base-files/clean", "V=s"]
        ))
 
-       # optional clean steps
-       for pattern, maketarget in MakeTargetMap.items():
-               factory.addStep(ShellCommand(
-                       name = maketarget,
-                       description = maketarget,
-                       command=["make", maketarget, "V=s"], doStepIf=IsAffected(pattern)
-               ))
-
        # build
        factory.addStep(ShellCommand(
                name = "tools",
@@ -421,7 +421,6 @@ EOT''' %(ts[0], ts[0], ts[1]) ))
                name = "pkginstall",
                description = "Installing packages",
                command=["make", WithProperties("-j%(nproc:~4)s"), "package/install", "V=s"],
-               doStepIf = isChangeBuiltin,
                haltOnFailure = True
        ))
 
@@ -436,8 +435,14 @@ EOT''' %(ts[0], ts[0], ts[1]) ))
        factory.addStep(ShellCommand(
                name = "images",
                description = "Building images",
-               command=["make", "-j1", "target/install", "V=s"],
-               doStepIf = isChangeBuiltin,
+               command=["make", WithProperties("-j%(nproc:~4)s"), "target/install", "V=s"],
+               haltOnFailure = True
+       ))
+
+       factory.addStep(ShellCommand(
+               name = "checksums",
+               description = "Calculating checksums",
+               command=["make", "-j1", "checksum", "V=s"],
                haltOnFailure = True
        ))
 
@@ -466,7 +471,8 @@ EOT''' %(ts[0], ts[0], ts[1]) ))
                factory.addStep(MasterShellCommand(
                        name = "signfiles",
                        description = "Signing files",
-                       command = ["%s/signall.sh" %(home_dir), "%s/signing/%s.%s.tar.gz" %(home_dir, ts[0], ts[1]), gpg_keyid, gpg_passfile, gpg_comment],
+                       command = ["%s/signall.sh" %(home_dir), "%s/signing/%s.%s.tar.gz" %(home_dir, ts[0], ts[1]), gpg_keyid, gpg_comment],
+                       env = {'GNUPGHOME': gpg_home, 'PASSFILE': gpg_passfile},
                        haltOnFailure = True
                ))
 
@@ -496,7 +502,7 @@ EOT''' %(ts[0], ts[0], ts[1]) ))
        factory.addStep(ShellCommand(
                name = "targetupload",
                description = "Uploading target files",
-               command=["rsync", "--delete", "--delay-updates", "--partial-dir=.~tmp~%s~%s" %(ts[0], ts[1]), "-avz", WithProperties("bin/targets/%s/%s%%(libc)s/" %(ts[0], ts[1])), "%s/targets/%s/%s/" %(rsync_bin_url, ts[0], ts[1])],
+               command=["rsync", "--delete", "--checksum", "--delay-updates", "--partial-dir=.~tmp~%s~%s" %(ts[0], ts[1]), "-avz", WithProperties("bin/targets/%s/%s%%(libc)s/" %(ts[0], ts[1])), "%s/targets/%s/%s/" %(rsync_bin_url, ts[0], ts[1])],
                env={'RSYNC_PASSWORD': rsync_bin_key},
                haltOnFailure = True,
                logEnviron = False
@@ -506,7 +512,7 @@ EOT''' %(ts[0], ts[0], ts[1]) ))
                factory.addStep(ShellCommand(
                        name = "sourceupload",
                        description = "Uploading source archives",
-                       command=["rsync", "--delay-updates", "--partial-dir=.~tmp~%s~%s" %(ts[0], ts[1]), "-avz", "dl/", "%s/" %(rsync_src_url)],
+                       command=["rsync", "--checksum", "--delay-updates", "--partial-dir=.~tmp~%s~%s" %(ts[0], ts[1]), "-avz", "dl/", "%s/" %(rsync_src_url)],
                        env={'RSYNC_PASSWORD': rsync_src_key},
                        haltOnFailure = True,
                        logEnviron = False