| author | wenzelm | 
| Fri, 04 Oct 2019 16:25:45 +0200 | |
| changeset 70785 | edaeb8feb4d0 | 
| parent 69854 | cc0b3e177b49 | 
| child 71896 | ce06d6456cc8 | 
| permissions | -rw-r--r-- | 
| 64160 | 1 | /* Title: Pure/Admin/ci_profile.scala | 
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 2 | Author: Lars Hupel | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 3 | |
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 4 | Build profile for continuous integration services. | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 5 | */ | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 6 | |
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 7 | package isabelle | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 8 | |
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 9 | |
| 64055 | 10 | import java.time.{Instant, ZoneId}
 | 
| 63472 | 11 | import java.time.format.DateTimeFormatter | 
| 68013 | 12 | import java.util.{Properties => JProperties, Map => JMap}
 | 
| 63328 
7a8515c58271
read Java system properties from ISABELLE_CI_PROPERTIES
 Lars Hupel <lars.hupel@mytum.de> parents: 
63294diff
changeset | 13 | |
| 
7a8515c58271
read Java system properties from ISABELLE_CI_PROPERTIES
 Lars Hupel <lars.hupel@mytum.de> parents: 
63294diff
changeset | 14 | |
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 15 | abstract class CI_Profile extends Isabelle_Tool.Body | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 16 | {
 | 
| 63387 
3395fe5e3893
more accurate total timing
 Lars Hupel <lars.hupel@mytum.de> parents: 
63385diff
changeset | 17 | private def build(options: Options): (Build.Results, Time) = | 
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 18 |   {
 | 
| 64115 | 19 | val progress = new Console_Progress(verbose = true) | 
| 63387 
3395fe5e3893
more accurate total timing
 Lars Hupel <lars.hupel@mytum.de> parents: 
63385diff
changeset | 20 | val start_time = Time.now() | 
| 
3395fe5e3893
more accurate total timing
 Lars Hupel <lars.hupel@mytum.de> parents: 
63385diff
changeset | 21 |     val results = progress.interrupt_handler {
 | 
| 65422 | 22 | Build.build( | 
| 69854 
cc0b3e177b49
system option "system_heaps" supersedes various command-line options for "system build mode";
 wenzelm parents: 
69121diff
changeset | 23 | options = options + "system_heaps", | 
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 24 | progress = progress, | 
| 64285 
d7e0123a752b
Jenkins: configurable clean build
 Lars Hupel <lars.hupel@mytum.de> parents: 
64232diff
changeset | 25 | clean_build = clean, | 
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 26 | verbose = true, | 
| 68498 
6855ebc61b4f
support NUMA shuffling in CI
 Lars Hupel <lars.hupel@mytum.de> parents: 
68013diff
changeset | 27 | numa_shuffling = numa, | 
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 28 | max_jobs = jobs, | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 29 | dirs = include, | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 30 | select_dirs = select, | 
| 65419 | 31 | selection = selection) | 
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 32 | } | 
| 63387 
3395fe5e3893
more accurate total timing
 Lars Hupel <lars.hupel@mytum.de> parents: 
63385diff
changeset | 33 | val end_time = Time.now() | 
| 
3395fe5e3893
more accurate total timing
 Lars Hupel <lars.hupel@mytum.de> parents: 
63385diff
changeset | 34 | (results, end_time - start_time) | 
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 35 | } | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 36 | |
| 63328 
7a8515c58271
read Java system properties from ISABELLE_CI_PROPERTIES
 Lars Hupel <lars.hupel@mytum.de> parents: 
63294diff
changeset | 37 | private def load_properties(): JProperties = | 
| 
7a8515c58271
read Java system properties from ISABELLE_CI_PROPERTIES
 Lars Hupel <lars.hupel@mytum.de> parents: 
63294diff
changeset | 38 |   {
 | 
| 
7a8515c58271
read Java system properties from ISABELLE_CI_PROPERTIES
 Lars Hupel <lars.hupel@mytum.de> parents: 
63294diff
changeset | 39 | val props = new JProperties() | 
| 63418 | 40 |     val file_name = Isabelle_System.getenv("ISABELLE_CI_PROPERTIES")
 | 
| 41 | ||
| 42 | if (file_name != "") | |
| 43 |     {
 | |
| 44 | val file = Path.explode(file_name).file | |
| 45 | if (file.exists()) | |
| 46 | props.load(new java.io.FileReader(file)) | |
| 47 | props | |
| 48 | } | |
| 49 | else | |
| 50 | props | |
| 63328 
7a8515c58271
read Java system properties from ISABELLE_CI_PROPERTIES
 Lars Hupel <lars.hupel@mytum.de> parents: 
63294diff
changeset | 51 | } | 
| 
7a8515c58271
read Java system properties from ISABELLE_CI_PROPERTIES
 Lars Hupel <lars.hupel@mytum.de> parents: 
63294diff
changeset | 52 | |
| 63385 | 53 | private def compute_timing(results: Build.Results, group: Option[String]): Timing = | 
| 54 |   {
 | |
| 55 |     val timings = results.sessions.collect {
 | |
| 56 | case session if group.forall(results.info(session).groups.contains(_)) => | |
| 57 | results(session).timing | |
| 58 | } | |
| 59 | (Timing.zero /: timings)(_ + _) | |
| 60 | } | |
| 61 | ||
| 63894 
7534eec7cfad
benchmark doesn't need to build documents
 Lars Hupel <lars.hupel@mytum.de> parents: 
63685diff
changeset | 62 | private def with_documents(options: Options): Options = | 
| 
7534eec7cfad
benchmark doesn't need to build documents
 Lars Hupel <lars.hupel@mytum.de> parents: 
63685diff
changeset | 63 |   {
 | 
| 
7534eec7cfad
benchmark doesn't need to build documents
 Lars Hupel <lars.hupel@mytum.de> parents: 
63685diff
changeset | 64 | if (documents) | 
| 
7534eec7cfad
benchmark doesn't need to build documents
 Lars Hupel <lars.hupel@mytum.de> parents: 
63685diff
changeset | 65 | options | 
| 
7534eec7cfad
benchmark doesn't need to build documents
 Lars Hupel <lars.hupel@mytum.de> parents: 
63685diff
changeset | 66 |         .bool.update("browser_info", true)
 | 
| 
7534eec7cfad
benchmark doesn't need to build documents
 Lars Hupel <lars.hupel@mytum.de> parents: 
63685diff
changeset | 67 |         .string.update("document", "pdf")
 | 
| 
7534eec7cfad
benchmark doesn't need to build documents
 Lars Hupel <lars.hupel@mytum.de> parents: 
63685diff
changeset | 68 |         .string.update("document_variants", "document:outline=/proof,/ML")
 | 
| 
7534eec7cfad
benchmark doesn't need to build documents
 Lars Hupel <lars.hupel@mytum.de> parents: 
63685diff
changeset | 69 | else | 
| 
7534eec7cfad
benchmark doesn't need to build documents
 Lars Hupel <lars.hupel@mytum.de> parents: 
63685diff
changeset | 70 | options | 
| 
7534eec7cfad
benchmark doesn't need to build documents
 Lars Hupel <lars.hupel@mytum.de> parents: 
63685diff
changeset | 71 | } | 
| 
7534eec7cfad
benchmark doesn't need to build documents
 Lars Hupel <lars.hupel@mytum.de> parents: 
63685diff
changeset | 72 | |
| 63385 | 73 | |
| 74 | final def hg_id(path: Path): String = | |
| 64232 
367d83d6030e
clarified hg.id operation, with explicit tip as default;
 wenzelm parents: 
64217diff
changeset | 75 | Mercurial.repository(path).id() | 
| 63385 | 76 | |
| 77 | final def print_section(title: String): Unit = | |
| 63349 | 78 | println(s"\n=== $title ===\n") | 
| 79 | ||
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 80 | |
| 63385 | 81 |   final val isabelle_home = Path.explode(Isabelle_System.getenv_strict("ISABELLE_HOME"))
 | 
| 82 | final val isabelle_id = hg_id(isabelle_home) | |
| 63472 | 83 | final val start_time = Instant.now().atZone(ZoneId.systemDefault).format(DateTimeFormatter.RFC_1123_DATE_TIME) | 
| 63385 | 84 | |
| 85 | ||
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 86 | override final def apply(args: List[String]): Unit = | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 87 |   {
 | 
| 63349 | 88 |     print_section("CONFIGURATION")
 | 
| 64081 | 89 | println(Build_Log.Settings.show()) | 
| 63328 
7a8515c58271
read Java system properties from ISABELLE_CI_PROPERTIES
 Lars Hupel <lars.hupel@mytum.de> parents: 
63294diff
changeset | 90 | val props = load_properties() | 
| 68013 | 91 | System.getProperties().asInstanceOf[JMap[AnyRef, AnyRef]].putAll(props) | 
| 63328 
7a8515c58271
read Java system properties from ISABELLE_CI_PROPERTIES
 Lars Hupel <lars.hupel@mytum.de> parents: 
63294diff
changeset | 92 | |
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 93 | val options = | 
| 63894 
7534eec7cfad
benchmark doesn't need to build documents
 Lars Hupel <lars.hupel@mytum.de> parents: 
63685diff
changeset | 94 | with_documents(Options.init()) | 
| 65056 | 95 |         .int.update("parallel_proofs", 1)
 | 
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 96 |         .int.update("threads", threads)
 | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 97 | |
| 69120 
9d3b41732fe0
Jenkins: detect machine; adjust job parameters accordingly
 Lars Hupel <lars.hupel@mytum.de> parents: 
68498diff
changeset | 98 | println(s"jobs = $jobs, threads = $threads, numa = $numa") | 
| 
9d3b41732fe0
Jenkins: detect machine; adjust job parameters accordingly
 Lars Hupel <lars.hupel@mytum.de> parents: 
68498diff
changeset | 99 | |
| 63349 | 100 |     print_section("BUILD")
 | 
| 63472 | 101 | println(s"Build started at $start_time") | 
| 102 | println(s"Isabelle id $isabelle_id") | |
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 103 | pre_hook(args) | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 104 | |
| 63472 | 105 |     print_section("LOG")
 | 
| 63387 
3395fe5e3893
more accurate total timing
 Lars Hupel <lars.hupel@mytum.de> parents: 
63385diff
changeset | 106 | val (results, elapsed_time) = build(options) | 
| 63349 | 107 | |
| 108 |     print_section("TIMING")
 | |
| 63385 | 109 | |
| 110 | val groups = results.sessions.map(results.info).flatMap(_.groups) | |
| 111 | for (group <- groups) | |
| 112 | println(s"Group $group: " + compute_timing(results, Some(group)).message_resources) | |
| 63387 
3395fe5e3893
more accurate total timing
 Lars Hupel <lars.hupel@mytum.de> parents: 
63385diff
changeset | 113 | |
| 
3395fe5e3893
more accurate total timing
 Lars Hupel <lars.hupel@mytum.de> parents: 
63385diff
changeset | 114 | val total_timing = compute_timing(results, None).copy(elapsed = elapsed_time) | 
| 
3395fe5e3893
more accurate total timing
 Lars Hupel <lars.hupel@mytum.de> parents: 
63385diff
changeset | 115 |     println("Overall: " + total_timing.message_resources)
 | 
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 116 | |
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 117 |     if (!results.ok) {
 | 
| 63349 | 118 |       print_section("FAILED SESSIONS")
 | 
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 119 | |
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 120 |       for (name <- results.sessions) {
 | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 121 |         if (results.cancelled(name)) {
 | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 122 | println(s"Session $name: CANCELLED") | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 123 | } | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 124 |         else {
 | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 125 | val result = results(name) | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 126 | if (!result.ok) | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 127 |             println(s"Session $name: FAILED ${result.rc}")
 | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 128 | } | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 129 | } | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 130 | } | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 131 | |
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 132 | post_hook(results) | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 133 | |
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 134 | System.exit(results.rc) | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 135 | } | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 136 | |
| 69120 
9d3b41732fe0
Jenkins: detect machine; adjust job parameters accordingly
 Lars Hupel <lars.hupel@mytum.de> parents: 
68498diff
changeset | 137 | /* profile */ | 
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 138 | |
| 69120 
9d3b41732fe0
Jenkins: detect machine; adjust job parameters accordingly
 Lars Hupel <lars.hupel@mytum.de> parents: 
68498diff
changeset | 139 |   def threads: Int = Isabelle_System.hostname() match {
 | 
| 
9d3b41732fe0
Jenkins: detect machine; adjust job parameters accordingly
 Lars Hupel <lars.hupel@mytum.de> parents: 
68498diff
changeset | 140 | case "hpcisabelle" => 8 | 
| 69121 | 141 | case "lxcisa1" => 4 | 
| 69120 
9d3b41732fe0
Jenkins: detect machine; adjust job parameters accordingly
 Lars Hupel <lars.hupel@mytum.de> parents: 
68498diff
changeset | 142 | case _ => 2 | 
| 
9d3b41732fe0
Jenkins: detect machine; adjust job parameters accordingly
 Lars Hupel <lars.hupel@mytum.de> parents: 
68498diff
changeset | 143 | } | 
| 
9d3b41732fe0
Jenkins: detect machine; adjust job parameters accordingly
 Lars Hupel <lars.hupel@mytum.de> parents: 
68498diff
changeset | 144 | |
| 
9d3b41732fe0
Jenkins: detect machine; adjust job parameters accordingly
 Lars Hupel <lars.hupel@mytum.de> parents: 
68498diff
changeset | 145 |   def jobs: Int = Isabelle_System.hostname() match {
 | 
| 
9d3b41732fe0
Jenkins: detect machine; adjust job parameters accordingly
 Lars Hupel <lars.hupel@mytum.de> parents: 
68498diff
changeset | 146 | case "hpcisabelle" => 8 | 
| 69121 | 147 | case "lxcisa1" => 10 | 
| 69120 
9d3b41732fe0
Jenkins: detect machine; adjust job parameters accordingly
 Lars Hupel <lars.hupel@mytum.de> parents: 
68498diff
changeset | 148 | case _ => 2 | 
| 
9d3b41732fe0
Jenkins: detect machine; adjust job parameters accordingly
 Lars Hupel <lars.hupel@mytum.de> parents: 
68498diff
changeset | 149 | } | 
| 
9d3b41732fe0
Jenkins: detect machine; adjust job parameters accordingly
 Lars Hupel <lars.hupel@mytum.de> parents: 
68498diff
changeset | 150 | |
| 
9d3b41732fe0
Jenkins: detect machine; adjust job parameters accordingly
 Lars Hupel <lars.hupel@mytum.de> parents: 
68498diff
changeset | 151 | def numa: Boolean = Isabelle_System.hostname() == "hpcisabelle" | 
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 152 | |
| 63894 
7534eec7cfad
benchmark doesn't need to build documents
 Lars Hupel <lars.hupel@mytum.de> parents: 
63685diff
changeset | 153 | def documents: Boolean = true | 
| 64285 
d7e0123a752b
Jenkins: configurable clean build
 Lars Hupel <lars.hupel@mytum.de> parents: 
64232diff
changeset | 154 | def clean: Boolean = true | 
| 63894 
7534eec7cfad
benchmark doesn't need to build documents
 Lars Hupel <lars.hupel@mytum.de> parents: 
63685diff
changeset | 155 | |
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 156 | def include: List[Path] | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 157 | def select: List[Path] | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 158 | |
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 159 | def pre_hook(args: List[String]): Unit | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 160 | def post_hook(results: Build.Results): Unit | 
| 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 161 | |
| 65419 | 162 | def selection: Sessions.Selection | 
| 63288 
e0513d6e4916
start moving actual Jenkins build scripts into the repository
 Lars Hupel <lars.hupel@mytum.de> parents: diff
changeset | 163 | } |