Remove no longer used Jenkins CI files.
diff --git a/3rdparty/BUILD b/3rdparty/BUILD
deleted file mode 100644
index e69de29..0000000
--- a/3rdparty/BUILD
+++ /dev/null
diff --git a/3rdparty/jvm/antlr/BUILD b/3rdparty/jvm/antlr/BUILD
deleted file mode 100644
index 12790f7..0000000
--- a/3rdparty/jvm/antlr/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "antlr",
-    exports = [
-        "//external:jar/antlr/antlr"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/aopalliance/BUILD b/3rdparty/jvm/aopalliance/BUILD
deleted file mode 100644
index 9a64f49..0000000
--- a/3rdparty/jvm/aopalliance/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "aopalliance",
-    exports = [
-        "//external:jar/aopalliance/aopalliance"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/args4j/BUILD b/3rdparty/jvm/args4j/BUILD
deleted file mode 100644
index 9c9642d..0000000
--- a/3rdparty/jvm/args4j/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "args4j",
-    exports = [
-        "//external:jar/args4j/args4j"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/com/cloudbees/BUILD b/3rdparty/jvm/com/cloudbees/BUILD
deleted file mode 100644
index 6c07585..0000000
--- a/3rdparty/jvm/com/cloudbees/BUILD
+++ /dev/null
@@ -1,14 +0,0 @@
-java_library(
-    name = "groovy_cps",
-    exports = [
-        "//external:jar/com/cloudbees/groovy_cps"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/com/google/guava:guava"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/com/github/jnr/BUILD b/3rdparty/jvm/com/github/jnr/BUILD
deleted file mode 100644
index e990224..0000000
--- a/3rdparty/jvm/com/github/jnr/BUILD
+++ /dev/null
@@ -1,72 +0,0 @@
-java_library(
-    name = "jffi",
-    exports = [
-        "//external:jar/com/github/jnr/jffi"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "jnr_constants",
-    exports = [
-        "//external:jar/com/github/jnr/jnr_constants"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "jnr_ffi",
-    exports = [
-        "//external:jar/com/github/jnr/jnr_ffi"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/org/ow2/asm:asm",
-        "//3rdparty/jvm/org/ow2/asm:asm_analysis",
-        "//3rdparty/jvm/org/ow2/asm:asm_commons",
-        "//3rdparty/jvm/org/ow2/asm:asm_tree",
-        "//3rdparty/jvm/org/ow2/asm:asm_util",
-        ":jffi",
-        ":jnr_x86asm"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "jnr_posix",
-    exports = [
-        "//external:jar/com/github/jnr/jnr_posix"
-    ],
-    runtime_deps = [
-        ":jnr_constants",
-        ":jnr_ffi"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "jnr_x86asm",
-    exports = [
-        "//external:jar/com/github/jnr/jnr_x86asm"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/com/google/code/findbugs/BUILD b/3rdparty/jvm/com/google/code/findbugs/BUILD
deleted file mode 100644
index d2f2a35..0000000
--- a/3rdparty/jvm/com/google/code/findbugs/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "jsr305",
-    exports = [
-        "//external:jar/com/google/code/findbugs/jsr305"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/com/google/guava/BUILD b/3rdparty/jvm/com/google/guava/BUILD
deleted file mode 100644
index 3a82699..0000000
--- a/3rdparty/jvm/com/google/guava/BUILD
+++ /dev/null
@@ -1,14 +0,0 @@
-java_library(
-    name = "guava",
-    exports = [
-        "//external:jar/com/google/guava/guava"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/com/google/code/findbugs:jsr305"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/com/google/inject/BUILD b/3rdparty/jvm/com/google/inject/BUILD
deleted file mode 100644
index a33c2f5..0000000
--- a/3rdparty/jvm/com/google/inject/BUILD
+++ /dev/null
@@ -1,15 +0,0 @@
-java_library(
-    name = "guice",
-    exports = [
-        "//external:jar/com/google/inject/guice"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/aopalliance:aopalliance",
-        "//3rdparty/jvm/javax/inject:javax_inject"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/com/infradna/tool/BUILD b/3rdparty/jvm/com/infradna/tool/BUILD
deleted file mode 100644
index 63a36c8..0000000
--- a/3rdparty/jvm/com/infradna/tool/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "bridge_method_annotation",
-    exports = [
-        "//external:jar/com/infradna/tool/bridge_method_annotation"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/com/jcraft/BUILD b/3rdparty/jvm/com/jcraft/BUILD
deleted file mode 100644
index a7f42b2..0000000
--- a/3rdparty/jvm/com/jcraft/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "jzlib",
-    exports = [
-        "//external:jar/com/jcraft/jzlib"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/com/lesfurets/BUILD b/3rdparty/jvm/com/lesfurets/BUILD
deleted file mode 100644
index ddbb224..0000000
--- a/3rdparty/jvm/com/lesfurets/BUILD
+++ /dev/null
@@ -1,18 +0,0 @@
-java_library(
-    name = "jenkins_pipeline_unit",
-    exports = [
-        "//external:jar/com/lesfurets/jenkins_pipeline_unit"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/com/cloudbees:groovy_cps",
-        "//3rdparty/jvm/commons_io:commons_io",
-        "//3rdparty/jvm/org/apache/ivy:ivy",
-        "//3rdparty/jvm/org/assertj:assertj_core",
-        "//3rdparty/jvm/org/codehaus/groovy:groovy_all"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/com/sun/solaris/BUILD b/3rdparty/jvm/com/sun/solaris/BUILD
deleted file mode 100644
index 8ed3a87..0000000
--- a/3rdparty/jvm/com/sun/solaris/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "embedded_su4j",
-    exports = [
-        "//external:jar/com/sun/solaris/embedded_su4j"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/com/sun/xml/txw2/BUILD b/3rdparty/jvm/com/sun/xml/txw2/BUILD
deleted file mode 100644
index 8dab9eb..0000000
--- a/3rdparty/jvm/com/sun/xml/txw2/BUILD
+++ /dev/null
@@ -1,15 +0,0 @@
-java_library(
-    name = "txw2",
-    exports = [
-        "//external:jar/com/sun/xml/txw2/txw2"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/javax/xml/stream:stax_api",
-        "//3rdparty/jvm/relaxngDatatype:relaxngDatatype"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/commons_beanutils/BUILD b/3rdparty/jvm/commons_beanutils/BUILD
deleted file mode 100644
index 2f34d6d..0000000
--- a/3rdparty/jvm/commons_beanutils/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "commons_beanutils",
-    exports = [
-        "//external:jar/commons_beanutils/commons_beanutils"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/commons_codec/BUILD b/3rdparty/jvm/commons_codec/BUILD
deleted file mode 100644
index 3f4d8e7..0000000
--- a/3rdparty/jvm/commons_codec/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "commons_codec",
-    exports = [
-        "//external:jar/commons_codec/commons_codec"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/commons_collections/BUILD b/3rdparty/jvm/commons_collections/BUILD
deleted file mode 100644
index 991d96d..0000000
--- a/3rdparty/jvm/commons_collections/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "commons_collections",
-    exports = [
-        "//external:jar/commons_collections/commons_collections"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/commons_digester/BUILD b/3rdparty/jvm/commons_digester/BUILD
deleted file mode 100644
index 80ceab2..0000000
--- a/3rdparty/jvm/commons_digester/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "commons_digester",
-    exports = [
-        "//external:jar/commons_digester/commons_digester"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/commons_discovery/BUILD b/3rdparty/jvm/commons_discovery/BUILD
deleted file mode 100644
index 646a0ab..0000000
--- a/3rdparty/jvm/commons_discovery/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "commons_discovery",
-    exports = [
-        "//external:jar/commons_discovery/commons_discovery"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/commons_fileupload/BUILD b/3rdparty/jvm/commons_fileupload/BUILD
deleted file mode 100644
index df5ad9a..0000000
--- a/3rdparty/jvm/commons_fileupload/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "commons_fileupload",
-    exports = [
-        "//external:jar/commons_fileupload/commons_fileupload"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/commons_httpclient/BUILD b/3rdparty/jvm/commons_httpclient/BUILD
deleted file mode 100644
index b98153b..0000000
--- a/3rdparty/jvm/commons_httpclient/BUILD
+++ /dev/null
@@ -1,14 +0,0 @@
-java_library(
-    name = "commons_httpclient",
-    exports = [
-        "//external:jar/commons_httpclient/commons_httpclient"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/junit:junit"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/commons_io/BUILD b/3rdparty/jvm/commons_io/BUILD
deleted file mode 100644
index fb480f2..0000000
--- a/3rdparty/jvm/commons_io/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "commons_io",
-    exports = [
-        "//external:jar/commons_io/commons_io"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/commons_jelly/BUILD b/3rdparty/jvm/commons_jelly/BUILD
deleted file mode 100644
index 40c2356..0000000
--- a/3rdparty/jvm/commons_jelly/BUILD
+++ /dev/null
@@ -1,23 +0,0 @@
-java_library(
-    name = "commons_jelly_tags_fmt",
-    exports = [
-        "//external:jar/commons_jelly/commons_jelly_tags_fmt"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "commons_jelly_tags_xml",
-    exports = [
-        "//external:jar/commons_jelly/commons_jelly_tags_xml"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/commons_lang/BUILD b/3rdparty/jvm/commons_lang/BUILD
deleted file mode 100644
index 5059083..0000000
--- a/3rdparty/jvm/commons_lang/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "commons_lang",
-    exports = [
-        "//external:jar/commons_lang/commons_lang"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/javax/annotation/BUILD b/3rdparty/jvm/javax/annotation/BUILD
deleted file mode 100644
index ee838a5..0000000
--- a/3rdparty/jvm/javax/annotation/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "javax_annotation_api",
-    exports = [
-        "//external:jar/javax/annotation/javax_annotation_api"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/javax/inject/BUILD b/3rdparty/jvm/javax/inject/BUILD
deleted file mode 100644
index 5087fcb..0000000
--- a/3rdparty/jvm/javax/inject/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "javax_inject",
-    exports = [
-        "//external:jar/javax/inject/javax_inject"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/javax/mail/BUILD b/3rdparty/jvm/javax/mail/BUILD
deleted file mode 100644
index 67abec1..0000000
--- a/3rdparty/jvm/javax/mail/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "mail",
-    exports = [
-        "//external:jar/javax/mail/mail"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/javax/servlet/jsp/jstl/BUILD b/3rdparty/jvm/javax/servlet/jsp/jstl/BUILD
deleted file mode 100644
index 2e204ad..0000000
--- a/3rdparty/jvm/javax/servlet/jsp/jstl/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "javax_servlet_jsp_jstl_api",
-    exports = [
-        "//external:jar/javax/servlet/jsp/jstl/javax_servlet_jsp_jstl_api"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/javax/xml/stream/BUILD b/3rdparty/jvm/javax/xml/stream/BUILD
deleted file mode 100644
index 70a604f..0000000
--- a/3rdparty/jvm/javax/xml/stream/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "stax_api",
-    exports = [
-        "//external:jar/javax/xml/stream/stax_api"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/jaxen/BUILD b/3rdparty/jvm/jaxen/BUILD
deleted file mode 100644
index 90612a8..0000000
--- a/3rdparty/jvm/jaxen/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "jaxen",
-    exports = [
-        "//external:jar/jaxen/jaxen"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/jfree/BUILD b/3rdparty/jvm/jfree/BUILD
deleted file mode 100644
index c2530cc..0000000
--- a/3rdparty/jvm/jfree/BUILD
+++ /dev/null
@@ -1,26 +0,0 @@
-java_library(
-    name = "jcommon",
-    exports = [
-        "//external:jar/jfree/jcommon"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "jfreechart",
-    exports = [
-        "//external:jar/jfree/jfreechart"
-    ],
-    runtime_deps = [
-        ":jcommon"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/jline/BUILD b/3rdparty/jvm/jline/BUILD
deleted file mode 100644
index d85c123..0000000
--- a/3rdparty/jvm/jline/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "jline",
-    exports = [
-        "//external:jar/jline/jline"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/junit/BUILD b/3rdparty/jvm/junit/BUILD
deleted file mode 100644
index f52df0d..0000000
--- a/3rdparty/jvm/junit/BUILD
+++ /dev/null
@@ -1,14 +0,0 @@
-java_library(
-    name = "junit",
-    exports = [
-        "//external:jar/junit/junit"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/org/hamcrest:hamcrest_core"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/net/i2p/crypto/BUILD b/3rdparty/jvm/net/i2p/crypto/BUILD
deleted file mode 100644
index 194aace..0000000
--- a/3rdparty/jvm/net/i2p/crypto/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "eddsa",
-    exports = [
-        "//external:jar/net/i2p/crypto/eddsa"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/net/java/dev/jna/BUILD b/3rdparty/jvm/net/java/dev/jna/BUILD
deleted file mode 100644
index 65866cc..0000000
--- a/3rdparty/jvm/net/java/dev/jna/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "jna",
-    exports = [
-        "//external:jar/net/java/dev/jna/jna"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/net/java/sezpoz/BUILD b/3rdparty/jvm/net/java/sezpoz/BUILD
deleted file mode 100644
index f5d2e32..0000000
--- a/3rdparty/jvm/net/java/sezpoz/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "sezpoz",
-    exports = [
-        "//external:jar/net/java/sezpoz/sezpoz"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/net/sf/ezmorph/BUILD b/3rdparty/jvm/net/sf/ezmorph/BUILD
deleted file mode 100644
index d205e12..0000000
--- a/3rdparty/jvm/net/sf/ezmorph/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "ezmorph",
-    exports = [
-        "//external:jar/net/sf/ezmorph/ezmorph"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/net/sf/kxml/BUILD b/3rdparty/jvm/net/sf/kxml/BUILD
deleted file mode 100644
index 1bfd035..0000000
--- a/3rdparty/jvm/net/sf/kxml/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "kxml2",
-    exports = [
-        "//external:jar/net/sf/kxml/kxml2"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/acegisecurity/BUILD b/3rdparty/jvm/org/acegisecurity/BUILD
deleted file mode 100644
index 4cac13d..0000000
--- a/3rdparty/jvm/org/acegisecurity/BUILD
+++ /dev/null
@@ -1,15 +0,0 @@
-java_library(
-    name = "acegi_security",
-    exports = [
-        "//external:jar/org/acegisecurity/acegi_security"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/org/springframework:spring_jdbc",
-        "//3rdparty/jvm/oro:oro"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/apache/ant/BUILD b/3rdparty/jvm/org/apache/ant/BUILD
deleted file mode 100644
index 828dbc4..0000000
--- a/3rdparty/jvm/org/apache/ant/BUILD
+++ /dev/null
@@ -1,26 +0,0 @@
-java_library(
-    name = "ant",
-    exports = [
-        "//external:jar/org/apache/ant/ant"
-    ],
-    runtime_deps = [
-        ":ant_launcher"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "ant_launcher",
-    exports = [
-        "//external:jar/org/apache/ant/ant_launcher"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/apache/commons/BUILD b/3rdparty/jvm/org/apache/commons/BUILD
deleted file mode 100644
index 2651080..0000000
--- a/3rdparty/jvm/org/apache/commons/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "commons_compress",
-    exports = [
-        "//external:jar/org/apache/commons/commons_compress"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/apache/ivy/BUILD b/3rdparty/jvm/org/apache/ivy/BUILD
deleted file mode 100644
index fb331ce..0000000
--- a/3rdparty/jvm/org/apache/ivy/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "ivy",
-    exports = [
-        "//external:jar/org/apache/ivy/ivy"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/assertj/BUILD b/3rdparty/jvm/org/assertj/BUILD
deleted file mode 100644
index aa74de4..0000000
--- a/3rdparty/jvm/org/assertj/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "assertj_core",
-    exports = [
-        "//external:jar/org/assertj/assertj_core"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/codehaus/groovy/BUILD b/3rdparty/jvm/org/codehaus/groovy/BUILD
deleted file mode 100644
index b3f1501..0000000
--- a/3rdparty/jvm/org/codehaus/groovy/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "groovy_all",
-    exports = [
-        "//external:jar/org/codehaus/groovy/groovy_all"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/codehaus/woodstox/BUILD b/3rdparty/jvm/org/codehaus/woodstox/BUILD
deleted file mode 100644
index ec83d04..0000000
--- a/3rdparty/jvm/org/codehaus/woodstox/BUILD
+++ /dev/null
@@ -1,14 +0,0 @@
-java_library(
-    name = "wstx_asl",
-    exports = [
-        "//external:jar/org/codehaus/woodstox/wstx_asl"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/stax:stax_api"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/connectbot/jbcrypt/BUILD b/3rdparty/jvm/org/connectbot/jbcrypt/BUILD
deleted file mode 100644
index 1450ab3..0000000
--- a/3rdparty/jvm/org/connectbot/jbcrypt/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "jbcrypt",
-    exports = [
-        "//external:jar/org/connectbot/jbcrypt/jbcrypt"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/fusesource/jansi/BUILD b/3rdparty/jvm/org/fusesource/jansi/BUILD
deleted file mode 100644
index 5ea1261..0000000
--- a/3rdparty/jvm/org/fusesource/jansi/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "jansi",
-    exports = [
-        "//external:jar/org/fusesource/jansi/jansi"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/hamcrest/BUILD b/3rdparty/jvm/org/hamcrest/BUILD
deleted file mode 100644
index 23e84f6..0000000
--- a/3rdparty/jvm/org/hamcrest/BUILD
+++ /dev/null
@@ -1,23 +0,0 @@
-java_library(
-    name = "hamcrest_all",
-    exports = [
-        "//external:jar/org/hamcrest/hamcrest_all"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "hamcrest_core",
-    exports = [
-        "//external:jar/org/hamcrest/hamcrest_core"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/jboss/marshalling/BUILD b/3rdparty/jvm/org/jboss/marshalling/BUILD
deleted file mode 100644
index c6e36bc..0000000
--- a/3rdparty/jvm/org/jboss/marshalling/BUILD
+++ /dev/null
@@ -1,26 +0,0 @@
-java_library(
-    name = "jboss_marshalling",
-    exports = [
-        "//external:jar/org/jboss/marshalling/jboss_marshalling"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "jboss_marshalling_river",
-    exports = [
-        "//external:jar/org/jboss/marshalling/jboss_marshalling_river"
-    ],
-    runtime_deps = [
-        ":jboss_marshalling"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/jenkins_ci/BUILD b/3rdparty/jvm/org/jenkins_ci/BUILD
deleted file mode 100644
index dfe7703..0000000
--- a/3rdparty/jvm/org/jenkins_ci/BUILD
+++ /dev/null
@@ -1,153 +0,0 @@
-java_library(
-    name = "annotation_indexer",
-    exports = [
-        "//external:jar/org/jenkins_ci/annotation_indexer"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "bytecode_compatibility_transformer",
-    exports = [
-        "//external:jar/org/jenkins_ci/bytecode_compatibility_transformer"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/org/kohsuke:asm5"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "commons_jelly",
-    exports = [
-        "//external:jar/org/jenkins_ci/commons_jelly"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "commons_jexl",
-    exports = [
-        "//external:jar/org/jenkins_ci/commons_jexl"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "constant_pool_scanner",
-    exports = [
-        "//external:jar/org/jenkins_ci/constant_pool_scanner"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "crypto_util",
-    exports = [
-        "//external:jar/org/jenkins_ci/crypto_util"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "jmdns",
-    exports = [
-        "//external:jar/org/jenkins_ci/jmdns"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "memory_monitor",
-    exports = [
-        "//external:jar/org/jenkins_ci/memory_monitor"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "symbol_annotation",
-    exports = [
-        "//external:jar/org/jenkins_ci/symbol_annotation"
-    ],
-    runtime_deps = [
-        ":annotation_indexer"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "task_reactor",
-    exports = [
-        "//external:jar/org/jenkins_ci/task_reactor"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "trilead_ssh2",
-    exports = [
-        "//external:jar/org/jenkins_ci/trilead_ssh2"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/net/i2p/crypto:eddsa",
-        "//3rdparty/jvm/org/connectbot/jbcrypt:jbcrypt"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "version_number",
-    exports = [
-        "//external:jar/org/jenkins_ci/version_number"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/jenkins_ci/dom4j/BUILD b/3rdparty/jvm/org/jenkins_ci/dom4j/BUILD
deleted file mode 100644
index 298c9d7..0000000
--- a/3rdparty/jvm/org/jenkins_ci/dom4j/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "dom4j",
-    exports = [
-        "//external:jar/org/jenkins_ci/dom4j/dom4j"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/jenkins_ci/main/BUILD b/3rdparty/jvm/org/jenkins_ci/main/BUILD
deleted file mode 100644
index 5242240..0000000
--- a/3rdparty/jvm/org/jenkins_ci/main/BUILD
+++ /dev/null
@@ -1,113 +0,0 @@
-java_library(
-    name = "cli",
-    exports = [
-        "//external:jar/org/jenkins_ci/main/cli"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "jenkins_core",
-    exports = [
-        "//external:jar/org/jenkins_ci/main/jenkins_core"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/antlr:antlr",
-        "//3rdparty/jvm/args4j:args4j",
-        "//3rdparty/jvm/com/github/jnr:jnr_posix",
-        "//3rdparty/jvm/com/google/guava:guava",
-        "//3rdparty/jvm/com/google/inject:guice",
-        "//3rdparty/jvm/com/infradna/tool:bridge_method_annotation",
-        "//3rdparty/jvm/com/jcraft:jzlib",
-        "//3rdparty/jvm/com/sun/solaris:embedded_su4j",
-        "//3rdparty/jvm/com/sun/xml/txw2:txw2",
-        "//3rdparty/jvm/commons_beanutils:commons_beanutils",
-        "//3rdparty/jvm/commons_codec:commons_codec",
-        "//3rdparty/jvm/commons_collections:commons_collections",
-        "//3rdparty/jvm/commons_digester:commons_digester",
-        "//3rdparty/jvm/commons_fileupload:commons_fileupload",
-        "//3rdparty/jvm/commons_httpclient:commons_httpclient",
-        "//3rdparty/jvm/commons_io:commons_io",
-        "//3rdparty/jvm/commons_jelly:commons_jelly_tags_fmt",
-        "//3rdparty/jvm/commons_jelly:commons_jelly_tags_xml",
-        "//3rdparty/jvm/commons_lang:commons_lang",
-        "//3rdparty/jvm/javax/mail:mail",
-        "//3rdparty/jvm/javax/servlet/jsp/jstl:javax_servlet_jsp_jstl_api",
-        "//3rdparty/jvm/jaxen:jaxen",
-        "//3rdparty/jvm/jfree:jfreechart",
-        "//3rdparty/jvm/jline:jline",
-        "//3rdparty/jvm/net/java/dev/jna:jna",
-        "//3rdparty/jvm/net/java/sezpoz:sezpoz",
-        "//3rdparty/jvm/net/sf/kxml:kxml2",
-        "//3rdparty/jvm/org/acegisecurity:acegi_security",
-        "//3rdparty/jvm/org/apache/ant:ant",
-        "//3rdparty/jvm/org/apache/commons:commons_compress",
-        "//3rdparty/jvm/org/codehaus/groovy:groovy_all",
-        "//3rdparty/jvm/org/codehaus/woodstox:wstx_asl",
-        "//3rdparty/jvm/org/fusesource/jansi:jansi",
-        "//3rdparty/jvm/org/jenkins_ci/plugins/icon_shim:icon_set",
-        "//3rdparty/jvm/org/jenkins_ci:annotation_indexer",
-        "//3rdparty/jvm/org/jenkins_ci:bytecode_compatibility_transformer",
-        "//3rdparty/jvm/org/jenkins_ci:commons_jexl",
-        "//3rdparty/jvm/org/jenkins_ci:crypto_util",
-        "//3rdparty/jvm/org/jenkins_ci:jmdns",
-        "//3rdparty/jvm/org/jenkins_ci:memory_monitor",
-        "//3rdparty/jvm/org/jenkins_ci:symbol_annotation",
-        "//3rdparty/jvm/org/jenkins_ci:task_reactor",
-        "//3rdparty/jvm/org/jenkins_ci:trilead_ssh2",
-        "//3rdparty/jvm/org/jenkins_ci:version_number",
-        "//3rdparty/jvm/org/jruby/ext/posix:jna_posix",
-        "//3rdparty/jvm/org/jvnet/hudson:activation",
-        "//3rdparty/jvm/org/jvnet/hudson:commons_jelly_tags_define",
-        "//3rdparty/jvm/org/jvnet/hudson:jtidy",
-        "//3rdparty/jvm/org/jvnet/hudson:xstream",
-        "//3rdparty/jvm/org/jvnet/localizer:localizer",
-        "//3rdparty/jvm/org/jvnet/robust_http_client:robust_http_client",
-        "//3rdparty/jvm/org/jvnet/winp:winp",
-        "//3rdparty/jvm/org/kohsuke/jinterop:j_interop",
-        "//3rdparty/jvm/org/kohsuke/stapler:json_lib",
-        "//3rdparty/jvm/org/kohsuke/stapler:stapler_adjunct_codemirror",
-        "//3rdparty/jvm/org/kohsuke/stapler:stapler_adjunct_timeline",
-        "//3rdparty/jvm/org/kohsuke/stapler:stapler_adjunct_zeroclipboard",
-        "//3rdparty/jvm/org/kohsuke/stapler:stapler_groovy",
-        "//3rdparty/jvm/org/kohsuke/stapler:stapler_jrebel",
-        "//3rdparty/jvm/org/kohsuke:access_modifier_annotation",
-        "//3rdparty/jvm/org/kohsuke:akuma",
-        "//3rdparty/jvm/org/kohsuke:libpam4j",
-        "//3rdparty/jvm/org/kohsuke:libzfs",
-        "//3rdparty/jvm/org/kohsuke:trilead_putty_extension",
-        "//3rdparty/jvm/org/kohsuke:windows_package_checker",
-        "//3rdparty/jvm/org/slf4j:jcl_over_slf4j",
-        "//3rdparty/jvm/org/slf4j:log4j_over_slf4j",
-        "//3rdparty/jvm/org/springframework:spring_aop",
-        "//3rdparty/jvm/org/springframework:spring_core",
-        "//3rdparty/jvm/org/springframework:spring_webmvc",
-        "//3rdparty/jvm/xpp3:xpp3",
-        ":cli",
-        ":remoting"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "remoting",
-    exports = [
-        "//external:jar/org/jenkins_ci/main/remoting"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/org/jenkins_ci:constant_pool_scanner"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/jenkins_ci/plugins/BUILD b/3rdparty/jvm/org/jenkins_ci/plugins/BUILD
deleted file mode 100644
index 0ca47b9..0000000
--- a/3rdparty/jvm/org/jenkins_ci/plugins/BUILD
+++ /dev/null
@@ -1,41 +0,0 @@
-java_library(
-    name = "scm_api",
-    exports = [
-        "//external:jar/org/jenkins_ci/plugins/scm_api"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "script_security",
-    exports = [
-        "//external:jar/org/jenkins_ci/plugins/script_security"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/org/kohsuke:groovy_sandbox"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "structs",
-    exports = [
-        "//external:jar/org/jenkins_ci/plugins/structs"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/org/jenkins_ci:symbol_annotation"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/jenkins_ci/plugins/icon_shim/BUILD b/3rdparty/jvm/org/jenkins_ci/plugins/icon_shim/BUILD
deleted file mode 100644
index 32509d1..0000000
--- a/3rdparty/jvm/org/jenkins_ci/plugins/icon_shim/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "icon_set",
-    exports = [
-        "//external:jar/org/jenkins_ci/plugins/icon_shim/icon_set"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/jenkins_ci/plugins/workflow/BUILD b/3rdparty/jvm/org/jenkins_ci/plugins/workflow/BUILD
deleted file mode 100644
index e7fc757..0000000
--- a/3rdparty/jvm/org/jenkins_ci/plugins/workflow/BUILD
+++ /dev/null
@@ -1,45 +0,0 @@
-java_library(
-    name = "workflow_api",
-    exports = [
-        "//external:jar/org/jenkins_ci/plugins/workflow/workflow_api"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "workflow_step_api",
-    exports = [
-        "//external:jar/org/jenkins_ci/plugins/workflow/workflow_step_api"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/org/jenkins_ci/plugins:structs"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "workflow_support",
-    exports = [
-        "//external:jar/org/jenkins_ci/plugins/workflow/workflow_support"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/org/jboss/marshalling:jboss_marshalling_river",
-        "//3rdparty/jvm/org/jenkins_ci/plugins:scm_api",
-        "//3rdparty/jvm/org/jenkins_ci/plugins:script_security",
-        ":workflow_api",
-        ":workflow_step_api"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/jruby/ext/posix/BUILD b/3rdparty/jvm/org/jruby/ext/posix/BUILD
deleted file mode 100644
index be75afd..0000000
--- a/3rdparty/jvm/org/jruby/ext/posix/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "jna_posix",
-    exports = [
-        "//external:jar/org/jruby/ext/posix/jna_posix"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/jvnet/BUILD b/3rdparty/jvm/org/jvnet/BUILD
deleted file mode 100644
index a3bc8e3..0000000
--- a/3rdparty/jvm/org/jvnet/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "tiger_types",
-    exports = [
-        "//external:jar/org/jvnet/tiger_types"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/jvnet/hudson/BUILD b/3rdparty/jvm/org/jvnet/hudson/BUILD
deleted file mode 100644
index 6dcf0aa..0000000
--- a/3rdparty/jvm/org/jvnet/hudson/BUILD
+++ /dev/null
@@ -1,47 +0,0 @@
-java_library(
-    name = "activation",
-    exports = [
-        "//external:jar/org/jvnet/hudson/activation"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "commons_jelly_tags_define",
-    exports = [
-        "//external:jar/org/jvnet/hudson/commons_jelly_tags_define"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "jtidy",
-    exports = [
-        "//external:jar/org/jvnet/hudson/jtidy"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "xstream",
-    exports = [
-        "//external:jar/org/jvnet/hudson/xstream"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/jvnet/localizer/BUILD b/3rdparty/jvm/org/jvnet/localizer/BUILD
deleted file mode 100644
index c9bc539..0000000
--- a/3rdparty/jvm/org/jvnet/localizer/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "localizer",
-    exports = [
-        "//external:jar/org/jvnet/localizer/localizer"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/jvnet/robust_http_client/BUILD b/3rdparty/jvm/org/jvnet/robust_http_client/BUILD
deleted file mode 100644
index 0272291..0000000
--- a/3rdparty/jvm/org/jvnet/robust_http_client/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "robust_http_client",
-    exports = [
-        "//external:jar/org/jvnet/robust_http_client/robust_http_client"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/jvnet/winp/BUILD b/3rdparty/jvm/org/jvnet/winp/BUILD
deleted file mode 100644
index 717525e..0000000
--- a/3rdparty/jvm/org/jvnet/winp/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "winp",
-    exports = [
-        "//external:jar/org/jvnet/winp/winp"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/kohsuke/BUILD b/3rdparty/jvm/org/kohsuke/BUILD
deleted file mode 100644
index 2567be8..0000000
--- a/3rdparty/jvm/org/kohsuke/BUILD
+++ /dev/null
@@ -1,95 +0,0 @@
-java_library(
-    name = "access_modifier_annotation",
-    exports = [
-        "//external:jar/org/kohsuke/access_modifier_annotation"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "akuma",
-    exports = [
-        "//external:jar/org/kohsuke/akuma"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "asm5",
-    exports = [
-        "//external:jar/org/kohsuke/asm5"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "groovy_sandbox",
-    exports = [
-        "//external:jar/org/kohsuke/groovy_sandbox"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "libpam4j",
-    exports = [
-        "//external:jar/org/kohsuke/libpam4j"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "libzfs",
-    exports = [
-        "//external:jar/org/kohsuke/libzfs"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "trilead_putty_extension",
-    exports = [
-        "//external:jar/org/kohsuke/trilead_putty_extension"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "windows_package_checker",
-    exports = [
-        "//external:jar/org/kohsuke/windows_package_checker"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/kohsuke/jinterop/BUILD b/3rdparty/jvm/org/kohsuke/jinterop/BUILD
deleted file mode 100644
index c1bf531..0000000
--- a/3rdparty/jvm/org/kohsuke/jinterop/BUILD
+++ /dev/null
@@ -1,29 +0,0 @@
-java_library(
-    name = "j_interop",
-    exports = [
-        "//external:jar/org/kohsuke/jinterop/j_interop"
-    ],
-    runtime_deps = [
-        ":j_interopdeps"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "j_interopdeps",
-    exports = [
-        "//external:jar/org/kohsuke/jinterop/j_interopdeps"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/org/samba/jcifs:jcifs"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/kohsuke/stapler/BUILD b/3rdparty/jvm/org/kohsuke/stapler/BUILD
deleted file mode 100644
index 2ff079d..0000000
--- a/3rdparty/jvm/org/kohsuke/stapler/BUILD
+++ /dev/null
@@ -1,114 +0,0 @@
-java_library(
-    name = "json_lib",
-    exports = [
-        "//external:jar/org/kohsuke/stapler/json_lib"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/net/sf/ezmorph:ezmorph"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "stapler",
-    exports = [
-        "//external:jar/org/kohsuke/stapler/stapler"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/com/google/code/findbugs:jsr305",
-        "//3rdparty/jvm/commons_discovery:commons_discovery",
-        "//3rdparty/jvm/javax/annotation:javax_annotation_api",
-        "//3rdparty/jvm/org/jvnet:tiger_types"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "stapler_adjunct_codemirror",
-    exports = [
-        "//external:jar/org/kohsuke/stapler/stapler_adjunct_codemirror"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "stapler_adjunct_timeline",
-    exports = [
-        "//external:jar/org/kohsuke/stapler/stapler_adjunct_timeline"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "stapler_adjunct_zeroclipboard",
-    exports = [
-        "//external:jar/org/kohsuke/stapler/stapler_adjunct_zeroclipboard"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "stapler_groovy",
-    exports = [
-        "//external:jar/org/kohsuke/stapler/stapler_groovy"
-    ],
-    runtime_deps = [
-        ":stapler_jelly"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "stapler_jelly",
-    exports = [
-        "//external:jar/org/kohsuke/stapler/stapler_jelly"
-    ],
-    runtime_deps = [
-        "//3rdparty/jvm/org/jenkins_ci/dom4j:dom4j",
-        "//3rdparty/jvm/org/jenkins_ci:commons_jelly"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "stapler_jrebel",
-    exports = [
-        "//external:jar/org/kohsuke/stapler/stapler_jrebel"
-    ],
-    runtime_deps = [
-        ":stapler"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/ow2/asm/BUILD b/3rdparty/jvm/org/ow2/asm/BUILD
deleted file mode 100644
index 80c996d..0000000
--- a/3rdparty/jvm/org/ow2/asm/BUILD
+++ /dev/null
@@ -1,59 +0,0 @@
-java_library(
-    name = "asm",
-    exports = [
-        "//external:jar/org/ow2/asm/asm"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "asm_analysis",
-    exports = [
-        "//external:jar/org/ow2/asm/asm_analysis"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "asm_commons",
-    exports = [
-        "//external:jar/org/ow2/asm/asm_commons"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "asm_tree",
-    exports = [
-        "//external:jar/org/ow2/asm/asm_tree"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "asm_util",
-    exports = [
-        "//external:jar/org/ow2/asm/asm_util"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/samba/jcifs/BUILD b/3rdparty/jvm/org/samba/jcifs/BUILD
deleted file mode 100644
index d1a03bb..0000000
--- a/3rdparty/jvm/org/samba/jcifs/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "jcifs",
-    exports = [
-        "//external:jar/org/samba/jcifs/jcifs"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/slf4j/BUILD b/3rdparty/jvm/org/slf4j/BUILD
deleted file mode 100644
index e520ae3..0000000
--- a/3rdparty/jvm/org/slf4j/BUILD
+++ /dev/null
@@ -1,38 +0,0 @@
-java_library(
-    name = "jcl_over_slf4j",
-    exports = [
-        "//external:jar/org/slf4j/jcl_over_slf4j"
-    ],
-    runtime_deps = [
-        ":slf4j_api"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "log4j_over_slf4j",
-    exports = [
-        "//external:jar/org/slf4j/log4j_over_slf4j"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "slf4j_api",
-    exports = [
-        "//external:jar/org/slf4j/slf4j_api"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/org/springframework/BUILD b/3rdparty/jvm/org/springframework/BUILD
deleted file mode 100644
index 2f0b65f..0000000
--- a/3rdparty/jvm/org/springframework/BUILD
+++ /dev/null
@@ -1,116 +0,0 @@
-java_library(
-    name = "spring_aop",
-    exports = [
-        "//external:jar/org/springframework/spring_aop"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "spring_beans",
-    exports = [
-        "//external:jar/org/springframework/spring_beans"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "spring_context",
-    exports = [
-        "//external:jar/org/springframework/spring_context"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "spring_context_support",
-    exports = [
-        "//external:jar/org/springframework/spring_context_support"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "spring_core",
-    exports = [
-        "//external:jar/org/springframework/spring_core"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "spring_dao",
-    exports = [
-        "//external:jar/org/springframework/spring_dao"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "spring_jdbc",
-    exports = [
-        "//external:jar/org/springframework/spring_jdbc"
-    ],
-    runtime_deps = [
-        ":spring_dao"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "spring_web",
-    exports = [
-        "//external:jar/org/springframework/spring_web"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
-
-java_library(
-    name = "spring_webmvc",
-    exports = [
-        "//external:jar/org/springframework/spring_webmvc"
-    ],
-    runtime_deps = [
-        ":spring_beans",
-        ":spring_context",
-        ":spring_context_support",
-        ":spring_web"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/oro/BUILD b/3rdparty/jvm/oro/BUILD
deleted file mode 100644
index c92cce4..0000000
--- a/3rdparty/jvm/oro/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "oro",
-    exports = [
-        "//external:jar/oro/oro"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/relaxngDatatype/BUILD b/3rdparty/jvm/relaxngDatatype/BUILD
deleted file mode 100644
index 1871f43..0000000
--- a/3rdparty/jvm/relaxngDatatype/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "relaxngDatatype",
-    exports = [
-        "//external:jar/relaxngDatatype/relaxngDatatype"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/stax/BUILD b/3rdparty/jvm/stax/BUILD
deleted file mode 100644
index 4a3a64f..0000000
--- a/3rdparty/jvm/stax/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "stax_api",
-    exports = [
-        "//external:jar/stax/stax_api"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/jvm/xpp3/BUILD b/3rdparty/jvm/xpp3/BUILD
deleted file mode 100644
index 3c6437d..0000000
--- a/3rdparty/jvm/xpp3/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-java_library(
-    name = "xpp3",
-    exports = [
-        "//external:jar/xpp3/xpp3"
-    ],
-    visibility = [
-        "//visibility:public"
-    ]
-)
-
-
diff --git a/3rdparty/workspace.bzl b/3rdparty/workspace.bzl
deleted file mode 100644
index 7c04739..0000000
--- a/3rdparty/workspace.bzl
+++ /dev/null
@@ -1,157 +0,0 @@
-def declare_maven(hash):
-    native.maven_jar(
-        name = hash["name"],
-        artifact = hash["artifact"],
-        sha1 = hash["sha1"],
-        repository = hash["repository"]
-    )
-    native.bind(
-        name = hash["bind"],
-        actual = hash["actual"]
-    )
-
-def maven_dependencies(callback = declare_maven):
-    callback({"artifact": "antlr:antlr:2.7.6", "lang": "java", "sha1": "cf4f67dae5df4f9932ae7810f4548ef3e14dd35e", "repository": "https://repo.maven.apache.org/maven2/", "name": "antlr_antlr", "actual": "@antlr_antlr//jar", "bind": "jar/antlr/antlr"})
-    callback({"artifact": "aopalliance:aopalliance:1.0", "lang": "java", "sha1": "0235ba8b489512805ac13a8f9ea77a1ca5ebe3e8", "repository": "https://repo.maven.apache.org/maven2/", "name": "aopalliance_aopalliance", "actual": "@aopalliance_aopalliance//jar", "bind": "jar/aopalliance/aopalliance"})
-    callback({"artifact": "args4j:args4j:2.0.31", "lang": "java", "sha1": "6b870d81551ce93c5c776c3046299db8ad6c39d2", "repository": "https://repo.maven.apache.org/maven2/", "name": "args4j_args4j", "actual": "@args4j_args4j//jar", "bind": "jar/args4j/args4j"})
-    callback({"artifact": "com.cloudbees:groovy-cps:1.12", "lang": "java", "sha1": "d766273a59e0b954c016e805779106bca22764b9", "repository": "https://repo.maven.apache.org/maven2/", "name": "com_cloudbees_groovy_cps", "actual": "@com_cloudbees_groovy_cps//jar", "bind": "jar/com/cloudbees/groovy_cps"})
-    callback({"artifact": "com.github.jnr:jffi:1.2.15", "lang": "java", "sha1": "f480f0234dd8f053da2421e60574cfbd9d85e1f5", "repository": "https://repo.maven.apache.org/maven2/", "name": "com_github_jnr_jffi", "actual": "@com_github_jnr_jffi//jar", "bind": "jar/com/github/jnr/jffi"})
-    callback({"artifact": "com.github.jnr:jnr-constants:0.9.8", "lang": "java", "sha1": "478036404879bd582be79e9a7939f3a161601c8b", "repository": "https://repo.maven.apache.org/maven2/", "name": "com_github_jnr_jnr_constants", "actual": "@com_github_jnr_jnr_constants//jar", "bind": "jar/com/github/jnr/jnr_constants"})
-    callback({"artifact": "com.github.jnr:jnr-ffi:2.1.4", "lang": "java", "sha1": "0a63bbd4af5cee55d820ef40dc5347d45765b788", "repository": "https://repo.maven.apache.org/maven2/", "name": "com_github_jnr_jnr_ffi", "actual": "@com_github_jnr_jnr_ffi//jar", "bind": "jar/com/github/jnr/jnr_ffi"})
-    callback({"artifact": "com.github.jnr:jnr-posix:3.0.41", "lang": "java", "sha1": "36eff018149e53ed814a340ddb7de73ceb66bf96", "repository": "https://repo.maven.apache.org/maven2/", "name": "com_github_jnr_jnr_posix", "actual": "@com_github_jnr_jnr_posix//jar", "bind": "jar/com/github/jnr/jnr_posix"})
-    callback({"artifact": "com.github.jnr:jnr-x86asm:1.0.2", "lang": "java", "sha1": "006936bbd6c5b235665d87bd450f5e13b52d4b48", "repository": "https://repo.maven.apache.org/maven2/", "name": "com_github_jnr_jnr_x86asm", "actual": "@com_github_jnr_jnr_x86asm//jar", "bind": "jar/com/github/jnr/jnr_x86asm"})
-# duplicates in com.google.code.findbugs:jsr305 promoted to 2.0.1
-# - org.kohsuke.stapler:stapler:1.254 wanted version 2.0.1
-# - com.google.guava:guava:11.0.1 wanted version 1.3.9
-    callback({"artifact": "com.google.code.findbugs:jsr305:2.0.1", "lang": "java", "sha1": "516c03b21d50a644d538de0f0369c620989cd8f0", "repository": "https://repo.maven.apache.org/maven2/", "name": "com_google_code_findbugs_jsr305", "actual": "@com_google_code_findbugs_jsr305//jar", "bind": "jar/com/google/code/findbugs/jsr305"})
-    callback({"artifact": "com.google.guava:guava:11.0.1", "lang": "java", "sha1": "57b40a943725d43610c898ac0169adf1b2d55742", "repository": "https://repo.maven.apache.org/maven2/", "name": "com_google_guava_guava", "actual": "@com_google_guava_guava//jar", "bind": "jar/com/google/guava/guava"})
-    callback({"artifact": "com.google.inject:guice:4.0", "lang": "java", "sha1": "0f990a43d3725781b6db7cd0acf0a8b62dfd1649", "repository": "https://repo.maven.apache.org/maven2/", "name": "com_google_inject_guice", "actual": "@com_google_inject_guice//jar", "bind": "jar/com/google/inject/guice"})
-    callback({"artifact": "com.infradna.tool:bridge-method-annotation:1.13", "lang": "java", "sha1": "18cdce50cde6f54ee5390d0907384f72183ff0fe", "repository": "https://repo.maven.apache.org/maven2/", "name": "com_infradna_tool_bridge_method_annotation", "actual": "@com_infradna_tool_bridge_method_annotation//jar", "bind": "jar/com/infradna/tool/bridge_method_annotation"})
-    callback({"artifact": "com.jcraft:jzlib:1.1.3-kohsuke-1", "lang": "java", "sha1": "af5d27e1de29df05db95da5d76b546d075bc1bc5", "repository": "http://repo.jenkins-ci.org/public/", "name": "com_jcraft_jzlib", "actual": "@com_jcraft_jzlib//jar", "bind": "jar/com/jcraft/jzlib"})
-    callback({"artifact": "com.lesfurets:jenkins-pipeline-unit:1.1", "lang": "java", "sha1": "afb0fd02143e5d5127ff6187b4403a3cf0b890a0", "repository": "https://repo.maven.apache.org/maven2/", "name": "com_lesfurets_jenkins_pipeline_unit", "actual": "@com_lesfurets_jenkins_pipeline_unit//jar", "bind": "jar/com/lesfurets/jenkins_pipeline_unit"})
-    callback({"artifact": "com.sun.solaris:embedded_su4j:1.1", "lang": "java", "sha1": "9404130cc4e60670429f1ab8dbf94d669012725d", "repository": "https://repo.maven.apache.org/maven2/", "name": "com_sun_solaris_embedded_su4j", "actual": "@com_sun_solaris_embedded_su4j//jar", "bind": "jar/com/sun/solaris/embedded_su4j"})
-    callback({"artifact": "com.sun.xml.txw2:txw2:20110809", "lang": "java", "sha1": "46afa3f3c468680875adb8f2a26086a126c89902", "repository": "https://repo.maven.apache.org/maven2/", "name": "com_sun_xml_txw2_txw2", "actual": "@com_sun_xml_txw2_txw2//jar", "bind": "jar/com/sun/xml/txw2/txw2"})
-    callback({"artifact": "commons-beanutils:commons-beanutils:1.8.3", "lang": "java", "sha1": "686ef3410bcf4ab8ce7fd0b899e832aaba5facf7", "repository": "https://repo.maven.apache.org/maven2/", "name": "commons_beanutils_commons_beanutils", "actual": "@commons_beanutils_commons_beanutils//jar", "bind": "jar/commons_beanutils/commons_beanutils"})
-    callback({"artifact": "commons-codec:commons-codec:1.9", "lang": "java", "sha1": "9ce04e34240f674bc72680f8b843b1457383161a", "repository": "https://repo.maven.apache.org/maven2/", "name": "commons_codec_commons_codec", "actual": "@commons_codec_commons_codec//jar", "bind": "jar/commons_codec/commons_codec"})
-    callback({"artifact": "commons-collections:commons-collections:3.2.2", "lang": "java", "sha1": "8ad72fe39fa8c91eaaf12aadb21e0c3661fe26d5", "repository": "https://repo.maven.apache.org/maven2/", "name": "commons_collections_commons_collections", "actual": "@commons_collections_commons_collections//jar", "bind": "jar/commons_collections/commons_collections"})
-    callback({"artifact": "commons-digester:commons-digester:2.1", "lang": "java", "sha1": "73a8001e7a54a255eef0f03521ec1805dc738ca0", "repository": "https://repo.maven.apache.org/maven2/", "name": "commons_digester_commons_digester", "actual": "@commons_digester_commons_digester//jar", "bind": "jar/commons_digester/commons_digester"})
-    callback({"artifact": "commons-discovery:commons-discovery:0.4", "lang": "java", "sha1": "9e3417d3866d9f71e83b959b229b35dc723c7bea", "repository": "https://repo.maven.apache.org/maven2/", "name": "commons_discovery_commons_discovery", "actual": "@commons_discovery_commons_discovery//jar", "bind": "jar/commons_discovery/commons_discovery"})
-    callback({"artifact": "commons-fileupload:commons-fileupload:1.3.1-jenkins-2", "lang": "java", "sha1": "297d1dc0a3cbdd3e125f4d506c2b73a105e6cd30", "repository": "http://repo.jenkins-ci.org/public/", "name": "commons_fileupload_commons_fileupload", "actual": "@commons_fileupload_commons_fileupload//jar", "bind": "jar/commons_fileupload/commons_fileupload"})
-    callback({"artifact": "commons-httpclient:commons-httpclient:3.1-jenkins-1", "lang": "java", "sha1": "a75a5917272ea09a24e6a4d9fc0b88a382341d22", "repository": "http://repo.jenkins-ci.org/public/", "name": "commons_httpclient_commons_httpclient", "actual": "@commons_httpclient_commons_httpclient//jar", "bind": "jar/commons_httpclient/commons_httpclient"})
-# duplicates in commons-io:commons-io promoted to 2.5
-# - org.jenkins-ci.main:jenkins-core:2.105 wanted version 2.4
-# - com.lesfurets:jenkins-pipeline-unit:1.1 wanted version 2.5
-    callback({"artifact": "commons-io:commons-io:2.5", "lang": "java", "sha1": "2852e6e05fbb95076fc091f6d1780f1f8fe35e0f", "repository": "https://repo.maven.apache.org/maven2/", "name": "commons_io_commons_io", "actual": "@commons_io_commons_io//jar", "bind": "jar/commons_io/commons_io"})
-    callback({"artifact": "commons-jelly:commons-jelly-tags-fmt:1.0", "lang": "java", "sha1": "2107da38fdd287ab78a4fa65c1300b5ad9999274", "repository": "https://repo.maven.apache.org/maven2/", "name": "commons_jelly_commons_jelly_tags_fmt", "actual": "@commons_jelly_commons_jelly_tags_fmt//jar", "bind": "jar/commons_jelly/commons_jelly_tags_fmt"})
-    callback({"artifact": "commons-jelly:commons-jelly-tags-xml:1.1", "lang": "java", "sha1": "cc0efc2ae0ff81ef7737afc786a0ce16a8540efc", "repository": "https://repo.maven.apache.org/maven2/", "name": "commons_jelly_commons_jelly_tags_xml", "actual": "@commons_jelly_commons_jelly_tags_xml//jar", "bind": "jar/commons_jelly/commons_jelly_tags_xml"})
-    callback({"artifact": "commons-lang:commons-lang:2.6", "lang": "java", "sha1": "0ce1edb914c94ebc388f086c6827e8bdeec71ac2", "repository": "https://repo.maven.apache.org/maven2/", "name": "commons_lang_commons_lang", "actual": "@commons_lang_commons_lang//jar", "bind": "jar/commons_lang/commons_lang"})
-    callback({"artifact": "javax.annotation:javax.annotation-api:1.2", "lang": "java", "sha1": "479c1e06db31c432330183f5cae684163f186146", "repository": "https://repo.maven.apache.org/maven2/", "name": "javax_annotation_javax_annotation_api", "actual": "@javax_annotation_javax_annotation_api//jar", "bind": "jar/javax/annotation/javax_annotation_api"})
-    callback({"artifact": "javax.inject:javax.inject:1", "lang": "java", "sha1": "6975da39a7040257bd51d21a231b76c915872d38", "repository": "https://repo.maven.apache.org/maven2/", "name": "javax_inject_javax_inject", "actual": "@javax_inject_javax_inject//jar", "bind": "jar/javax/inject/javax_inject"})
-    callback({"artifact": "javax.mail:mail:1.4.4", "lang": "java", "sha1": "b907ef0a02ff6e809392b1e7149198497fcc8e49", "repository": "https://repo.maven.apache.org/maven2/", "name": "javax_mail_mail", "actual": "@javax_mail_mail//jar", "bind": "jar/javax/mail/mail"})
-    callback({"artifact": "javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api:1.2.1", "lang": "java", "sha1": "f072f63ab1689e885ac40c221df3e6bb3e64a84a", "repository": "https://repo.maven.apache.org/maven2/", "name": "javax_servlet_jsp_jstl_javax_servlet_jsp_jstl_api", "actual": "@javax_servlet_jsp_jstl_javax_servlet_jsp_jstl_api//jar", "bind": "jar/javax/servlet/jsp/jstl/javax_servlet_jsp_jstl_api"})
-    callback({"artifact": "javax.xml.stream:stax-api:1.0-2", "lang": "java", "sha1": "d6337b0de8b25e53e81b922352fbea9f9f57ba0b", "repository": "https://repo.maven.apache.org/maven2/", "name": "javax_xml_stream_stax_api", "actual": "@javax_xml_stream_stax_api//jar", "bind": "jar/javax/xml/stream/stax_api"})
-    callback({"artifact": "jaxen:jaxen:1.1-beta-11", "lang": "java", "sha1": "81e32b8bafcc778e5deea4e784670299f1c26b96", "repository": "https://repo.maven.apache.org/maven2/", "name": "jaxen_jaxen", "actual": "@jaxen_jaxen//jar", "bind": "jar/jaxen/jaxen"})
-    callback({"artifact": "jfree:jcommon:1.0.12", "lang": "java", "sha1": "737f02607d2f45bb1a589a85c63b4cd907e5e634", "repository": "https://repo.maven.apache.org/maven2/", "name": "jfree_jcommon", "actual": "@jfree_jcommon//jar", "bind": "jar/jfree/jcommon"})
-    callback({"artifact": "jfree:jfreechart:1.0.9", "lang": "java", "sha1": "6e522aa603bf7ac69da59edcf519b335490e93a6", "repository": "https://repo.maven.apache.org/maven2/", "name": "jfree_jfreechart", "actual": "@jfree_jfreechart//jar", "bind": "jar/jfree/jfreechart"})
-    callback({"artifact": "jline:jline:2.12", "lang": "java", "sha1": "ce9062c6a125e0f9ad766032573c041ae8ecc986", "repository": "https://repo.maven.apache.org/maven2/", "name": "jline_jline", "actual": "@jline_jline//jar", "bind": "jar/jline/jline"})
-    callback({"artifact": "junit:junit:4.12", "lang": "java", "sha1": "2973d150c0dc1fefe998f834810d68f278ea58ec", "repository": "https://repo.maven.apache.org/maven2/", "name": "junit_junit", "actual": "@junit_junit//jar", "bind": "jar/junit/junit"})
-    callback({"artifact": "net.i2p.crypto:eddsa:0.2.0", "lang": "java", "sha1": "0856a92559c4daf744cb27c93cd8b7eb1f8c4780", "repository": "https://repo.maven.apache.org/maven2/", "name": "net_i2p_crypto_eddsa", "actual": "@net_i2p_crypto_eddsa//jar", "bind": "jar/net/i2p/crypto/eddsa"})
-    callback({"artifact": "net.java.dev.jna:jna:4.2.1", "lang": "java", "sha1": "fcc5b10cb812c41b00708e7b57baccc3aee5567c", "repository": "https://repo.maven.apache.org/maven2/", "name": "net_java_dev_jna_jna", "actual": "@net_java_dev_jna_jna//jar", "bind": "jar/net/java/dev/jna/jna"})
-    callback({"artifact": "net.java.sezpoz:sezpoz:1.12", "lang": "java", "sha1": "01f7e4a04e06fdbc91d66ddf80c443c3f7c6503c", "repository": "https://repo.maven.apache.org/maven2/", "name": "net_java_sezpoz_sezpoz", "actual": "@net_java_sezpoz_sezpoz//jar", "bind": "jar/net/java/sezpoz/sezpoz"})
-    callback({"artifact": "net.sf.ezmorph:ezmorph:1.0.6", "lang": "java", "sha1": "01e55d2a0253ea37745d33062852fd2c90027432", "repository": "https://repo.maven.apache.org/maven2/", "name": "net_sf_ezmorph_ezmorph", "actual": "@net_sf_ezmorph_ezmorph//jar", "bind": "jar/net/sf/ezmorph/ezmorph"})
-    callback({"artifact": "net.sf.kxml:kxml2:2.3.0", "lang": "java", "sha1": "ccbc77a5fd907ef863c29f3596c6f54ffa4e9442", "repository": "https://repo.maven.apache.org/maven2/", "name": "net_sf_kxml_kxml2", "actual": "@net_sf_kxml_kxml2//jar", "bind": "jar/net/sf/kxml/kxml2"})
-    callback({"artifact": "org.acegisecurity:acegi-security:1.0.7", "lang": "java", "sha1": "72901120d299e0c6ed2f6a23dd37f9186eeb8cc3", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_acegisecurity_acegi_security", "actual": "@org_acegisecurity_acegi_security//jar", "bind": "jar/org/acegisecurity/acegi_security"})
-    callback({"artifact": "org.apache.ant:ant-launcher:1.9.2", "lang": "java", "sha1": "4f20f0651dd207caf04351192d59936e71da895b", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_apache_ant_ant_launcher", "actual": "@org_apache_ant_ant_launcher//jar", "bind": "jar/org/apache/ant/ant_launcher"})
-    callback({"artifact": "org.apache.ant:ant:1.9.2", "lang": "java", "sha1": "112cf195dec0bd2b7967b5711b88c880b6640d86", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_apache_ant_ant", "actual": "@org_apache_ant_ant//jar", "bind": "jar/org/apache/ant/ant"})
-    callback({"artifact": "org.apache.commons:commons-compress:1.10", "lang": "java", "sha1": "5eeb27c57eece1faf2d837868aeccc94d84dcc9a", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_apache_commons_commons_compress", "actual": "@org_apache_commons_commons_compress//jar", "bind": "jar/org/apache/commons/commons_compress"})
-    callback({"artifact": "org.apache.ivy:ivy:2.4.0", "lang": "java", "sha1": "5abe4c24bbe992a9ac07ca563d5bd3e8d569e9ed", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_apache_ivy_ivy", "actual": "@org_apache_ivy_ivy//jar", "bind": "jar/org/apache/ivy/ivy"})
-    callback({"artifact": "org.assertj:assertj-core:3.4.1", "lang": "java", "sha1": "536893abdf1ce11f72c1e4483a88e94d6ba80005", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_assertj_assertj_core", "actual": "@org_assertj_assertj_core//jar", "bind": "jar/org/assertj/assertj_core"})
-# duplicates in org.codehaus.groovy:groovy-all fixed to 2.4.13
-# - com.lesfurets:jenkins-pipeline-unit:1.1 wanted version 2.4.6
-# - org.jenkins-ci.main:jenkins-core:2.105 wanted version 2.4.11
-    callback({"artifact": "org.codehaus.groovy:groovy-all:2.4.13", "lang": "java", "sha1": "7e410735a50e495323dd4855ddd13ea7dad23ac1", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_codehaus_groovy_groovy_all", "actual": "@org_codehaus_groovy_groovy_all//jar", "bind": "jar/org/codehaus/groovy/groovy_all"})
-    callback({"artifact": "org.codehaus.woodstox:wstx-asl:3.2.9", "lang": "java", "sha1": "c82b6e8f225bb799540e558b10ee24d268035597", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_codehaus_woodstox_wstx_asl", "actual": "@org_codehaus_woodstox_wstx_asl//jar", "bind": "jar/org/codehaus/woodstox/wstx_asl"})
-    callback({"artifact": "org.connectbot.jbcrypt:jbcrypt:1.0.0", "lang": "java", "sha1": "f37bba2b8b78fcc8111bb932318b621dcc6c5194", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_connectbot_jbcrypt_jbcrypt", "actual": "@org_connectbot_jbcrypt_jbcrypt//jar", "bind": "jar/org/connectbot/jbcrypt/jbcrypt"})
-    callback({"artifact": "org.fusesource.jansi:jansi:1.11", "lang": "java", "sha1": "655c643309c2f45a56a747fda70e3fadf57e9f11", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_fusesource_jansi_jansi", "actual": "@org_fusesource_jansi_jansi//jar", "bind": "jar/org/fusesource/jansi/jansi"})
-    callback({"artifact": "org.hamcrest:hamcrest-all:1.3", "lang": "java", "sha1": "63a21ebc981131004ad02e0434e799fd7f3a8d5a", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_hamcrest_hamcrest_all", "actual": "@org_hamcrest_hamcrest_all//jar", "bind": "jar/org/hamcrest/hamcrest_all"})
-    callback({"artifact": "org.hamcrest:hamcrest-core:1.3", "lang": "java", "sha1": "42a25dc3219429f0e5d060061f71acb49bf010a0", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_hamcrest_hamcrest_core", "actual": "@org_hamcrest_hamcrest_core//jar", "bind": "jar/org/hamcrest/hamcrest_core"})
-    callback({"artifact": "org.jboss.marshalling:jboss-marshalling-river:1.4.12.jenkins-3", "lang": "java", "sha1": "53949db54bd86e2aa1b3a3614cc0110aaffcca0d", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jboss_marshalling_jboss_marshalling_river", "actual": "@org_jboss_marshalling_jboss_marshalling_river//jar", "bind": "jar/org/jboss/marshalling/jboss_marshalling_river"})
-    callback({"artifact": "org.jboss.marshalling:jboss-marshalling:1.4.12.jenkins-3", "lang": "java", "sha1": "3d6857aead803e7f7f7e6418d1b4a6f771c74ef9", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jboss_marshalling_jboss_marshalling", "actual": "@org_jboss_marshalling_jboss_marshalling//jar", "bind": "jar/org/jboss/marshalling/jboss_marshalling"})
-    callback({"artifact": "org.jenkins-ci.dom4j:dom4j:1.6.1-jenkins-4", "lang": "java", "sha1": "9a370b2010b5a1223c7a43dae6c05226918e17b1", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_dom4j_dom4j", "actual": "@org_jenkins_ci_dom4j_dom4j//jar", "bind": "jar/org/jenkins_ci/dom4j/dom4j"})
-    callback({"artifact": "org.jenkins-ci.main:cli:2.105", "lang": "java", "sha1": "f5314541cf4878c6beccb6dcf23527e3bb26b94a", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_main_cli", "actual": "@org_jenkins_ci_main_cli//jar", "bind": "jar/org/jenkins_ci/main/cli"})
-    callback({"artifact": "org.jenkins-ci.main:jenkins-core:2.105", "lang": "java", "sha1": "af35cd5ddee2ca256ee9910559ec00444ff43345", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_main_jenkins_core", "actual": "@org_jenkins_ci_main_jenkins_core//jar", "bind": "jar/org/jenkins_ci/main/jenkins_core"})
-    callback({"artifact": "org.jenkins-ci.main:remoting:3.16", "lang": "java", "sha1": "98133ca4027b00ed1a1d87241708ac05acc20e8b", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_main_remoting", "actual": "@org_jenkins_ci_main_remoting//jar", "bind": "jar/org/jenkins_ci/main/remoting"})
-    callback({"artifact": "org.jenkins-ci.plugins.icon-shim:icon-set:1.0.5", "lang": "java", "sha1": "dedc76ac61797dafc66f31e8507d65b98c9e57df", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_plugins_icon_shim_icon_set", "actual": "@org_jenkins_ci_plugins_icon_shim_icon_set//jar", "bind": "jar/org/jenkins_ci/plugins/icon_shim/icon_set"})
-    callback({"artifact": "org.jenkins-ci.plugins.workflow:workflow-api:2.22", "lang": "java", "sha1": "ba64d15b11475153e2542c201552765c90b9c884", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_plugins_workflow_workflow_api", "actual": "@org_jenkins_ci_plugins_workflow_workflow_api//jar", "bind": "jar/org/jenkins_ci/plugins/workflow/workflow_api"})
-    callback({"artifact": "org.jenkins-ci.plugins.workflow:workflow-step-api:2.13", "lang": "java", "sha1": "4683818134b9610b126557033425cc68ba5de8dd", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_plugins_workflow_workflow_step_api", "actual": "@org_jenkins_ci_plugins_workflow_workflow_step_api//jar", "bind": "jar/org/jenkins_ci/plugins/workflow/workflow_step_api"})
-    callback({"artifact": "org.jenkins-ci.plugins.workflow:workflow-support:2.16", "lang": "java", "sha1": "b17142e69505d4f9c7f0ccc53d01470a7ca39dfd", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_plugins_workflow_workflow_support", "actual": "@org_jenkins_ci_plugins_workflow_workflow_support//jar", "bind": "jar/org/jenkins_ci/plugins/workflow/workflow_support"})
-    callback({"artifact": "org.jenkins-ci.plugins:scm-api:2.0.8", "lang": "java", "sha1": "9ee72304b2a58dc3a3b08c4a48fc45870097f9d4", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_plugins_scm_api", "actual": "@org_jenkins_ci_plugins_scm_api//jar", "bind": "jar/org/jenkins_ci/plugins/scm_api"})
-    callback({"artifact": "org.jenkins-ci.plugins:script-security:1.27", "lang": "java", "sha1": "486d8f7e051f4a439e2a2850cd9fa2c64ee71d52", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_plugins_script_security", "actual": "@org_jenkins_ci_plugins_script_security//jar", "bind": "jar/org/jenkins_ci/plugins/script_security"})
-    callback({"artifact": "org.jenkins-ci.plugins:structs:1.5", "lang": "java", "sha1": "72d429f749151f1c983c1fadcb348895cc6da20e", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_plugins_structs", "actual": "@org_jenkins_ci_plugins_structs//jar", "bind": "jar/org/jenkins_ci/plugins/structs"})
-# duplicates in org.jenkins-ci:annotation-indexer promoted to 1.12
-# - org.jenkins-ci:symbol-annotation:1.5 wanted version 1.9
-# - org.jenkins-ci.main:jenkins-core:2.105 wanted version 1.12
-    callback({"artifact": "org.jenkins-ci:annotation-indexer:1.12", "lang": "java", "sha1": "8f6ee0cd64c305dcca29e2f5b46631d50890208f", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_annotation_indexer", "actual": "@org_jenkins_ci_annotation_indexer//jar", "bind": "jar/org/jenkins_ci/annotation_indexer"})
-    callback({"artifact": "org.jenkins-ci:bytecode-compatibility-transformer:1.8", "lang": "java", "sha1": "aded88ffe12f1904758397f96f16957e97b88e6e", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_bytecode_compatibility_transformer", "actual": "@org_jenkins_ci_bytecode_compatibility_transformer//jar", "bind": "jar/org/jenkins_ci/bytecode_compatibility_transformer"})
-    callback({"artifact": "org.jenkins-ci:commons-jelly:1.1-jenkins-20120928", "lang": "java", "sha1": "2720a0d54b7f32479b08970d7738041362e1f410", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_commons_jelly", "actual": "@org_jenkins_ci_commons_jelly//jar", "bind": "jar/org/jenkins_ci/commons_jelly"})
-    callback({"artifact": "org.jenkins-ci:commons-jexl:1.1-jenkins-20111212", "lang": "java", "sha1": "0a990a77bea8c5a400d58a6f5d98122236300f7d", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_commons_jexl", "actual": "@org_jenkins_ci_commons_jexl//jar", "bind": "jar/org/jenkins_ci/commons_jexl"})
-    callback({"artifact": "org.jenkins-ci:constant-pool-scanner:1.2", "lang": "java", "sha1": "e5e0b7c7fcb67767dbd195e0ca1f0ee9406dd423", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_jenkins_ci_constant_pool_scanner", "actual": "@org_jenkins_ci_constant_pool_scanner//jar", "bind": "jar/org/jenkins_ci/constant_pool_scanner"})
-    callback({"artifact": "org.jenkins-ci:crypto-util:1.1", "lang": "java", "sha1": "3a199a4c3748012b9dbbf3080097dc9f302493d8", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_crypto_util", "actual": "@org_jenkins_ci_crypto_util//jar", "bind": "jar/org/jenkins_ci/crypto_util"})
-    callback({"artifact": "org.jenkins-ci:jmdns:3.4.0-jenkins-3", "lang": "java", "sha1": "264d0c402b48c365f34d072b864ed57f25e92e63", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_jmdns", "actual": "@org_jenkins_ci_jmdns//jar", "bind": "jar/org/jenkins_ci/jmdns"})
-    callback({"artifact": "org.jenkins-ci:memory-monitor:1.9", "lang": "java", "sha1": "1935bfb46474e3043ee2310a9bb790d42dde2ed7", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_memory_monitor", "actual": "@org_jenkins_ci_memory_monitor//jar", "bind": "jar/org/jenkins_ci/memory_monitor"})
-# duplicates in org.jenkins-ci:symbol-annotation promoted to 1.5
-# - org.jenkins-ci.plugins:structs:1.5 wanted version 1.5
-# - org.jenkins-ci.main:jenkins-core:2.105 wanted version 1.1
-    callback({"artifact": "org.jenkins-ci:symbol-annotation:1.5", "lang": "java", "sha1": "17694feb24cb69793914d0c1c11ff479ee4c1b38", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_symbol_annotation", "actual": "@org_jenkins_ci_symbol_annotation//jar", "bind": "jar/org/jenkins_ci/symbol_annotation"})
-    callback({"artifact": "org.jenkins-ci:task-reactor:1.5", "lang": "java", "sha1": "62964c07bb64457bbbb5711482e9c79bab720f20", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_task_reactor", "actual": "@org_jenkins_ci_task_reactor//jar", "bind": "jar/org/jenkins_ci/task_reactor"})
-    callback({"artifact": "org.jenkins-ci:trilead-ssh2:build-217-jenkins-11", "lang": "java", "sha1": "f10f4dd4121cc233cac229c51adb4775960fee0a", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_trilead_ssh2", "actual": "@org_jenkins_ci_trilead_ssh2//jar", "bind": "jar/org/jenkins_ci/trilead_ssh2"})
-    callback({"artifact": "org.jenkins-ci:version-number:1.4", "lang": "java", "sha1": "5d0f2ea16514c0ec8de86c102ce61a7837e45eb8", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jenkins_ci_version_number", "actual": "@org_jenkins_ci_version_number//jar", "bind": "jar/org/jenkins_ci/version_number"})
-    callback({"artifact": "org.jruby.ext.posix:jna-posix:1.0.3-jenkins-1", "lang": "java", "sha1": "fb1148cc8192614ec1418d414f7b6026cc0ec71b", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jruby_ext_posix_jna_posix", "actual": "@org_jruby_ext_posix_jna_posix//jar", "bind": "jar/org/jruby/ext/posix/jna_posix"})
-    callback({"artifact": "org.jvnet.hudson:activation:1.1.1-hudson-1", "lang": "java", "sha1": "7957d80444223277f84676aabd5b0421b65888c4", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_jvnet_hudson_activation", "actual": "@org_jvnet_hudson_activation//jar", "bind": "jar/org/jvnet/hudson/activation"})
-    callback({"artifact": "org.jvnet.hudson:commons-jelly-tags-define:1.0.1-hudson-20071021", "lang": "java", "sha1": "8b952d0e504ee505d234853119e5648441894234", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_jvnet_hudson_commons_jelly_tags_define", "actual": "@org_jvnet_hudson_commons_jelly_tags_define//jar", "bind": "jar/org/jvnet/hudson/commons_jelly_tags_define"})
-    callback({"artifact": "org.jvnet.hudson:jtidy:4aug2000r7-dev-hudson-1", "lang": "java", "sha1": "ad8553d0acfa6e741d21d5b2c2beb737972ab7c7", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_jvnet_hudson_jtidy", "actual": "@org_jvnet_hudson_jtidy//jar", "bind": "jar/org/jvnet/hudson/jtidy"})
-    callback({"artifact": "org.jvnet.hudson:xstream:1.4.7-jenkins-1", "lang": "java", "sha1": "161ed1603117c2d37b864f81a0d62f36cf7e958a", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jvnet_hudson_xstream", "actual": "@org_jvnet_hudson_xstream//jar", "bind": "jar/org/jvnet/hudson/xstream"})
-    callback({"artifact": "org.jvnet.localizer:localizer:1.24", "lang": "java", "sha1": "e20e7668dbf36e8d354dab922b89adb6273b703f", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jvnet_localizer_localizer", "actual": "@org_jvnet_localizer_localizer//jar", "bind": "jar/org/jvnet/localizer/localizer"})
-    callback({"artifact": "org.jvnet.robust-http-client:robust-http-client:1.2", "lang": "java", "sha1": "dee9fda92ad39a94a77ec6cf88300d4dd6db8a4d", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jvnet_robust_http_client_robust_http_client", "actual": "@org_jvnet_robust_http_client_robust_http_client//jar", "bind": "jar/org/jvnet/robust_http_client/robust_http_client"})
-    callback({"artifact": "org.jvnet.winp:winp:1.25", "lang": "java", "sha1": "1c88889f80c0e03a7fb62c26b706d68813f8e657", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_jvnet_winp_winp", "actual": "@org_jvnet_winp_winp//jar", "bind": "jar/org/jvnet/winp/winp"})
-    callback({"artifact": "org.jvnet:tiger-types:2.2", "lang": "java", "sha1": "7ddc6bbc8ca59be8879d3a943bf77517ec190f39", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_jvnet_tiger_types", "actual": "@org_jvnet_tiger_types//jar", "bind": "jar/org/jvnet/tiger_types"})
-    callback({"artifact": "org.kohsuke.jinterop:j-interop:2.0.6-kohsuke-1", "lang": "java", "sha1": "b2e243227608c1424ab0084564dc71659d273007", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_jinterop_j_interop", "actual": "@org_kohsuke_jinterop_j_interop//jar", "bind": "jar/org/kohsuke/jinterop/j_interop"})
-    callback({"artifact": "org.kohsuke.jinterop:j-interopdeps:2.0.6-kohsuke-1", "lang": "java", "sha1": "778400517a3419ce8c361498c194036534851736", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_jinterop_j_interopdeps", "actual": "@org_kohsuke_jinterop_j_interopdeps//jar", "bind": "jar/org/kohsuke/jinterop/j_interopdeps"})
-    callback({"artifact": "org.kohsuke.stapler:json-lib:2.4-jenkins-2", "lang": "java", "sha1": "7f4f9016d8c8b316ecbe68afe7c26df06d301366", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_kohsuke_stapler_json_lib", "actual": "@org_kohsuke_stapler_json_lib//jar", "bind": "jar/org/kohsuke/stapler/json_lib"})
-    callback({"artifact": "org.kohsuke.stapler:stapler-adjunct-codemirror:1.3", "lang": "java", "sha1": "fd1d45544400d2a4da6dfee9e60edd4ec3368806", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_kohsuke_stapler_stapler_adjunct_codemirror", "actual": "@org_kohsuke_stapler_stapler_adjunct_codemirror//jar", "bind": "jar/org/kohsuke/stapler/stapler_adjunct_codemirror"})
-    callback({"artifact": "org.kohsuke.stapler:stapler-adjunct-timeline:1.5", "lang": "java", "sha1": "3fa806cbb94679ceab9c1ecaaf5fea8207390cb7", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_stapler_stapler_adjunct_timeline", "actual": "@org_kohsuke_stapler_stapler_adjunct_timeline//jar", "bind": "jar/org/kohsuke/stapler/stapler_adjunct_timeline"})
-    callback({"artifact": "org.kohsuke.stapler:stapler-adjunct-zeroclipboard:1.3.5-1", "lang": "java", "sha1": "20184ea79888b55b6629e4479615b52f88b55173", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_stapler_stapler_adjunct_zeroclipboard", "actual": "@org_kohsuke_stapler_stapler_adjunct_zeroclipboard//jar", "bind": "jar/org/kohsuke/stapler/stapler_adjunct_zeroclipboard"})
-    callback({"artifact": "org.kohsuke.stapler:stapler-groovy:1.254", "lang": "java", "sha1": "c8f1bc639c6067a43b2c18d37d2eff436e475f8f", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_stapler_stapler_groovy", "actual": "@org_kohsuke_stapler_stapler_groovy//jar", "bind": "jar/org/kohsuke/stapler/stapler_groovy"})
-    callback({"artifact": "org.kohsuke.stapler:stapler-jelly:1.254", "lang": "java", "sha1": "1f81746ae5c4a56eac61d39f225eb908cc9d5673", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_stapler_stapler_jelly", "actual": "@org_kohsuke_stapler_stapler_jelly//jar", "bind": "jar/org/kohsuke/stapler/stapler_jelly"})
-    callback({"artifact": "org.kohsuke.stapler:stapler-jrebel:1.254", "lang": "java", "sha1": "cb23acb2f7237e5846c4bb2b8e11e4c87e72141f", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_stapler_stapler_jrebel", "actual": "@org_kohsuke_stapler_stapler_jrebel//jar", "bind": "jar/org/kohsuke/stapler/stapler_jrebel"})
-    callback({"artifact": "org.kohsuke.stapler:stapler:1.254", "lang": "java", "sha1": "e01068956c7e143264ce57e659728c89a2e38f3c", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_stapler_stapler", "actual": "@org_kohsuke_stapler_stapler//jar", "bind": "jar/org/kohsuke/stapler/stapler"})
-    callback({"artifact": "org.kohsuke:access-modifier-annotation:1.12", "lang": "java", "sha1": "a4964840aef2cf07bdf8b327a4b737cef64ce19d", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_access_modifier_annotation", "actual": "@org_kohsuke_access_modifier_annotation//jar", "bind": "jar/org/kohsuke/access_modifier_annotation"})
-    callback({"artifact": "org.kohsuke:akuma:1.10", "lang": "java", "sha1": "0e2c6a1f79f17e3fab13332ab8e9b9016eeab0b6", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_akuma", "actual": "@org_kohsuke_akuma//jar", "bind": "jar/org/kohsuke/akuma"})
-    callback({"artifact": "org.kohsuke:asm5:5.0.1", "lang": "java", "sha1": "71ab0620a41ed37f626b96d80c2a7c58165550df", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_asm5", "actual": "@org_kohsuke_asm5//jar", "bind": "jar/org/kohsuke/asm5"})
-    callback({"artifact": "org.kohsuke:groovy-sandbox:1.10", "lang": "java", "sha1": "f4f33a2122cca74ce8beaaf6a3c5ab9c8644d977", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_groovy_sandbox", "actual": "@org_kohsuke_groovy_sandbox//jar", "bind": "jar/org/kohsuke/groovy_sandbox"})
-    callback({"artifact": "org.kohsuke:libpam4j:1.8", "lang": "java", "sha1": "548d4a1177adad8242fe03a6930c335669d669ad", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_libpam4j", "actual": "@org_kohsuke_libpam4j//jar", "bind": "jar/org/kohsuke/libpam4j"})
-    callback({"artifact": "org.kohsuke:libzfs:0.8", "lang": "java", "sha1": "5bb311276283921f7e1082c348c0253b17922dcc", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_libzfs", "actual": "@org_kohsuke_libzfs//jar", "bind": "jar/org/kohsuke/libzfs"})
-    callback({"artifact": "org.kohsuke:trilead-putty-extension:1.2", "lang": "java", "sha1": "0f2f41517e1f73be8e319da27a69e0dc0c524bf6", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_trilead_putty_extension", "actual": "@org_kohsuke_trilead_putty_extension//jar", "bind": "jar/org/kohsuke/trilead_putty_extension"})
-    callback({"artifact": "org.kohsuke:windows-package-checker:1.2", "lang": "java", "sha1": "86b5d2f9023633808d65dbcfdfd50dc5ad3ca31f", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_kohsuke_windows_package_checker", "actual": "@org_kohsuke_windows_package_checker//jar", "bind": "jar/org/kohsuke/windows_package_checker"})
-    callback({"artifact": "org.ow2.asm:asm-analysis:5.0.3", "lang": "java", "sha1": "c7126aded0e8e13fed5f913559a0dd7b770a10f3", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_ow2_asm_asm_analysis", "actual": "@org_ow2_asm_asm_analysis//jar", "bind": "jar/org/ow2/asm/asm_analysis"})
-    callback({"artifact": "org.ow2.asm:asm-commons:5.0.3", "lang": "java", "sha1": "a7111830132c7f87d08fe48cb0ca07630f8cb91c", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_ow2_asm_asm_commons", "actual": "@org_ow2_asm_asm_commons//jar", "bind": "jar/org/ow2/asm/asm_commons"})
-    callback({"artifact": "org.ow2.asm:asm-tree:5.0.3", "lang": "java", "sha1": "287749b48ba7162fb67c93a026d690b29f410bed", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_ow2_asm_asm_tree", "actual": "@org_ow2_asm_asm_tree//jar", "bind": "jar/org/ow2/asm/asm_tree"})
-    callback({"artifact": "org.ow2.asm:asm-util:5.0.3", "lang": "java", "sha1": "1512e5571325854b05fb1efce1db75fcced54389", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_ow2_asm_asm_util", "actual": "@org_ow2_asm_asm_util//jar", "bind": "jar/org/ow2/asm/asm_util"})
-    callback({"artifact": "org.ow2.asm:asm:5.0.3", "lang": "java", "sha1": "dcc2193db20e19e1feca8b1240dbbc4e190824fa", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_ow2_asm_asm", "actual": "@org_ow2_asm_asm//jar", "bind": "jar/org/ow2/asm/asm"})
-    callback({"artifact": "org.samba.jcifs:jcifs:1.3.17-kohsuke-1", "lang": "java", "sha1": "6c9114dc4075277d829ea09e15d6ffab52f2d0c0", "repository": "http://repo.jenkins-ci.org/public/", "name": "org_samba_jcifs_jcifs", "actual": "@org_samba_jcifs_jcifs//jar", "bind": "jar/org/samba/jcifs/jcifs"})
-    callback({"artifact": "org.slf4j:jcl-over-slf4j:1.7.25", "lang": "java", "sha1": "f8c32b13ff142a513eeb5b6330b1588dcb2c0461", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_slf4j_jcl_over_slf4j", "actual": "@org_slf4j_jcl_over_slf4j//jar", "bind": "jar/org/slf4j/jcl_over_slf4j"})
-    callback({"artifact": "org.slf4j:log4j-over-slf4j:1.7.25", "lang": "java", "sha1": "a87bb47468f47ee7aabbd54f93e133d4215769c3", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_slf4j_log4j_over_slf4j", "actual": "@org_slf4j_log4j_over_slf4j//jar", "bind": "jar/org/slf4j/log4j_over_slf4j"})
-    callback({"artifact": "org.slf4j:slf4j-api:1.7.25", "lang": "java", "sha1": "da76ca59f6a57ee3102f8f9bd9cee742973efa8a", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_slf4j_slf4j_api", "actual": "@org_slf4j_slf4j_api//jar", "bind": "jar/org/slf4j/slf4j_api"})
-    callback({"artifact": "org.springframework:spring-aop:2.5.6.SEC03", "lang": "java", "sha1": "6468695557500723a18630b712ce112ec58827c1", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_springframework_spring_aop", "actual": "@org_springframework_spring_aop//jar", "bind": "jar/org/springframework/spring_aop"})
-    callback({"artifact": "org.springframework:spring-beans:2.5.6.SEC03", "lang": "java", "sha1": "79b2c86ff12c21b2420b4c46dca51f0e58762aae", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_springframework_spring_beans", "actual": "@org_springframework_spring_beans//jar", "bind": "jar/org/springframework/spring_beans"})
-    callback({"artifact": "org.springframework:spring-context-support:2.5.6.SEC03", "lang": "java", "sha1": "edf496f4ce066edc6b212e0e5521cb11ff97d55e", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_springframework_spring_context_support", "actual": "@org_springframework_spring_context_support//jar", "bind": "jar/org/springframework/spring_context_support"})
-    callback({"artifact": "org.springframework:spring-context:2.5.6.SEC03", "lang": "java", "sha1": "5f1c24b26308afedc48a90a1fe2ed334a6475921", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_springframework_spring_context", "actual": "@org_springframework_spring_context//jar", "bind": "jar/org/springframework/spring_context"})
-    callback({"artifact": "org.springframework:spring-core:2.5.6.SEC03", "lang": "java", "sha1": "644a23805a7ea29903bde0ccc1cd1a8b5f0432d6", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_springframework_spring_core", "actual": "@org_springframework_spring_core//jar", "bind": "jar/org/springframework/spring_core"})
-    callback({"artifact": "org.springframework:spring-dao:1.2.9", "lang": "java", "sha1": "6f90baf86fc833cac3c677a8f35d3333ed86baea", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_springframework_spring_dao", "actual": "@org_springframework_spring_dao//jar", "bind": "jar/org/springframework/spring_dao"})
-    callback({"artifact": "org.springframework:spring-jdbc:1.2.9", "lang": "java", "sha1": "8a81d42995e61e2deac49c2bc75cfacbb28e7218", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_springframework_spring_jdbc", "actual": "@org_springframework_spring_jdbc//jar", "bind": "jar/org/springframework/spring_jdbc"})
-    callback({"artifact": "org.springframework:spring-web:2.5.6.SEC03", "lang": "java", "sha1": "699f171339f20126f1d09dde2dd17d6db2943fce", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_springframework_spring_web", "actual": "@org_springframework_spring_web//jar", "bind": "jar/org/springframework/spring_web"})
-    callback({"artifact": "org.springframework:spring-webmvc:2.5.6.SEC03", "lang": "java", "sha1": "275c5ac6ade12819f49e984c8e06b114a4e23458", "repository": "https://repo.maven.apache.org/maven2/", "name": "org_springframework_spring_webmvc", "actual": "@org_springframework_spring_webmvc//jar", "bind": "jar/org/springframework/spring_webmvc"})
-    callback({"artifact": "oro:oro:2.0.8", "lang": "java", "sha1": "5592374f834645c4ae250f4c9fbb314c9369d698", "repository": "https://repo.maven.apache.org/maven2/", "name": "oro_oro", "actual": "@oro_oro//jar", "bind": "jar/oro/oro"})
-    callback({"artifact": "relaxngDatatype:relaxngDatatype:20020414", "lang": "java", "sha1": "de7952cecd05b65e0e4370cc93fc03035175eef5", "repository": "https://repo.maven.apache.org/maven2/", "name": "relaxngDatatype_relaxngDatatype", "actual": "@relaxngDatatype_relaxngDatatype//jar", "bind": "jar/relaxngDatatype/relaxngDatatype"})
-    callback({"artifact": "stax:stax-api:1.0.1", "lang": "java", "sha1": "49c100caf72d658aca8e58bd74a4ba90fa2b0d70", "repository": "https://repo.maven.apache.org/maven2/", "name": "stax_stax_api", "actual": "@stax_stax_api//jar", "bind": "jar/stax/stax_api"})
-    callback({"artifact": "xpp3:xpp3:1.1.4c", "lang": "java", "sha1": "9b988ea84b9e4e9f1874e390ce099b8ac12cfff5", "repository": "https://repo.maven.apache.org/maven2/", "name": "xpp3_xpp3", "actual": "@xpp3_xpp3//jar", "bind": "jar/xpp3/xpp3"})
diff --git a/BUILD b/BUILD
deleted file mode 100644
index 7e76bfa..0000000
--- a/BUILD
+++ /dev/null
@@ -1,7 +0,0 @@
-genrule(
-    name = "git-hash",
-    srcs = [".git/logs/HEAD"],
-    outs = ["git-hash.txt"],
-    cmd = "tail -1 $< | cut -d ' ' -f 2 > $@",
-    visibility = ["//visibility:public"],
-)
diff --git a/WORKSPACE b/WORKSPACE
index ae47f64..bec9f16 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,119 +11,4 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-workspace(name = "io_bazel_ci")
-
-git_repository(
-    name = "io_bazel_rules_docker",
-    remote = "https://github.com/bazelbuild/rules_docker.git",
-    tag = "v0.3.0",
-)
-
-load(
-    "@io_bazel_rules_docker//container:container.bzl",
-    "container_pull",
-    container_repositories = "repositories",
-)
-
-# This is NOT needed when going through the language lang_image
-# "repositories" function(s).
-container_repositories()
-
-# Docker base images
-load("//base:docker_base.bzl", "docker_bases")
-docker_bases()
-
-# Jenkins
-load("//jenkins/base:plugins.bzl", "JENKINS_PLUGINS")
-load("//jenkins/base:jenkins_base.bzl", "jenkins_base")
-
-jenkins_base(
-    name = "jenkins",
-    plugins = JENKINS_PLUGINS,
-    version = "2.105",
-    digest = "sha256:d2b9c9e7c373f365364d9be87d21f29157d267cfe063e64d1bdf6097018772a5",
-    volumes = ["/opt/secrets"],
-)
-
-# Releases stuff
-http_file(
-    name = "hoedown",
-    sha256 = "01b6021b1ec329b70687c0d240b12edcaf09c4aa28423ddf344d2bd9056ba920",
-    url = "https://github.com/hoedown/hoedown/archive/3.0.7.tar.gz",
-)
-
-http_file(
-    name = "github_release",
-    sha256 = "bb647fb89f086a78bfc51c0b3264338f3471fb5b275829a7d1f08cf76af17da2",
-    url = "https://github.com/c4milo/github-release/archive/v1.1.0.tar.gz",
-)
-
-# Use Jinja for templating our files
-new_http_archive(
-    name = "markupsafe_archive",
-    build_file_content = """
-py_library(
-    name = "markupsafe",
-    srcs = glob(["markupsafe/*.py"]),
-    srcs_version = "PY2AND3",
-    visibility = ["//visibility:public"],
-)
-""",
-    sha256 = "a6be69091dac236ea9c6bc7d012beab42010fa914c459791d627dad4910eb665",
-    strip_prefix = "MarkupSafe-1.0",
-    url = "https://pypi.python.org/packages/4d/de/32d741db316d8fdb7680822dd37001ef7a448255de9699ab4bfcbdf4172b/MarkupSafe-1.0.tar.gz#md5=2fcedc9284d50e577b5192e8e3578355",
-)
-
-new_http_archive(
-    name = "org_pocoo_jinja_jinja2",
-    build_file_content = """
-py_library(
-    name = "jinja2",
-    srcs = glob(["jinja2/*.py"]),
-    srcs_version = "PY2AND3",
-    deps = [
-        "@markupsafe_archive//:markupsafe",
-    ],
-    visibility = ["//visibility:public"],
-)
-""",
-    sha256 = "f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4",
-    strip_prefix = "Jinja2-2.10",
-    url = "https://pypi.python.org/packages/56/e6/332789f295cf22308386cf5bbd1f4e00ed11484299c5d7383378cf48ba47/Jinja2-2.10.tar.gz#md5=61ef1117f945486472850819b8d1eb3d",
-)
-
-# Our template engine use gflags
-new_git_repository(
-    name = "com_github_google_python_gflags",
-    build_file_content = """
-py_library(
-    name = "gflags",
-    srcs = [
-        "gflags.py",
-        "gflags_validators.py",
-    ],
-    visibility = ["//visibility:public"],
-)
-""",
-    remote = "https://github.com/google/python-gflags",
-    tag = "python-gflags-2.0",
-)
-
-# Testing Jenkins pipeline library
-# TODO(dmarting): the groovy support is really rudimentary we should fix it:
-#   - Need for adding more dependency
-#   - Groovy test absolutely want you to declare a specific structure
-#   - The release is not working with latest bazel
-#   - Repository overrely on bind() and does not respect naming conventions
-http_archive(
-    name = "io_bazel_rules_groovy",
-    url = "https://github.com/bazelbuild/rules_groovy/archive/6b8e32ce0f7e33ae1b859706c2dc0c169b966e7e.zip",
-    sha256 = "9dac7ddcf9e0004b1eeaf53dd9324350601eaee8c252f77423330af3effe2f5c",
-    strip_prefix = "rules_groovy-6b8e32ce0f7e33ae1b859706c2dc0c169b966e7e",
-)
-load("@io_bazel_rules_groovy//groovy:groovy.bzl", "groovy_repositories")
-groovy_repositories()
-
-# For groovy tests
-load("//3rdparty:workspace.bzl", "maven_dependencies")
-maven_dependencies()
+workspace(name = "build_bazel_ci")
diff --git a/base/BUILD b/base/BUILD
deleted file mode 100644
index 5405ab2..0000000
--- a/base/BUILD
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright 2015 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-package(default_visibility = ["//visibility:public"])
-
-load("@io_bazel_rules_docker//docker:docker.bzl", "docker_build")
-
-# Image support golang and make
-docker_build(
-    name = "ubuntu-xenial-amd64-deploy",
-    base = "@ubuntu-xenial-amd64-deploy//:image",
-)
-
-# Support SSH for gerrit deployment
-docker_build(
-    name = "ubuntu-xenial-amd64-ssh",
-    base = "@ubuntu-xenial-amd64-ssh//:image",
-)
diff --git a/base/Dockerfile.ubuntu-xenial-amd64-deploy b/base/Dockerfile.ubuntu-xenial-amd64-deploy
deleted file mode 100644
index 8cd1508..0000000
--- a/base/Dockerfile.ubuntu-xenial-amd64-deploy
+++ /dev/null
@@ -1,8 +0,0 @@
-FROM ubuntu:xenial
-RUN apt-get update && apt-get install -y \
-       zip g++ openjdk-8-jdk openjdk-8-source wget git unzip python python3 curl \
-       golang make \
-       jekyll \
-       reprepro devscripts dpkg-dev
-ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
-RUN update-ca-certificates -f
diff --git a/base/Dockerfile.ubuntu-xenial-amd64-ssh b/base/Dockerfile.ubuntu-xenial-amd64-ssh
deleted file mode 100644
index 1fed08e..0000000
--- a/base/Dockerfile.ubuntu-xenial-amd64-ssh
+++ /dev/null
@@ -1,6 +0,0 @@
-FROM ubuntu:xenial
-RUN apt-get update && apt-get install -y \
-       zip g++ openjdk-8-jdk openjdk-8-source wget git unzip python python3 curl \
-       ssh
-ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
-RUN update-ca-certificates -f
diff --git a/base/convert_image_to_build.py b/base/convert_image_to_build.py
deleted file mode 100644
index 63f57cc..0000000
--- a/base/convert_image_to_build.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Convert a docker save JSON files to a BUILD file so docker_import can read it."""
-
-import gzip
-import json
-import os
-import os.path
-import shutil
-import sys
-import tarfile
-
-def convert_manifest(infile, outfile):
-  with open(infile, "r") as fp:
-    json_obj =  json.load(fp)
-    dirname = os.path.dirname(infile)
-    dir = os.path.relpath(dirname, os.path.dirname(outfile))
-    config = json_obj[0]["Config"]
-    layers = json_obj[0]["Layers"]
-    with open(outfile, "w") as of:
-      of.write( """
-load("@io_bazel_rules_docker//docker:docker.bzl", "docker_import")
-
-docker_import(
-    name = "image",
-    layers = [%s],
-    config = "%s/%s",
-    visibility = ["//visibility:public"],
-)
-""" % (",".join(['"%s/%s.tgz"' % (dir, os.path.dirname(l)) for l in layers]), dir, config))
-
-def extract_image(image, directory):
-  with tarfile.open(image) as tar:
-    tar.extractall(directory)
-  for f in os.listdir(directory):
-    d = os.path.join(directory, f)
-    l = os.path.join(d, "layer.tar")
-    if os.path.isdir(d) and os.path.exists(l):
-      with gzip.open(d + ".tgz", "wb") as f_out, open(l, "rb") as f_in:
-        shutil.copyfileobj(f_in, f_out)
-      os.remove(l)
-
-if __name__ == '__main__':
-  if len(sys.argv) < 4:
-    sys.stderr.write("Usage: %s infile directory build_file\n" % sys.argv[0])
-    sys.exit(1)
-  extract_image(sys.argv[1], sys.argv[2])
-  convert_manifest(os.path.join(sys.argv[2], "manifest.json"), sys.argv[3])
diff --git a/base/docker_base.bzl b/base/docker_base.bzl
deleted file mode 100644
index 5101e77..0000000
--- a/base/docker_base.bzl
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Wrapper to fetch the base docker images we need."""
-
-load(":dockerfile_build.bzl", "dockerfile_build")
-
-def docker_bases():
-  dockerfile_build(
-    name = "ubuntu-xenial-amd64-deploy",
-    dockerfile = "//base:Dockerfile.ubuntu-xenial-amd64-deploy",
-    tag = "local:ubuntu-xenial-amd64-deploy",
-  )
-  dockerfile_build(
-    name = "ubuntu-xenial-amd64-ssh",
-    dockerfile = "//base:Dockerfile.ubuntu-xenial-amd64-ssh",
-    tag = "local:ubuntu-xenial-amd64-ssh",
-  )
diff --git a/base/dockerfile_build.bzl b/base/dockerfile_build.bzl
deleted file mode 100644
index 6c6f888..0000000
--- a/base/dockerfile_build.bzl
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Repository rule to build image with `docker build`."""
-
-def _impl(rctx):
-  tag = rctx.attr.tag
-  dockerfile = rctx.path(rctx.attr.dockerfile)
-  result = rctx.execute([
-      "docker",
-      "build",
-      "-q",
-      "-t",
-      tag,
-      "-f",
-      dockerfile,
-      dockerfile.dirname,
-  ])
-  if result.return_code:
-    fail("docker build failed with error code %s:\n%s" % (
-        result.return_code,
-        result.stdout + result.stderr))
-  base_tar = rctx.path("base.tar")
-  base_dir = rctx.path("base")
-  result = rctx.execute(["docker", "save", "-o", base_tar, tag])
-  if result.return_code:
-    fail("docker save failed with error code %s:\n%s" % (
-        result.return_code,
-        result.stderr))
-  result = rctx.execute(["python", rctx.path(Label("//base:convert_image_to_build.py")),
-                         base_tar, base_dir, rctx.path("BUILD")])
-  if result.return_code:
-    fail("Converting the image failed with error code %s:\n%s" % (
-        result.return_code,
-        result.stderr))
-
-dockerfile_build = repository_rule(
-    implementation = _impl,
-    attrs = {
-        "tag": attr.string(mandatory=True),
-        "dockerfile": attr.label(mandatory=True),
-    },
-)
diff --git a/dependencies.yaml b/dependencies.yaml
deleted file mode 100644
index 3994b36..0000000
--- a/dependencies.yaml
+++ /dev/null
@@ -1,47 +0,0 @@
-options:
-  languages: [ "java" ]
-  resolvers:
-    - id: "mavencentral"
-      type: "default"
-      url: https://repo.maven.apache.org/maven2/
-    - id: "jenkins-public"
-      type: "default"
-      url: http://repo.jenkins-ci.org/public/
-  transitivity: runtime_deps
-  versionConflictPolicy: highest
-
-dependencies:
-   com.lesfurets:
-     jenkins-pipeline-unit:
-       lang: java
-       version: "1.1"
-
-   org.codehaus.groovy:
-     groovy-all:
-       lang: java
-       version: "2.4.13"
-
-   org.hamcrest:
-     hamcrest-all:
-       lang: java
-       version: "1.3"
-
-   junit:
-     junit:
-       lang: java
-       version: "4.12"
-
-   org.jenkins-ci.main:
-     jenkins-core:
-       lang: java
-       version: "2.105"
-
-   org.jenkins-ci.plugins.workflow:
-     workflow-step-api:
-       lang: java
-       version: "2.14"
-
-   org.jenkins-ci.plugins.workflow:
-     workflow-support:
-       lang: java
-       version: "2.16"
diff --git a/docs/bazel-monitoring.md b/docs/bazel-monitoring.md
deleted file mode 100644
index 72f46ae..0000000
--- a/docs/bazel-monitoring.md
+++ /dev/null
@@ -1,81 +0,0 @@
-# How to monitor for Bazel regressions
-
-This is a guide for the Bazel build sheriff about monitoring the Bazel CI
-(Continuous Integration) projects and jobs.
-
-# The CI dashboard
-
-URL: https://ci.bazel.build/view/Dashboard/
-
-The dashboard gives a quick overview of the Bazel CI's health.
-
-We monitor:
-
-*   Bazel's own jobs (owned by the core Bazel team):
-
-    -   [bazel-tests](https://ci.bazel.build/job/bazel-tests)
-    -   [bazel-slow-tests](https://ci.bazel.build/job/bazel-slow-tests)
-    -   [bazel-remote-tests](https://ci.bazel.build/job/bazel-remote-tests)
-    -   [Tutorial](https://ci.bazel.build/job/Tutorial)
-    -   [nightly](https://ci.bazel.build/job/bazel/job/nightly)
-    -   [release](https://ci.bazel.build/job/bazel/job/release)
-
-*   Projects built using Bazel:
-
-    -   repositories on the bazelbuild GitHub organisation, e.g. rules\_web
-    -   TensorFlow
-    -   Gerrit
-    -   protobuf
-    -   re2
-    -   ...
-
-If Bazel's own jobs are not green, the Bazel team must:
-
-1.  investigate
-2.  fix as soon as possible
-
-If the other projects are not green:
-
-1.  report it to the project owners
-2.  deactivate the project if it stays broken for more than a week
-
-# Triaging failures
-
-The build sheriff should monitor the outputs of these types of jobs:
-
-*   [global tests](user.md#global-jobs)
-*   [postsubmits](user.md#postsubmit)
-
-## Global tests
-
-URLs:
-
-*   nightly: https://ci.bazel.build/job/bazel/job/nightly
-*   release: https://ci.bazel.build/job/bazel/job/release
-
-When do these jobs run:
-
-*   [nightly](https://ci.bazel.build/job/bazel/job/nightly): runs every night and
-    can be re-run on demand using the Run button in Jenkins (you need to log in
-    on the Jenkins UI)
-*   [release](https://ci.bazel.build/job/bazel/job/release): runs at every push and
-    is always green for non-release pushes
-
-How to investigate: see the [user guide](user.md#global-jobs).
-
-When global tests fail badly:
-
-1.  [file a bug to bazelbuild/bazel](https://github.com/bazelbuild/bazel/issues/new)
-2.  add the "breakage" label to the bug
-3.  add the "release blocker" label if the breakage is on the release job
-
-## Postsubmits
-
-These are all the other monitored jobs.
-
-To investigate:
-
-How to investigate: see the [user guide](user.md#presubmit).
-
-1.  report to the project owner (e.g. Bazel team for "bazel-tests")
-2.  deactivate partially or totally, if a failure stays for too long
diff --git a/docs/init.md b/docs/init.md
deleted file mode 100644
index 52fe3eb..0000000
--- a/docs/init.md
+++ /dev/null
@@ -1,149 +0,0 @@
-# Initializing Google Cloud for Bazel's CI
-
-This document describes how to setup our Google Cloud project so that it can
-host Bazel's Jenkins CI.
-
-## Network
-
-For CI we're using a normal 'auto' mode network:
-
-```bash
-gcloud compute networks create "default"
-```
-
-We'll also need a static IP address for Jenkins:
-
-```bash
-gcloud compute addresses create "ci"
-```
-
-## `/volumes` disk
-
-The Jenkins controller is connected to a persistent disk. This disk is
-encrypted, and it is not erased between builds nor after Jenkins restarts.
-
-Let's create one:
-
-```bash
-gcloud compute disks create "jenkins-volumes" --size=4TB
-```
-
-This disk is mounted under `/volumes` on the Jenkins controller and has two
-subdirectories:
-
-*   `/volumes/secrets`: stores credentials needed for CI
-*   `/volumes/jenkins_home`: stores permanent files for the Jenkins controller,
-    to keep history (logs and build artifacts) even after reimaging the
-    controller
-
-## Populating the `/volumes/secrets` directory
-
-`/volumes/secrets` directory is filled with RSA keys, authentication tokens, and
-passwords. Each file refers to one particular secret, some of which have
-corresponding placeholders in the `//jenkins/config/secrets/*.xml` files.
-
-The secrets are:
-
-*   `google.oauth.clientid` and `google.oauth.secret`: OAuth authentication
-    token to the Google Cloud APIs.
-
-    To regenerate:
-
-    1.  Go to the Cloud Console:
-        https://console.cloud.google.com/apis/credentials?project=bazel-public
-
-    2.  Click on "Create credentials" > "OAuth client ID".
-
-        ```text
-        Application type: Web application
-        Name: Jenkins
-        Authorized redirect URIs: https://ci.bazel.build/securityRealm/finishLogin
-        ```
-
-    3.  Click create, copy the resulting Client ID and Client secret into the
-        two files in `/volumes/secrets`, without a newline at the end:
-
-        ```sh
-        echo -n '<client id>' > google.oauth.clientid
-        echo -n '<client secret>' > google.oauth.secret
-        ```
-
-*   `gerritcookies`: the Git cookies file for the CI user on Gerrit
-
-    You can fetch this from
-    https://bazel-review.googlesource.com/#/settings/http-password.
-
-*   `github.bazel-io.jenkins.password`: the password for the CI user on Github
-
-    To regenerate:
-
-    1.  Click "Manage Jenkins" > "Manage Credentials".
-    2.  Enter the password for the GitHub account
-    3.  Click on "Save".
-
-        This updates `/var/jenkins_home/credentials.xml` inside
-        the local Docker container with the secret.
-
-    4.  Connect to the Jenkins VM:
-
-        ```sh
-        gcloud compute ssh jenkins
-        ```
-
-    5.  Copy the credentials out of the file:
-
-        ```sh
-        cat /volumes/jenkins_home/credentials.xml
-        ```
-
-    6.  Copy the value of the `<password>` tag and write it to
-        `/volumes/secrets/github.bazel-io.jenkins.password`.
-
-*   `boto_config`: a boto config file with oauth token to access GCS
-
-*   `github_id.rsa` and `github_id_rsa.pub`: private and public SSH keys for
-    pushing to GitHub
-
-    The Jenkins job pushes to GitHub to sync the Gerrit and GitHub
-    repositories.
-
-    To regenerate:
-
-    1.  SSH into the Jenkins controller
-    2.  Run:
-
-        ```sh
-        ssh-keygen -t rsa -b 4096 -C "noreply@bazel.build" -N '' -f /volumes/secrets/github_id_rsa
-        ```
-
-    You must add the public key to the list of deploy keys of all repositories
-    to sync (e.g. for Bazel at `https://github.com/bazelbuild/bazel/settings/keys`).
-
-*   `github_token`: the "Bazel Release Token" of the "Personal access tokens"
-    of the "ci.bazel" user on GitHub
-
-    The Jenkins controller uses this token to push Bazel releases to GitHub.
-
-    You can't see the token itself, but you can update it and then GitHub
-    shows you the new value.
-
-*   `github_trigger_auth_token`: the "Jenkins GitHub Pull Request Builder" of
-    the "Personal access tokens" of the "ci.bazel" user on GitHub
-
-    The Jenkins controller uses this token to post comments on GitHub pull
-    requests, e.g. "All tests passed".
-
-    You can't see the token itself, but you can update it and then GitHub
-    shows you the new value.
-
-*   `apt-key.id` and `apt-key.sec.gpg`: GPG key to sign the Debian packages
-
-*   `smtp.auth.password` and `smtp.auth.username`: authentication information
-    for the mail provider.
-
-    We use bazel.build's G Suite to send e-mails.
-
-## Next
-
-You can now use the [`vm.sh` script to create the virtual machines and the
-`setup_mac.sh` script to setup mac nodes](machines.md).
diff --git a/docs/jobs.md b/docs/jobs.md
deleted file mode 100644
index 9da26b4..0000000
--- a/docs/jobs.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Jobs
-
-Three categories of jobs run on https://ci.bazel.build:
-
-*   bootstrap/maintenance jobs (e.g. bazel-bootstrap)
-*   projects (e.g. TensorFlow)
-*   hidden jobs
-
-## Bootstrap and maintenance
-
-Several jobs control the bootstrap and maintenance of Bazel, they
-are mostly under the `maintenance` and `bazel` folders:
-
-*   `maintenance/install-bazel`: installs Bazel release on all workers
-*   `maintenance/gerrit-verifier`: detects pending reviews on Gerrit that
-    need validation.
-
-    A review needs validation if somebody marks it as `Presubmit-Ready`.
-
-*   `bazel/nightly`: handles the [Global tests](docs/bazel-monitoring.md#global-tests)
-
-    This job runs every night.
-
-*   `bazel/release`: copy of `bazel/nightly` that runs for the release
-
-    This job also handles publishing the release artifacts.
-
-*   `bazel/presubmit`: copy of `bazel/nightly` that is triggered when someone
-     sets `Presubmit-Ready+2` on Gerrit
-
-## Projects
-
-These jobs simply run Bazel on a GitHub repository.
-
-The job templates and definitions are under `//jenkins`.
-
-Particularly interesting is `//jenkins/jobs/jobs.bzl`: it contains the logic
-that computes which jobs to run on CI.
-
-## Hidden jobs
-
-These jobs are copies of the jobs for the corresponding `<project>`. These jobs
-all use the latest Bazel release:
-
-*   `PR/<project>`: validates a GitHub pull request on `<project>`
-
-*   `CR/<project>`: validates a Gerrit review request on `<project>`
-
-*   `Global/<project>`: runs a global presubmit test for changes on `<project>`
diff --git a/docs/machines.md b/docs/machines.md
deleted file mode 100644
index fd1ab57..0000000
--- a/docs/machines.md
+++ /dev/null
@@ -1,80 +0,0 @@
-# CI machines
-
-This document describes the architecture and administration of the Bazel CI
-(Continuous Integration) machines.
-
-## Architecture
-
-Bazel's CI uses Jenkins.
-
-The Jenkins controller runs in a Docker container on a virtual machine (VM).
-
-The Jenkins controller distributes the work to various nodes:
-
-*   VMs on GCE (e.g. Linux and Windows nodes)
-*   Physical machines (e.g Mac nodes)
-*   Docker containers (e.g. the deploy node that deploys Bazel releases and the
-    Bazel homepage)
-
-The Docker containers run on the Jenkins controller's VM.
-
-## Administration
-
-*   VMs: through the `//gce/vm.sh` script
-*   Physical machines: physically or through Chrome Remote Desktop
-*   Docker containers: through the `//gce/jenkins.yml` files (Google Container
-    Engine pod configurations)
-
-### Virtual machines admininstration
-
-You can administer the VMs using the `//gce/vm.sh` script.
-
-You can apply the script's changes to:
-
-*   individual machines, or
-*   all machines
-
-`//gce/vm.sh` script commands:
-
-*   `create` and `delete`: create a machine (unless it already exists) or delete
-    it
-*   `reimage`: `delete` a machine, then `create` it again
-*   `start` and `stop`: start or stop the specified machine(s).
-*   `update_metadata`: update the metadata for the VM
-
-    The metadata is what we pass to the `--metadata` flags when we run `gcloud
-    instances create` commands. The metadata includes the startup scripts and
-    the pod configuration for the Docker containers.
-
-The `//gce/vm.sh` script runs `gcloud` and assumes your default GCE project
-is the Bazel CI project.
-
-You can install `gcloud` from https://cloud.google.com/sdk/
-
-To set the default `gcloud` project to "bazel-public", run:
-
-```
-gcloud config set project bazel-public
-gcloud auth login
-```
-
-### Physical machines administration
-
-The physical machines need to be on a network allowed for port 50000.  See the
-list of IP ranges provided to the [`init.sh`](init.md) script.
-
-The physical manually need to have a service installed that talks to the Jenkins
-controller.  The only kind of physical nodes we use are Mac nodes and we need to
-set them up manually (for licensing reasons).
-
-To set up a Mac executor node:
-
-1.  install [Xcode](https://developer.apple.com/xcode/downloads/)
-2.  install [JDK 8](https://jdk8.java.net/download.html)
-3.  create a "ci" user with "sudo" rights
-4.  download the `mac/setup_mac.sh` script and run it as the "ci" user:
-
-    ```
-    curl -o setup_mac.sh "https://raw.githubusercontent.com/bazelbuild/continuous-integration/master/mac/setup_mac.sh"
-    sudo su ci -c "/bin/bash setup_mac.sh <node_name>"
-    ```
diff --git a/docs/owner.md b/docs/owner.md
deleted file mode 100644
index d866312..0000000
--- a/docs/owner.md
+++ /dev/null
@@ -1,296 +0,0 @@
-# Bazel continuous integration for project owners
-
-## Adding a project
-
-To add a project to Bazel CI that is on the `bazelbuild` GitHub organization:
-
-1.  Allow write access to your repository:
-
-    *   for [`robots`](https://github.com/orgs/bazelbuild/teams/robot), if your
-        repository is part of the `bazelbuild` organization
-    *   for [`bazel-io`](https://github.com/bazel-io), if your repository is
-        outside of the `bazelbuild` organization
-
-2.  Add the job to the job list.
-
-    If the project is in the `bazelbuild` organization and doesn't need special
-    tweaking, you can add it to an existing job list in `jenkins/jobs/BUILD`.
-
-    Otherwise add a `bazel_github_job` or `bazel_git_job` rule to
-    `jenkins/jobs/BUILD`:
-
-    *   use `bazel_github_job` for jobs from GitHub repositories
-    *   use `bazel_git_job` for jobs from Git repositories
-
-3.  Send a Gerrit code review to a CI admin.
-
-    See `jenkins/config.bzl` for the list of admins.
-
-### `bazel_github_job` parameters
-
-The `bazel_github_job` rule takes the following parameters:
-
-*   `name`: name of the job as it will appear in Jenkins
-*   `branch`: Git branch to build and test (default: `master`)
-*   `project`: name of the project (default: same as `name`)
-
-    Useful when you rename a job but want to keep its history.
-
-*   `org`: name of the organization on GitHub
-*    `git_url`: URL to the Git repository (default:
-    `https://github.com/<org>/<project>`)
-*   `project_url`: URL to the project (default: same as `git_url`)
-*   `workspace`: the directory where the workspace is, relative to the
-    root of the Git repository (default: `.`)
-*   `config`: specifies a default configuration file (default:
-    `jenkins/build_defs:default.json`)
-
-    Normally it is not needed because you can change the configuration using
-    a file in the repository (see next section).
-
-*   `enable_trigger`: enable postsubmit test (default: true)
-*   `poll`: use polling to trigger postsubmit tests instead of waiting
-    for GitHub API to notify (default: true if organization is not
-    `bazelbuild`)
-*   `gerrit_project`: project on the [Bazel Gerrit
-    server](https://bazel-review.googlesource.com) that mirrors the GitHub
-    project and will be used to trigger presubmits from Gerrit
-*   `enabled`: activates or deactivates the project (default: true)
-*   `pr_enabled`: enables or disables presubmit from GitHub Pull Requests
-*   `run_sequential`: if enabled, runs the job's configurations
-    concurrently; otherwise runs the job's configurations one after the
-    other
-
-    Useful if the job uses some exclusive resource such as [Sauce
-    Labs](https://wiki.saucelabs.com/).
-
-*   `sauce_enabled`: activates or deactivates [Sauce
-    Labs](https://wiki.saucelabs.com/) support
-
-### `bazel_git_job` parameters
-
-The `bazel_git_job` rule takes the same parameters as `bazel_github_job`, but
-requires that either `git_url` or `project_url` be specified.
-
-## Customizing a project
-
-By default, the CI system tries to build `//...` then to test `//...` on Darwin
-and on Linuxes.
-
-You can use a JSON file to change how the project is built:
-
-*   add `.ci/<name>.json` to the project's repository, or
-*   or add `scripts/ci/<name>.json` to the
-    https://github.com/bazelbuild/continuous-integration repository
-
-Where `<name>` is the name of the project declared in `jobs.bzl`.
-
-This JSON file contains a list of configurations to build and test.
-Each configuration entry specifies:
-
-*   a platform name under the `node` key
-*   optionally a list of parameters under the key `parameters`
-*   optionally a list of sub-configurations under the key `configurations`
-
-### Example 1
-
-A simple configuration with one platform:
-
-```javascript
-[
-    {"node": "linux-x86_64"}
-]
-```
-
-This configuration would build and test on a node that has the label
-`linux-x86\_64` with the default set of parameters (i.e. build `//...`
-then test `//...`).
-
-### Example 2
-
-Built on the previous example:
-
-```javascript
-[
-    {
-        "node": "linux-x86_64",
-        "parameters": {
-            "targets": ["//my:target"],
-            "tests": ["//my:test"],
-        }
-    }
-]
-```
-
-This configuration uses `targets` and `tests` parameters to set the targets
-to build (`targets`) and to test (`tests`), instead of the default `//...`.
-
-### Example 3
-
-To add a platform, add another configuration:
-
-```javascript
-[
-    {
-        "node": "linux-x86_64",
-        "parameters": {
-            "targets": ["//my:target"],
-            "tests": ["//my:test"],
-        }
-    },
-    {
-        "node": "darwin-x86_64",
-        "parameters": {
-            "targets": ["//my:target"],
-            "tests": ["//my:test"],
-        }
-    },
-    {
-        "node": "windows-x86_64",
-        "parameters": {
-            "targets": ["//my:target"],
-            "tests": [
-                "//my/other/windows/specific:test",
-                "//and/some/other/test:name"
-            ],
-        }
-    }
-]
-```
-
-### Example 4
-
-Use a sub-configurations to reduce repetitions:
-
-```javascript
-[
-    {
-        "configurations": [
-            {"node": "linux-x86_64"},
-            {"node": "darwin-x86_64"},
-        ],
-        "parameters": {
-            "targets": ["//my:target"],
-            "tests": ["//my:test"],
-        }
-    }
-]
-```
-
-### Example 5
-
-You can specify child configurations.
-
-Each child configuration inherits parent configuration description. The
-child configurations get factored with the parent configuration to create N
-configurations that inherit the parameters and descriptor of the parent
-configuration. The child configuration can override inherited parameters.
-
-The following configuration:
-
-```javascript
-[
-    {
-        "descriptor": "yeah",
-        "parameters": ["targets": ["//:target1"]],
-        "configurations": [
-            {
-                "descriptor2": "a",
-                "parameters": ["tests": ["//:test"]]
-            },
-            {
-                "descriptor2": "b",
-                "parameters": ["targets": ["//:target2"], "tests": ["//:test"]]
-            }
-        ]
-    }
-]
-```
-
-would expand to this:
-
-```javascript
-[
-    {
-        "descriptor": "yeah",
-        "descriptor2": "a",
-        "parameters":  ["targets": ["//:target1"], "tests": ["//:test"]]
-    },
-    {
-        "descriptor": "yeah",
-        "descriptor2": "b",
-        "parameters": ["targets": ["//:target2"], "tests": ["//:test"]]
-    }
-]
-```
-
-## Reference
-
-### Configuration `descriptor` keys
-
-`descriptor` keys that have special meaning:
-
-*   `node`: a label that describes the platform to run on
-
-    Example: `linux-x86_64`, `windows-x86_64`, `freebsd-11`, etc.
-
-    The complete list of connected nodes is available on
-    https://ci.bazel.build/computer/ . You can select nodes either by name or by
-    label. To see the list of labels of a specific node, click on the node in
-    the Jenkins UI.
-
-You can use more `descriptor` keys to specify more configuration combinations,
-but they won't have any special effects.
-
-
-### Configuration `parameter` keys
-
-Supported `parameter` keys:
-
-*   `configure`: list of Shell commands (Batch commands on Windows) to execute
-    before the build
-*   `targets`: list of targets to build.
-*   `tests`: the list of targets to test; can be a bazel query expression
-*   `build_tag_filters`: `tags` filter for the build step; works the same way as
-    [test_suite.tags](https://docs.bazel.build/versions/master/be/general.html#test_suite.tags)
-*   `test_tag_filters`: `tags` filter for the build step; always considered to
-    contain `["-noci", "-manual"]`; works the same way as
-    [test_suite.tags](https://docs.bazel.build/versions/master/be/general.html#test_suite.tags)
-*   `build_opts`: list of options to add to the bazelrc as `build` options
-
-    Note that such options also affect testing.
-
-*   `test_opts`: list of options to add to the bazelrc as `test` options
-*   `startup_opts`: list of options to add to the bazelrc as `startup` options
-
-
-### `scripts/ci/bootstrap.json` (Bazel bootstrap configuration)
-
-__For Bazel developers.__
-
-The Bazel project itself has a separate configuration file for
-creating release artifacts. It is stored under `scripts/ci/bootstrap.json`.
-
-This file follows the same JSON format as discussed in [Customizing a
-project](#customizing-a-project) but accepts different parameters:
-
-*   `archive`: list of files to archive
-
-    This is a map of target name to new name.
-
-    The names may contain the `%{release_name}` placeholder, which will be
-    replaced by the release name.
-
-    If this parameter is empty then nothing is archived (useful for non-release
-    builds).
-
-*   `stash`: list of artifacts to stash
-
-    These artifacts are either:
-
-    *   to be released, or
-    *   to be pushed, but there's no need to keep them forever
-
-*   `configure`: list of Shell commands (Batch commands on Windows) to execute
-    before building
-*   `targets`: list of targets to build, in addition to `//src:bazel`
diff --git a/docs/user.md b/docs/user.md
deleted file mode 100644
index a0a726b..0000000
--- a/docs/user.md
+++ /dev/null
@@ -1,146 +0,0 @@
-# Using the Bazel CI
-
-[Bazel CI](https://ci.bazel.build) tests Bazel and a variety of
-open-source projects that use Bazel.
-
-We also use the projects using Bazel to validate Bazel changes.
-
-The Bazel CI:
-
-*   runs presubmit tests (on a pending change)
-*   runs postsubmit tests (on the master branch)
-*   handles the release project of Bazel
-
-If you wish to add or modify a configuration for one of the projects on
-Bazel CI, see the [project owner documentation](owner.md).
-
-## Postsubmit <a name="postsubmit"></a>
-
-The CI uses the GitHub API and handles test runs automatically if
-[bazel-io](https://github.com/bazel-io) has write access to the repository.
-
-The result of a build can be one of:
-
-*   Success (job is green)
-*   Unstable (job is yellow), if some tests failed.
-
-    The Blue Ocean View<sup>1</sup> shows the failing platforms in Pipeline view
-    and the list of failing tests in Tests view.
-
-*   Failed (job is red), if compilation failed or configuration files are
-    broken.
-
-    The Blue Ocean View<sup>1</sup> shows the build breakage. If it doesn't,
-    you should look at the full console log.
-
-<sup>1</sup> The Open Blue Ocean view is a Jenkins UI. There's a link to it on
-the default Jenkins UI, on the left side in the Job view.
-
-Tips:
-
-*   Test logs are available under the artifacts list via the URL
-    `<joburl>/artifact`.
-
-    Example: https://ci.bazel.build/job/bazel-tests/lastCompletedBuild/artifact/
-
-*   Flaky tests can be analyzed with the Test Results Analyzer
-
-    The analyzer is available in the normal job view on the side menu (the one
-    which shows the test's history).
-
-*   The "Pipeline Steps" button on the side menu on a job view lets you examine
-    each step of the Jenkins pipeline.
-
-    Looking for the enclosing workspace or node start step of another step gives
-    you access to the workspace of that step.
-
-Current limitations:
-
-*   Jenkins Blue Ocean UI has no good way to mark an unstable steps.
-
-    If a platform stage fails without clear sub-step failing, look for the last
-    shell step in the platform stage view.
-
-*   Tests are not ordered by platforms in the test view.
-
-## Presubmit
-
-The Bazel CI can run presubmit tests for changes from GitHub and from Gerrit.
-
-### GitHub pull requests
-
-A GitHub pull request is tested when:
-
-*   a pull request admin comments "test this please" or "retest this please"
-*   an admin pushes a Pull Request
-
-Pull request admins are the people from:
-
-*   the [bazelbuild](https://github.com/bazelbuild) organization, or
-*   the [google](https://github.com/google) organization
-
-Jenkins considers those people to be admins whose visibility is public. To make
-someone public:
-
-1.  go to [the Bazel organization
-    page](https://github.com/orgs/bazelbuild/people) (or the
-    [Google organization page](https://github.com/orgs/google/people)
-    respectively)
-2.  find the person's name and change their visibility to public
-
-To test pull requests, [bazel-io](https://github.com/bazel-io) needs
-write access to the repository. This is always the case if the repository is in
-the `bazelbuild` organization, otherwise you may need to grant access.
-
-### Gerrit code reviews
-
-A Gerrit code review is tested when someone marks the code review as
-`Presubmit-Ready+1`.
-
-Marking the code review as presubmit ready:
-
-*   automatically adds "Bazel CI" as a reviewer
-*   updates the review thread with the link to the test results
-*   marks the code review as `Verified+1` or `Verified-1` depending on the
-    result of the test
-
-To retrigger a test, simply reset the `Presubmit-Ready` label.
-
-You can read the output the same way as of the [postsubmit](#postsubmit).
-
-## Global tests <a name="global-tests"></a>
-
-The Bazel CI can also do a "global test".
-
-A global test:
-
-1.  builds Bazel from a branch
-2.  uses the resulting Bazel binary to run all the other jobs on the Bazel CI
-3.  produces a report comparing the global test results of this binary and of
-    the latest release of Bazel
-
-This report is at
-`https://ci.bazel.build/job/bazel/job/<nightly|release|presubmit>/<buildNumber>/Downstream_projects/`.
-For example for the last nigthly run it will be at
-https://ci.bazel.build/job/bazel/job/nightly/lastBuild/Downstream_projects/ .
-
-The way to read that report is as follows:
-
-*   Newly failing jobs are problematic.
-
-    They are likely to indicate a failure due to a Bazel change. These make the
-    build to be unstable (yellow).
-
-*   Already failing jobs may be fine.
-
-    They mean that the job result is no worse than before. It is usually safe to
-    ignore these failure, but we should aim to have none of them, because they
-    might hide new regressions.
-
-*   Passing jobs are safe to ignore.
-
-## Release process
-
-In addition to testing all the jobs, the [Global test](#global-tests) handles
-pushing artifacts that are created by a release branch to GCS and to the GitHub
-release system.
diff --git a/docs/windows-slave-image.md b/docs/windows-slave-image.md
deleted file mode 100644
index bbc461f..0000000
--- a/docs/windows-slave-image.md
+++ /dev/null
@@ -1,89 +0,0 @@
-# Creating a new Windows VM image for Bazel's CI
-
-The key thing to keep in mind is that the Windows setup for Jenkins has nothing magic about it
-that makes it a Jenkins slave VM. It's just a normal Windows setup with a few pre-installed tools
-that you would install on a workstation anyway. The Jenkins-specific setup is then handled
-completely automatic by the PowerShell script in `gce/jenkins-slave-windows-2016.ps1`.
-
-## Modifying an existing image
-
-Instead of recreating the image from scratch, it is also fine to just take an existing image that was generated using an earlier version of these instructions, create a VM using it, make the necessary changes, run GCESysprep again and create a new image from the VM disk.
-
-## Necessary steps
-- Create a new GCE VM with Windows Server 2016.
-- Temporarily enable RDP access to the VM via:
-  - `gcloud compute firewall-rules create $USER-rdp --allow=tcp:3389,udp:3389 --source-ranges=$(curl v4.ifconfig.co)/32`
-- Set a new Windows password, note it somewhere and connect via RDP.
-
-- Server Manager -> Configure this local server
-  - Deactivate Windows Firewall.
-  - Deactivate Windows Defender.
-  - Deactivate IE Enhanced Security Configuration.
-  - Set time zone to Europe/Berlin.
-
-- Download and install Google Chrome. Pin to taskbar, unpin IE.
-
-- Settings -> Update & security
-  - For developers -> [x] Developer mode. Click all three "Apply" buttons below.
-  - Windows Update -> Advanced options -> Check "Give me updates for other Microsoft products".
-  - Windows Update -> Check updates, then install all updates.
-    - Reboot if necessary.
-    - Repeat until no more updates are found.
-
-- Go to https://www.python.org/downloads/windows/
-  - Download latest stable Python 3.x (64-Bit).
-  - Start installation.
-    - Check "Install launcher for all users".
-    - Check "Add Python to PATH".
-    - Customize installation, check all boxes.
-    - Check "Install for all users".
-    - Customize install location: C:\Python3
-    - When setup is complete, click "Disable path length limit", then close setup.
-
-- Go to http://www.msys2.org/
-  - Download latest x86_64 msys2 setup.
-  - Install to C:\msys64.
-  - Launch msys2 shell from installer, run "pacman -Syuu", forcibly close terminal window when prompted.
-  - Launch "MSYS2 MinGW 64-bit" shell, run "pacman -Syuu", install all updates.
-  - Run "pacman -S git curl zip unzip gcc zlib-devel isl tar patch".
-  - Open a cmd.exe with administrator privileges and run:
-    - mkdir c:\tools
-    - mklink /j c:\tools\msys64 c:\msys64
-
-- Go to http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
-  - Download and install latest "Windows x64" JDK 8.
-
-- Go to http://landinghub.visualstudio.com/visual-cpp-build-tools
-  - Download "Visual C++ Build Tools 2015".
-  - Start installation, choose "Custom", select all options, install.
-
-- Go to https://nssm.cc/download
-  - Download "nssm 2.24-101-g897c7ad (2017-04-26)" or later build.
-  - Create new folder: "C:\Program Files\nssm".
-  - Extract nssm.exe from the download ZIP file's "win64" folder into the just created folder.
-
-- Install the Android SDK:
-  - Download the command-line tools from: https://developer.android.com/studio/index.html#downloads
-  - Extract the ZIP into C:\bazel_ci\android (create missing folders if necessary).
-  - Open a cmd.exe with administrator privileges and run:
-    - cd \bazel_ci\android
-    - ren tools tools.old
-    - tools.old\bin\sdkmanager tools
-    - rd /s /q tools.old
-    - tools\bin\sdkmanager --install platform-tools build-tools;27.0.3 platforms;android-24 platforms;android-25 platforms;android-26 platforms;android-27 extras;android;m2repository
-    
-- Install the Android NDK:
-  - Download the NDK from here: https://dl.google.com/android/repository/android-ndk-r14b-windows-x86_64.zip
-  - Extract the ZIP into C:\bazel_ci.
-
-- Start -> Search for "path" -> Choose "Edit the system environment variables"
-  - Click "Environment Variables". Do the following actions in the lower "System variables" part of the UI.
-  - Add "C:\Program Files\nssm" to the PATH variable.
-  - Set BAZEL_VC to "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC"
-  - Set BAZEL_SH to "C:\msys64\usr\bin\bash.exe"
-  - Set JAVA_HOME to "C:\Program Files\Java\jdk1.8.0_152" (or the latest version installed)
-  - Set ANDROID_HOME to "C:\bazel_ci\android".
-  - Set ANDROID_NDK_HOME to "C:\bazel_ci\android-ndk-r10e".
-
-- Start -> Type "GCESysprep", run it.
-  - The system will shut down and prepare itself for being used as an image to create new VMs.
diff --git a/docs/workflow.md b/docs/workflow.md
deleted file mode 100644
index 5ab0dd1..0000000
--- a/docs/workflow.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# Bazel CI workflow
-
-## Prerequisites
-
-Docker:
-
-*   [At least
-    25GB](https://github.com/bazelbuild/continuous-integration/issues/73) of
-    free disk space.
-
-*   Your username in the "docker" group.
-
-    Follow the instructions on [Ask Ubuntu](https://askubuntu.com/a/477554/671928).
-
-Gcloud:
-
-*   You may need to authenticate and set the current project. To do so, run:
-
-    ```
-    gcloud auth login
-    gcloud config set project bazel-public
-    gcloud config set zone europe-west1-d
-    ```
-
-## Pushing changes
-
-The process typically looks like:
-
-1.  Make your change.
-2.  Deploy to Google Cloud with `bazel run //gcr:deploy`.
-3.  Gracefully restart the Jenkins instance: https://ci.bazel.build/safeExit
-
-    If Jenkins doesn't exit fast enough, ensure that no important jobs are
-    running and then: https://ci.bazel.build/exit
diff --git a/gce/BUILD b/gce/BUILD
deleted file mode 100644
index 2f08581..0000000
--- a/gce/BUILD
+++ /dev/null
@@ -1 +0,0 @@
-exports_files(["bootstrap-bazel.sh"])
diff --git a/gce/bootstrap-bazel.sh b/gce/bootstrap-bazel.sh
deleted file mode 100644
index 8b62a32..0000000
--- a/gce/bootstrap-bazel.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-set -eu
-
-# Install a bootstrap bazel; we use the latest released version
-PLATFORM=$(uname -s | tr '[:upper:]' '[:lower:]')-$(uname -m)
-BAZEL_VERSION=$(curl -I https://github.com/bazelbuild/bazel/releases/latest | grep '^Location: ' | sed 's|.*/||' | sed $'s/\r//')
-
-CI_HOME="$(echo ~ci)"
-
-mkdir -p "${CI_HOME}/bootstrap-bazel"
-cd "${CI_HOME}/bootstrap-bazel"
-
-installer="https://releases.bazel.build/${BAZEL_VERSION}/release/bazel-${BAZEL_VERSION}-without-jdk-installer-${PLATFORM}.sh"
-destination="${CI_HOME}/.bazel/${BAZEL_VERSION}"
-curl -L -o install.sh "${installer}"
-chmod 0755 ./install.sh
-rm -fr "${destination}"
-mkdir -p "${destination}"
-./install.sh \
-    --base="${destination}" \
-    --bin="${destination}/binary"
-ln -s "${destination}" "${CI_HOME}/.bazel/latest"
-
-chown -R ci "${CI_HOME}/.bazel"
-rm -rf "${CI_HOME}/bootstrap-bazel"
diff --git a/gce/cleanup-install.sh b/gce/cleanup-install.sh
deleted file mode 100644
index 2937873..0000000
--- a/gce/cleanup-install.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-cat >/etc/cron.daily/cleanup_bazel_installs <<'EOF'
-#!/bin/bash
-# Clean-up bazel installs
-BAZEL_INSTALLER_PREFIX="/home/ci/.cache/bazel/_bazel_ci/install"
-
-ctime=$(date +%s)
-for f in ${BAZEL_INSTALLER_PREFIX}/*; do
-  mtime=$(stat -c "%X" $f/_embedded_binaries/install_base_key)
-  if (( $ctime - $mtime > 86400*14 )); then
-    # The last modification time is older than 14 days, delete.
-    rm -fr $f
-  fi
-done
-EOF
-
-chmod +x /etc/cron.daily/cleanup_bazel_installs
diff --git a/gce/jenkins-slave-windows-2016.ps1 b/gce/jenkins-slave-windows-2016.ps1
deleted file mode 100644
index 4a5087c..0000000
--- a/gce/jenkins-slave-windows-2016.ps1
+++ /dev/null
@@ -1,103 +0,0 @@
-# Stop on action error.
-$ErrorActionPreference = "Stop"
-
-if (-Not (Test-Path c:\bazel_ci)) {
-  New-Item c:\bazel_ci -type directory
-}
-Set-Location c:\bazel_ci
-
-# TODO(philwo) remove if it turns out we don't need Chocolatey.
-# Upgrade Chocolatey.
-# Write-Host "Updating Chocolatey..."
-# & "C:\ProgramData\chocolatey\choco.exe" upgrade chocolatey
-# & "C:\ProgramData\chocolatey\choco.exe" upgrade all
-
-# Update MSYS2 once.
-Write-Host "Updating MSYS2 packages (round 1)..."
-Start-Process -Wait "c:\msys64\msys2_shell.cmd" -ArgumentList "-c", "pacman --noconfirm -Syuu"
-
-# Update again, in case the first round only upgraded core packages.
-Write-Host "Updating MSYS2 packages (round 2)..."
-Start-Process -Wait "c:\msys64\msys2_shell.cmd" -ArgumentList "-c", "pacman --noconfirm -Syuu"
-
-# Install a couple of Python modules required by TensorFlow.
-Write-Host "Updating Python packages..."
-& "C:\Python3\Scripts\pip.exe" install --upgrade `
-    autograd `
-    numpy `
-    portpicker `
-    protobuf `
-    pyreadline `
-    six `
-    wheel
-
-# Fetch the instance ID from GCE.
-Write-Host "Fetching instance ID from GCE..."
-$webclient = (New-Object Net.WebClient)
-$webclient.Headers.Add("Metadata-Flavor", "Google")
-$jenkins_node = $webclient.DownloadString("http://metadata/computeMetadata/v1/instance/attributes/jenkins_node")
-
-# Get the latest release version number of Bazel.
-Write-Host "Grabbing latest Bazel version number from GitHub..."
-$url = "https://github.com/bazelbuild/bazel/releases/latest"
-$req = [system.Net.HttpWebRequest]::Create($url);
-$res = $req.getresponse();
-$res.Close();
-$bazel_version = $res.ResponseUri.AbsolutePath.TrimStart("/bazelbuild/bazel/releases/tag/")
-
-# Download the latest bazel.
-$folder = "c:\bazel_ci\installs\${bazel_version}"
-if (-Not (Test-Path "${folder}\bazel.exe")) {
-  Write-Host "Downloading Bazel ${bazel_version}..."
-  $url = "https://releases.bazel.build/${bazel_version}/release/bazel-${bazel_version}-without-jdk-windows-x86_64.exe"
-  New-Item $folder -type directory -force
-  (New-Object Net.WebClient).DownloadFile("${url}", "${folder}\bazel.exe")
-} else {
-  Write-Host "Bazel ${bazel_version} was already downloaded, skipping..."
-}
-
-# Create a junction to the latest release.
-Write-Host "Creating helper junctions..."
-$latest_folder = "C:\bazel_ci\installs\latest"
-if (Test-Path $latest_folder) {
-  Remove-Item -Force -Recurse $latest_folder
-}
-New-Item -ItemType Junction $latest_folder -Value $folder
-
-$bootstrap_folder = "C:\bazel_ci\installs\bootstrap"
-if (Test-Path $bootstrap_folder) {
-  Remove-Item -Force -Recurse $bootstrap_folder
-}
-New-Item -ItemType Junction $bootstrap_folder -Value $folder
-
-# Find the JDK. The path changes frequently, so hardcoding it is not enough.
-$java = Get-ChildItem "c:\Program Files\Java\jdk*" | Select-Object -Index 0 | foreach { $_.FullName }
-Write-Host "Found latest JDK at ${java}..."
-
-# Save the Jenkins slave.jar to a suitable location.
-Write-Host "Downloading https://ci.bazel.build/jnlpJars/slave.jar..."
-Invoke-WebRequest https://ci.bazel.build/jnlpJars/slave.jar -OutFile slave.jar
-
-# Create the service that runs the Jenkins slave
-# We can't execute Java directly because then it mysteriously fails with
-# "Sockets error: 10106: create", so we redirect through Powershell
-# The path change is needed because Jenkins cannot execute a different git
-# binary on different nodes, so we need to simply use "git"
-Write-Host "Creating Jenkins slave startup script..."
-$jnlpUrl = "https://ci.bazel.build/computer/${jenkins_node}/slave-agent.jnlp"
-$agent_script = @"
-`$env:path="c:\tools\msys64\usr\bin;`$env:path"
-cd c:\bazel_ci
-# A path name with c:\ in the JNLP URL makes Java hang. I don't know why.
-# Jenkins tries to reconnect to the wrong port if the server is restarted.
-# -noReconnect makes the agent die, and it is then subsequently restarted by
-# Windows because it is a service, and then all is well.
-& "${java}\bin\java" -jar c:\bazel_ci\slave.jar -jnlpUrl ${jnlpUrl} -noReconnect
-"@
-Write-Output $agent_script | Out-File -Encoding ascii agent_script.ps1
-
-Write-Host "Creating Jenkins slave service..."
-& nssm install bazel_ci powershell c:\bazel_ci\agent_script.ps1
-& nssm set bazel_ci AppStdout c:\bazel_ci\stdout.log
-& nssm set bazel_ci AppStderr c:\bazel_ci\stderr.log
-& nssm start bazel_ci
diff --git a/gce/jenkins-slave.sh b/gce/jenkins-slave.sh
deleted file mode 100644
index f22451c..0000000
--- a/gce/jenkins-slave.sh
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/bin/sh
-#
-# Copyright 2015 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Startup script for our various *nix executor nodes.
-# This is just setting up a slave to run.
-
-# We ignore errors on this script as we want to retry on errors.
-
-cat > /root/jenkins-startup <<'EOF'
-&> /root/jenkins-startup.log
-
-# Wait until the machine is set-up on creation.
-while ! (id ci >&/dev/null) || [ ! -f /home/ci/node_name ]; do
-  sleep 60
-done
-
-# Reboot if required, before going into operation.
-if [ -f /var/run/reboot-required ]; then
-  reboot
-fi
-
-NODE_NAME=$(cat /home/ci/node_name)
-
-# Setup NodeJS (only on Linux).
-if [[ ! -d /home/ci/node && $(uname) == "Linux" ]]; then
-  mkdir -p /home/ci/node &&
-  curl https://nodejs.org/dist/v8.9.4/node-v8.9.4-linux-x64.tar.xz | tar xJ -C /home/ci/node &&
-  PATH=/home/ci/node/node-v8.9.4-linux-x64/bin:$PATH npm install -g typescript fried-twinkie
-fi
-
-cd /home/ci
-
-# Setup the various Android SDK paths.
-export ANDROID_SDK_PATH=$(echo /home/ci/android/android-sdk-*)
-export ANDROID_NDK_PATH=$(echo /home/ci/android/android-ndk-*)
-if [ -d "${ANDROID_SDK_PATH}" ]; then
-  export ANDROID_SDK_BUILD_TOOLS_VERSION=$(ls $ANDROID_SDK_PATH/build-tools | sort -n | tail -1)
-  export ANDROID_SDK_API_LEVEL=$(ls $ANDROID_SDK_PATH/platforms | cut -d '-' -f 2 | sort -n | tail -1)
-else
-  unset ANDROID_SDK_PATH
-fi
-if [ -d "${ANDROID_NDK_PATH}" ]; then
-  export ANDROID_NDK_API_LEVEL=$(ls $ANDROID_NDK_PATH/platforms | cut -d '-' -f 2 | sort -n | tail -1)
-else
-  unset ANDROID_NDK_PATH
-fi
-
-# Keep the agent running, even if it crashes or the server is temporarily not available.
-while true; do
-  wget -O slave.jar https://ci.bazel.build/jnlpJars/slave.jar &&
-  sudo -u ci \
-      ANDROID_SDK_PATH=$ANDROID_SDK_PATH \
-      ANDROID_SDK_BUILD_TOOLS_VERSION=$ANDROID_SDK_BUILD_TOOLS_VERSION \
-      ANDROID_SDK_API_LEVEL=$ANDROID_SDK_API_LEVEL \
-      ANDROID_NDK_PATH=$ANDROID_NDK_PATH \
-      ANDROID_NDK_API_LEVEL=$ANDROID_NDK_API_LEVEL \
-      PATH=/home/ci/node/node-v8.9.4-linux-x64/bin:$PATH \
-      $(which java) -jar slave.jar -jnlpUrl https://ci.bazel.build/computer/${NODE_NAME}/slave-agent.jnlp -noReconnect
-
-  # Something went wrong. Sleep and retry in 1 minute.
-  sleep 60
-done
-
-EOF
-
-# As this init script is called before the setup is complete, we have to do
-# some dance to make sure we only start the actual script once bash (optional
-# on some systems) is installed.
-
-cat > /root/call-jenkins-startup <<'EOF'
-PATH=$PATH:/usr/local/bin ; export PATH
-echo `date` PATH=$PATH >> /root/early-startup.log
-
-while [ -z "`which bash`" ] ; do
-  echo `date` Waiting for bash to be installed >> /root/early-startup.log
-  sleep 60
-done
-
-bash /root/jenkins-startup
-EOF
-
-# Start the actual jenkins daemon
-echo /bin/sh /root/call-jenkins-startup | batch
diff --git a/gce/jenkins.yml b/gce/jenkins.yml
deleted file mode 100644
index 2ed73f7..0000000
--- a/gce/jenkins.yml
+++ /dev/null
@@ -1,48 +0,0 @@
-apiVersion: v1
-kind: Pod
-metadata:
-  name: jenkins
-spec:
-  containers:
-    - name: jenkins-master
-      image: gcr.io/bazel-public/jenkins-master
-      imagePullPolicy: Always
-      volumeMounts:
-        - name: jenkins-home
-          mountPath: /var/jenkins_home
-          readOnly: false
-        - name: secrets
-          mountPath: /opt/secrets
-          readOnly: true
-      ports:
-        - name: www
-          containerPort: 8080
-          hostPort: 80
-          protocol: TCP
-        - name: jenkins-slave
-          containerPort: 50000
-          hostPort: 50000
-          protocol: TCP
-    - name: deploy-slave
-      image: gcr.io/bazel-public/deploy-slave
-      imagePullPolicy: Always
-      volumeMounts:
-        - name: secrets
-          mountPath: /opt/secrets
-          readOnly: true
-    - name: sync-gerrit-github
-      image: gcr.io/bazel-public/sync-gerrit-github
-      imagePullPolicy: Always
-      volumeMounts:
-        - name: secrets
-          mountPath: /opt/secrets
-          readOnly: true
-  restartPolicy: Always
-  dnsPolicy: Default
-  volumes:
-    - name: jenkins-home
-      hostPath:
-        path: /volumes/jenkins_home
-    - name: secrets
-      hostPath:
-        path: /volumes/secrets
diff --git a/gce/linux-android.sh b/gce/linux-android.sh
deleted file mode 100644
index 09fc790..0000000
--- a/gce/linux-android.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright 2015 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Android support
-
-set -eu
-
-# NDK
-mkdir -p /home/ci/android
-cd /home/ci/android
-curl -o android-ndk.zip https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip
-unzip android-ndk.zip
-rm android-ndk.zip
-
-# Android SDK
-mkdir -p /home/ci/android/android-sdk-linux
-cd /home/ci/android/android-sdk-linux
-curl -o android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip
-unzip android-sdk.zip
-rm android-sdk.zip
-expect -c '
-set timeout -1;
-spawn tools/bin/sdkmanager --update
-expect {
-    "Accept? (y/N)" { exp_send "y\r" ; exp_continue }
-    eof
-}
-'
-
-# platform-tools is necessary for ADB. build-tools 26.0.1 is the oldest version
-# that Bazel supports as of 0.5.4 and is necessary for aapt, dx, apksigner, etc.
-# platforms 24, 25 and 26 are installed in case any future test is written that
-# specifically relies on one of them. extras;android;m2repository is necessary
-# for tests of our support library integration.
-# This should be kept in sync with mac/mac-android.sh.
-yes | tools/bin/sdkmanager \
-  "platform-tools" \
-  "build-tools;27.0.3" \
-  "platforms;android-24" \
-  "platforms;android-25" \
-  "platforms;android-26" \
-  "platforms;android-27" \
-  "extras;android;m2repository"
-chown -R ci /home/ci/android
diff --git a/gce/mount-volumes.sh b/gce/mount-volumes.sh
deleted file mode 100644
index 4b3c865..0000000
--- a/gce/mount-volumes.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2015 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Mount the permanent volumes for the Docker image.
-
-set -eu
-
-mkdir -p /volumes
-mount -t ext4 /dev/disk/by-id/google-volumes /volumes
-
-mkdir -p /volumes/{jenkins_home,secrets}
-# Allow ci (1000) user from docker images to access those directory.
-# We use the uid because the host do not have the ci user.
-chown 1000 /volumes/{jenkins_home,secrets}
diff --git a/gce/ubuntu-14-04-slave.sh b/gce/ubuntu-14-04-slave.sh
deleted file mode 100644
index b055ea3..0000000
--- a/gce/ubuntu-14-04-slave.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2015 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Setup scripts for Ubuntu 14.04
-
-# Android SDK requires 32-bits libraries.
-dpkg --add-architecture i386
-apt-get -y update
-apt-get -y dist-upgrade
-
-echo y | add-apt-repository ppa:webupd8team/java
-apt-get -y update
-apt-get -y install zip g++ zlib1g-dev wget git unzip python python3 curl realpath xvfb
-
-# Should accept the licence:
-yes | apt-get -y install oracle-java8-installer
-
-# Android SDK requires 32-bits libraries
-apt-get -y install libncurses5:i386 libstdc++6:i386 zlib1g:i386
-apt-get -y install expect  # Needed to 'yes' the SDK licenses.
-
-# Dependencies for TensorFlow
-apt-get -y install python-numpy swig python-dev python-pip libcurl3-dev
-pip install mock
diff --git a/gce/ubuntu-16-04-slave.sh b/gce/ubuntu-16-04-slave.sh
deleted file mode 100644
index 0135872..0000000
--- a/gce/ubuntu-16-04-slave.sh
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Setup scripts for Ubuntu 16.04.
-
-# Android SDK requires 32-bits libraries.
-dpkg --add-architecture i386
-apt-get -y update
-apt-get -y dist-upgrade
-
-# Explicitly install the OpenJDK 8 before anything else to prevent
-# Ubuntu from pulling in OpenJDK 9.
-apt-get -y install \
-  openjdk-8-jdk \
-  openjdk-8-source
-
-packages=(
-  # Bazel dependencies.
-  build-essential
-  curl
-  git
-  python
-  python3
-  unzip
-  wget
-  xvfb
-  zip
-  zlib1g-dev
-
-  # Dependencies for Android SDK.
-  # https://developer.android.com/studio/troubleshoot.html#linux-libraries
-  # https://code.google.com/p/android/issues/detail?id=207212
-  expect
-  libbz2-1.0:i386
-  libncurses5:i386
-  libstdc++6:i386
-  libz1:i386
-
-  # Dependencies for TensorFlow.
-  libcurl3-dev
-  python-dev
-  python-numpy
-  python-pip
-  python-wheel
-  swig
-)
-apt-get -y install "${packages[@]}"
-
-pip install mock
diff --git a/gce/ubuntu-docker.sh b/gce/ubuntu-docker.sh
deleted file mode 100644
index f66f031..0000000
--- a/gce/ubuntu-docker.sh
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/bin/bash
-
-set -eu
-
-apt-get -y install apt-transport-https ca-certificates
-
-# From https://download.docker.com/linux/ubuntu/gpg
-cat <<'EOF' | apt-key add -
------BEGIN PGP PUBLIC KEY BLOCK-----
-
-mQINBFit2ioBEADhWpZ8/wvZ6hUTiXOwQHXMAlaFHcPH9hAtr4F1y2+OYdbtMuth
-lqqwp028AqyY+PRfVMtSYMbjuQuu5byyKR01BbqYhuS3jtqQmljZ/bJvXqnmiVXh
-38UuLa+z077PxyxQhu5BbqntTPQMfiyqEiU+BKbq2WmANUKQf+1AmZY/IruOXbnq
-L4C1+gJ8vfmXQt99npCaxEjaNRVYfOS8QcixNzHUYnb6emjlANyEVlZzeqo7XKl7
-UrwV5inawTSzWNvtjEjj4nJL8NsLwscpLPQUhTQ+7BbQXAwAmeHCUTQIvvWXqw0N
-cmhh4HgeQscQHYgOJjjDVfoY5MucvglbIgCqfzAHW9jxmRL4qbMZj+b1XoePEtht
-ku4bIQN1X5P07fNWzlgaRL5Z4POXDDZTlIQ/El58j9kp4bnWRCJW0lya+f8ocodo
-vZZ+Doi+fy4D5ZGrL4XEcIQP/Lv5uFyf+kQtl/94VFYVJOleAv8W92KdgDkhTcTD
-G7c0tIkVEKNUq48b3aQ64NOZQW7fVjfoKwEZdOqPE72Pa45jrZzvUFxSpdiNk2tZ
-XYukHjlxxEgBdC/J3cMMNRE1F4NCA3ApfV1Y7/hTeOnmDuDYwr9/obA8t016Yljj
-q5rdkywPf4JF8mXUW5eCN1vAFHxeg9ZWemhBtQmGxXnw9M+z6hWwc6ahmwARAQAB
-tCtEb2NrZXIgUmVsZWFzZSAoQ0UgZGViKSA8ZG9ja2VyQGRvY2tlci5jb20+iQI3
-BBMBCgAhBQJYrefAAhsvBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEI2BgDwO
-v82IsskP/iQZo68flDQmNvn8X5XTd6RRaUH33kXYXquT6NkHJciS7E2gTJmqvMqd
-tI4mNYHCSEYxI5qrcYV5YqX9P6+Ko+vozo4nseUQLPH/ATQ4qL0Zok+1jkag3Lgk
-jonyUf9bwtWxFp05HC3GMHPhhcUSexCxQLQvnFWXD2sWLKivHp2fT8QbRGeZ+d3m
-6fqcd5Fu7pxsqm0EUDK5NL+nPIgYhN+auTrhgzhK1CShfGccM/wfRlei9Utz6p9P
-XRKIlWnXtT4qNGZNTN0tR+NLG/6Bqd8OYBaFAUcue/w1VW6JQ2VGYZHnZu9S8LMc
-FYBa5Ig9PxwGQOgq6RDKDbV+PqTQT5EFMeR1mrjckk4DQJjbxeMZbiNMG5kGECA8
-g383P3elhn03WGbEEa4MNc3Z4+7c236QI3xWJfNPdUbXRaAwhy/6rTSFbzwKB0Jm
-ebwzQfwjQY6f55MiI/RqDCyuPj3r3jyVRkK86pQKBAJwFHyqj9KaKXMZjfVnowLh
-9svIGfNbGHpucATqREvUHuQbNnqkCx8VVhtYkhDb9fEP2xBu5VvHbR+3nfVhMut5
-G34Ct5RS7Jt6LIfFdtcn8CaSas/l1HbiGeRgc70X/9aYx/V/CEJv0lIe8gP6uDoW
-FPIZ7d6vH+Vro6xuWEGiuMaiznap2KhZmpkgfupyFmplh0s6knymuQINBFit2ioB
-EADneL9S9m4vhU3blaRjVUUyJ7b/qTjcSylvCH5XUE6R2k+ckEZjfAMZPLpO+/tF
-M2JIJMD4SifKuS3xck9KtZGCufGmcwiLQRzeHF7vJUKrLD5RTkNi23ydvWZgPjtx
-Q+DTT1Zcn7BrQFY6FgnRoUVIxwtdw1bMY/89rsFgS5wwuMESd3Q2RYgb7EOFOpnu
-w6da7WakWf4IhnF5nsNYGDVaIHzpiqCl+uTbf1epCjrOlIzkZ3Z3Yk5CM/TiFzPk
-z2lLz89cpD8U+NtCsfagWWfjd2U3jDapgH+7nQnCEWpROtzaKHG6lA3pXdix5zG8
-eRc6/0IbUSWvfjKxLLPfNeCS2pCL3IeEI5nothEEYdQH6szpLog79xB9dVnJyKJb
-VfxXnseoYqVrRz2VVbUI5Blwm6B40E3eGVfUQWiux54DspyVMMk41Mx7QJ3iynIa
-1N4ZAqVMAEruyXTRTxc9XW0tYhDMA/1GYvz0EmFpm8LzTHA6sFVtPm/ZlNCX6P1X
-zJwrv7DSQKD6GGlBQUX+OeEJ8tTkkf8QTJSPUdh8P8YxDFS5EOGAvhhpMBYD42kQ
-pqXjEC+XcycTvGI7impgv9PDY1RCC1zkBjKPa120rNhv/hkVk/YhuGoajoHyy4h7
-ZQopdcMtpN2dgmhEegny9JCSwxfQmQ0zK0g7m6SHiKMwjwARAQABiQQ+BBgBCAAJ
-BQJYrdoqAhsCAikJEI2BgDwOv82IwV0gBBkBCAAGBQJYrdoqAAoJEH6gqcPyc/zY
-1WAP/2wJ+R0gE6qsce3rjaIz58PJmc8goKrir5hnElWhPgbq7cYIsW5qiFyLhkdp
-YcMmhD9mRiPpQn6Ya2w3e3B8zfIVKipbMBnke/ytZ9M7qHmDCcjoiSmwEXN3wKYI
-mD9VHONsl/CG1rU9Isw1jtB5g1YxuBA7M/m36XN6x2u+NtNMDB9P56yc4gfsZVES
-KA9v+yY2/l45L8d/WUkUi0YXomn6hyBGI7JrBLq0CX37GEYP6O9rrKipfz73XfO7
-JIGzOKZlljb/D9RX/g7nRbCn+3EtH7xnk+TK/50euEKw8SMUg147sJTcpQmv6UzZ
-cM4JgL0HbHVCojV4C/plELwMddALOFeYQzTif6sMRPf+3DSj8frbInjChC3yOLy0
-6br92KFom17EIj2CAcoeq7UPhi2oouYBwPxh5ytdehJkoo+sN7RIWua6P2WSmon5
-U888cSylXC0+ADFdgLX9K2zrDVYUG1vo8CX0vzxFBaHwN6Px26fhIT1/hYUHQR1z
-VfNDcyQmXqkOnZvvoMfz/Q0s9BhFJ/zU6AgQbIZE/hm1spsfgvtsD1frZfygXJ9f
-irP+MSAI80xHSf91qSRZOj4Pl3ZJNbq4yYxv0b1pkMqeGdjdCYhLU+LZ4wbQmpCk
-SVe2prlLureigXtmZfkqevRz7FrIZiu9ky8wnCAPwC7/zmS18rgP/17bOtL4/iIz
-QhxAAoAMWVrGyJivSkjhSGx1uCojsWfsTAm11P7jsruIL61ZzMUVE2aM3Pmj5G+W
-9AcZ58Em+1WsVnAXdUR//bMmhyr8wL/G1YO1V3JEJTRdxsSxdYa4deGBBY/Adpsw
-24jxhOJR+lsJpqIUeb999+R8euDhRHG9eFO7DRu6weatUJ6suupoDTRWtr/4yGqe
-dKxV3qQhNLSnaAzqW/1nA3iUB4k7kCaKZxhdhDbClf9P37qaRW467BLCVO/coL3y
-Vm50dwdrNtKpMBh3ZpbB1uJvgi9mXtyBOMJ3v8RZeDzFiG8HdCtg9RvIt/AIFoHR
-H3S+U79NT6i0KPzLImDfs8T7RlpyuMc4Ufs8ggyg9v3Ae6cN3eQyxcK3w0cbBwsh
-/nQNfsA6uu+9H7NhbehBMhYnpNZyrHzCmzyXkauwRAqoCbGCNykTRwsur9gS41TQ
-M8ssD1jFheOJf3hODnkKU+HKjvMROl1DK7zdmLdNzA1cvtZH/nCC9KPj1z8QC47S
-xx+dTZSx4ONAhwbS/LN3PoKtn8LPjY9NP9uDWI+TWYquS2U+KHDrBDlsgozDbs/O
-jCxcpDzNmXpWQHEtHU7649OXHP7UeNST1mCUCH5qdank0V1iejF6/CfTFU4MfcrG
-YT90qFF93M3v01BbxP+EIY2/9tiIPbrd
-=0YYh
------END PGP PUBLIC KEY BLOCK-----
-EOF
-
-add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
-
-apt-get -y update
-apt-get -y install docker-ce
-
-# Docker group
-usermod -aG docker ci
diff --git a/gce/utils/commands.sh b/gce/utils/commands.sh
deleted file mode 100644
index dca38e0..0000000
--- a/gce/utils/commands.sh
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2015 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Some common methods to talk to GCE
-set -eu
-
-# Print a log message if VERBOSE is set to true
-function _log() {
-  echo "[$(basename "$0"):${FUNCNAME[2]}:${BASH_LINENO[1]}]" "$@"
-}
-function log() {
-  if [ "${VERBOSE-}" = yes ]; then
-    echo -n "INFO: "
-    _log "$@"
-  fi
-}
-
-# Test whether $1 is the name of an existing instance on GCE
-function test_vm() {
-  (( $(gcloud compute instances list --filter="name=$1" | wc -l) > 1 ))
-}
-
-# Wait for a VM $1 in zone $2 to be up and running using ssh.
-# This function will wait for at most $3 seconds.
-function wait_vm() {
-  local vm="$1"
-  local zone="$2"
-  local timeout="${3-60}"  # Wait for 1 minute maximum by default
-  local cmd="${4-/bin/true}"
-  local starttime="$(date +%s)"
-  while (( "$(date +%s)" - "$starttime" < "$timeout" )); do
-    # gcloud compute ssh forward the return code of the executed command.
-    if gcloud compute ssh --zone="$zone" --command "${cmd}" "$vm" &>/dev/null
-    then
-      return 0
-    fi
-  done
-  return 1
-}
-
-# SSH to a VM $1 on zone  $2 and execute the command giving by the rest of
-# the arguments.
-function ssh_command() {
-  local TAG="$1"
-  local LOCATION="$2"
-  local tmpdir="${TMPDIR:-/tmp}"
-  # ${tmp} points to a file containing the list of commands to execute.
-  local tmp="$(mktemp ${tmpdir%%/}/vm-ssh.XXXXXXXX)"
-  trap "rm -f ${tmp}" EXIT
-  shift 2
-  # Truncate the list of commands
-  echo -n >"${tmp}"
-  # And then add the commands provided as argument.
-  for i in "$@"; do
-    if [ -f "$i" ]; then
-      cat "$i" >>"${tmp}"
-    else
-      echo "$i" >>"${tmp}"
-    fi
-  done
-  < "${tmp}" gcloud compute ssh --zone="${LOCATION}" \
-      --command "cat >/tmp/s.sh; sudo bash /tmp/s.sh; rm /tmp/s.sh" \
-      "${TAG}"
-  rm -f "${tmp}"
-  trap - EXIT
-}
diff --git a/gce/vm.sh b/gce/vm.sh
deleted file mode 100755
index 0550d5c..0000000
--- a/gce/vm.sh
+++ /dev/null
@@ -1,358 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2015 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Script to easily re-image the various vms on GCE
-set -eu
-
-# List of executor nodes in the following format:
-#   GCE-VM-NAME GCE-BASE-IMAGE JENKINS-NODE LOCATION STARTUP-METADATA SETUP-SCRIPTS
-# Where
-#   GCE-VM-NAME is the VM name on GCE
-#   GCE-BASE-IMAGE is the name of the base image in GCE
-#                  (see `gcloud compute images list`)
-#   JENKINS-NODE is the name of the node in Jenkins
-#   LOCATION is the location in GCE (e.g. europe-west1-d)
-#   NETWORK is the GCE network the instance has to be created on.
-#   STARTUP-METADATA is the metadata argument to gcloud to launch the right
-#                    startup script.
-#   SETUP-SCRIPTS is a list of shell scripts to adapt the executor node. It should
-#                create a ci user with its home in /home/ci
-#                and ends with writing to /home/ci/node_name the name
-#                of the jenkins node.
-
-# Executor nodes for ci.bazel.build
-SLAVES=(
-    "ubuntu-14-04-slave-1 ubuntu-1404-lts ubuntu_14.04-x86_64-1 europe-west1-d default startup-script=jenkins-slave.sh ubuntu-14-04-slave.sh ubuntu-docker.sh bootstrap-bazel.sh linux-android.sh cleanup-install.sh"
-    "ubuntu-14-04-slave-2 ubuntu-1404-lts ubuntu_14.04-x86_64-2 europe-west1-d default startup-script=jenkins-slave.sh ubuntu-14-04-slave.sh ubuntu-docker.sh bootstrap-bazel.sh linux-android.sh cleanup-install.sh"
-    "ubuntu-14-04-slave-3 ubuntu-1404-lts ubuntu_14.04-x86_64-3 europe-west1-d default startup-script=jenkins-slave.sh ubuntu-14-04-slave.sh ubuntu-docker.sh bootstrap-bazel.sh linux-android.sh cleanup-install.sh"
-    "ubuntu-14-04-slave-4 ubuntu-1404-lts ubuntu_14.04-x86_64-4 europe-west1-d default startup-script=jenkins-slave.sh ubuntu-14-04-slave.sh ubuntu-docker.sh bootstrap-bazel.sh linux-android.sh cleanup-install.sh"
-    "ubuntu-16-04-slave-1 ubuntu-1604-lts ubuntu_16.04-x86_64-1 europe-west1-d default startup-script=jenkins-slave.sh ubuntu-16-04-slave.sh ubuntu-docker.sh bootstrap-bazel.sh linux-android.sh cleanup-install.sh"
-    "ubuntu-16-04-slave-2 ubuntu-1604-lts ubuntu_16.04-x86_64-2 europe-west1-d default startup-script=jenkins-slave.sh ubuntu-16-04-slave.sh ubuntu-docker.sh bootstrap-bazel.sh linux-android.sh cleanup-install.sh"
-    "ubuntu-16-04-slave-3 ubuntu-1604-lts ubuntu_16.04-x86_64-3 europe-west1-d default startup-script=jenkins-slave.sh ubuntu-16-04-slave.sh ubuntu-docker.sh bootstrap-bazel.sh linux-android.sh cleanup-install.sh"
-    "ubuntu-16-04-slave-4 ubuntu-1604-lts ubuntu_16.04-x86_64-4 europe-west1-d default startup-script=jenkins-slave.sh ubuntu-16-04-slave.sh ubuntu-docker.sh bootstrap-bazel.sh linux-android.sh cleanup-install.sh"
-    "freebsd-11-slave-1 https://www.googleapis.com/compute/v1/projects/freebsd-org-cloud-dev/global/images/freebsd-11-1-stable-amd64-2017-12-28 freebsd-11-1 europe-west1-d default startup-script=jenkins-slave.sh freebsd-slave.sh freebsd-ci-homedir.sh"
-    "freebsd-11-slave-2 https://www.googleapis.com/compute/v1/projects/freebsd-org-cloud-dev/global/images/freebsd-11-1-stable-amd64-2017-12-28 freebsd-11-2 europe-west1-d default startup-script=jenkins-slave.sh freebsd-slave.sh freebsd-ci-homedir.sh"
-    "freebsd-12-slave-1 https://www.googleapis.com/compute/v1/projects/freebsd-org-cloud-dev/global/images/freebsd-12-0-current-amd64-2017-12-28 freebsd-12-1 europe-west1-d default startup-script=jenkins-slave.sh freebsd-slave.sh freebsd-ci-homedir.sh"
-    "freebsd-12-slave-2 https://www.googleapis.com/compute/v1/projects/freebsd-org-cloud-dev/global/images/freebsd-12-0-current-amd64-2017-12-28 freebsd-12-2 europe-west1-d default startup-script=jenkins-slave.sh freebsd-slave.sh freebsd-ci-homedir.sh"
-    # Fow Windows, we use a custom image with pre-installed MSVC.
-    "windows-slave-1 windows-server-2016-dc-bazel-ci-v20180115 windows-x86_64-1 europe-west1-d default windows-startup-script-ps1=jenkins-slave-windows-2016.ps1"
-    "windows-slave-2 windows-server-2016-dc-bazel-ci-v20180115 windows-x86_64-2 europe-west1-d default windows-startup-script-ps1=jenkins-slave-windows-2016.ps1"
-)
-
-# Jenkins controller for ci.bazel.build
-MASTER=(
-    # VM name
-    "jenkins"
-    # Zone
-    "europe-west1-d"
-    # Metadata specification
-    "google-container-manifest=jenkins.yml,startup-script=mount-volumes.sh"
-    # Disk specification
-    "name=jenkins-volumes-ssd,device-name=volumes"
-    # Address name
-    "ci"
-    # Network name
-    "default"
-    # Instance group
-    "ci-instance-group"
-)
-
-# You can use these VMs to test anything you want on this platform. They are not
-# connected to Jenkins.
-TESTING=(
-    "ubuntu-14-04-testing ubuntu-1404-lts ubuntu_14.04-x86_64-testing europe-west1-d testing ubuntu-14-04-slave.sh bootstrap-bazel.sh linux-android.sh cleanup-install.sh"
-    "ubuntu-16-04-testing ubuntu-1604-lts ubuntu_16.04-x86_64-testing europe-west1-d testing ubuntu-16-04-slave.sh bootstrap-bazel.sh linux-android.sh cleanup-install.sh"
-    "freebsd-11-testing https://www.googleapis.com/compute/v1/projects/freebsd-org-cloud-dev/global/images/freebsd-11-1-stable-amd64-2017-12-28 freebsd-11-testing europe-west1-d testing freebsd-slave.sh freebsd-ci-homedir.sh"
-    "freebsd-12-testing https://www.googleapis.com/compute/v1/projects/freebsd-org-cloud-dev/global/images/freebsd-12-0-current-amd64-2017-12-28 freebsd-12-testing europe-west1-d testing freebsd-slave.sh freebsd-ci-homedir.sh"
-    "windows-testing windows-server-2016-dc-bazel-ci-v20180115 windows-x86_64-testing europe-west1-d testing"
-)
-
-cd "$(dirname "${BASH_SOURCE[0]}")"
-
-source utils/commands.sh
-
-# Create the container engine VM containing the jenkins instance.
-function create_master() {
-  local flavour="${1:-}"
-  local name="$1"
-  local location="$2"
-  local metadata="$3"
-  local disk="$4"
-  local address="$5"
-  local network="$6"
-  local group="$7"
-
-  gcloud compute instances create "$name" --tags jenkins \
-      --zone "$location" --machine-type n1-standard-16 \
-      --image-family container-vm --image-project google-containers \
-      --metadata-from-file "$metadata" \
-      --min-cpu-platform "Intel Skylake" \
-      --boot-disk-type pd-ssd --boot-disk-size 250GB \
-      --network "$network" \
-      --address "$address" --disk "$disk"
-
-  gcloud compute instance-groups unmanaged add-instances \
-      "$group" --instances "$name" --zone "$location"
-}
-
-# Create a node named $1 whose image is $2 (see `gcloud compute image list`)
-# and whose jenkins node name is $3. The other arguments are a list of setup
-# scripts to run as root on instance creation. The `jenkins-slave.sh` script
-# will be used as the startup script for the instance.
-function create_slave() {
-  local TAG="$1"
-  local IMAGE="$2"
-  local JENKINS_NODE="$3"
-  local LOCATION="$4"
-  local NETWORK="$5"
-  local STARTUP_METADATA="$6"
-  shift 6
-
-  if [[ $TAG == *-testing ]]; then
-    MACHINE_TYPE="n1-standard-8"
-    BOOT_DISK_SIZE="250GB"
-  else
-    MACHINE_TYPE="n1-standard-32"
-    BOOT_DISK_SIZE="500GB"
-  fi
-
-  CPU_PLATFORM="Intel Skylake"
-  if [[ $IMAGE == ubuntu-* ]]; then
-    IMAGE_FLAG="--image-project=ubuntu-os-cloud --image-family=$IMAGE"
-    LOCAL_SSD="--local-ssd interface=nvme"
-  else
-    IMAGE_FLAG="--image $IMAGE"
-    LOCAL_SSD="--local-ssd interface=scsi"
-  fi
-
-  gcloud compute instances create "$TAG" \
-      --zone "$LOCATION" \
-      --machine-type "$MACHINE_TYPE" \
-      --network "$NETWORK" \
-      $IMAGE_FLAG \
-      --metadata-from-file "$STARTUP_METADATA" \
-      --metadata jenkins_node="$JENKINS_NODE" \
-      --min-cpu-platform "$CPU_PLATFORM" \
-      --boot-disk-type pd-ssd --boot-disk-size "$BOOT_DISK_SIZE" \
-      $LOCAL_SSD
-
-  case "$TAG" in
-    windows-*)
-      # Nothing to do here.
-      ;;
-
-    freebsd*)
-      # Wait a bit for the VM to fully start.
-      wait_vm "$TAG" "$LOCATION" 120 /usr/bin/true
-
-      # Install bash directly calling gcloud, as the ssh_command function
-      # already depends on bash being installed and in PATH.
-      gcloud compute ssh --zone="${LOCATION}" --command "sudo pkg install -y bash" "${TAG}"
-
-      # Create the jenkins user, run additional set-up scripts and mark
-      # the install process as finished.
-      ssh_command "$TAG" "$LOCATION" \
-          "pw useradd -n ci -s /usr/local/bin/bash -d /home/ci -m -w no" \
-          "$@" \
-          "echo \"echo -n '$JENKINS_NODE' >/home/ci/node_name\" | su -m ci"
-      ;;
-
-    *)
-      # Wait a bit for the VM to fully start.
-      wait_vm "$TAG" "$LOCATION"
-
-      # Create the jenkins user, run additional set-up scripts and mark
-      # the install process as finished.
-      ssh_command "$TAG" "$LOCATION" \
-          "sudo adduser --system --home /home/ci ci" \
-          "$@" \
-          "su ci -s /bin/bash -c \"echo -n '$JENKINS_NODE' >/home/ci/node_name\""
-      ;;
-  esac
-}
-
-# Updates the --metadata and --metadata-from-file values of an existing VM.
-#
-# Primary purpose is to propagate changes to the startup scripts (e.g.
-# mount-volumes.sh for the jenkins controller, jenkins-slave.sh for Ubuntu nodes,
-# etc.) without recreating the VM. The update needs a VM reboot to take effect.
-function update_metadata() {
-  local tag="${MASTER[0]}"
-  local metadata_flag=""
-  local location="${MASTER[1]}"
-  local startup_metadata="${MASTER[2]}"
-
-  if [ ! "$1" = jenkins ]; then
-    local args="$(get_slave_by_name "$1")"
-    [ -n "$args" ] || (echo "Unknown vm $1" >&2; exit 1)
-
-    tag="$(echo $args | cut -d' ' -f1)"
-    metadata_flag="--metadata jenkins_node=$(echo $args | cut -d' ' -f3)"
-    location="$(echo $args | cut -d' ' -f4)"
-    startup_metadata="$(echo $args | cut -d' ' -f6)"
-  fi
-
-  gcloud compute instances add-metadata "$tag" \
-      --zone "$location" \
-      $metadata_flag \
-      --metadata-from-file "$startup_metadata"
-}
-
-function get_slave_by_name() {
-  for i in "${SLAVES[@]}" "${TESTING[@]}"; do
-    if [[ "$i" =~ ^"$1 " ]]; then
-      echo "$i"
-    fi
-  done
-}
-
-function create_vm() {
-  if [ "$1" = "jenkins" ]; then
-    create_master "${MASTER[@]}"
-  else
-    local args="$(get_slave_by_name "$1")"
-    [ -n "$args" ] || (echo "Unknown vm $1" >&2; exit 1)
-    create_slave $args
-  fi
-}
-
-function action() {
-  local action=$1
-  shift
-  if (( $# == 0 )); then
-    $action jenkins
-    for i in "${SLAVES[@]}"; do
-      $action "${i%% *}"
-    done
-  else
-    for i in "$@"; do
-      $action "$i"
-    done
-  fi
-  wait %?gcloud 2>/dev/null || true  # wait fails if the job already finished.
-}
-
-function test_slave() {
-  local TAG=$1
-  if test_vm $TAG; then
-    if [ "$TAG" = "${MASTER[0]}" ]; then
-      echo "${MASTER[1]}"
-    else
-      get_slave_by_name "$TAG" | cut -d " " -f 4
-    fi
-  fi
-}
-
-function vm_command() {
-  local command=$1
-  local TAG=$2
-  local location="$(test_slave "$TAG")"
-  shift 2
-  if [ -n "$location" ]; then
-    gcloud compute instances $command --quiet --zone=$location $TAG "$@"
-  fi
-}
-
-function delete_vm() {
-  vm_command delete "$@"
-}
-
-function stop_vm() {
-  vm_command stop "$@"
-}
-
-function start_vm() {
-  vm_command start "$@"
-}
-
-function do_ssh_command() {
-  tag=$1
-  shift
-  location="$(test_slave "${tag}")"
-  if [ -z "${location}" ]; then
-    echo "Slave ${tag} was not found or is not running" >&2
-  else
-    ssh_command "$tag" "$location" "$@"
-  fi
-}
-
-function print_vm_name() {
-  echo $1
-}
-
-command="${1-}"
-shift || true
-
-case "${command}" in
-  "stop")
-    action stop_vm "$@"
-    ;;
-  "start")
-    action start_vm "$@"
-    ;;
-  "create")
-    action create_vm "$@"
-    ;;
-  "delete")
-    action delete_vm "$@"
-    ;;
-  "reimage")
-    action delete_vm "$@"
-    action create_vm "$@"
-    ;;
-  "update_metadata")
-    action update_metadata "$@"
-    ;;
-  "ssh_command")
-    do_ssh_command "$@"
-    ;;
-  "vms"|"list")
-    action print_vm_name "$@"
-    ;;
-  "ssh")
-    tag=$1
-    location="$(test_slave "${tag}")"
-    if [ -z "${location}" ]; then
-      echo "Slave ${tag} was not found or is not running" >&2
-    else
-      gcloud compute ssh "$tag" --zone "$location"
-    fi
-    ;;
-  "kill_container")
-    tag="$1"
-    do_ssh_command "$1" 'sudo docker stop $(sudo docker ps -q -f status=running -f ancestor='"$2"')'
-    ;;
-  *)
-    echo "Usage: $0 <command> ([<vm> ... <vm>])" >&2
-    echo "       $0 ssh_command <vm> <arg0> [<arg1>..<argN>]" >&2
-    echo "       $0 ssh <vm>" >&2
-    echo "       $0 kill_container <vm> <image>" >&2
-    echo " - command can be:" >&2
-    echo "    create: create the VM, fails if the VM already exists." >&2
-    echo "    delete: delete the VM, fails if the VM does not exists." >&2
-    echo "    reimage: reimage the VM, equivalent to delete followed by create." >&2
-    echo "    update_metadata: update the VM metadata, the VM must already exists." >&2
-    echo "    start: start the VM, the VM must exists." >&2
-    echo "    stop: stop the VM, the VM must exists." >&2
-    echo " - ssh_command executes a command via SSH on the specified VM." >&2
-    echo " - ssh launch a secure shell on the specified VM." >&2
-    echo " - kill_container kills container that runs the specified image on the" >&2
-    echo "   specified VM." >&2
-    echo " Unless you specify a specific VM, this tool will operate on all VMs " >&2
-    echo " (Jenkins master and slaves)." >&2
-    exit 1
-    ;;
-esac
diff --git a/gcr/BUILD b/gcr/BUILD
deleted file mode 100644
index e9e67c5..0000000
--- a/gcr/BUILD
+++ /dev/null
@@ -1,22 +0,0 @@
-load(
-    "@io_bazel_rules_docker//docker:docker.bzl",
-    "docker_bundle",
-)
-load(
-    "@io_bazel_rules_docker//contrib:push-all.bzl",
-    "docker_push",
-)
-
-docker_bundle(
-    name = "bundle",
-    images = {
-        "gcr.io/bazel-public/jenkins-master:latest": "//jenkins:jenkins",
-        "gcr.io/bazel-public/deploy-slave:latest": "//jenkins:deploy.docker",
-        "gcr.io/bazel-public/sync-gerrit-github:latest": "//gerrit-github-sync:gerrit-github-sync",
-    },
-)
-
-docker_push(
-    name = "deploy",
-    bundle = ":bundle",
-)
diff --git a/jenkins/BUILD b/jenkins/BUILD
deleted file mode 100644
index 2a01e1c..0000000
--- a/jenkins/BUILD
+++ /dev/null
@@ -1,257 +0,0 @@
-# Copyright 2015 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-package(default_visibility = ["//jenkins:__subpackages__"])
-
-# Configuration for our Jenkins instance
-load("@io_bazel_rules_docker//docker:docker.bzl", "docker_build")
-load("//jenkins/build_defs:templates.bzl", "expand_template")
-load("//jenkins/build_defs:jenkins.bzl", "jenkins_node", "jenkins_docker_build", "jenkins_job", "jenkins_nodes", "jenkins_node_names")
-
-#
-# Nodes
-#
-
-DARWIN_PREFIX = "darwin-x86_64"
-DARWIN_COUNT = 8
-
-FREEBSD_11_PREFIX = "freebsd-11"
-FREEBSD_11_COUNT = 2
-
-UBUNTU_1404_PREFIX = "ubuntu_14.04-x86_64"
-UBUNTU_1404_COUNT = 4
-
-UBUNTU_1604_PREFIX = "ubuntu_16.04-x86_64"
-UBUNTU_1604_COUNT = 4
-
-WINDOWS_PREFIX = "windows-x86_64"
-WINDOWS_COUNT = 2
-
-# Physical machines
-jenkins_nodes(
-    DARWIN_PREFIX,
-    DARWIN_COUNT,
-    remote_fs = "/Users/ci",
-    tunnel = "master.ci.bazel.io:50000",
-)
-
-# GCE machines
-jenkins_nodes(
-    WINDOWS_PREFIX,
-    WINDOWS_COUNT,
-    remote_fs = "c:\\jenkins",
-    tunnel = "jenkins.c.bazel-public.internal:50000",
-)
-
-jenkins_nodes(
-    UBUNTU_1404_PREFIX,
-    UBUNTU_1404_COUNT,
-    labels = ["linux-x86_64"],
-    tunnel = "jenkins.c.bazel-public.internal:50000",
-)
-
-# Non-release nodes
-jenkins_nodes(
-    UBUNTU_1604_PREFIX,
-    UBUNTU_1604_COUNT,
-    labels = ["no-release"],
-    tunnel = "jenkins.c.bazel-public.internal:50000",
-)
-
-jenkins_nodes(
-    FREEBSD_11_PREFIX,
-    FREEBSD_11_COUNT,
-    labels = ["no-release"],
-    tunnel = "jenkins.c.bazel-public.internal:50000",
-)
-
-#
-# A deploy slave used for release work and syncing
-# our repositories.
-#
-
-# A little hack to remove path consideration
-DEPLOY_FILES = [
-    "hoedown",
-    "github_release",
-]
-
-genrule(
-    name = "deploy-files",
-    srcs = ["@%s//file" % f for f in DEPLOY_FILES],
-    outs = ["%s.tar.gz" % f for f in DEPLOY_FILES],
-    cmd = "\n".join([
-        "cp $(location @%s//file) $(location %s.tar.gz)" % (f, f)
-        for f in DEPLOY_FILES
-    ]),
-)
-
-docker_build(
-    name = "deploy-base",
-    base = "//base:ubuntu-xenial-amd64-deploy",
-    directory = "/opt/data",
-    env = {
-        # We have to put those files on some secrets volume.
-        "BOTO_CONFIG": "/opt/secrets/boto_config",
-        "GITHUB_TOKEN_FILE": "/opt/secrets/github_token",
-        "GSUTIL": "/opt/data/gsutil/gsutil",
-        "GITHUB_RELEASE": "/opt/data/github-release/github-release",
-        "HOEDOWN": "/opt/data/hoedown/hoedown",
-        "APT_GPG_KEY_PATH": "/opt/secrets/apt-key.sec.gpg",
-        "APT_GPG_KEY_ID_FILE": "/opt/secrets/apt-key.id",
-    },
-    files = [":deploy-files"],
-    volumes = ["/opt/secrets"],
-)
-
-docker_build(
-    name = "deploy-full",
-    base = ":deploy-base",
-    directory = "/opt/run",
-    files = ["setup-deploy.sh"],
-)
-
-jenkins_node(
-    name = "deploy",
-    docker_base = "deploy-full",
-    # Deploy slave have special access, do not allow to get reserved by accident.
-    mode = "EXCLUSIVE",
-    num_executors = 2,
-    visibility = ["//visibility:public"],
-    tunnel = "jenkins.c.bazel-public.internal:50000",
-)
-
-# Jenkins job for Gerrit vetting
-jenkins_job(
-    name = "maintenance/gerrit-verifier",
-    config = "gerrit-verifier.xml.tpl",
-    project_url = "https://bazel-review.googlesource.com",
-    deps = ["gerrit-verifier.groovy"],
-)
-
-#
-# Jenkins permissions
-#
-
-# Public permissions
-PUBLIC_PERMS = [
-    "Hudson.Read",  # Read the public dashboard
-    "Item.Read",  # Read the result of a build
-    "Item.Workspace",  # Read a job workspace
-    "View.Read",  # Read views
-    "Computer.Connect",  # Connect a new node, needed by the node themselves
-]
-
-# Permissions for @google.com emails
-AUTHENTICATED_PERMS = PUBLIC_PERMS
-
-# Permissions for admin users (Beware it is dangerous)
-ADMIN_PERMS = AUTHENTICATED_PERMS + [
-    "Item.Build",  # Launch a build
-    "Item.Cancel",  # Cancel a build
-    "Run.Delete",  # Delete one build's information
-    "Run.Update",  # Run one build's information
-    "View.Configure",  # Configure views
-    "View.Create",  # Create a new view
-    "View.Delete",  # Delete existing view
-    # Dangerous area: touch to nodes
-    "Computer.Disconnect",  # Disconnect a node, normally never needed
-    "Computer.Configure",  # Configure a node, normally never needed
-    "Computer.Delete",  # Delete a node, almost never needed
-    "Computer.Build",  # Build on a node, needed for debugging
-    # Very dangerous area, administer jenkins
-    "Hudson.Administer",  # Only used for restarting jenkins.
-]
-
-PERMS_TEMPLATE = "<permission>hudson.model.%s:%s</permission>"
-
-#
-# Creates the permissions info
-#
-# This is a config file generated by the build.sh script.
-load(":config.bzl", "ADMIN_USERS")
-
-SECURITY_CONFIG = """
-  <useSecurity>true</useSecurity>
-  <authorizationStrategy class="hudson.security.GlobalMatrixAuthorizationStrategy">
-    %s
-  </authorizationStrategy>
-  <securityRealm class="org.jenkinsci.plugins.googlelogin.GoogleOAuth2SecurityRealm" plugin="google-login@1.1">
-    <clientId>##SECRET:google.oauth.clientid##</clientId>
-    <clientSecret>##SECRET:google.oauth.secret##</clientSecret>
-    <domain>google.com</domain>
-  </securityRealm>
-""" % "\n".join([
-    PERMS_TEMPLATE % (perm, "anonymous")
-    for perm in PUBLIC_PERMS
-] + [
-    PERMS_TEMPLATE % (perm, "authenticated")
-    for perm in AUTHENTICATED_PERMS
-] + [
-    PERMS_TEMPLATE % (perm, user)
-    for user in ADMIN_USERS
-    for perm in ADMIN_PERMS
-])
-
-#
-# Finally the Jenkins image
-#
-jenkins_docker_build(
-    name = "jenkins",
-    configs = [
-                  ":config_xml",
-                  ":deploy",
-                  ":jenkins-common-configs",
-                  ":config/org.jenkinsci.plugins.ghprb.GhprbTrigger.xml",
-              ] + jenkins_node_names(DARWIN_PREFIX, DARWIN_COUNT) +
-              jenkins_node_names(FREEBSD_11_PREFIX, FREEBSD_11_COUNT) +
-              jenkins_node_names(WINDOWS_PREFIX, WINDOWS_COUNT) +
-              jenkins_node_names(UBUNTU_1404_PREFIX, UBUNTU_1404_COUNT) +
-              jenkins_node_names(UBUNTU_1604_PREFIX, UBUNTU_1604_COUNT),
-    jobs = [
-        "//jenkins/jobs",
-        ":maintenance/gerrit-verifier",
-    ],
-    tars = ["//jenkins/lib"],
-    visibility = ["//visibility:public"],
-)
-
-expand_template(
-    name = "config_xml",
-    out = "config/config.xml",
-    escape_xml = False,
-    substitutions = {"SECURITY_CONFIG": SECURITY_CONFIG},
-    template = "config/config.xml.tpl",
-    deps = ["//:git-hash"],
-)
-
-expand_template(
-    name = "config_xml-nosecurity",
-    out = "config-nosecurity/config.xml",
-    escape_xml = False,
-    substitutions = {"SECURITY_CONFIG": "<useSecurity>false</useSecurity>"},
-    template = "config/config.xml.tpl",
-    deps = ["//:git-hash"],
-)
-
-filegroup(
-    name = "jenkins-common-configs",
-    srcs = glob(
-        ["config/**"],
-        exclude = [
-            "config/org.jenkinsci.plugins.ghprb.GhprbTrigger.xml",
-            "config/config.xml.tpl",
-        ],
-    ),
-)
diff --git a/jenkins/base/BUILD b/jenkins/base/BUILD
deleted file mode 100644
index ce48c63..0000000
--- a/jenkins/base/BUILD
+++ /dev/null
@@ -1,14 +0,0 @@
-load("@io_bazel_rules_docker//docker:docker.bzl", "docker_build")
-
-docker_build(
-    name = "base",
-    base = "@jenkins//:image",
-    data_path = ".",
-    directory = "/usr/local/bin",
-    entrypoint = [
-        "/bin/bash",
-        "/usr/local/bin/jenkins.sh",
-    ],
-    files = ["jenkins.sh"],
-    visibility = ["//jenkins:__pkg__"],
-)
diff --git a/jenkins/base/jenkins.sh b/jenkins/base/jenkins.sh
deleted file mode 100755
index aa5cb3a..0000000
--- a/jenkins/base/jenkins.sh
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2015 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Script to run Jenkins from the Docker image
-set -eux
-
-# Take file $1 and copy it to file $2, replacing all instance of
-# the string '##SECRET:filename##' by the content of the file
-# 'filename' for each file in /opt/secrets
-function replace_secrets() {
-  if [ "${1##*.}" = "xml" ]; then
-    # Only do replacement for xml files
-    local content="$(cat $1)"
-    for i in /opt/secrets/*; do
-      local bi="$(basename $i)"
-      if echo -n "${content}" | grep -qF "##SECRET:${bi}##"; then
-        content="$(echo -n "${content}" | sed "s|##SECRET:${bi}##|$(cat $i)|g")"
-      fi
-    done
-    # Environment
-    for i in $(compgen -v); do
-      if echo -n "${content}" | grep -qF "##ENV:${i}##"; then
-        local var="$(printenv "$i")"
-        content="$(echo -n "${content}" | sed "s|##ENV:${i}##|${var}|g")"
-      fi
-    done
-    echo -n "${content}" >$2
-  else
-    cp $1 $2
-  fi
-}
-export -f replace_secrets
-
-# Remove existing jobs configuration so we delete jobs
-# We do not use find because it goes too deep, use a function instead
-delete_jobs() {
-  for i in "$1/jobs/"*; do
-    if [ -d "$i" ]; then
-      if [ -f "$i/config.xml" ]; then
-        rm -f "$i/config.xml"
-      fi
-      delete_jobs "$i"
-    fi
-  done
-}
-delete_jobs /var/jenkins_home
-
-# Same for nodes
-rm -rf /var/jenkins_home/nodes
-# Remove existing plugins to ensure update of plugins
-rm -fr /var/jenkins_home/plugins
-
-# Copy the configuration files provided in the docker image
-(cd /usr/share/jenkins/ref && \
-    find ./ -type f -exec bash -c \
-    "mkdir -p /var/jenkins_home/\$(dirname '{}'); \
-     rm -f '/var/jenkins_home/{}'; \
-     replace_secrets '/usr/share/jenkins/ref/{}' '/var/jenkins_home/{}'" \;)
-
-# Transform /opt/lib to a git repository if exists to be used
-# as a pipeline library (GitSCM).
-if [ -d "/opt/lib" ]; then
-  (cd /opt/lib && \
-      git init && \
-      git config user.email "nobody@nowhere.local" && \
-      git config user.name "Nobody" && \
-      git add . && \
-      git commit -m "Jenkins library: commit from container")
-fi
-
-# Execute Jenkins
-JAVA_OPTS="${JAVA_OPTS-} -Dorg.jenkinsci.plugins.ghprb.GhprbTrigger.disableRegisterOnStartup=true"
-exec java ${JAVA_OPTS-} -jar /usr/share/jenkins/jenkins.war ${JENKINS_OPTS-} "$@"
diff --git a/jenkins/base/jenkins_base.bzl b/jenkins/base/jenkins_base.bzl
deleted file mode 100644
index 35aed52..0000000
--- a/jenkins/base/jenkins_base.bzl
+++ /dev/null
@@ -1,83 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Some definition to create a base image for jenkins in docker
-
-load("@io_bazel_rules_docker//docker:docker.bzl", "docker_pull")
-
-JENKINS_PLUGINS_URL = "http://updates.jenkins-ci.org/download/plugins/{name}/{version}/{name}.hpi"
-
-def _jenkins_image_impl(repository_ctx):
-  repository_ctx.file("plugins/BUILD", """
-load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_tar")
-pkg_tar(
-    name = "plugins",
-    srcs = glob(["**/*.jpi"]),
-    mode = "0644",
-    strip_prefix = ".",
-    package_dir = "/usr/share/jenkins/ref/plugins",
-    visibility = ["//:__pkg__"],
-)
-""")
-  for plugin in repository_ctx.attr.plugins:
-    config = repository_ctx.attr.plugins[plugin]
-    dest = "plugins/" + plugin + ".jpi"
-    repository_ctx.download(
-        JENKINS_PLUGINS_URL.format(name=plugin, version=config[0]), dest,
-        config[1])
-    if len(config) >= 3 and config[2] == "pinned":
-      repository_ctx.file(dest + ".pinned", "")
-  repository_ctx.file("BUILD", """
-load("@io_bazel_rules_docker//docker:docker.bzl", "docker_build")
-
-docker_build(
-  name = "image",
-  base = "{base}",
-  tars = ["//plugins"],
-  directory = "/",
-  volumes = [{volumes}],
-  visibility = ["//visibility:public"],
-)
-""".format(
-  base = repository_ctx.attr.base,
-  volumes = ", ".join(['"%s"' % f for f in repository_ctx.attr.volumes])
-))
-
-jenkins_image_ = repository_rule(
-    implementation = _jenkins_image_impl,
-    attrs = {
-        "base": attr.string(mandatory=True),
-        "plugins": attr.string_list_dict(mandatory=True),
-        "volumes": attr.string_list(default=[]),
-    })
-
-def jenkins_base(name, plugins, volumes=[], digest=None, version="1.642.4"):
-  base = "jenkins_" + version.replace(".", "_")
-  if not native.existing_rule(base):
-    kwargs = {}
-    if digest:
-      kwargs["digest"] = digest
-    else:
-      kwargs["tag"] = version
-    docker_pull(
-        name = base,
-        registry = "index.docker.io",
-        repository = "jenkins/jenkins",
-        **kwargs
-    )
-  jenkins_image_(
-      name=name,
-      plugins=plugins,
-      base="@%s//image" % base,
-      volumes=volumes)
diff --git a/jenkins/base/plugins.bzl b/jenkins/base/plugins.bzl
deleted file mode 100644
index 2edbd3e..0000000
--- a/jenkins/base/plugins.bzl
+++ /dev/null
@@ -1,234 +0,0 @@
-# Copyright 2015 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Plugins for Jenkins
-JENKINS_PLUGINS = {
- 'ace-editor': ['1.1',
-                'abc97028893c8a71581a5f559ea48e8e1f1a65164faee96dabfed9e95e9abad2'],
- 'ansicolor': ['0.5.2',
-               '726c651a3ac8d080ff4aa5b962dd8b264801b8a3fde027da07fa1be30c709b31'],
- 'apache-httpcomponents-client-4-api': ['4.5.3-2.1',
-                                        '998f57d1fb0ea9558706c8c4fe34f82d43ea70b8642884edb4357e694faa1079'],
- 'authentication-tokens': ['1.3',
-                           'f05736bc7da0df3bba5ceb4d893089706812ced3134adb2edc9ae341467f1ae3'],
- 'blueocean': ['1.4.0',
-               '9aafd3b29d0d4cfd8755aa1c6d893e61a6dfd8101c573f3d680e39c8a0da44b5'],
- 'blueocean-autofavorite': ['1.2.1',
-                            '91863ba4b29842c667a3cd264e5cd4e922e1770523a69f8cf903e54ea3441cd7'],
- 'blueocean-bitbucket-pipeline': ['1.4.0',
-                                  'a1c744dd16eef1ba7ce7f29bd67bb82246f0814786000a6deb5dace16378c880'],
- 'blueocean-commons': ['1.4.0',
-                       '8d1e6f100734660544c7cf126ddcc958e8721ac2c907b8413a8128e3425dfd43'],
- 'blueocean-config': ['1.4.0',
-                      'c57f2f23c32eec10577382b221ff06cdea1bb13a96c8cd1cbc65d4b296f4f0cf'],
- 'blueocean-core-js': ['1.4.0',
-                       'd372a49dbecab17e1519dec9111bfe758b444aa65bd9b1812129e1d5f9939015'],
- 'blueocean-dashboard': ['1.4.0',
-                         '48648e3911791aaccfa10b97e57f8e9320f0441a053f40cc81f3f8c71f88fbc7'],
- 'blueocean-display-url': ['2.2.0',
-                           '4392cff3f4d75c678abadb7aad040b782be7ea61c5c87bdd5e3a62fa633e10ca'],
- 'blueocean-events': ['1.4.0',
-                      '95fe2b28f7f5594526c8d9a280dbdf9418893becac90e21fb69162d3961bac6a'],
- 'blueocean-git-pipeline': ['1.4.0',
-                            '3f8adfbf23d6c8f57e8023a8daa0ae9ef382ec1811790f3c871ca5b3b9a041f1'],
- 'blueocean-github-pipeline': ['1.4.0',
-                               '567ecb28b55d4926d123ea106b26d555519a8939f3c1c885f93740b756ebc859'],
- 'blueocean-i18n': ['1.4.0',
-                    '2d7e065fc8ed026480769e4e6822f92ceacf8e507434ff058580b33636eb38da'],
- 'blueocean-jira': ['1.4.0',
-                    'f82ddb6aa8cee3fde484debc8a0967e998e467d6abf422d0dc31221c9d37e3fc'],
- 'blueocean-jwt': ['1.4.0',
-                   'c80347ade396bbb699fd1048fa0b67429244e67c953b301d54665e451ba90e4c'],
- 'blueocean-personalization': ['1.4.0',
-                               'dd9d311467f86401ae7c9990ddeb1b6402960758e0941fa17edbd6a2c4858406'],
- 'blueocean-pipeline-api-impl': ['1.4.0',
-                                 '4c8d2003983efad187f9ac32ecf606c0cae66fecd3f90d4023eaf93132f59416'],
- 'blueocean-pipeline-editor': ['1.4.0',
-                               'ef91c098bb90086b6dea1a87fe8649382849dfdbb4d9d9fe8a3bc5acedae4d8d'],
- 'blueocean-pipeline-scm-api': ['1.4.0',
-                                '4676d8e1a8d38e3f98af9eb67d63ee418ea62f43a5bdbfacbb8efc51ac6264b3'],
- 'blueocean-rest': ['1.4.0',
-                    '891d18b90d06ea383e5ff38a855b49b7077dc453a3c4d0af4b642832a6641e70'],
- 'blueocean-rest-impl': ['1.4.0',
-                         'e64d9eb32c4703f68802613e8b1a17184acf8d374855fe188338fb7ed0261523'],
- 'blueocean-web': ['1.4.0',
-                   '63b286c545716bd986e13e4e201815f2f91ca588d839345eab59bc5f8a915b9e'],
- 'bouncycastle-api': ['2.16.2',
-                      '6130c9a7132dfe50bde27e256942a7a45f568817e3ad9d5d40ce95330076fad6'],
- 'branch-api': ['2.0.18',
-                'a338715ff2006ec7d7f92d4897fa9d40769adf7ec3dc726aba494f505dec5c31'],
- 'build-monitor-plugin': ['1.12+build.201708172343',
-                          '1b00d08120d2a7b1ac8a0c8eec83cd224a103cf8c2c7e60aa87d470690d9ee5c'],
- 'build-timeout': ['1.19',
-                   'a92b43adb9c668e3fd0ad307db43c2277cf15ea75c084b5bdc74fb294f80583d'],
- 'cloudbees-bitbucket-branch-source': ['2.2.9',
-                                       '74687f0c9b51a9a9ae4b26958e44d9011a4dd9a3c7cec7013187c5dd9ef0337c'],
- 'cloudbees-folder': ['6.3',
-                      '4f21d3dedd352fe1fb0c6adea1d39dcb190180615e5cc5aa5ffac18b47c5a71a'],
- 'conditional-buildstep': ['1.3.6',
-                           '4b550bc136fe66bb4eb396605f4036935963327b9c94662f7c441888adb99f77'],
- 'copyartifact': ['1.39',
-                  '5014383a87922b6c2915c6323d43685801f0272e4e311dd4584fd4ac48c1e520'],
- 'credentials': ['2.1.16',
-                 'b151673bb77ef585900d901684a4197c3018b6baa83ddd0dac8327e42aedfef9'],
- 'credentials-binding': ['1.15',
-                         'c973fd463308e9777ccc55df94b8cdc217e06e2f9211d225aef886c1d23bc844'],
- 'display-url-api': ['2.2.0',
-                     'f9a7acb09a0c649d2cfe25ed52d6a974e664f3a00e76d9dccf24f845d20bb754'],
- 'docker-commons': ['1.11',
-                    '4cbb7cec0ceaec1b398b2f3620bcaf1116e177802c6f3339e0b3d176547a3998'],
- 'docker-workflow': ['1.15',
-                     '6658aea35784ff821cc8a5ac4567e1c34c19f5fd02f4d53cdb3f408301c72e0d'],
- 'durable-task': ['1.17',
-                  '54b0c95d15508274e583952e5056a34424b464530caa9483736134b5c96eef20'],
- 'email-ext': ['2.61',
-               '46a8a2cbfac75e086af031667b5eac459854b4646be13b5442df47e945c13e58'],
- 'embeddable-build-status': ['1.9',
-                             '9d950ce4bfdcb67e1b1198ea2b54e18de95ec3214b1cf1135141b5b54a62edb2'],
- 'fail-the-build-plugin': ['1.0',
-                           'c97db02dc6fef269780b77d2001a9bfb49bcdc9ac2ee242cd10445709bb7d09e'],
- 'favorite': ['2.3.1',
-              'b847647271830a3cec63035dea8fffe79b91331678cd306967cbc64227d4db28'],
- 'ghprb': ['1.40.0',
-           '58e9411089233a6630a11623a557c385c2271b64a9c57fe3ad8decf1adb600b2'],
- 'git': ['3.7.0',
-         '1cb33ab6027557d54bb6fb8ee31c211bef9ff217b71166f8423ba20fa7e7137c'],
- 'git-client': ['2.7.1',
-                '192f32b9d8c60c2471d99517b512316c2398e582eeb153290508b4319d7b03ab'],
- 'git-parameter': ['0.9.0',
-                   '329d5dad9bd84bcf75e396a0be73cfc6cfcc9ab0ee75bb505777f32991d57574'],
- 'git-server': ['1.7',
-                '1a5dc733495681a6d1a6adce07e614e50f4e5d22580e6fafbd5ca260aa4367fc'],
- 'github': ['1.29.0',
-            '041d244289810f4adfa320563db4db7444cbeafb9563ea2f2167a13aa0009350'],
- 'github-api': ['1.90',
-                '8ec10c98b4cc103d826e2e2a101b4bf44b3b91b395c33de7448003431ba736ce'],
- 'github-branch-source': ['2.3.2',
-                          '107951a8b3baa2964d045a009aa7c50de2a6329f35da0227e3f66caa0a4710b5'],
- 'google-login': ['1.3',
-                  '4b1482347ddd0a2a54c1fdedfe46a519cc2ada60dfc774d2435f554287c52d25'],
- 'greenballs': ['1.15',
-                '6c3722fb9ce2a446f0266e1911d87ef50898a10f38890bb6963e7e1e1c4296fb'],
- 'handlebars': ['1.1.1',
-                'bc5cc7b3eca17ba6cec0a8def94f3aa78ad7a19387a19aa3a56f857a18966afa'],
- 'handy-uri-templates-2-api': ['2.1.6-1.0',
-                               '09446d387f5e87a846469334579292f3047b3d4cabf3dd05cd057a2f34b39814'],
- 'htmlpublisher': ['1.14',
-                   '08802f5f0a3915ac06432f432f2d4e5b051f1c976fd6251d7696b0f98ac02771'],
- 'jackson2-api': ['2.8.10.1',
-                  'ea5cda3192e890500d1c09a123962cd576e2a6c8946f9f720511493b0cd7666a'],
- 'javadoc': ['1.4',
-             '2236e563d057a98b1bb2e56975756a008986289aa01a61c4655a31b62c760a22'],
- 'jenkins-design-language': ['1.4.0',
-                             '80f4951adcf7c2a58804b21d44cf31213623cee4fc3af8cb649f60bf88f82de9'],
- 'jira': ['2.5',
-          'cee72ce7d24e0c0b7ec0404322c6ea3fe84947265de77adaa19785cd6d13832c'],
- 'jquery': ['1.12.4-0',
-            'fdfb8c7b0370ecaf10985c8be8dd3f7f651c3bddd84c709df14c26508d2aeb1e'],
- 'jquery-detached': ['1.2.1',
-                     'a05273cd20c11557ffcb7dcb75150f21d35dc8be28355548b831c2960d7f11c0'],
- 'jsch': ['0.1.54.1',
-          '5e979207485bd7c7c42eb2b1ff5dac4e5c10e6d717b89ab2a1052c404d6963bb'],
- 'junit': ['1.24',
-           '9a65d385aa88705f9639777f326c5a0f8052ef4367c440d23e3430e1e42803fa'],
- 'mailer': ['1.20',
-            'e78b7bb32957d11dcf58e57f2d7b60903bf31ace7858d19febb3b11a374a1187'],
- 'matrix-auth': ['2.2',
-                 '56ea5d8313f3481196d73c60367eab037005d37d2b2aa8b40ac0abeb21d7c86f'],
- 'matrix-project': ['1.12',
-                    'bc3300877704d41d42813d6cef18ea017dcb4be5e8faae45a7da4ce6c9b540e1'],
- 'maven-plugin': ['3.1',
-                  'c937c1a4f1991104a7d7a30ddc5abf7e8dde79918b6bf7947d79f046b683231c'],
- 'mercurial': ['2.2',
-               '7b22e37164107e4dca7b2970a14cf8a1a2d7e7be7ebee29868ed0f617e4b7931'],
- 'metrics': ['3.1.2.10',
-             'e694a10ea265186775c37fd1dc6b7ec66de864ef5d57dcd6b92fb61158814a40'],
- 'momentjs': ['1.1.1',
-              'ca3c2d264cff55f71e900dc7de1f13c0bfbffdb9b3419b854dce175bcb8a4848'],
- 'nodelabelparameter': ['1.7.2',
-                        '0f556ae48573db6bae28b24eae561121ed9931e8b1bc31ac4e586bc8d3238edf'],
- 'parameterized-trigger': ['2.35.2',
-                           '36228ae6c41cf828cf472deabaeff50f8b4e9b69e742deab38d4a9b9a093fd97'],
- 'pipeline-build-step': ['2.7',
-                         'd02fd27988328435c0bc4211e4e45fee88b28b5d633c3bbce6cb4dca9480a9cb'],
- 'pipeline-graph-analysis': ['1.6',
-                             'a20cedaa0b847f31cf88b51ee490c49eea8aa1052511b12d5af2a140af45e7e3'],
- 'pipeline-input-step': ['2.8',
-                         '8e9fa1654ec0c0ec726c894b079828737b8ce6d9ea3d05cd4378c37acc3235db'],
- 'pipeline-milestone-step': ['1.3.1',
-                             'd3a26629b656821c60a14fe403ab8afc50f084e338406dbc27e2b6b403f7cb20'],
- 'pipeline-model-api': ['1.2.7',
-                        '7101529b2838d28a114c3fce48d52ab943adc7667e2fbbee2845f5f62be184a1'],
- 'pipeline-model-declarative-agent': ['1.1.1',
-                                      'd5540c3973bf5f568910f93b3a002c413148b9d3dd4211ce5faf4a2a1214d4ef'],
- 'pipeline-model-definition': ['1.2.7',
-                               '2a9efd78e535726fcad701df1a33e6c91ad5ca2a46711c76f026d2f56fbff6b3'],
- 'pipeline-model-extensions': ['1.2.7',
-                               '278853b8ddb95bc8b767bdd9b0b412f86389a6c377f6c58d84c317bd1ce3a5f2'],
- 'pipeline-rest-api': ['2.9',
-                       '38d9f5dd0750a3ce3113ff3eeed32864ed4e0655ec5e3a5556f529d8c3cf86a8'],
- 'pipeline-stage-step': ['2.3',
-                         'f6caab90742664289b0cb57b27755c3b8b963c3764894129fb954efbf796d310'],
- 'pipeline-stage-tags-metadata': ['1.2.7',
-                                  '0c7b805b5660ac5370646795564a1525da9044542b1ddaeabecaa320a0882b80'],
- 'pipeline-stage-view': ['2.9',
-                         '52879f4fc756bbe95c5ef9802ef9da15c4938833555046b23c9fc78c914b6525'],
- 'plain-credentials': ['1.4',
-                       '4f1834f99ffd7f2a7db1972fe46ee42d06af819b27297193ac89eb33a14292d8'],
- 'pubsub-light': ['1.12',
-                  '666cbc579d82849bef8d0396a57335c9994222e8b0ba52f07be76dab9fb56c40'],
- 'run-condition': ['1.0',
-                   '4e55ebf4bde1202784404d856f98f7de85470ed145cde06feb45f641891780fb'],
- 'sauce-ondemand': ['1.171',
-                    '5a7a1e1eccb199d82227e41e9bce655d33b2e33219f40a9cd0c884780cc26ae8'],
- 'scm-api': ['2.2.6',
-             'be7cb7c513ebeb361a8ccb5c636541313c1c54b3119566b969fe10a3552cca14'],
- 'script-security': ['1.40',
-                     '058912d20896b44658141f350a5f061fae9042c1a1b9d1e2cd764f62816fdd99'],
- 'sse-gateway': ['1.15',
-                 '56b19b7a48f646dc8269bae4aca41ec11f71756d618d302b1f8b9d688441850f'],
- 'ssh-agent': ['1.15',
-               'd1c955b883a3e82522a1b97ff044812193bc325c5eb095e23ba8673c2b16e181'],
- 'ssh-credentials': ['1.13',
-                     'd4f979223cc543dfd9bf72a1177471bb08748d2c79e1115d7bb12198bbbf2010'],
- 'structs': ['1.13',
-             '7e788b7c254d1188c8b6cec89260f0756ffa3839f36925c99ec302f851a62a15'],
- 'test-results-analyzer': ['0.3.4',
-                           'b3aa8c11d59a5c1ac007f86a054a259766bc64ee0ad91be0c2dd1981bce3c6f8'],
- 'token-macro': ['2.3',
-                 'c3da743e97e958dcbe7f9a41c64ee693c3174824be7faf2ad4625d3dcc7d17f8'],
- 'variant': ['1.1',
-             '971893fb05da213631b8ea977a32a5d4953f1cb7ab6fbdec9020d503550275ff'],
- 'windows-slaves': ['1.3.1',
-                    '4364f88286745a48962b86b53df3739a6978886e72ec83289a3cfc750f1adcc6'],
- 'workflow-api': ['2.25',
-                  'f92fe4de3c4cb814833a875b070844d540f3401b27e1683ac153bf128b35c5c3'],
- 'workflow-basic-steps': ['2.6',
-                          'ba6bc7f586b902ba6aacae571a8ae78916e7f3e106d8a7da14c348ea933f0016'],
- 'workflow-cps': ['2.44',
-                  'ac3bf296bb811c2bbedc46b956b3b5ceee716903bcee10aaf51e4891328f1704'],
- 'workflow-cps-global-lib': ['2.9',
-                             'b5a141c4896be15e09d76fc5b60df3fe701e94d2c2d2015a99ca5147a78b09d1'],
- 'workflow-durable-task-step': ['2.18',
-                                '8643e6fe9bbcc06151cc0b392854649b5d078bde562e81700582531b4c569231'],
- 'workflow-job': ['2.17',
-                  '054f7b128a96628c19d3cb92cae44f70b7eb89c065ea2d7af76e351a7d8fd3a9'],
- 'workflow-multibranch': ['2.17',
-                          '51e37b5016541cb73c2fd9334ab5c25d505900657be0b007b27a3aaa5f52e3c3'],
- 'workflow-scm-step': ['2.6',
-                       'a382864adaf0fc80d58243568157a1450028e6d0503a03b81111d4c4de8275d0'],
- 'workflow-step-api': ['2.14',
-                       '4a0c25d4bb9f985a786774f14c1bdaa02853173e18ad40d49dd13d4c7c8f420e'],
- 'workflow-support': ['2.18',
-                      'bafb72d98af4ffb8fd2836d06dba4bdb117eb394fa1f302a071a373a32d4264f']}
diff --git a/jenkins/base/update_plugins.py b/jenkins/base/update_plugins.py
deleted file mode 100644
index 56db5a8..0000000
--- a/jenkins/base/update_plugins.py
+++ /dev/null
@@ -1,112 +0,0 @@
-#!/usr/bin/env python3
-
-import hashlib
-import importlib.machinery
-import json
-import os
-import os.path
-import pprint
-import sys
-import types
-import urllib.request
-
-CACHE_DIR = os.path.expanduser("~/.update_jenkins_plugins")
-
-def get_json_url(name):
-  return "https://plugins.jenkins.io/api/plugin/%s" % name
-
-def get_download_url(name, version):
-  return "http://updates.jenkins-ci.org/download/plugins/%s/%s/%s.hpi" % (name, version, name)
-
-def download_url(url):
-  h = hashlib.sha256(url.encode("utf-8")).hexdigest()
-  fname = os.path.join(CACHE_DIR, h)
-  try:
-    with open(fname, "rb") as f:
-      return f.read()
-  except OSError:
-    with open(fname, "wb") as f:
-      data = urllib.request.urlopen(url).read()
-      f.write(data)
-      return data
-
-def get_plugin_sha256(name, version):
-  url = get_download_url(name, version)
-  data = download_url(url)
-  return hashlib.sha256(data).hexdigest()
-
-def load_plugins_bzl():
-  # Load the current plugins.bzl.
-  loader = importlib.machinery.SourceFileLoader("plugins", "plugins.bzl")
-  plugins = types.ModuleType(loader.name)
-  loader.exec_module(plugins)
-  return plugins.JENKINS_PLUGINS
-
-def get_plugin_json(name):
-  url = get_json_url(name)
-  data = download_url(url)
-  return json.loads(data.decode("utf-8"))
-
-os.makedirs(CACHE_DIR, exist_ok=True)
-
-plugins = load_plugins_bzl()
-
-# Update all plugins to the latest version.
-current_versions = {name: metadata[0] for name, metadata in plugins.items()}
-queue = [(name, metadata) for name, metadata in plugins.items()]
-new_plugins = {}
-rdeps = {}
-
-while queue:
-  name, metadata = queue.pop(0)
-
-  if name in new_plugins:
-    continue
-
-  # Get information from the Jenkins API.
-  plugin_json = get_plugin_json(name)
-  latest_version = plugin_json["version"]
-
-  if name not in current_versions:
-    print("New plug-in: %s (%s)" % (name, latest_version), file=sys.stderr)
-    new_plugins[name] = [latest_version, get_plugin_sha256(name, latest_version)]
-  elif current_versions[name] != latest_version:
-    print("Updated plug-in: %s (%s -> %s)" % (name, metadata[0], latest_version), file=sys.stderr)
-    new_plugins[name] = [latest_version, get_plugin_sha256(name, latest_version)]
-  else:
-    print("Unchanged plug-in: %s (%s)" % (name, metadata[0]), file=sys.stderr)
-    new_plugins[name] = metadata[0:2]
-
-  for dep in plugin_json['dependencies']:
-    if dep["optional"]:
-      continue
-
-    queue.append((dep["name"], None))
-    if dep["name"] not in rdeps:
-      rdeps[dep["name"]] = []
-    rdeps[dep["name"]].append(name)
-
-for name, metadata in new_plugins.items():
-  if name in rdeps:
-    print("%s is depended on by %s" % (name, sorted(rdeps[name])), file=sys.stderr)
-  else:
-    print("%s is depended on by nothing" % name, file=sys.stderr)
-
-# Generate a new plugins.bzl.
-print("""# Copyright 2015 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Plugins for Jenkins
-JENKINS_PLUGINS = {
- %s""" % pprint.pformat(new_plugins)[1:])
diff --git a/jenkins/build_defs/BUILD b/jenkins/build_defs/BUILD
deleted file mode 100644
index c5d9fa2..0000000
--- a/jenkins/build_defs/BUILD
+++ /dev/null
@@ -1,12 +0,0 @@
-load("//jenkins/lib:def.bzl", "bazel_job_configuration_test")
-
-exports_files(glob([
-    "bazel-job*.tpl",
-    "folder.xml",
-    "default.json",
-]))
-
-bazel_job_configuration_test(
-    name = "default-config-test",
-    configs = ["default.json"],
-)
diff --git a/jenkins/build_defs/bazel-job-Gerrit.xml.tpl b/jenkins/build_defs/bazel-job-Gerrit.xml.tpl
deleted file mode 100644
index 6602948..0000000
--- a/jenkins/build_defs/bazel-job-Gerrit.xml.tpl
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<flow-definition plugin="workflow-job">
-  <actions/>
-  <description>Test Gerrit code review for {{ variables.PROJECT_NAME }}.
-
-This job is for testing changes submitted to the Gerrit project: {{ variables.GERRIT_PROJECT }}.
-</description>
-  <keepDependencies>false</keepDependencies>
-  <properties>
-    {% if variables.RUN_SEQUENTIAL == "true" %}
-    <org.jenkinsci.plugins.workflow.job.properties.DisableConcurrentBuildsJobProperty/>
-    {% endif %}
-    <jenkins.model.BuildDiscarderProperty>
-      <strategy class="hudson.tasks.LogRotator">
-        <daysToKeep>90</daysToKeep>
-        <numToKeep>-1</numToKeep>
-        <artifactDaysToKeep>-1</artifactDaysToKeep>
-        <artifactNumToKeep>-1</artifactNumToKeep>
-      </strategy>
-    </jenkins.model.BuildDiscarderProperty>
-    {% if variables.github == "True" %}
-    <com.coravy.hudson.plugins.github.GithubProjectProperty>
-      <projectUrl>{{ variables.GITHUB_URL }}</projectUrl>
-    </com.coravy.hudson.plugins.github.GithubProjectProperty>
-    {% endif %}
-    <hudson.model.ParametersDefinitionProperty>
-      <parameterDefinitions>
-        <hudson.model.StringParameterDefinition>
-          <name>REFSPEC</name>
-          <description>Refs to pull</description>
-          <defaultValue>+refs/heads/*:refs/remotes/origin/*</defaultValue>
-        </hudson.model.StringParameterDefinition>
-        <hudson.model.StringParameterDefinition>
-          <name>BRANCH</name>
-          <description>Branch to build</description>
-          <defaultValue>master</defaultValue>
-        </hudson.model.StringParameterDefinition>
-        <hudson.model.StringParameterDefinition>
-          <name>CHANGE_NUMBER</name>
-          <description>Number of the change being tested, for information only.</description>
-          <defaultValue>no-change</defaultValue>
-        </hudson.model.StringParameterDefinition>
-      </parameterDefinitions>
-    </hudson.model.ParametersDefinitionProperty>
-    <org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-      <triggers/>
-    </org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-  </properties>
-  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps">
-    <script><![CDATA[
-gerritReview("https://bazel-review.googlesource.com/",
-    "/opt/secrets/gerritcookies",
-    "Bazel CI <ci.bazel@gmail.com>",
-    params.CHANGE_NUMBER,
-    params.BRANCH) {
-    bazelCiConfiguredJob(
-        repository: "https://bazel.googlesource.com/{{ variables.GERRIT_PROJECT }}",
-        branch: params.BRANCH,
-        refspec: params.REFSPEC,
-        bazel_version: "latest",
-        configuration: '''{{ raw_imports['JSON_CONFIGURATION'].replace('\\', '\\\\').replace("'", "\\'") }}''',
-        workspace: "{{ variables.WORKSPACE }}",
-        {% if variables.SAUCE_ENABLED == "true" %}
-        sauce: "61b4846b-279d-4369-ae20-31e9d8b9bc66",
-        {% endif %}
-        run_sequentially: {{ variables.RUN_SEQUENTIAL }}
-    )
-}
-    ]]></script>
-    <sandbox>true</sandbox>
-  </definition>
-  <triggers/>
-  <quietPeriod>5</quietPeriod>
-  <disabled>{{ variables.disabled }}</disabled>
-</flow-definition>
diff --git a/jenkins/build_defs/bazel-job-Global.xml.tpl b/jenkins/build_defs/bazel-job-Global.xml.tpl
deleted file mode 100644
index df2a4a1..0000000
--- a/jenkins/build_defs/bazel-job-Global.xml.tpl
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<flow-definition plugin="workflow-job">
-  <actions/>
-  <description>Test the {{ variables.PROJECT_NAME }} project located at {{ variables.GIT_URL }}.
-
-  Job for Global tests with Bazel at HEAD.
-  </description>
-  <keepDependencies>false</keepDependencies>
-  <properties>
-    {% if variables.RUN_SEQUENTIAL == "true" %}
-    <org.jenkinsci.plugins.workflow.job.properties.DisableConcurrentBuildsJobProperty/>
-    {% endif %}
-    {% if variables.github == "True" %}
-    <com.coravy.hudson.plugins.github.GithubProjectProperty>
-      <projectUrl>{{ variables.GITHUB_URL }}</projectUrl>
-    </com.coravy.hudson.plugins.github.GithubProjectProperty>
-    {% endif %}
-    <hudson.model.ParametersDefinitionProperty>
-      <parameterDefinitions>
-        <hudson.model.TextParameterDefinition>
-          <name>EXTRA_BAZELRC</name>
-          <description>Extraneous content for the .bazelrc file</description>
-          <defaultValue></defaultValue>
-        </hudson.model.TextParameterDefinition>
-{% if variables.GLOBAL_USE_UPSTREAM_BRANCH == "True" %}
-        <hudson.model.StringParameterDefinition>
-          <name>REPOSITORY</name>
-          <description>Repository to build</description>
-          <defaultValue>{{ variables.GIT_URL }}</defaultValue>
-        </hudson.model.StringParameterDefinition>
-        <hudson.model.StringParameterDefinition>
-          <name>BRANCH</name>
-          <description>Branch to build</description>
-          <defaultValue>{{ variables.BRANCH }}</defaultValue>
-        </hudson.model.StringParameterDefinition>
-        <hudson.model.TextParameterDefinition>
-          <name>REFSPEC</name>
-          <description>Refspec to fetch</description>
-          <defaultValue>+refs/heads/*:refs/remotes/origin/*</defaultValue>
-        </hudson.model.TextParameterDefinition>
-{% endif %}
-      </parameterDefinitions>
-    </hudson.model.ParametersDefinitionProperty>
-    <org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-      <triggers/>
-    </org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-  </properties>
-  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps">
-    <script><![CDATA[
-bazelCiConfiguredJob(
-    bazel_version: "custom",
-{% if variables.GLOBAL_USE_UPSTREAM_BRANCH == "True" %}
-    repository: params.REPOSITORY,
-    refspec: params.REFSPEC,
-    branch: params.BRANCH,
-{% else %}
-    repository: "{{ variables.GIT_URL }}",
-    branch: "{{ variables.BRANCH }}",
-{% endif %}
-    extra_bazelrc: params.EXTRA_BAZELRC,
-    configuration: '''{{ raw_imports['JSON_CONFIGURATION'].replace('\\', '\\\\').replace("'", "\\'") }}''',
-    workspace: "{{ variables.WORKSPACE }}",
-    {% if variables.SAUCE_ENABLED == "true" %}
-    sauce: "61b4846b-279d-4369-ae20-31e9d8b9bc66",
-    {% endif %}
-    run_sequentially: {{ variables.RUN_SEQUENTIAL }}
-)
-    ]]></script>
-    <sandbox>true</sandbox>
-  </definition>
-  <triggers/>
-  <disabled>{{ variables.disabled }}</disabled>
-</flow-definition>
diff --git a/jenkins/build_defs/bazel-job-PR.xml.tpl b/jenkins/build_defs/bazel-job-PR.xml.tpl
deleted file mode 100644
index 8e505a0..0000000
--- a/jenkins/build_defs/bazel-job-PR.xml.tpl
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<flow-definition plugin="workflow-job">
-  <actions/>
-  <description>Test Github pull requests for {{ variables.PROJECT_NAME }}.</description>
-  <keepDependencies>false</keepDependencies>
-  <properties>
-    {% if variables.RUN_SEQUENTIAL == "true" %}
-    <org.jenkinsci.plugins.workflow.job.properties.DisableConcurrentBuildsJobProperty/>
-    {% endif %}
-    <jenkins.model.BuildDiscarderProperty>
-      <strategy class="hudson.tasks.LogRotator">
-        <daysToKeep>90</daysToKeep>
-        <numToKeep>-1</numToKeep>
-        <artifactDaysToKeep>-1</artifactDaysToKeep>
-        <artifactNumToKeep>-1</artifactNumToKeep>
-      </strategy>
-    </jenkins.model.BuildDiscarderProperty>
-    <com.coravy.hudson.plugins.github.GithubProjectProperty>
-      <projectUrl>{{ variables.GITHUB_URL }}</projectUrl>
-    </com.coravy.hudson.plugins.github.GithubProjectProperty>
-    <org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-      <triggers>
-        <org.jenkinsci.plugins.ghprb.GhprbTrigger>
-          <spec>H/5 * * * *</spec>
-          <configVersion>3</configVersion>
-          <adminlist></adminlist>
-          <allowMembersOfWhitelistedOrgsAsAdmin>true</allowMembersOfWhitelistedOrgsAsAdmin>
-          <orgslist>google bazelbuild abseil</orgslist>
-          <cron>H/5 * * * *</cron>
-          <buildDescTemplate></buildDescTemplate>
-          <onlyTriggerPhrase>false</onlyTriggerPhrase>
-          <useGitHubHooks>true</useGitHubHooks>
-          <permitAll>false</permitAll>
-          <whitelist></whitelist>
-          <autoCloseFailedPullRequests>false</autoCloseFailedPullRequests>
-          <displayBuildErrorsOnDownstreamBuilds>false</displayBuildErrorsOnDownstreamBuilds>
-          <whiteListTargetBranches>
-            <org.jenkinsci.plugins.ghprb.GhprbBranch>
-              <branch></branch>
-            </org.jenkinsci.plugins.ghprb.GhprbBranch>
-          </whiteListTargetBranches>
-          <blackListTargetBranches>
-            <org.jenkinsci.plugins.ghprb.GhprbBranch>
-              <branch></branch>
-            </org.jenkinsci.plugins.ghprb.GhprbBranch>
-          </blackListTargetBranches>
-          <gitHubAuthId>58f0694f-1760-4610-b4f2-73ffb34c61a3</gitHubAuthId>
-          <triggerPhrase></triggerPhrase>
-          <skipBuildPhrase>.*\[skip\W+ci\].*</skipBuildPhrase>
-          <blackListCommitAuthor></blackListCommitAuthor>
-          <blackListLabels></blackListLabels>
-          <whiteListLabels></whiteListLabels>
-          <includedRegions></includedRegions>
-          <excludedRegions></excludedRegions>
-          <extensions>
-            <org.jenkinsci.plugins.ghprb.extensions.status.GhprbSimpleStatus>
-              <commitStatusContext>ci.bazel.build - {{ variables.NAME }}</commitStatusContext>
-              <triggeredStatus></triggeredStatus>
-              <startedStatus></startedStatus>
-              <statusUrl>${RUN_DISPLAY_URL}</statusUrl>
-              <addTestResults>false</addTestResults>
-            </org.jenkinsci.plugins.ghprb.extensions.status.GhprbSimpleStatus>
-          </extensions>
-        </org.jenkinsci.plugins.ghprb.GhprbTrigger>
-      </triggers>
-    </org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-  </properties>
-  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps">
-    <script><![CDATA[
-    bazelCiConfiguredJob(
-        repository: "{{ variables.GIT_URL }}",
-        branch: env.sha1,
-        refspec: "+refs/pull/*:refs/remotes/origin/pr/*",
-        bazel_version: "latest",
-        configuration: '''{{ raw_imports['JSON_CONFIGURATION'].replace('\\', '\\\\').replace("'", "\\'") }}''',
-        workspace: "{{ variables.WORKSPACE }}",
-        {% if variables.SAUCE_ENABLED == "true" %}
-        sauce: "61b4846b-279d-4369-ae20-31e9d8b9bc66",
-        {% endif %}
-        run_sequentially: {{ variables.RUN_SEQUENTIAL }}
-    )
-    ]]></script>
-    <sandbox>true</sandbox>
-  </definition>
-  <triggers/>
-  <quietPeriod>5</quietPeriod>
-  <disabled>{{ variables.disabled }}</disabled>
-</flow-definition>
diff --git a/jenkins/build_defs/bazel-job.xml.tpl b/jenkins/build_defs/bazel-job.xml.tpl
deleted file mode 100644
index f8622ec..0000000
--- a/jenkins/build_defs/bazel-job.xml.tpl
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<flow-definition plugin="workflow-job">
-  <actions/>
-  <description>Test the {{ variables.PROJECT_NAME }} project located at {{ variables.GIT_URL }}.</description>
-  <keepDependencies>false</keepDependencies>
-  <properties>
-    <org.jenkinsci.plugins.workflow.job.properties.DisableConcurrentBuildsJobProperty/>
-    <jenkins.model.BuildDiscarderProperty>
-      <strategy class="hudson.tasks.LogRotator">
-        <daysToKeep>90</daysToKeep>
-        <numToKeep>-1</numToKeep>
-        <artifactDaysToKeep>-1</artifactDaysToKeep>
-        <artifactNumToKeep>-1</artifactNumToKeep>
-      </strategy>
-    </jenkins.model.BuildDiscarderProperty>
-    {% if variables.github == "True" %}
-    <com.coravy.hudson.plugins.github.GithubProjectProperty>
-      <projectUrl>{{ variables.GITHUB_URL }}</projectUrl>
-    </com.coravy.hudson.plugins.github.GithubProjectProperty>
-    {% endif %}
-    <org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-      <triggers>
-        <com.cloudbees.jenkins.GitHubPushTrigger>
-          <spec></spec>
-        </com.cloudbees.jenkins.GitHubPushTrigger>
-        <hudson.triggers.SCMTrigger>
-          <spec>H/15 * * * *</spec>
-        </hudson.triggers.SCMTrigger>
-      </triggers>
-    </org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-  </properties>
-  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps">
-    <script><![CDATA[
-bazelCiConfiguredJob(
-    repository: "{{ variables.GIT_URL }}",
-    branch: "{{ variables.BRANCH }}",
-    bazel_version: "latest",
-    configuration: '''{{ raw_imports['JSON_CONFIGURATION'].replace('\\', '\\\\').replace("'", "\\'") }}''',
-    workspace: "{{ variables.WORKSPACE }}",
-    {% if variables.SAUCE_ENABLED == "true" %}
-    sauce: "61b4846b-279d-4369-ae20-31e9d8b9bc66",
-    {% endif %}
-    run_sequentially: {{ variables.RUN_SEQUENTIAL }}
-)
-    ]]></script>
-    <sandbox>true</sandbox>
-  </definition>
-  <triggers/>
-  <quietPeriod>5</quietPeriod>
-  <disabled>{{ variables.disabled }}</disabled>
-</flow-definition>
diff --git a/jenkins/build_defs/default.json b/jenkins/build_defs/default.json
deleted file mode 100644
index b21e68d..0000000
--- a/jenkins/build_defs/default.json
+++ /dev/null
@@ -1,7 +0,0 @@
-// This is a relaxed JSON format, you can have comments in it.
-// This is a list of configuration for the job that does not specify a configuration.
-[
-    {"node": "linux-x86_64"},
-    {"node": "ubuntu_16.04-x86_64"},
-    {"node": "darwin-x86_64"}
-]
diff --git a/jenkins/build_defs/folder.xml b/jenkins/build_defs/folder.xml
deleted file mode 100644
index 080c411..0000000
--- a/jenkins/build_defs/folder.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<com.cloudbees.hudson.plugins.folder.Folder>
-  <properties/>
-  <folderViews class="com.cloudbees.hudson.plugins.folder.views.DefaultFolderViewHolder">
-    <views>
-      <hudson.model.AllView>
-        <owner class="com.cloudbees.hudson.plugins.folder.Folder" reference="../../../.."/>
-        <name>All</name>
-        <filterExecutors>false</filterExecutors>
-        <filterQueue>false</filterQueue>
-        <properties class="hudson.model.View$PropertyList"/>
-      </hudson.model.AllView>
-    </views>
-    <tabBar class="hudson.views.DefaultViewsTabBar"/>
-  </folderViews>
-  <healthMetrics/>
-  <icon class="com.cloudbees.hudson.plugins.folder.icons.StockFolderIcon"/>
-</com.cloudbees.hudson.plugins.folder.Folder>
diff --git a/jenkins/build_defs/jenkins.bzl b/jenkins/build_defs/jenkins.bzl
deleted file mode 100644
index 53d45f7..0000000
--- a/jenkins/build_defs/jenkins.bzl
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Some definition to setup jenkins and build the corresponding docker images
-load(":jenkins_docker_build.bzl", "jenkins_docker_build")
-load(":jenkins_node.bzl", "jenkins_node")
-load(":jenkins_nodes.bzl", "jenkins_nodes", "jenkins_node_names")
-load(":jenkins_job.bzl", "jenkins_job", "bazel_git_job", "bazel_github_job")
-
diff --git a/jenkins/build_defs/jenkins_docker_build.bzl b/jenkins/build_defs/jenkins_docker_build.bzl
deleted file mode 100644
index c13788f..0000000
--- a/jenkins/build_defs/jenkins_docker_build.bzl
+++ /dev/null
@@ -1,108 +0,0 @@
-# Copyright 2015 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Creation of the docker container for the jenkins master.
-
-load("@io_bazel_rules_docker//docker:docker.bzl", "docker_build")
-load(":templates.bzl", "merge_files")
-load(":vars.bzl", "MAIL_SUBSTITUTIONS")
-
-def _build_jobs_impl(ctx):
-  output = ctx.outputs.out
-  folders_to_create = {}
-  args = [
-    "--output=" + output.path,
-    "--mode=0644",
-    "--directory=/usr/share/jenkins/ref/jobs",
-    ]
-  # Group fob by folders
-  for f in ctx.files.jobs:
-    if f.owner and "/" in f.owner.name:
-      segments = f.owner.name.split("/")
-      for i in range(1, len(segments)):
-        folders_to_create["/jobs/".join(segments[:i])] = True
-      p = f.owner.name.replace("/", "/jobs/")
-      args.append("--file=%s=%s/config.xml" % (f.path, p))
-    else:
-      p = f.basename[:-len(f.extension)-1]
-      args.append("--file=%s=%s/config.xml" % (f.path, p))
-
-  for folder in folders_to_create:
-    args.append("--file=%s=%s/config.xml" % (ctx.file._folder_xml.path, folder))
-
-  ctx.action(
-      executable = ctx.executable._build_tar,
-      arguments = args,
-      inputs = ctx.files.jobs + [ctx.file._folder_xml],
-      outputs = [output],
-      mnemonic="TarJobs"
-      )
-
-_build_jobs = rule(
-    attrs = {
-        "jobs": attr.label_list(allow_files=True),
-        "_folder_xml": attr.label(
-            default=Label("//jenkins/build_defs:folder.xml"),
-            allow_files=True,
-            single_file=True),
-        "_build_tar": attr.label(
-            default=Label("@bazel_tools//tools/build_defs/pkg:build_tar"),
-            cfg="host",
-            executable=True,
-            allow_files=True),
-    },
-    outputs = {"out": "%{name}.tar"},
-    implementation = _build_jobs_impl,
-)
-
-
-def jenkins_docker_build(name, plugins = None, base = "//jenkins/base", configs = [],
-                  jobs = [], substitutions = {}, visibility = None, tars = []):
-  """Build the docker image for the Jenkins instance."""
-  substitutions = substitutions + MAIL_SUBSTITUTIONS
-  # Expands config files in a tar ball
-  merge_files(
-      name = "%s-configs" % name,
-      srcs = configs,
-      directory = "/usr/share/jenkins/ref",
-      strip_prefixes = [
-          "jenkins/config",
-          "jenkins",
-      ],
-      substitutions = substitutions)
-  tars += ["%s-configs" % name]
-
-  # Create the structures for jobs
-  _build_jobs(name=name + "-jobs", jobs=jobs)
-  tars += ["%s-jobs" % name]
-
-  ### FINAL IMAGE ###
-  docker_build(
-      name = name,
-      tars = tars,
-      # Workaround no way to specify owner in pkg_tar
-      # TODO(dmarting): use https://cr.bazel.build/10255 when it hits a release.
-      user = "root",
-      entrypoint = [
-          "/sbin/tini",
-          "--",
-          "/bin/bash",
-          "-c",
-          "[ -d /opt/lib ] && chown -R jenkins /opt/lib; su jenkins -c /usr/local/bin/jenkins.sh",
-      ],
-      # End of workaround
-      base = base,
-      directory = "/",
-      visibility = visibility,
-  )
diff --git a/jenkins/build_defs/jenkins_job.bzl b/jenkins/build_defs/jenkins_job.bzl
deleted file mode 100644
index f3588fe..0000000
--- a/jenkins/build_defs/jenkins_job.bzl
+++ /dev/null
@@ -1,166 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Jenkins job creation
-
-load(":templates.bzl", "expand_template")
-load(":vars.bzl", "MAIL_SUBSTITUTIONS")
-
-def _to_groovy_list(lst):
-  return "[%s]" % (",".join(['"%s"' % e for e in lst]))
-
-def jenkins_job(name, config, substitutions = {}, deps = [], deps_aliases = {},
-                project='bazel', org='bazelbuild', git_url=None, project_url=None,
-                folder=None, create_filegroups=True):
-  """Create a job configuration on Jenkins.
-
-  Args:
-     name: the name of the job to create
-     config: the configuration file for the job
-     substitutions: additional substitutions to pass to the template generation
-     deps: list of dependencies (templates included by the config file)
-     project: the project name on github
-     org: the project organization on github, default 'bazelbuild'
-     git_url: the URL to the git project, defaulted to the Github URL
-     project_url: the project url, defaulted to the Git URL
-     create_filegroups: create filegroups named <name>/all and <name>/test that
-       contain the files that have to be included to include that job. This is
-       to be set to false if the calling macros already creates those
-       filegroups.
-  """
-  github_project =  "%s/%s" % (org, project)
-  github_url = "https://github.com/" + github_project
-  if not git_url:
-    git_url = github_url
-  if not project_url:
-    project_url = git_url
-  deps = deps + [deps_aliases[k] for k in deps_aliases]
-  substitutions = substitutions + {
-      "GITHUB_URL": github_url,
-      "GIT_URL": git_url,
-      "GITHUB_PROJECT": github_project,
-      "PROJECT_URL": project_url,
-      } + MAIL_SUBSTITUTIONS
-  substitutions["SEND_EMAIL"] = "1"
-  expand_template(
-      name = name,
-      template = config,
-      out = "%s.xml" % name,
-      deps = deps,
-      deps_aliases = deps_aliases,
-      substitutions = substitutions,
-    )
-  if create_filegroups:
-    native.filegroup(name = name + "/all", srcs = [name])
-
-def bazel_git_job(**kwargs):
-  """Override bazel_github_job to test a project that is not on GitHub."""
-  kwargs["github_enabled"] = False
-  if not "git_url" in kwargs:
-    if not "project_url" in kwargs:
-      fail("Neither project_url nor git_url was specified")
-    kwargs["git_url"] = kwargs
-  bazel_github_job(**kwargs)
-
-def bazel_github_job(name, branch="master", project=None, org="bazelbuild",
-                     project_url=None, workspace=".", git_url=None,
-                     config="//jenkins/build_defs:default.json",
-                     enable_trigger=True,
-                     gerrit_project=None,
-                     enabled=True,
-                     pr_enabled=True,
-                     github_enabled=True,
-                     run_sequential=False,
-                     sauce_enabled=False,
-                     use_upstream_branch=False):
-  """Create a generic github job configuration to build against Bazel head."""
-  if not project:
-    project = name
-
-  substitutions = {
-    "WORKSPACE": workspace,
-    "PROJECT_NAME": project,
-    "BRANCH": branch,
-    "NAME": name,
-    "disabled": str(not enabled).lower(),
-    "enable_trigger": str(enable_trigger and github_enabled).lower(),
-    "github": str(github_enabled),
-    "GERRIT_PROJECT": str(gerrit_project) if gerrit_project else "",
-    "RUN_SEQUENTIAL": str(run_sequential).lower(),
-    "SAUCE_ENABLED": str(sauce_enabled).lower(),
-    "GLOBAL_USE_UPSTREAM_BRANCH": str(use_upstream_branch)
-  }
-
-  all_files = [name + ".xml"]
-
-  kwargs = {}
-  if not github_enabled:
-    kwargs["git_url"] = git_url
-
-  jenkins_job(
-      name = name,
-      config = "//jenkins/build_defs:bazel-job.xml.tpl",
-      deps_aliases = {
-        "JSON_CONFIGURATION": config,
-      },
-      substitutions=substitutions,
-      project=project,
-      org=org,
-      project_url=project_url,
-      create_filegroups=False,
-      **kwargs)
-
-  if enabled and config:
-    jenkins_job(
-        name = "Global/" + name,
-        config = "//jenkins/build_defs:bazel-job-Global.xml.tpl",
-        deps_aliases = {
-          "JSON_CONFIGURATION": config,
-        },
-        substitutions=substitutions,
-        git_url=git_url,
-        project=project,
-        org=org,
-        project_url=project_url,
-        create_filegroups=False)
-    all_files.append("Global/%s.xml" % name)
-
-  if pr_enabled and config:
-    jenkins_job(
-        name = "PR/" + name,
-        config = "//jenkins/build_defs:bazel-job-PR.xml.tpl",
-        deps_aliases = {
-          "JSON_CONFIGURATION": config,
-        },
-        substitutions=substitutions,
-        project=project,
-        org=org,
-        project_url=project_url,
-        create_filegroups=False)
-    all_files.append("PR/%s.xml" % name)
-
-  if gerrit_project:
-    jenkins_job(
-        name = "CR/" + name,
-        config = "//jenkins/build_defs:bazel-job-Gerrit.xml.tpl",
-        deps_aliases = {
-          "JSON_CONFIGURATION": config,
-        },
-        substitutions=substitutions,
-        project=project,
-        org=org,
-        project_url=project_url)
-    all_files.append("CR/%s.xml" % name)
-
-  native.filegroup(name = "%s/all" % name, srcs = all_files)
diff --git a/jenkins/build_defs/jenkins_node.bzl b/jenkins/build_defs/jenkins_node.bzl
deleted file mode 100644
index 4b99bd4..0000000
--- a/jenkins/build_defs/jenkins_node.bzl
+++ /dev/null
@@ -1,87 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Setup jenkins and build the corresponding docker images
-
-load("@io_bazel_rules_docker//docker:docker.bzl", "docker_build")
-load(":templates.bzl", "expand_template")
-
-JENKINS_SERVER = "http://jenkins:80"
-
-def jenkins_node(name, remote_fs = "/home/ci", num_executors = 1, mode = "NORMAL",
-                 labels = [], docker_base = None, visibility = None,
-                 tunnel = None):
-  """Create a node configuration on Jenkins, with possible docker image.
-
-  Args:
-    name: Name of the node on Jenkins.
-    remote_fs: path to the home of the Jenkins user.
-    num_executors: number of executors (i.e. concurrent build) this machine can have.
-    mode: NORMAL for "Utilize this node as much as possible"
-      EXCLUSIVE for "Only build jobs with label restrictions matching this node"
-    labels: list of Jenkins labels for this node (the node name is always added).
-    docker_base: base for the corresponding docker image to create if we should create one
-      (if docker_base is not specified, then a corresponding machine should be configured
-      to connect to the Jenkins master).
-    visibility: rule visibility.
-  """
-  if tunnel:
-    tunnel = "<tunnel>%s</tunnel>" % tunnel
-  else:
-    tunnel = ""
-  native.genrule(
-      name = name,
-      cmd = """cat >$@ <<'EOF'
-<?xml version='1.0' encoding='UTF-8'?>
-<slave>
-  <name>%s</name>
-  <description></description>
-  <remoteFS>%s</remoteFS>
-  <numExecutors>%s</numExecutors>
-  <mode>%s</mode>
-  <retentionStrategy class="hudson.slaves.RetentionStrategy$$Always"/>
-  <launcher class="hudson.slaves.JNLPLauncher">%s</launcher>
-  <label>%s</label>
-</slave>
-EOF
-""" % (name, remote_fs, num_executors, mode, tunnel, " ".join([name] + labels)),
-      outs = ["nodes/%s/config.xml" % name],
-      visibility = visibility,
-      )
-  if docker_base:
-    # Generate docker image startup script
-    expand_template(
-        name = name + ".docker-launcher",
-        out = name + ".docker-launcher.sh",
-        template = "slave_setup.sh",
-        substitutions = {
-            "NODE_NAME": name,
-            "HOME_FS": remote_fs,
-            "JENKINS_SERVER": JENKINS_SERVER,
-            },
-        executable = True,
-        )
-    # Generate docker image
-    docker_build(
-        name = name + ".docker",
-        base = docker_base,
-        volumes = [remote_fs],
-        files = [":%s.docker-launcher.sh" % name],
-        data_path = ".",
-        entrypoint = [
-            "/bin/bash",
-            "/%s.docker-launcher.sh" % name,
-        ],
-        visibility = visibility,
-        )
diff --git a/jenkins/build_defs/jenkins_nodes.bzl b/jenkins/build_defs/jenkins_nodes.bzl
deleted file mode 100644
index c8f45dc..0000000
--- a/jenkins/build_defs/jenkins_nodes.bzl
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Macros to ease the creation of machines
-load(":jenkins_node.bzl", "jenkins_node")
-
-def jenkins_node_names(name, count):
-  """Returns the names for `count` jenkins nodes prefixed by `name`."""
-  return ["%s-%s" % (name, i) for i in range(1, count+1)]
-
-def _extend_kwargs(kwargs, extra_args):
-  result = {}
-  for k,v in kwargs.items():
-    result[k] = v
-  if extra_args:
-    for k,v in extra_args.items():
-      result[k] = v
-  return result
-
-def jenkins_nodes(name,
-                  count,
-                  labels=None,
-                  install_bazel=True,
-                  **kwargs):
-  """Create a set of Jenkins nodes on the system.
-
-  It creates `count` Jenkins nodes with name prefix `name`.
-
-  Example:
-  If `name` is `darwin-x86_64` and `count` is two, it will
-  create two nodes `darwin-x86_64-1` and `darwin-x86_64-2`.
-
-  Args:
-    name: prefix of each node name, it should be the platform
-      name (e.g., darwin-x86_64, ubuntu-14.04-x86_64, ...).
-    count: number of nodes to create.
-    labels: Jenkins node labels to apply to this node (in addition to
-      the "install-bazel" label and the `name` itself).
-    install_bazel: if the "install-bazel" label should be added to labels.
-    **kwargs: other arguments to be passed verbatim to `jenkins_node`.
-  """
-  labels = [
-      name] + (["install-bazel"] if install_bazel else []) + (labels if labels else [])
-  [jenkins_node(
-      name = n,
-      labels = labels,
-      **kwargs
-  ) for n in jenkins_node_names(name, count)]
diff --git a/jenkins/build_defs/templates.bzl b/jenkins/build_defs/templates.bzl
deleted file mode 100644
index 42b4b5c..0000000
--- a/jenkins/build_defs/templates.bzl
+++ /dev/null
@@ -1,198 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Rules for templating / files layout
-
-def _expand_template_impl(ctx):
-  """Simply spawn the template-engine in a rule."""
-  variables = [
-      "--variable=%s=%s" % (k, ctx.attr.substitutions[k])
-      for k in ctx.attr.substitutions
-  ]
-  if not ctx.attr.escape_xml:
-    variables += ["--noescape_xml"]
-  d = {str(ctx.attr.deps[i].label): ctx.files.deps[i].path
-       for i in range(0, len(ctx.attr.deps))}
-  imports = ["--imports=%s=%s" % (k, d[k]) for k in d]
-  imports += ["--imports=%s=%s" % (k, d[str(ctx.label.relative(ctx.attr.deps_aliases[k]))])
-              for k in ctx.attr.deps_aliases]
-  ctx.action(
-      executable = ctx.executable._engine,
-      arguments = [
-        "--executable" if ctx.attr.executable else "--noexecutable",
-        "--template=%s" % ctx.file.template.path,
-        "--output=%s" % ctx.outputs.out.path,
-      ] + variables + imports,
-      inputs = [ctx.file.template] + ctx.files.deps,
-      outputs = [ctx.outputs.out],
-      )
-
-expand_template = rule(
-    attrs = {
-        "template": attr.label(
-            mandatory = True,
-            allow_files = True,
-            single_file = True,
-        ),
-        "deps": attr.label_list(default = [], allow_files = True),
-        "deps_aliases": attr.string_dict(default = {}),
-        "substitutions": attr.string_dict(mandatory = True),
-        "out": attr.output(mandatory = True),
-        "executable": attr.bool(default = True),
-        "escape_xml": attr.bool(default = True),
-        "_engine": attr.label(
-            default = Label("//templating:template_engine"),
-            executable = True,
-            cfg="host"),
-    },
-    implementation = _expand_template_impl,
-)
-"""Expand a jinja2 template file.
-
-This rules expands the file given in template, into the file given by out.
-
-Args:
-  template: The template file to expand.
-  deps: additional files to expand, they will be accessible as imports[label]
-      in the template environment. If a file ends with .tpl, it is considered
-      a template itself and will be expanded.
-  deps_aliases: a dictionary of name to label. Each label in that dictionary
-      should be present in the deps attribute, and will be make accessible as
-      imports[name] in the template environment.
-  substitutions: a dictionary of key => values that will appear as variables.key
-      in the template environment.
-  out: the name of the output file to generate.
-  executable: mark the result as excutable if set to True.
-"""
-
-def strip_prefix(path, prefixes):
-  for prefix in prefixes:
-    if path.startswith(prefix):
-      return path[len(prefix):]
-  return path
-
-def _dest_path(f, strip_prefixes):
-  """Returns the short path of f, stripped of strip_prefixes."""
-  return strip_prefix(f.short_path, strip_prefixes)
-
-def _format_path(path_format, path):
-  dirsep = path.rfind("/")
-  dirname = path[:dirsep] if dirsep > 0 else ""
-  basename = path[dirsep+1:] if dirsep > 0 else path
-  extsep = basename.rfind(".")
-  extension = basename[extsep+1:] if extsep > 0 else ""
-  basename = basename[:extsep] if extsep > 0 else basename
-  return path_format.format(
-      path=path,
-      dirname=dirname,
-      basename=basename,
-      extension=extension
-  )
-
-def _append_inputs(args, inputs, f, path, path_format):
-  args.append("--file=%s=%s" % (
-      f.path,
-      _format_path(path_format, path)
-  ))
-  inputs.append(f)
-
-def _merge_files_impl(ctx):
-  """Merge a list of config files in a tar ball with the correct layout."""
-  output = ctx.outputs.out
-  build_tar = ctx.executable._build_tar
-  inputs = []
-  args = [
-      "--output=" + output.path,
-      "--directory=" + ctx.attr.directory,
-      "--mode=0644",
-      ]
-  variables = [
-      "--variable=%s=%s" % (k, ctx.attr.substitutions[k])
-      for k in ctx.attr.substitutions
-  ]
-  for f in ctx.files.srcs:
-    path = _dest_path(f, ctx.attr.strip_prefixes)
-    if path.endswith(ctx.attr.template_extension):
-      path = path[:-4]
-      f2 = ctx.new_file(ctx.label.name + "/" + path)
-      ctx.action(
-          executable = ctx.executable._engine,
-          arguments = [
-            "--template=%s" % f.path,
-            "--output=%s" % f2.path,
-            "--noescape_xml",
-          ] + variables,
-          inputs = [f],
-          outputs = [f2],
-      )
-      _append_inputs(args, inputs, f2, path, ctx.attr.path_format)
-    else:
-      _append_inputs(args, inputs, f, path, ctx.attr.path_format)
-  ctx.action(
-      executable = build_tar,
-      arguments = args,
-      inputs = inputs,
-      outputs = [output],
-      mnemonic="MergeFiles"
-      )
-
-merge_files = rule(
-    attrs = {
-        "srcs": attr.label_list(allow_files=True),
-        "template_extension": attr.string(default=".tpl"),
-        "directory": attr.string(default="/"),
-        "strip_prefixes": attr.string_list(default=[]),
-        "substitutions": attr.string_dict(default={}),
-        "path_format": attr.string(default="{path}"),
-        "_build_tar": attr.label(
-            default=Label("@bazel_tools//tools/build_defs/pkg:build_tar"),
-            cfg="host",
-            executable=True,
-            allow_files=True),
-        "_engine": attr.label(
-            cfg="host",
-            default = Label("//templating:template_engine"),
-            executable = True),
-    },
-    outputs = {"out": "%{name}.tar"},
-    implementation = _merge_files_impl,
-)
-"""Merge a set of files in a single tarball.
-
-This rule merge a set of files into one tarball, each file will appear in the
-tarball as a file determined by path_format, strip_prefixes and directory.
-
-Outputs:
-  <name>.tar: the tarball containing all the files in srcs.
-
-Args:
-  srcs: The list of files to merge. If a file is ending with ".tpl" (see
-      template_extension), it will get expanded like a template passed to
-      expand_template.
-  template_extension: extension of files to be considered as template, ".tpl"
-      by default.
-  directory: base directory for all the files in the resulting tarball.
-  strip_prefixes: list of prefixes to strip from the path of the srcs to obtain
-      the final path (see path_format).
-  substitutions: map of substitutions to make available during template
-      expansion. Values of that map will be available as "variables.name" in
-      the template environment.
-  path_format: format of the final files. Each file will appear in the final
-      tarball under "{directory}/{path_format}" where the following string of
-      path_format are replaced:
-          {path}: path of the input file, removed from prefixes and suffixes,
-          {dirname}: directory name of path,
-          {basename}: base filename of path,
-          {extension}: extension of path
-"""
diff --git a/jenkins/build_defs/vars.bzl b/jenkins/build_defs/vars.bzl
deleted file mode 100644
index 3203bf3..0000000
--- a/jenkins/build_defs/vars.bzl
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Global constants for jenkins jobs substitutions
-
-MAIL_SUBSTITUTIONS = {
-    "BAZEL_BUILD_RECIPIENT": "bazel-ci@googlegroups.com",
-    "BAZEL_RELEASE_RECIPIENT": "bazel-discuss+release@googlegroups.com",
-}
diff --git a/jenkins/config.bzl b/jenkins/config.bzl
deleted file mode 100644
index da34eca..0000000
--- a/jenkins/config.bzl
+++ /dev/null
@@ -1,17 +0,0 @@
-ADMIN_USERS = [
-    "dslomov@google.com",
-    "laszlocsomor@google.com",
-    "lberki@google.com",
-    "pcloudy@google.com",
-    "yueg@google.com",
-    "jcater@google.com",
-    "aehlig@google.com",
-    "elenairina@google.com",
-    "hlopko@google.com",
-    "vladmos@google.com",
-    "fisherii@google.com",
-    "philwo@google.com",
-    "buchgr@google.com",
-    "davidstanke@google.com",
-    "jingwen@google.com",
-]
diff --git a/jenkins/config/com.cloudbees.jenkins.GitHubPushTrigger.xml b/jenkins/config/com.cloudbees.jenkins.GitHubPushTrigger.xml
deleted file mode 100644
index 1412ffe..0000000
--- a/jenkins/config/com.cloudbees.jenkins.GitHubPushTrigger.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<com.cloudbees.jenkins.GitHubPushTrigger_-DescriptorImpl plugin="github@1.11.3">
-  <manageHook>false</manageHook>
-  <credentials/>
-</com.cloudbees.jenkins.GitHubPushTrigger_-DescriptorImpl>
diff --git a/jenkins/config/config.xml.tpl b/jenkins/config/config.xml.tpl
deleted file mode 100644
index 9b48972..0000000
--- a/jenkins/config/config.xml.tpl
+++ /dev/null
@@ -1,116 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<hudson>
-  <disabledAdministrativeMonitors>
-    <string>hudson.diagnosis.ReverseProxySetupMonitor</string>
-  </disabledAdministrativeMonitors>
-  <version>2.101</version>
-  <installState class="jenkins.install.InstallState$5">
-    <isSetupComplete>true</isSetupComplete>
-    <name>RESTART</name>
-  </installState>
-  <numExecutors>0</numExecutors>
-  <mode>NORMAL</mode>
-  {{ variables.SECURITY_CONFIG }}
-  <disableRememberMe>false</disableRememberMe>
-  <projectNamingStrategy class="jenkins.model.ProjectNamingStrategy$DefaultProjectNamingStrategy"/>
-  <workspaceDir>${JENKINS_HOME}/workspace/${ITEM_FULLNAME}</workspaceDir>
-  <buildsDir>${ITEM_ROOTDIR}/builds</buildsDir>
-  <systemMessage>Jenkins configuration built from HEAD={{ imports['//:git-hash'] }}</systemMessage>
-  <markupFormatter class="hudson.markup.EscapedMarkupFormatter"/>
-  <jdks/>
-  <viewsTabBar class="hudson.views.DefaultViewsTabBar"/>
-  <myViewsTabBar class="hudson.views.DefaultMyViewsTabBar"/>
-  <clouds/>
-  <quietPeriod>5</quietPeriod>
-  <scmCheckoutRetryCount>0</scmCheckoutRetryCount>
-  <views>
-    <listView>
-      <owner class="hudson" reference="../../.."/>
-      <name>Projects</name>
-      <description>All projects</description>
-      <filterExecutors>false</filterExecutors>
-      <filterQueue>false</filterQueue>
-      <properties class="hudson.model.View$PropertyList"/>
-      <jobNames/>
-      <jobFilters/>
-      <columns>
-        <hudson.views.StatusColumn/>
-        <hudson.views.WeatherColumn/>
-        <hudson.views.JobColumn/>
-        <hudson.views.LastSuccessColumn/>
-        <hudson.views.LastFailureColumn/>
-        <hudson.views.LastDurationColumn/>
-        <hudson.views.BuildButtonColumn/>
-      </columns>
-      <includeRegex>(?!^(bazel|PR|CR|maintenance|Global)$).*</includeRegex>
-      <recurse>false</recurse>
-      <statusFilter>true</statusFilter>
-    </listView>
-    <listView>
-      <owner class="hudson" reference="../../.."/>
-      <name>Bazel bootstrap and maintenance</name>
-      <filterExecutors>false</filterExecutors>
-      <filterQueue>false</filterQueue>
-      <properties class="hudson.model.View$PropertyList"/>
-      <jobNames/>
-      <jobFilters/>
-      <columns>
-        <hudson.views.StatusColumn/>
-        <hudson.views.WeatherColumn/>
-        <hudson.views.JobColumn/>
-        <hudson.views.LastSuccessColumn/>
-        <hudson.views.LastFailureColumn/>
-        <hudson.views.LastDurationColumn/>
-        <hudson.views.BuildButtonColumn/>
-      </columns>
-      <includeRegex>(bazel|PR|CR|maintenance|Global)</includeRegex>
-      <recurse>false</recurse>
-      <statusFilter>true</statusFilter>
-    </listView>
-    <com.smartcodeltd.jenkinsci.plugins.buildmonitor.BuildMonitorView plugin="build-monitor-plugin@1.12+build.201708172343">
-      <owner class="hudson" reference="../../.."/>
-      <name>Dashboard</name>
-      <filterExecutors>false</filterExecutors>
-      <filterQueue>false</filterQueue>
-      <properties class="hudson.model.View$PropertyList"/>
-      <jobNames/>
-      <jobFilters/>
-      <columns/>
-      <includeRegex>(bazel/nightly|bazel/release|(?!.*/).*)</includeRegex>
-      <recurse>true</recurse>
-      <statusFilter>true</statusFilter>
-      <title>Bazel Tests</title>
-      <config>
-        <displayCommitters>false</displayCommitters>
-        <order class="com.smartcodeltd.jenkinsci.plugins.buildmonitor.order.ByStatus"/>
-      </config>
-    </com.smartcodeltd.jenkinsci.plugins.buildmonitor.BuildMonitorView>
-    <com.smartcodeltd.jenkinsci.plugins.buildmonitor.BuildMonitorView>
-      <owner class="hudson" reference="../../.."/>
-      <name>Global Dashboard</name>
-      <filterExecutors>false</filterExecutors>
-      <filterQueue>false</filterQueue>
-      <properties class="hudson.model.View$PropertyList"/>
-      <jobNames/>
-      <jobFilters/>
-      <columns/>
-      <title>Global Dashboard</title>
-      <config>
-        <displayCommitters>false</displayCommitters>
-        <order class="com.smartcodeltd.jenkinsci.plugins.buildmonitor.order.ByStatus"/>
-      </config>
-      <includeRegex>Global/.*</includeRegex>
-      <recurse>true</recurse>
-      <statusFilter>true</statusFilter>
-    </com.smartcodeltd.jenkinsci.plugins.buildmonitor.BuildMonitorView>
-  </views>
-  <primaryView>Projects</primaryView>
-  <slaveAgentPort>50000</slaveAgentPort>
-  <disabledAgentProtocols>
-    <string>JNLP-connect</string>
-    <string>JNLP2-connect</string>
-  </disabledAgentProtocols>
-  <label></label>
-  <nodeProperties/>
-  <globalNodeProperties/>
-</hudson>
diff --git a/jenkins/config/credentials.xml b/jenkins/config/credentials.xml
deleted file mode 100644
index a5f664e..0000000
--- a/jenkins/config/credentials.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<com.cloudbees.plugins.credentials.SystemCredentialsProvider>
-  <domainCredentialsMap class="hudson.util.CopyOnWriteMap$Hash">
-    <entry>
-      <com.cloudbees.plugins.credentials.domains.Domain>
-        <specifications/>
-      </com.cloudbees.plugins.credentials.domains.Domain>
-      <java.util.concurrent.CopyOnWriteArrayList>
-        <com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
-          <scope>GLOBAL</scope>
-          <id>3b53d1b7-9c6b-4822-b2d0-82022ade718f</id>
-          <description>bazel-io @ github</description>
-          <username>bazel-io</username>
-          <password>##SECRET:github.bazel-io.jenkins.password##</password>
-        </com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
-        <hudson.plugins.sauce_ondemand.credentials.SauceCredentials>
-          <scope>GLOBAL</scope>
-          <id>61b4846b-279d-4369-ae20-31e9d8b9bc66</id>
-          <description>bazel_rules_webtesting @ Sauce Labs</description>
-          <username>bazel_rules_webtesting</username>
-          <apiKey>##SECRET:saucelabs.bazel_rules_webtesting.access_key##</apiKey>
-        </hudson.plugins.sauce_ondemand.credentials.SauceCredentials>
-        <org.jenkinsci.plugins.plaincredentials.impl.FileCredentialsImpl plugin="plain-credentials@1.4">
-          <scope>GLOBAL</scope>
-          <id>remote-execution</id>
-          <description>credentials for remote execution</description>
-          <fileName>bazel-public-d5508ebd72fb.json</fileName>
-          <secretBytes>##SECRET:remote-execution-secret-bytes##</secretBytes>
-        </org.jenkinsci.plugins.plaincredentials.impl.FileCredentialsImpl>
-      </java.util.concurrent.CopyOnWriteArrayList>
-    </entry>
-    <entry>
-      <com.cloudbees.plugins.credentials.domains.Domain>
-        <name>api.github.com</name>
-        <description>Auto generated credentials domain</description>
-        <specifications>
-          <com.cloudbees.plugins.credentials.domains.HostnameSpecification>
-            <includes>api.github.com</includes>
-          </com.cloudbees.plugins.credentials.domains.HostnameSpecification>
-          <com.cloudbees.plugins.credentials.domains.SchemeSpecification>
-            <schemes class="linked-hash-set">
-              <string>https</string>
-            </schemes>
-          </com.cloudbees.plugins.credentials.domains.SchemeSpecification>
-          <com.cloudbees.plugins.credentials.domains.PathSpecification>
-            <includes>/</includes>
-            <caseSensitive>false</caseSensitive>
-          </com.cloudbees.plugins.credentials.domains.PathSpecification>
-        </specifications>
-      </com.cloudbees.plugins.credentials.domains.Domain>
-      <list>
-        <org.jenkinsci.plugins.plaincredentials.impl.StringCredentialsImpl>
-          <scope>GLOBAL</scope>
-          <id>6b2a31e0-cd98-4ed9-bb19-a5e013c68e8a</id>
-          <description>https://api.github.com GitHub auto generated token credentials</description>
-          <secret>##SECRET:github_token_ghprb##</secret>
-        </org.jenkinsci.plugins.plaincredentials.impl.StringCredentialsImpl>
-      </list>
-    </entry>
-  </domainCredentialsMap>
-</com.cloudbees.plugins.credentials.SystemCredentialsProvider>
diff --git a/jenkins/config/hudson.plugins.emailext.ExtendedEmailPublisher.xml b/jenkins/config/hudson.plugins.emailext.ExtendedEmailPublisher.xml
deleted file mode 100644
index 3f43c84..0000000
--- a/jenkins/config/hudson.plugins.emailext.ExtendedEmailPublisher.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<hudson.plugins.emailext.ExtendedEmailPublisherDescriptor plugin="email-ext@2.40.5">
-  <defaultSuffix>@bazel.build</defaultSuffix>
-  <smtpAuthUsername>##SECRET:smtp.auth.username##</smtpAuthUsername>
-  <smtpAuthPassword>##SECRET:smtp.auth.password##</smtpAuthPassword>
-  <smtpHost>smtp.gmail.com</smtpHost>
-  <useSsl>true</useSsl>
-  <smtpPort>465</smtpPort>
-  <charset>UTF-8</charset>
-  <defaultContentType>text/plain</defaultContentType>
-  <defaultSubject>$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!</defaultSubject>
-  <defaultBody>$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS:&#xd;
-&#xd;
-Check console output at $BUILD_URL to view the results.</defaultBody>
-  <defaultPresendScript></defaultPresendScript>
-  <defaultPostsendScript></defaultPostsendScript>
-  <defaultClasspath/>
-  <defaultTriggerIds>
-    <string>hudson.plugins.emailext.plugins.trigger.FailureTrigger</string>
-  </defaultTriggerIds>
-  <maxAttachmentSize>-1</maxAttachmentSize>
-  <recipientList></recipientList>
-  <defaultReplyTo></defaultReplyTo>
-  <excludedCommitters></excludedCommitters>
-  <overrideGlobalSettings>true</overrideGlobalSettings>
-  <precedenceBulk>false</precedenceBulk>
-  <debugMode>false</debugMode>
-  <requireAdminForTemplateTesting>false</requireAdminForTemplateTesting>
-  <enableWatching>false</enableWatching>
-  <enableAllowUnregistered>false</enableAllowUnregistered>
-</hudson.plugins.emailext.ExtendedEmailPublisherDescriptor>
diff --git a/jenkins/config/hudson.tasks.Mailer.xml.tpl b/jenkins/config/hudson.tasks.Mailer.xml.tpl
deleted file mode 100644
index 0bfc407..0000000
--- a/jenkins/config/hudson.tasks.Mailer.xml.tpl
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<hudson.tasks.Mailer_-DescriptorImpl plugin="mailer@1.20">
-  <defaultSuffix>@bazel.build</defaultSuffix>
-  <hudsonUrl>https://ci.bazel.build/</hudsonUrl>
-  <smtpAuthUsername>##SECRET:smtp.auth.username##</smtpAuthUsername>
-  <smtpAuthPassword>##SECRET:smtp.auth.password##</smtpAuthPassword>
-  <replyToAddress>bazel-ci@googlegroups.com</replyToAddress>
-  <smtpHost>smtp.gmail.com</smtpHost>
-  <useSsl>true</useSsl>
-  <smtpPort>465</smtpPort>
-  <charset>UTF-8</charset>
-</hudson.tasks.Mailer_-DescriptorImpl>
diff --git a/jenkins/config/hudson.triggers.SCMTrigger.xml b/jenkins/config/hudson.triggers.SCMTrigger.xml
deleted file mode 100644
index 70867ab..0000000
--- a/jenkins/config/hudson.triggers.SCMTrigger.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<hudson.triggers.SCMTrigger_-DescriptorImpl>
-  <synchronousPolling>false</synchronousPolling>
-  <maximumThreads>0</maximumThreads>
-</hudson.triggers.SCMTrigger_-DescriptorImpl>
\ No newline at end of file
diff --git a/jenkins/config/init.groovy.d/configure-jnlp-agent-protocols.groovy b/jenkins/config/init.groovy.d/configure-jnlp-agent-protocols.groovy
deleted file mode 100644
index 94e1bba..0000000
--- a/jenkins/config/init.groovy.d/configure-jnlp-agent-protocols.groovy
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-   Copyright (c) 2015-2017 Sam Gleske - https://github.com/samrocketman/jenkins-bootstrap-shared
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-       http://www.apache.org/licenses/LICENSE-2.0
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-   */
-/*
-   Disable all JNLP protocols except for JNLP4.  JNLP4 is the most secure agent
-   protocol because it is using standard TLS.
- */
-import jenkins.model.Jenkins
-
-Jenkins j = Jenkins.instance
-
-if(!j.isQuietingDown()) {
-    Set<String> agentProtocolsList = ['JNLP4-connect', 'Ping']
-    if(!j.getAgentProtocols().equals(agentProtocolsList)) {
-        j.setAgentProtocols(agentProtocolsList)
-        println "JNLP Agent Protocols have changed. Setting: ${agentProtocolsList}"
-        j.save()
-    }
-    else {
-        println "Nothing changed. JNLP Agent Protocols already configured: ${j.getAgentProtocols()}"
-    }
-}
-else {
-    println 'Shutdown mode enabled. Configure JNLP Agent Protocols SKIPPED.'
-}
diff --git a/jenkins/config/jenkins.model.JenkinsLocationConfiguration.xml.tpl b/jenkins/config/jenkins.model.JenkinsLocationConfiguration.xml.tpl
deleted file mode 100644
index 6482442..0000000
--- a/jenkins/config/jenkins.model.JenkinsLocationConfiguration.xml.tpl
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!--
-  Copyright 2015 The Bazel Authors. All rights reserved.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<jenkins.model.JenkinsLocationConfiguration>
-  <adminAddress>Bazel Jenkins CI server &lt;noreply@bazel.build&gt;</adminAddress>
-  <jenkinsUrl>https://ci.bazel.build/</jenkinsUrl>
-</jenkins.model.JenkinsLocationConfiguration>
diff --git a/jenkins/config/org.jenkinsci.main.modules.sshd.SSHD.xml b/jenkins/config/org.jenkinsci.main.modules.sshd.SSHD.xml
deleted file mode 100644
index a1ef923..0000000
--- a/jenkins/config/org.jenkinsci.main.modules.sshd.SSHD.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<org.jenkinsci.main.modules.sshd.SSHD>
-  <port>-1</port>
-</org.jenkinsci.main.modules.sshd.SSHD>
\ No newline at end of file
diff --git a/jenkins/config/org.jenkinsci.plugins.ghprb.GhprbTrigger.xml b/jenkins/config/org.jenkinsci.plugins.ghprb.GhprbTrigger.xml
deleted file mode 100644
index 4bfd091..0000000
--- a/jenkins/config/org.jenkinsci.plugins.ghprb.GhprbTrigger.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<org.jenkinsci.plugins.ghprb.GhprbTrigger_-DescriptorImpl plugin="ghprb@1.39.0">
-  <configVersion>1</configVersion>
-  <whitelistPhrase>.*add\W+to\W+whitelist.*</whitelistPhrase>
-  <okToTestPhrase>.*ok\W+to\W+test.*</okToTestPhrase>
-  <retestPhrase>.*test\W+this\W+please.*</retestPhrase>
-  <skipBuildPhrase>.*\[skip\W+ci\].*</skipBuildPhrase>
-  <blackListCommitAuthor></blackListCommitAuthor>
-  <cron>H/5 * * * *</cron>
-  <useComments>false</useComments>
-  <useDetailedComments>false</useDetailedComments>
-  <manageWebhooks>false</manageWebhooks>
-  <unstableAs>FAILURE</unstableAs>
-  <autoCloseFailedPullRequests>false</autoCloseFailedPullRequests>
-  <displayBuildErrorsOnDownstreamBuilds>false</displayBuildErrorsOnDownstreamBuilds>
-  <githubAuth>
-    <org.jenkinsci.plugins.ghprb.GhprbGitHubAuth>
-      <serverAPIUrl>https://api.github.com</serverAPIUrl>
-      <credentialsId>6b2a31e0-cd98-4ed9-bb19-a5e013c68e8a</credentialsId>
-      <id>58f0694f-1760-4610-b4f2-73ffb34c61a3</id>
-      <description></description>
-      <secret>##SECRET:github_token_ghprb2##</secret>
-    </org.jenkinsci.plugins.ghprb.GhprbGitHubAuth>
-  </githubAuth>
-  <adminlist></adminlist>
-  <requestForTestingPhrase>Can one of the admins verify this patch?</requestForTestingPhrase>
-  <extensions>
-    <org.jenkinsci.plugins.ghprb.extensions.status.GhprbSimpleStatus>
-      <commitStatusContext>ci.bazel.build</commitStatusContext>
-      <triggeredStatus></triggeredStatus>
-      <startedStatus></startedStatus>
-      <statusUrl></statusUrl>
-    </org.jenkinsci.plugins.ghprb.extensions.status.GhprbSimpleStatus>
-  </extensions>
-</org.jenkinsci.plugins.ghprb.GhprbTrigger_-DescriptorImpl>
diff --git a/jenkins/config/org.jenkinsci.plugins.workflow.libs.GlobalLibraries.xml b/jenkins/config/org.jenkinsci.plugins.workflow.libs.GlobalLibraries.xml
deleted file mode 100644
index bb584f3..0000000
--- a/jenkins/config/org.jenkinsci.plugins.workflow.libs.GlobalLibraries.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<org.jenkinsci.plugins.workflow.libs.GlobalLibraries>
-  <libraries>
-    <org.jenkinsci.plugins.workflow.libs.LibraryConfiguration>
-      <name>opt-lib</name>
-      <retriever class="org.jenkinsci.plugins.workflow.libs.SCMSourceRetriever">
-        <scm class="jenkins.plugins.git.GitSCMSource">
-          <id>f97d1277-16e1-4a66-ab25-c876be722f50</id>
-          <remote>file:///opt/lib</remote>
-          <credentialsId></credentialsId>
-          <remoteName>origin</remoteName>
-          <rawRefSpecs>+refs/heads/*:refs/remotes/origin/*</rawRefSpecs>
-          <includes>*</includes>
-          <excludes></excludes>
-          <ignoreOnPushNotifications>false</ignoreOnPushNotifications>
-        </scm>
-      </retriever>
-      <defaultVersion>master</defaultVersion>
-      <implicit>true</implicit>
-      <allowVersionOverride>true</allowVersionOverride>
-    </org.jenkinsci.plugins.workflow.libs.LibraryConfiguration>
-  </libraries>
-</org.jenkinsci.plugins.workflow.libs.GlobalLibraries>
diff --git a/jenkins/config/secrets/slave-to-master-security-kill-switch b/jenkins/config/secrets/slave-to-master-security-kill-switch
deleted file mode 100644
index 02e4a84..0000000
--- a/jenkins/config/secrets/slave-to-master-security-kill-switch
+++ /dev/null
@@ -1 +0,0 @@
-false
\ No newline at end of file
diff --git a/jenkins/gerrit-verifier.groovy b/jenkins/gerrit-verifier.groovy
deleted file mode 100644
index d8a291f..0000000
--- a/jenkins/gerrit-verifier.groovy
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import build.bazel.ci.GerritUtils
-import build.bazel.ci.JenkinsUtils
-
-GerritUtils gerrit = new GerritUtils(
-    "https://bazel-review.googlesource.com/",
-    "/opt/secrets/gerritcookies",
-    "Bazel CI <ci.bazel@gmail.com>")
-
-// Build the jobs associated to a given change.
-def buildChange(gerrit, change) {
-  def refspec = "+" + change.ref + ":" + change.ref.replaceAll('ref/', 'ref/remotes/origin/')
-  def jobs = JenkinsUtils.jobsWithDescription("CR", "Gerrit project: " + change.project + ".")
-
-  if (jobs != null && !jobs.empty) {
-    gerrit.startReview(change.number)
-    for(job in jobs) {
-      build job: "/CR/${job}", propagate: false, wait: false, parameters: [
-        [$class: 'StringParameterValue', name: 'REFSPEC', value: refspec],
-        [$class: 'StringParameterValue', name: 'BRANCH', value: change.sha1],
-        [$class: 'StringParameterValue', name: 'CHANGE_NUMBER', value: change.number.toString()]]
-    }
-  }
-}
-
-// Run the global presubmit job for a given change
-def globalPresubmit(gerrit, change) {
-  def refspec = "+" + change.ref + ":" + change.ref.replaceAll('ref/', 'ref/remotes/origin/')
-  gerrit.startReview(change.number)
-  build job: "/bazel/presubmit", propagate: false, wait: false, parameters: [
-    [$class: 'StringParameterValue', name: 'REFSPEC', value: refspec],
-    [$class: 'StringParameterValue', name: 'BRANCH', value: change.sha1],
-    [$class: 'StringParameterValue', name: 'CHANGE_NUMBER', value: change.number.toString()]]
-}
-
-timeout(2) {
-  def changes = [:]
-  // Get open gerrit changes that were verified but not yet processed
-  stage("Get changes") {
-    def acceptedChanges = gerrit.getVerifiedChanges()
-    def changesForGlobalPresubmit = gerrit.getVerifiedChanges("project:bazel", 2)
-    if (acceptedChanges) {
-      echo "Gerrit has " + acceptedChanges.size() + " change(s) to be verified"
-      for (int i = 0; i < acceptedChanges.size(); i++) {
-        def change = acceptedChanges[i]
-        changes[change.number] = { -> buildChange(gerrit, change) }
-      }
-    }
-    if (changesForGlobalPresubmit) {
-      echo "Gerrit has " + changesForGlobalPresubmit.size() + " change(s) waiting for global presubmit"
-      for (int i = 0; i < changesForGlobalPresubmit.size(); i++) {
-        def change = changesForGlobalPresubmit[i]
-        changes[change.number] = { -> globalPresubmit(gerrit, change) }
-      }
-    }
-    if (!changes && !changesForGlobalPresubmit) {
-      echo "No change to be verified"
-    }
-  }
-
-  // And build accepted changes
-  stage("Verify") {
-    parallel changes
-  }
-}
diff --git a/jenkins/gerrit-verifier.xml.tpl b/jenkins/gerrit-verifier.xml.tpl
deleted file mode 100644
index fcfe377..0000000
--- a/jenkins/gerrit-verifier.xml.tpl
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<flow-definition plugin="workflow-job">
-  <actions/>
-  <description></description>
-  <keepDependencies>false</keepDependencies>
-  <properties>
-    <jenkins.model.BuildDiscarderProperty>
-      <strategy class="hudson.tasks.LogRotator">
-        <daysToKeep>-1</daysToKeep>
-        <numToKeep>25</numToKeep>
-        <artifactDaysToKeep>-1</artifactDaysToKeep>
-        <artifactNumToKeep>-1</artifactNumToKeep>
-      </strategy>
-    </jenkins.model.BuildDiscarderProperty>
-    <org.jenkinsci.plugins.workflow.job.properties.DisableConcurrentBuildsJobProperty/>
-    <org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-      <triggers>
-        <hudson.triggers.TimerTrigger>
-          <spec>* * * * *</spec>
-        </hudson.triggers.TimerTrigger>
-      </triggers>
-    </org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-  </properties>
-  <assignedNode>deploy</assignedNode>
-  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps">
-    <script>{{ imports['//jenkins:gerrit-verifier.groovy'] }}</script>
-    <sandbox>true</sandbox>
-  </definition>
-  <triggers/>
-</flow-definition>
diff --git a/jenkins/jobs/BUILD b/jenkins/jobs/BUILD
deleted file mode 100644
index 68d2fc7..0000000
--- a/jenkins/jobs/BUILD
+++ /dev/null
@@ -1,218 +0,0 @@
-load("//jenkins/build_defs:jenkins.bzl", "jenkins_job", "bazel_github_job", "bazel_git_job")
-load(":jobs.bzl", "job_lists")
-load("//jenkins/lib:def.bzl", "bazel_job_configuration_test")
-
-# Tests
-[bazel_job_configuration_test(
-    name = s + "-test",
-    configs = [s],
-) for s in glob(["configs/*.json"])]
-
-# Some common jobs
-[jenkins_job(
-    name = "bazel/" + job,
-    config = "global/%s.xml.tpl" % job,
-    deps = [
-        ":configs/bootstrap.json",
-    ],
-) for job in [
-    "nightly",
-    "presubmit",
-    "release",
-]]
-
-jenkins_job(
-    name = "maintenance/install-bazel",
-    config = "install-bazel.xml.tpl",
-    deps = [":install-bazel.groovy"],
-)
-
-##
-## list of projects
-##
-
-# Jobs from the tensorflow org
-bazel_github_job(
-    name = "TensorFlow",
-    config = ":configs/tensorflow.json",
-    org = "tensorflow",
-    project = "tensorflow",
-    project_url = "https://tensorflow.org",
-)
-
-bazel_github_job(
-    name = "TensorFlow_Serving",
-    config = ":configs/tensorflow_serving.json",
-    org = "tensorflow",
-    project = "serving",
-)
-
-bazel_github_job(
-    name = "tf_models_syntaxnet",
-    config = ":configs/tf_models_syntaxnet.json",
-    org = "tensorflow",
-    project = "models",
-    workspace = "research/syntaxnet",
-)
-
-# Job for testing Gerrit
-bazel_git_job(
-    name = "gerrit",
-    config = ":configs/gerrit.json",
-    git_url = "https://gerrit.googlesource.com/gerrit",
-    org = "GerritCodeReview",
-    project_url = "https://www.gerritcodereview.com",
-)
-
-# Jobs from the bazelbuild org with customization
-bazel_github_job(
-    name = "tutorial",
-    config = ":configs/tutorial.json",
-    project = "examples",
-    workspace = "tutorial",
-)
-
-bazel_github_job(
-    name = "eclipse",
-    gerrit_project = "eclipse",
-)
-
-bazel_github_job(
-    name = "continuous-integration",
-    config = ":configs/continuous-integration.json",
-    gerrit_project = "continuous-integration",
-)
-
-bazel_github_job(
-    name = "bazel-tests-remote",
-    config = ":configs/empty.json",
-    gerrit_project = "bazel",
-    git_url = "https://bazel.googlesource.com/bazel",
-    pr_enabled = False,  # Do not vet PR because it seems to cancel bazel-tests.
-    project = "bazel",
-    use_upstream_branch = True,
-)
-
-bazel_github_job(
-    name = "bazel-tests",
-    config = ":configs/empty.json",
-    gerrit_project = "bazel",
-    git_url = "https://bazel.googlesource.com/bazel",
-    project = "bazel",
-    use_upstream_branch = True,
-)
-
-bazel_github_job(
-    name = "buildtools",
-    config = ":configs/buildtools.json",
-)
-
-bazel_github_job(
-    name = "bazel-toolchains",
-    config = ":configs/empty.json",
-    gerrit_project = "bazel-toolchains",
-    git_url = "https://bazel.googlesource.com/bazel-toolchains",
-)
-
-bazel_github_job(
-    name = "rules_webtesting",
-    config = ":configs/rules_webtesting.json",
-    run_sequential = True,
-    sauce_enabled = True,
-)
-
-bazel_github_job(
-    name = "intellij",
-    config = ":configs/intellij.json",
-    project_url = "https://ij.bazel.build",
-)
-
-# Jobs from the bazelbuild org that have a specific config on continuous-integration
-# side.
-# TODO(dmarting): merge with the next list once we move those configuration file
-# on the repository side.
-[bazel_github_job(
-    name = n,
-    config = ":configs/%s.json" % n,
-) for n in [
-    "rules_dotnet",
-    "rules_jsonnet",
-    "rules_rust",
-    "rules_scala",
-]]
-
-# Jobs from the bazelbuild org using the default configuration
-[bazel_github_job(name = n) for n in [
-    "bazel-watcher",
-    "migration-tooling",
-    "rules_appengine",
-    "rules_closure",
-    "rules_d",
-    "rules_docker",
-    "rules_go",
-    "rules_perl",
-    "rules_sass",
-    "skydoc",
-]]
-
-# Jobs without tests
-[bazel_github_job(
-    name = n,
-    config = ":configs/no-tests.json",
-) for n in [
-    "rules_groovy",
-    "rules_gwt",
-]]
-
-# Jobs from the bazelbuild org using a dummy configuration
-[bazel_github_job(
-    name = n,
-    config = ":configs/empty.json",
-) for n in [
-    "bazel-integration-testing",
-    "BUILD_file_generator",
-    "rules_apple",
-    "rules_k8s",
-    "rules_nodejs",
-    "rules_python",
-    "rules_typescript",
-]]
-
-# Jobs from the abseil org
-[bazel_github_job(
-    name = n,
-    config = ":configs/empty.json",
-    org = "abseil",
-) for n in [
-    "abseil-cpp",
-    "abseil-py",
-]]
-
-# Jobs from the google org
-bazel_github_job(
-    name = "glog",
-    org = "google",
-)
-
-bazel_github_job(
-    name = "re2",
-    config = ":configs/re2.json",
-    org = "google",
-)
-
-bazel_github_job(
-    name = "protobuf",
-    config = ":configs/protobuf.json",
-    org = "google",
-)
-
-bazel_github_job(
-    name = "subpar",
-    org = "google",
-)
-
-# End of project list
-job_lists(
-    name = "jobs",
-    visibility = ["//jenkins:__pkg__"],
-)
diff --git a/jenkins/jobs/configs/bootstrap.json b/jenkins/jobs/configs/bootstrap.json
deleted file mode 100644
index 80b8fa1..0000000
--- a/jenkins/jobs/configs/bootstrap.json
+++ /dev/null
@@ -1,64 +0,0 @@
-// DO NOT MODIFY!
-// This file is used only for older tree of Bazel, new tree includes it.
-// Please modify https://github.com/bazelbuild/bazel/blob/master/scripts/ci/bootstrap.json
-[
-    {
-        "node": "linux-x86_64",
-        "parameters": {
-            "archive": {
-                "bazel-bin/src/bazel": "bazel",
-                "bazel-bin/scripts/packages/with-jdk/install.sh": "bazel-%{release_name}-installer-linux-x86_64.sh",
-                "bazel-bin/scripts/packages/without-jdk/install.sh": "bazel-%{release_name}-without-jdk-installer-linux-x86_64.sh",
-                "bazel-bin/scripts/packages/debian/bazel-debian.deb": "bazel_%{release_name}-linux-x86_64.deb",
-                "bazel-genfiles/bazel-distfile.zip": "bazel-%{release_name}-dist.zip"
-            },
-            "stash": {
-                "bazel-genfiles/scripts/packages/debian/bazel.dsc": "bazel.dsc",
-                "bazel-genfiles/scripts/packages/debian/bazel.tar.gz": "bazel.tar.gz",
-                "bazel-genfiles/site/jekyll-tree.tar": "docs.bazel.build.tar",
-            },
-            "targets": [
-                "//scripts/packages",
-                "//site:jekyll-tree",
-            ]
-        }
-    },
-    { "node": "ubuntu_16.04-x86_64" },
-    {
-        "node": "darwin-x86_64",
-        "parameters": {
-            "archive": {
-                "bazel-bin/src/bazel": "bazel",
-                "bazel-bin/scripts/packages/with-jdk/install.sh": "bazel-%{release_name}-installer-darwin-x86_64.sh",
-                "bazel-bin/scripts/packages/without-jdk/install.sh": "bazel-%{release_name}-without-jdk-installer-darwin-x86_64.sh"
-            },
-            "targets": [
-                "//scripts/packages"
-            ],
-            // TODO(dmarting): Do we still needs that? this could be done as an external repo
-            // instead.
-            "opts": ["--define IPHONE_SDK=1"]
-        }
-    },
-    {
-        "node": "windows-x86_64",
-        "parameters": {
-            "archive": {
-                "bazel-bin/src/bazel": ["bazel.exe", "bazel-%{release_name}-without-jdk-windows-x86_64.exe"],
-                "bazel-bin/src/bazel_with_jdk": "bazel-%{release_name}-windows-x86_64.exe",
-                "bazel-genfiles/scripts/packages/bazel.zip": "bazel-%{release_name}-without-jdk-windows-x86_64.zip",
-                "bazel-genfiles/scripts/packages/bazel_with_jdk.zip": "bazel-%{release_name}-windows-x86_64.zip"
-            },
-            "targets": [
-                "//scripts/packages"
-            ],
-            "opts": [
-                "--copt=-w",
-                "--host_copt=-w",
-                // TODO(pcloudy):
-                // Remove it after wrapper-less CROSSTOOL becomes default
-                "--action_env=NO_MSVC_WRAPPER=1"
-            ]
-        }
-    }
-]
diff --git a/jenkins/jobs/configs/buildtools.json b/jenkins/jobs/configs/buildtools.json
deleted file mode 100644
index 02debc2..0000000
--- a/jenkins/jobs/configs/buildtools.json
+++ /dev/null
@@ -1,17 +0,0 @@
-[
-    {
-        "configurations": [
-            {
-                "configurations": [
-                    {"node": "linux-x86_64"},
-                    {"node": "ubuntu_16.04-x86_64"},
-                    {"node": "darwin-x86_64"}
-                ]
-            }
-        ],
-        "parameters": {
-            "targets": [],
-            "tests": [":tests"]
-        }
-    }
-]
diff --git a/jenkins/jobs/configs/continuous-integration.json b/jenkins/jobs/configs/continuous-integration.json
deleted file mode 100644
index b60446b..0000000
--- a/jenkins/jobs/configs/continuous-integration.json
+++ /dev/null
@@ -1,5 +0,0 @@
-[
-    {
-        "node": "linux-x86_64",
-    }
-]
diff --git a/jenkins/jobs/configs/empty.json b/jenkins/jobs/configs/empty.json
deleted file mode 100644
index f04086a..0000000
--- a/jenkins/jobs/configs/empty.json
+++ /dev/null
@@ -1,3 +0,0 @@
-// This configuration file is for new project so that they can setup the configuration
-// on the repository side. It build nothing, just create an empty project.
-[]
diff --git a/jenkins/jobs/configs/gerrit.json b/jenkins/jobs/configs/gerrit.json
deleted file mode 100644
index 16383da..0000000
--- a/jenkins/jobs/configs/gerrit.json
+++ /dev/null
@@ -1,31 +0,0 @@
-[
-    {
-        "configurations": [
-            {
-                "configurations": [
-                    {"node": "linux-x86_64"},
-                    {"node": "ubuntu_16.04-x86_64"},
-                    {"node": "darwin-x86_64"}
-                ]
-            }
-        ],
-        "parameters": {
-            "tests": ["//..."],
-            "test_tag_filters": ["-slow"],
-            "targets": ["//:release"],
-        }
-    }, {
-        "configurations": [
-            {"node": "windows-x86_64"}
-        ],
-        "parameters": {
-            "build_opts": [
-                "--workspace_status_command=tools/workspace-status.cmd",
-                "--verbose_failures"
-            ],
-            "tests": ["//javatests/..."],
-            "test_tag_filters": ["-slow", "-no_windows"],
-            "targets": ["//:headless"]
-        }
-    }
-]
diff --git a/jenkins/jobs/configs/intellij.json b/jenkins/jobs/configs/intellij.json
deleted file mode 100644
index 706c9da..0000000
--- a/jenkins/jobs/configs/intellij.json
+++ /dev/null
@@ -1,57 +0,0 @@
-[
-    {
-        "product": "intellij",
-        "configurations": [
-            {
-                "configurations": [
-                    {"node": "linux-x86_64"},
-                    {"node": "ubuntu_16.04-x86_64"},
-                    {"node": "darwin-x86_64"}
-                ]
-            }
-        ],
-        "parameters": {
-            "targets": ["ijwb:ijwb_bazel"],
-            "test_opts": ["--define=ij_product=intellij-latest"],
-            "build_opts": ["--define=ij_product=intellij-latest"],
-            "tests": [":ijwb_tests"]
-        }
-    },
-    {
-        "product": "clion",
-        "configurations": [
-            {
-                "configurations": [
-                    {"node": "linux-x86_64"},
-                    {"node": "ubuntu_16.04-x86_64"},
-                    {"node": "darwin-x86_64"}
-                ]
-            }
-        ],
-        "parameters": {
-            "targets": ["clwb:clwb_bazel"],
-            "test_opts": ["--define=ij_product=clion-latest"],
-            "build_opts": ["--define=ij_product=clion-latest"],
-            "tests": [":clwb_tests"]
-        }
-    }//,
-    // TODO(dmarting): Reenable android-studio when upstream is fixed
-    // {
-    //     "name": "android-studio",
-    //     "configurations": [
-    //         {
-    //             "configurations": [
-    //                 {"node": "linux-x86_64"},
-    //                 {"node": "ubuntu_16.04-x86_64"},
-    //                 {"node": "darwin-x86_64"}
-    //             ]
-    //         }
-    //     ],
-    //     "parameters": {
-    //         "targets": ["aswb:aswb_bazel"],
-    //         "test_opts": ["--define=ij_product=android-studio-latest"],
-    //         "build_opts": ["--define=ij_product=android-studio-latest"],
-    //         "tests": [":aswb_tests"]
-    //     }
-    // }
-]
diff --git a/jenkins/jobs/configs/no-tests.json b/jenkins/jobs/configs/no-tests.json
deleted file mode 100644
index 5d48a0b..0000000
--- a/jenkins/jobs/configs/no-tests.json
+++ /dev/null
@@ -1,10 +0,0 @@
-[
-    {
-        "parameters": {"tests": []},
-        "configurations": [
-            {"node": "linux-x86_64"},
-            {"node": "ubuntu_16.04-x86_64"},
-            {"node": "darwin-x86_64"}
-        ]
-    }
-]
diff --git a/jenkins/jobs/configs/protobuf.json b/jenkins/jobs/configs/protobuf.json
deleted file mode 100644
index 4cd968f..0000000
--- a/jenkins/jobs/configs/protobuf.json
+++ /dev/null
@@ -1,18 +0,0 @@
-[
-    {
-        "configurations": [
-            {
-                "configurations": [
-                    {"node": "linux-x86_64"},
-                    {"node": "ubuntu_16.04-x86_64"},
-                    {"node": "darwin-x86_64"}
-                ]
-            }
-        ],
-        "parameters": {
-            "targets": [],
-            // on Linux protobuf tries to build objc target so filter by test only
-            "tests": ["//:all"]
-        }
-    }
-]
diff --git a/jenkins/jobs/configs/re2.json b/jenkins/jobs/configs/re2.json
deleted file mode 100644
index 30e46b9..0000000
--- a/jenkins/jobs/configs/re2.json
+++ /dev/null
@@ -1,17 +0,0 @@
-[
-    {
-        "configurations": [
-            {
-                "configurations": [
-                    {"node": "linux-x86_64"},
-                    {"node": "ubuntu_16.04-x86_64"},
-                    {"node": "darwin-x86_64"}
-                ]
-            }
-        ],
-        "parameters": {
-            "targets": [],
-            "tests": ["//:all"]
-        }
-    }
-]
diff --git a/jenkins/jobs/configs/rules_dotnet.json b/jenkins/jobs/configs/rules_dotnet.json
deleted file mode 100644
index eccffde..0000000
--- a/jenkins/jobs/configs/rules_dotnet.json
+++ /dev/null
@@ -1,9 +0,0 @@
-[
-    {
-        // rules_dotnet is disabled on Linux until bazelbuild/rules_dotnet#13 is fixed.
-        "node": "darwin-x86_64",
-        "parameters": {
-            "build_opts": ["--spawn_strategy=standalone"]
-        }
-    }
-]
diff --git a/jenkins/jobs/configs/rules_jsonnet.json b/jenkins/jobs/configs/rules_jsonnet.json
deleted file mode 100644
index d983e09..0000000
--- a/jenkins/jobs/configs/rules_jsonnet.json
+++ /dev/null
@@ -1,17 +0,0 @@
-[
-    {
-        "configurations": [
-            {
-                "configurations": [
-                    {"node": "linux-x86_64"},
-                    {"node": "ubuntu_16.04-x86_64"},
-                    {"node": "darwin-x86_64"}
-                ]
-            }
-        ],
-        "parameters": {
-            "targets": ["//...", "@examples//..."],
-            "tests": ["//...", "@examples//..."]
-        }
-    }
-]
diff --git a/jenkins/jobs/configs/rules_rust.json b/jenkins/jobs/configs/rules_rust.json
deleted file mode 100644
index d983e09..0000000
--- a/jenkins/jobs/configs/rules_rust.json
+++ /dev/null
@@ -1,17 +0,0 @@
-[
-    {
-        "configurations": [
-            {
-                "configurations": [
-                    {"node": "linux-x86_64"},
-                    {"node": "ubuntu_16.04-x86_64"},
-                    {"node": "darwin-x86_64"}
-                ]
-            }
-        ],
-        "parameters": {
-            "targets": ["//...", "@examples//..."],
-            "tests": ["//...", "@examples//..."]
-        }
-    }
-]
diff --git a/jenkins/jobs/configs/rules_scala.json b/jenkins/jobs/configs/rules_scala.json
deleted file mode 100644
index 325df58..0000000
--- a/jenkins/jobs/configs/rules_scala.json
+++ /dev/null
@@ -1,17 +0,0 @@
-[
-    {
-        "configurations": [
-            {
-                "configurations": [
-                    {"node": "linux-x86_64"},
-                    {"node": "ubuntu_16.04-x86_64"},
-                    {"node": "darwin-x86_64"}
-                ]
-            }
-        ],
-        "parameters": {
-            "targets": ["//test/..."],
-            "tests": ["//test/..."]
-        }
-    }
-]
diff --git a/jenkins/jobs/configs/rules_webtesting.json b/jenkins/jobs/configs/rules_webtesting.json
deleted file mode 100644
index e2dcb75..0000000
--- a/jenkins/jobs/configs/rules_webtesting.json
+++ /dev/null
@@ -1,18 +0,0 @@
-[
-    {
-        "configurations": [
-            {
-                "configurations": [
-                    {"node": "linux-x86_64"},
-                    {"node": "ubuntu_16.04-x86_64"},
-                    {"node": "darwin-x86_64"}
-                ]
-            }
-        ],
-        "parameters": {
-            // Disable chrome55-win10 test until https://github.com/bazelbuild/rules_webtesting/issues/188
-            // is resolved.
-            "tests": ["tests(//...) - //go/launcher/webdriver:go_default_test_chrome55-win10"],
-        }
-    }
-]
diff --git a/jenkins/jobs/configs/tensorflow.json b/jenkins/jobs/configs/tensorflow.json
deleted file mode 100644
index 1a203e7..0000000
--- a/jenkins/jobs/configs/tensorflow.json
+++ /dev/null
@@ -1,46 +0,0 @@
-[
-    {
-        "configurations": [
-            {
-                "configurations": [
-                    {"node": "linux-x86_64"},
-                    {"node": "ubuntu_16.04-x86_64"}
-                ]
-            }
-        ],
-        "parameters": {
-            "configure": [
-                "echo -e '\nimport %workspace%/.bazelrc' >>bazel.bazelrc",
-                "touch .bazelrc",
-                "./tensorflow/tools/ci_build/builds/configured CPU"
-            ],
-            "test_opts": ["--test_timeout=1800"],
-            "build_opts": ["-c opt"],
-            "tests": ["filter(':(lib|platform)_.*', kind(test, //tensorflow/core:all))"],
-            "targets": ["//tensorflow/tools/pip_package:build_pip_package"]
-        }
-    }, {
-        "toolchain": "msvc",
-        "configurations": [{
-            "configurations": [{"node": "windows-x86_64"}]
-        }],
-        "parameters": {
-            "configure": [
-                "if not exist C:\\tmp md C:\\tmp",
-                "echo.>>bazel.bazelrc",
-                "echo import .bazelrc>>bazel.bazelrc",
-                "echo.>>.bazelrc",
-                "yes '' | python ./configure.py"
-            ],
-            "startup_opts": [
-                "--output_base=c:/tmp" // Use a short output root to avoid potential long path issue
-            ],
-            "build_opts": [
-                "-c opt",
-                "--define=override_eigen_strong_inline=true" // speed up the compiling, see https://github.com/tensorflow/tensorflow/issues/10521
-            ],
-            "targets": ["//tensorflow/tools/pip_package:build_pip_package"],
-            "tests": []
-        }
-    }
-]
diff --git a/jenkins/jobs/configs/tensorflow_serving.json b/jenkins/jobs/configs/tensorflow_serving.json
deleted file mode 100644
index daf2ff2..0000000
--- a/jenkins/jobs/configs/tensorflow_serving.json
+++ /dev/null
@@ -1,22 +0,0 @@
-[
-    {
-        "configurations": [
-            {
-                "configurations": [
-                    {"node": "linux-x86_64"},
-                    {"node": "ubuntu_16.04-x86_64"}
-                ]
-            }
-        ],
-        "parameters": {
-            "configure": [
-                "(cd tensorflow && ./tensorflow/tools/ci_build/builds/configured CPU)",
-                "echo -e '\nimport %workspace%/tensorflow/.tf_configure.bazelrc' >>bazel.bazelrc",
-                "$BAZEL clean" // Clean to work around bazelbuild/bazel#3664
-            ],
-            "tests": ["tensorflow_serving/... - //tensorflow_serving/model_servers:tensorflow_model_server_test"],
-            "build_opts": ["--config=monolithic"],
-            "targets": []
-        }
-    }
-]
diff --git a/jenkins/jobs/configs/tf_models_syntaxnet.json b/jenkins/jobs/configs/tf_models_syntaxnet.json
deleted file mode 100644
index da51600..0000000
--- a/jenkins/jobs/configs/tf_models_syntaxnet.json
+++ /dev/null
@@ -1,22 +0,0 @@
-[
-    {
-        "configurations": [
-            {
-                "configurations": [
-                    {"node": "linux-x86_64"},
-                    {"node": "ubuntu_16.04-x86_64"}
-                ]
-            }
-        ],
-        "parameters": {
-            "configure": [
-                "(cd tensorflow && ./tensorflow/tools/ci_build/builds/configured CPU)",
-                "echo -e '\nimport %workspace%/tensorflow/.tf_configure.bazelrc' >>bazel.bazelrc",
-                "$BAZEL clean" // Clean to work around bazelbuild/bazel#3664
-            ],
-            "tests": ["syntaxnet/... - //syntaxnet:beam_reader_ops_test - //syntaxnet:graph_builder_test - //syntaxnet:lexicon_builder_test - //syntaxnet:parser_trainer_test - //syntaxnet:reader_ops_test - //syntaxnet:text_formats_test - //syntaxnet/util:check_test - //syntaxnet/util:registry_test", "util/utf8/..."],
-            "build_opts": ["--config=monolithic"],
-            "targets": []
-        }
-    }
-]
diff --git a/jenkins/jobs/configs/tutorial.json b/jenkins/jobs/configs/tutorial.json
deleted file mode 100644
index c949ffe..0000000
--- a/jenkins/jobs/configs/tutorial.json
+++ /dev/null
@@ -1,30 +0,0 @@
-[
-    {
-        "configurations": [
-            {
-                "configurations": [
-                    {"node": "linux-x86_64"},
-                    {"node": "ubuntu_16.04-x86_64"},
-                    {"node": "darwin-x86_64"}
-                ]
-            }
-        ],
-        "parameters": {
-            "configure": [
-                "echo >>WORKSPACE",
-                "cat >>WORKSPACE <<EOF",
-                "android_sdk_repository(",
-                "    name = \"androidsdk\",",
-                "    path = \"${ANDROID_SDK_PATH}\",",
-                ")",
-                "android_ndk_repository(",
-                "    name = \"androidndk\",",
-                "    path = \"${ANDROID_NDK_PATH}\",",
-                ")",
-                "EOF"
-            ],
-            "targets": ["//:all"],
-            "tests": []
-        }
-    }
-]
diff --git a/jenkins/jobs/global/nightly.xml.tpl b/jenkins/jobs/global/nightly.xml.tpl
deleted file mode 100644
index 1ec4c55..0000000
--- a/jenkins/jobs/global/nightly.xml.tpl
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<flow-definition>
-  <actions/>
-  <description>Global pipeline to bootstrap bazel and runs all downstream jobs</description>
-  <keepDependencies>false</keepDependencies>
-  <properties>
-    <org.jenkinsci.plugins.workflow.job.properties.DisableConcurrentBuildsJobProperty/>
-    <com.coravy.hudson.plugins.github.GithubProjectProperty>
-      <projectUrl>https://github.com/bazelbuild/bazel/</projectUrl>
-      <displayName></displayName>
-    </com.coravy.hudson.plugins.github.GithubProjectProperty>
-    <jenkins.model.BuildDiscarderProperty>
-      <strategy class="hudson.tasks.LogRotator">
-        <daysToKeep>90</daysToKeep>
-        <numToKeep>-1</numToKeep>
-        <artifactDaysToKeep>-1</artifactDaysToKeep>
-        <artifactNumToKeep>-1</artifactNumToKeep>
-      </strategy>
-    </jenkins.model.BuildDiscarderProperty>
-    <hudson.model.ParametersDefinitionProperty>
-      <parameterDefinitions>
-        <hudson.model.TextParameterDefinition>
-          <name>EXTRA_BAZELRC</name>
-          <description>To inject new option to the .bazelrc file in downstream projects.</description>
-          <defaultValue></defaultValue>
-        </hudson.model.TextParameterDefinition>
-      </parameterDefinitions>
-    </hudson.model.ParametersDefinitionProperty>
-    <org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-      <triggers>
-        <hudson.triggers.TimerTrigger>
-          <spec>@midnight</spec>
-        </hudson.triggers.TimerTrigger>
-      </triggers>
-    </org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-  </properties>
-  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition">
-    <script>
-  globalBazelTest(
-      repository: "https://bazel.googlesource.com/bazel",
-      branch: "master",
-      extra_bazelrc: params.EXTRA_BAZELRC,
-      refspec: "+refs/heads/*:refs/remotes/origin/*",
-      configuration: '''{{ raw_imports['//jenkins/jobs:configs/bootstrap.json'].replace('\\', '\\\\').replace("'", "\\'") }}''')
-  </script>
-    <sandbox>true</sandbox>
-  </definition>
-  <triggers/>
-</flow-definition>
diff --git a/jenkins/jobs/global/presubmit.xml.tpl b/jenkins/jobs/global/presubmit.xml.tpl
deleted file mode 100644
index 6e26601..0000000
--- a/jenkins/jobs/global/presubmit.xml.tpl
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<flow-definition>
-  <actions/>
-  <description>Global pipeline to bootstrap bazel and runs all downstream jobs</description>
-  <keepDependencies>false</keepDependencies>
-  <properties>
-    <org.jenkinsci.plugins.workflow.job.properties.DisableConcurrentBuildsJobProperty/>
-    <com.coravy.hudson.plugins.github.GithubProjectProperty>
-      <projectUrl>https://github.com/bazelbuild/bazel/</projectUrl>
-      <displayName></displayName>
-    </com.coravy.hudson.plugins.github.GithubProjectProperty>
-    <jenkins.model.BuildDiscarderProperty>
-      <strategy class="hudson.tasks.LogRotator">
-        <daysToKeep>90</daysToKeep>
-        <numToKeep>-1</numToKeep>
-        <artifactDaysToKeep>-1</artifactDaysToKeep>
-        <artifactNumToKeep>-1</artifactNumToKeep>
-      </strategy>
-    </jenkins.model.BuildDiscarderProperty>
-    <hudson.model.ParametersDefinitionProperty>
-      <parameterDefinitions>
-        <hudson.model.StringParameterDefinition>
-          <name>REPOSITORY</name>
-          <description>The repository to build</description>
-          <defaultValue>https://bazel.googlesource.com/bazel</defaultValue>
-        </hudson.model.StringParameterDefinition>
-        <hudson.model.StringParameterDefinition>
-          <name>BRANCH</name>
-          <description>The branch to build</description>
-          <defaultValue>master</defaultValue>
-        </hudson.model.StringParameterDefinition>
-        <hudson.model.StringParameterDefinition>
-          <name>REFSPEC</name>
-          <description>The refspec to fetch</description>
-          <defaultValue>+refs/heads/*:refs/remotes/origin/*</defaultValue>
-        </hudson.model.StringParameterDefinition>
-        <hudson.model.TextParameterDefinition>
-          <name>EXTRA_BAZELRC</name>
-          <description>To inject new option to the .bazelrc file in downstream projects.</description>
-          <defaultValue></defaultValue>
-        </hudson.model.TextParameterDefinition>
-        <hudson.model.StringParameterDefinition>
-          <name>CHANGE_NUMBER</name>
-          <description>Number of the change being tested, for information only.</description>
-          <defaultValue></defaultValue>
-        </hudson.model.StringParameterDefinition>
-      </parameterDefinitions>
-    </hudson.model.ParametersDefinitionProperty>
-    <org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-      <triggers/>
-    </org.jenkinsci.plugins.workflow.job.properties.PipelineTriggersJobProperty>
-  </properties>
-  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition">
-    <script>
-gerritReview("https://bazel-review.googlesource.com/",
-    "/opt/secrets/gerritcookies",
-    "Bazel CI &lt;ci.bazel@gmail.com&gt;",
-    params.CHANGE_NUMBER,
-    params.BRANCH) {
-  globalBazelTest(
-      repository: params.REPOSITORY,
-      branch: params.BRANCH,
-      extra_bazelrc: params.EXTRA_BAZELRC,
-      refspec: params.REFSPEC,
-      configuration: '''{{ raw_imports['//jenkins/jobs:configs/bootstrap.json'].replace('\\', '\\\\').replace("'", "\\'") }}''')
-  delegate.reportUrl = "${currentBuild.getAbsoluteUrl()}Downstream_projects/"
-}</script>
-    <sandbox>true</sandbox>
-  </definition>
-  <triggers/>
-</flow-definition>
diff --git a/jenkins/jobs/global/release.xml.tpl b/jenkins/jobs/global/release.xml.tpl
deleted file mode 100644
index 62b766f..0000000
--- a/jenkins/jobs/global/release.xml.tpl
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<flow-definition>
-  <actions/>
-  <description>Global pipeline to bootstrap bazel and runs all downstream jobs</description>
-  <keepDependencies>false</keepDependencies>
-  <properties>
-    <org.jenkinsci.plugins.workflow.job.properties.DisableConcurrentBuildsJobProperty/>
-    <com.coravy.hudson.plugins.github.GithubProjectProperty>
-      <projectUrl>https://github.com/bazelbuild/bazel/</projectUrl>
-      <displayName></displayName>
-    </com.coravy.hudson.plugins.github.GithubProjectProperty>
-    <jenkins.model.BuildDiscarderProperty>
-      <strategy class="hudson.tasks.LogRotator">
-        <daysToKeep>90</daysToKeep>
-        <numToKeep>-1</numToKeep>
-        <artifactDaysToKeep>-1</artifactDaysToKeep>
-        <artifactNumToKeep>-1</artifactNumToKeep>
-      </strategy>
-    </jenkins.model.BuildDiscarderProperty>
-    <hudson.model.ParametersDefinitionProperty>
-      <parameterDefinitions>
-        <hudson.model.StringParameterDefinition>
-          <name>payload</name>
-          <description>Payload sent by GitHub</description>
-          <defaultValue></defaultValue>
-        </hudson.model.StringParameterDefinition>
-        <hudson.model.TextParameterDefinition>
-          <name>EXTRA_BAZELRC</name>
-          <description>To inject new option to the .bazelrc file in downstream projects.</description>
-          <defaultValue></defaultValue>
-        </hudson.model.TextParameterDefinition>
-      </parameterDefinitions>
-    </hudson.model.ParametersDefinitionProperty>
-  </properties>
-  <authToken>##SECRET:github_trigger_auth_token##</authToken>
-  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition">
-    <script>
-githubHook(refs: '^refs/(heads/release-|tags/).*$') {
-  globalBazelTest(
-      repository: delegate.url,
-      branch: delegate.branch,
-      extra_bazelrc: params.EXTRA_BAZELRC,
-      refspec: "+refs/heads/*:refs/remotes/origin/* +refs/notes/*:refs/notes/*",
-      configuration: '''{{ raw_imports['//jenkins/jobs:configs/bootstrap.json'].replace('\\', '\\\\').replace("'", "\\'") }}''')
-}
-  </script>
-    <sandbox>true</sandbox>
-  </definition>
-  <triggers/>
-</flow-definition>
diff --git a/jenkins/jobs/install-bazel.groovy b/jenkins/jobs/install-bazel.groovy
deleted file mode 100644
index 3b42eea..0000000
--- a/jenkins/jobs/install-bazel.groovy
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Install the bazel release on all the machine
-
-import build.bazel.ci.JenkinsUtils
-
-jobs = [:]
-nodes = JenkinsUtils.nodeNames("install-bazel")
-latest = "latest"
-
-stage("Get latest version of Bazel") {
-  latest = installBazel.getLatestBazelVersion()
-  echo "Latest bazel version is ${latest}"
-}
-
-for (int k = 0; k < nodes.size(); k++) {
-  def node = nodes[k]
-  if (!node.startsWith("freebsd")) {
-    // Skip FreeBSD, because we install Bazel via ports on that platform.
-    jobs[node] = {
-      stage("Install Bazel on ${node}") {
-        installBazel(node: node,
-                     version: latest,
-                     alias: "latest")
-      }
-    }
-  }
-}
-
-stage("Install on all nodes") {
-  // We fail after 4h in case a node is offline and doesn't come back online.
-  timeout(240) {
-    parallel jobs
-  }
-}
diff --git a/jenkins/jobs/install-bazel.xml.tpl b/jenkins/jobs/install-bazel.xml.tpl
deleted file mode 100644
index 1e7948b..0000000
--- a/jenkins/jobs/install-bazel.xml.tpl
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<flow-definition>
-  <actions/>
-  <description>Job to install Bazel on all nodes</description>
-  <keepDependencies>false</keepDependencies>
-  <properties>
-    <org.jenkinsci.plugins.workflow.job.properties.DisableConcurrentBuildsJobProperty/>
-    <jenkins.model.BuildDiscarderProperty>
-      <strategy class="hudson.tasks.LogRotator">
-        <daysToKeep>-1</daysToKeep>
-        <numToKeep>25</numToKeep>
-        <artifactDaysToKeep>-1</artifactDaysToKeep>
-        <artifactNumToKeep>-1</artifactNumToKeep>
-      </strategy>
-    </jenkins.model.BuildDiscarderProperty>
-  </properties>
-  <definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition">
-    <script>{{ imports['//jenkins/jobs:install-bazel.groovy'] }}</script>
-    <sandbox>true</sandbox>
-  </definition>
-  <triggers/>
-</flow-definition>
diff --git a/jenkins/jobs/jobs.bzl b/jenkins/jobs/jobs.bzl
deleted file mode 100644
index 817b80c..0000000
--- a/jenkins/jobs/jobs.bzl
+++ /dev/null
@@ -1,8 +0,0 @@
-def job_lists(name, visibility):
-  jobs = native.existing_rules()
-
-  native.filegroup(
-    name = name,
-    srcs = [j for j in jobs if j.endswith("/all")],
-    visibility = visibility,
-  )
diff --git a/jenkins/lib/BUILD b/jenkins/lib/BUILD
deleted file mode 100644
index 1cfd15f..0000000
--- a/jenkins/lib/BUILD
+++ /dev/null
@@ -1,24 +0,0 @@
-package(default_visibility = ["//jenkins:__subpackages__"])
-
-load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_tar")
-load("@io_bazel_rules_groovy//groovy:groovy.bzl", "groovy_library")
-
-filegroup(
-    name = "vars-files",
-    srcs = glob(["vars/**"]),
-)
-
-filegroup(
-    name = "lib-files",
-    srcs = [
-        ":vars-files",
-        "//jenkins/lib/src/build/bazel/ci",
-    ],
-)
-
-pkg_tar(
-    name = "lib",
-    srcs = [":lib-files"],
-    package_dir = "/opt/lib",
-    strip_prefix = ".",
-)
diff --git a/jenkins/lib/def.bzl b/jenkins/lib/def.bzl
deleted file mode 100644
index 4dc207d..0000000
--- a/jenkins/lib/def.bzl
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright (C) 2017 The Bazel Authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-def bazel_job_configuration_test(name, configs):
-    """A simple test that test that all config files can be parsed."""
-    native.java_test(
-        name = name,
-        size = "small",
-        runtime_deps = [
-            "//3rdparty/jvm/org/codehaus/groovy:groovy_all",
-            "//3rdparty/jvm/org/hamcrest:hamcrest_all",
-            "//jenkins/lib/tests/build/bazel/ci:BazelConfigurationParsingTest"],
-        data = configs,
-        test_class = "build.bazel.ci.BazelConfigurationParsingTest",
-    )
diff --git a/jenkins/lib/src/build/bazel/ci/BUILD b/jenkins/lib/src/build/bazel/ci/BUILD
deleted file mode 100644
index ec14c62..0000000
--- a/jenkins/lib/src/build/bazel/ci/BUILD
+++ /dev/null
@@ -1,33 +0,0 @@
-package(default_visibility = ["//jenkins/lib:__subpackages__"])
-
-load("@io_bazel_rules_groovy//groovy:groovy.bzl", "groovy_library")
-
-filegroup(
-    name = "ci",
-    srcs = glob(
-        ["**"],
-        exclude = ["BUILD"],
-    ),
-)
-
-groovy_library(
-    name = "BazelConfiguration",
-    srcs = ["BazelConfiguration.groovy"],
-    deps = ["//3rdparty/jvm/com/cloudbees:groovy_cps"],
-)
-
-groovy_library(
-    name = "JsonUtils",
-    srcs = ["JsonUtils.groovy"],
-    deps = ["//3rdparty/jvm/com/cloudbees:groovy_cps"],
-)
-
-groovy_library(
-    name = "lib",
-    srcs = glob(["*.groovy"]),
-    deps = [
-        "//3rdparty/jvm/com/cloudbees:groovy_cps",
-        "//3rdparty/jvm/org/jenkins_ci/main:jenkins_core",
-        "//3rdparty/jvm/org/jenkins_ci/plugins/workflow:workflow_support",
-    ],
-)
diff --git a/jenkins/lib/src/build/bazel/ci/BazelConfiguration.groovy b/jenkins/lib/src/build/bazel/ci/BazelConfiguration.groovy
deleted file mode 100644
index 72cb8a8..0000000
--- a/jenkins/lib/src/build/bazel/ci/BazelConfiguration.groovy
+++ /dev/null
@@ -1,230 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package build.bazel.ci
-
-import com.cloudbees.groovy.cps.NonCPS
-import groovy.json.JsonSlurper
-import groovy.json.JsonParserType
-
-/**
- * A class that stores configuration for a Bazel job.
- *
- * A configuration is composed of a descriptor and a list of parameters.
- * A descriptor is a key-value map describing the configuration itself and
- * parameters are parameters for the job common to all configurations but for
- * which the value is configuration specific. E.g. test options or targets to
- * build.
- *
- * A configuration can contains several other configurations. In which case the
- * child configurations get factored with the parent configuration to create N
- * configurations that inherit the parameters and descriptor of the parent
- * configuration. If a child configuration specify a value already present in the
- * parent configuration, the parent configuration value will be ignored and the child
- * configuration value will be used.
- *
- * Example:
- * BazelConfiguration(["descriptor": "yeah"],
- *                    ["params1": false],
- *                    [BazelConfiguration(["descriptor2": "a"], [], [params2: true]),
- *                     BazelConfiguration(["descriptor2": "b"], [], [params1: true, params2: false])])
- *
- * would expand to the following configurations:
- *
- * BazelConfiguration(["descriptor": "yeah", "descriptor2": "a"], [params1: false, params2: true])])
- * BazelConfiguration(["descriptor": "yeah", "descriptor2": "b"], [params1: true, params2: false])])
- */
-class BazelConfiguration implements java.io.Serializable {
-  private Map<String, String> descriptor
-  private Map<String, Object> parameters
-  private List<BazelConfiguration> configurations
-
-  private static def EMPTY_CONFIGURATION = new BazelConfiguration([:], [:], [])
-
-  static public interface ConfigurationContainer {
-    def addConfiguration(BazelConfiguration)
-  }
-
-  private static List<BazelConfiguration> parseJson(Object json) {
-    List<BazelConfiguration> result = []
-    for (Object o in json) {
-      result.add(new BazelConfiguration(o))
-    }
-    return result
-  }
-
-  private static Object toSerializable(Object jsonObject) {
-    // JsonSlurper map and list are not serializable, which make them unsuitable for
-    // usage inside a Jenkins pipeline, convert them to HashMap and ArrayList
-    if (jsonObject instanceof Map) {
-      def result = [:]
-      for (e in jsonObject) {
-        result[e.key] = toSerializable(e.value)
-      }
-      return result
-    } else if (jsonObject instanceof List) {
-      def result = []
-      for (it in jsonObject) {
-        result.add(toSerializable(it))
-      }
-      return result
-    } else {
-      return jsonObject
-    }
-  }
-
-  /**
-   * Parse a list of configurations for a JSON string.
-   * A JSON configuration is an object whose key -> values are the entries
-   * of the configuration descriptor, except for "configurations" and "parameters"
-   * keys which correspond respectively to the child configurations and the parameters.
-   */
-  public static List<BazelConfiguration> parse(String jsonString) {
-    // There is a subtle bug in the parser so skip the first comment line
-    while (jsonString.trim().startsWith("//")) {
-      def pos = jsonString.indexOf("\n")
-      jsonString = pos < 0 ? "" : jsonString.substring(pos + 1)
-    }
-    def jsonObject = new JsonSlurper().setType(JsonParserType.LAX).parseText(jsonString);
-    return parseJson(toSerializable(jsonObject))
-  }
-
-  /** Parse a list of configurations from a JSON file. */
-  public static List<BazelConfiguration> parse(File jsonFile) {
-    return parse(jsonFile.text)
-  }
-
-  /**
-   * Flatten a list of configurations into a map of descriptor -> parameters.
-   *
-   * excludeConfigurations can be used to specifically deny certain configuration.
-   * A configuration will be selected only if, for any key k in the descriptor, either the k
-   * is not a key of excludeConfigurations or the value of the descriptor is NOT in
-   * excludeConfigurations[k].
-   *
-   * Examples:
-   * - excludeConfigurations = ["a": ["a", "b"]] would NOT match descriptor
-   *   ["a": "a"], ["a": "b"] but would match ["b": "whatever"] or ["a": "c"].
-   * - excludeConfigurations = ["node": ["linux-x86_64"]] would match descriptors
-   *   that DO NOT point to an execution on a linux node.
-   */
-  public static Map<Map<String, String>, Map<String, Object>> flattenConfigurations(
-      List<BazelConfiguration> configurations,
-      Map<String, List<String>> excludeConfigurations = [:]) {
-    def result = [:]
-    for (conf in configurations) {
-      result += conf.restrict(excludeConfigurations).flatten()
-    }
-    return result
-  }
-
-  private BazelConfiguration(Object json) {
-    this.parameters = ("parameters" in json) ? json["parameters"] : [:]
-    this.configurations = ("configurations" in json) ?
-        json["configurations"].collect { it -> new BazelConfiguration(it) } : []
-    this.descriptor = json.findAll { k, v -> k != "configurations" && k != "parameters" }
-  }
-
-  public BazelConfiguration(Map<String, String> descriptor,
-                            Map<String, Object> parameters,
-                            List<BazelConfiguration> configurations = []) {
-    this.descriptor = descriptor
-    this.parameters = parameters
-    this.configurations = configurations
-  }
-
-  def getDescriptor() {
-    return descriptor
-  }
-
-  def getParameters() {
-    return parameters
-  }
-
-  def getConfigurations() {
-    return configurations
-  }
-
-  private boolean matchRestriction(excludeConfigurations) {
-    // Avoid closures because CPS is having trouble with it
-    for (def e : descriptor.entrySet()) {
-      if ((e.key in excludeConfigurations) && (e.value in excludeConfigurations[e.key])) {
-        return true
-      }
-    }
-    return false
-  }
-
-  private BazelConfiguration restrict(excludeConfigurations) {
-    if (!excludeConfigurations.isEmpty()) {
-      if (matchRestriction(excludeConfigurations)) {
-        return EMPTY_CONFIGURATION
-      }
-      if (configurations.isEmpty()) {
-        return this
-      } else {
-        def newConfigs = []
-        for (configuration in configurations) {
-          def conf = configuration.restrict(excludeConfigurations)
-          if (conf != EMPTY_CONFIGURATION) {
-            newConfigs << conf
-          }
-        }
-        if (newConfigs.isEmpty()) {
-          return EMPTY_CONFIGURATION;
-        } else {
-          return new BazelConfiguration(descriptor, parameters, newConfigs)
-        }
-      }
-    }
-    return this
-  }
-
-  private Map<Map<String, String>, Map<String, Object>> flatten() {
-    Map<Map<String, String>, Map<String, Object>> result = [:]
-
-    if (configurations.isEmpty()) {
-      if (!descriptor.isEmpty()) {
-        result[descriptor] = parameters
-      }
-      return result
-    } else {
-      for (conf in configurations) {
-        def configs = conf.flatten()
-        for (e in configs) {
-          def descr2 = [:]
-          descr2.putAll(descriptor)
-          descr2.putAll(e.key)
-          result[descr2] = [:]
-          result[descr2].putAll(parameters)
-          result[descr2].putAll(e.value)
-        }
-      }
-      if (result.isEmpty() && !descriptor.isEmpty()) {
-        result[descriptor] = parameters
-      }
-      return result
-    }
-  }
-
-  public String toString() {
-    return "BazelConfiguration({descriptor=${descriptor}, parameters=${parameters}, configurations=${configurations})"
-  }
-
-  /** Convert a map descriptor to a one line description */
-  @NonCPS
-  public static def descriptorToString(descriptor) {
-    return descriptor.collect { "${it.key}=${it.value}" }.join(",")
-  }
-}
diff --git a/jenkins/lib/src/build/bazel/ci/BazelTestFailure.groovy b/jenkins/lib/src/build/bazel/ci/BazelTestFailure.groovy
deleted file mode 100644
index ec854ca..0000000
--- a/jenkins/lib/src/build/bazel/ci/BazelTestFailure.groovy
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package build.bazel.ci
-
-/** An exception thrown when a test failure occur */
-public class BazelTestFailure extends Exception {
-  static final long serialVersionUID = 1L;
-
-  BazelTestFailure() {
-    super("Test failures")
-  }
-}
diff --git a/jenkins/lib/src/build/bazel/ci/BazelUtils.groovy b/jenkins/lib/src/build/bazel/ci/BazelUtils.groovy
deleted file mode 100644
index a48aba2..0000000
--- a/jenkins/lib/src/build/bazel/ci/BazelUtils.groovy
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package build.bazel.ci
-
-import com.cloudbees.groovy.cps.NonCPS
-
-/**
- * A set of utility methods to call Bazel inside Jenkins
- */
-class BazelUtils implements Serializable {
-  private static final TEST_EVENTS_FILE = "bazel-events-test.json"
-  private static final BUILD_EVENTS_FILE = "bazel-events-build.json"
-  private String bazel;
-  private String ws;
-  private def script;
-  private boolean isWindows;
-  private def envs = [];
-
-  // Accessors
-  def setBazel(value) {
-    bazel = value
-  }
-
-  def getBazel() {
-    bazel
-  }
-
-  def setScript(value) {
-    script = value
-    ws = script.pwd()
-    isWindows = !script.isUnix()
-    if (isWindows) {
-      def bazel_sh = script.sh(script: "cygpath --windows /bin/bash",
-                               returnStdout: true).trim()
-      envs = ["BAZEL_SH=${bazel_sh}"]
-    }
-  }
-
-  def getScript() {
-    script
-  }
-
-  // Actual method
-
-  private def execute(script, returnStatus = false, returnStdout = false) {
-    if (isWindows) {
-      if (returnStdout) {
-        // @ removes the command lines from the output
-        script = "@${script}"
-      }
-      // exit /b !ERRORLEVEL! actually returns the exit code
-      return this.script.bat(script: "${script}\r\n@exit /b %ERRORLEVEL%",
-                             returnStatus: returnStatus, returnStdout: returnStdout)
-    } else {
-      return this.script.sh(script: script, returnStatus: returnStatus, returnStdout: returnStdout)
-    }
-  }
-
-  def bazelCommand(String args, returnStatus = false, returnStdout = false) {
-    script.withEnv(envs + ["BAZEL=" + this.bazel]) {
-      owner.script.ansiColor("xterm") {
-        return execute("${this.bazel} --bazelrc=${this.ws}/bazel.bazelrc ${args}",
-                       returnStatus, returnStdout)
-      }
-    }
-  }
-
-  // Execute a shell/batch command with bazel as a command on the path
-  def commandWithBazelOnPath(script) {
-    def pathWithBazel = ""
-    if (isWindows) {
-      def bazelDir = bazel.substring(0, bazel.lastIndexOf("\\"))
-      pathWithBazel = "${bazelDir};${this.script.env.PATH}"
-    } else {
-      def bazelDir = bazel.substring(0, bazel.lastIndexOf("/"))
-      pathWithBazel = "${bazelDir}:${this.script.env.PATH}"
-    }
-    this.script.withEnv(["PATH=${pathWithBazel}",
-          "BAZEL=${this.bazel}"] + envs) {
-      if (isWindows) {
-        this.script.bat script
-      } else {
-        this.script.sh "#!/bin/sh -x\n${script}"
-      }
-    }
-  }
-
-  // Write a RC file to consume by the other step
-  def writeRc(build_opts = [],
-              test_opts = [],
-              startup_opts = [],
-              extra_bazelrc = "") {
-    def rc_file_content = [
-      "common --color=yes",
-      "test --test_output=errors",
-      "build --verbose_failures"
-    ]
-
-    rc_file_content.addAll(build_opts.collect { "build ${it}" })
-    rc_file_content.addAll(test_opts.collect { "test ${it}" })
-    rc_file_content.addAll(startup_opts.collect { "startup ${it}" })
-    // Store the BEP events on a json file.
-    // TODO(dmarting): We should archive it and generate a good HTML report instead of
-    // the hard to read jenkins dashboard.
-    rc_file_content.add("build --experimental_build_event_json_file=${BUILD_EVENTS_FILE}")
-    rc_file_content.add("test --experimental_build_event_json_file=${TEST_EVENTS_FILE}")
-    script.writeFile(file: "${ws}/bazel.bazelrc",
-                     text: rc_file_content.join("\n") + "\n${extra_bazelrc}")
-  }
-
-  def showFailedActions(events) {
-    def eventsstring = ""
-    for(event in events) {
-      if ("action" in event) {
-        eventsstring += event.toString() + "\n"
-      }
-    }
-    if (eventsstring == "") {
-      script.echo("No failed actions reported in the event stream")
-    } else {
-      script.echo("Failed actions:\n" + eventsstring)
-    }
-  }
-
-  // Execute a bazel build
-  def build(targets = ["//..."]) {
-    if (!targets.isEmpty()) {
-      try {
-        bazelCommand("build ${targets.join ' '}")
-      } finally {
-        showFailedActions(buildEvents())
-      }
-    }
-  }
-
-  @NonCPS
-  private def makeTestQuery(tests) {
-    // Lambda are not working well with CPS, so NonCPS...
-    def quote = isWindows ? { s -> s.replace('"', '""') } : { s -> s.replace("'", "'\\''") }
-    def q = isWindows ? '"' : "'"
-    return "query ${q}${tests.collect(quote).join(' + ')}${q}"
-  }
-
-  // Execute a bazel tests
-  def test(tests = ["//..."]) {
-    if (!tests.isEmpty()) {
-      def filteredTests = bazelCommand(makeTestQuery(tests), false, true)
-      if (filteredTests == null || filteredTests.isEmpty()) {
-        script.echo "Skipped tests (no tests found)"
-      } else {
-        def status = bazelCommand("test ${filteredTests.replaceAll("\n", " ")}", true)
-        showFailedActions(testEvents())
-        if (status == 3) {
-          // Bazel returns 3 if there was a test failures but no breakage, that is unstable
-          throw new BazelTestFailure()
-        } else if (status != 0) {
-          // TODO(dmarting): capturing the output mark the wrong step at failure, there is
-          // no good way to do so, it would probably better to have better output in the failing
-          // step
-          throw new Exception("`bazel test` returned status ${status}")
-        }
-      }
-    }
-  }
-
-  private def parseEventsFile(String fileName) {
-    if (script.fileExists(fileName)) {
-      return JsonUtils.parseJsonStream(script.readFile(fileName))
-    }
-    // The file does not exists (probably because empty set of targets / tests), just return
-    // an empty list.
-    return []
-  }
-
-  def buildEvents() {
-    return parseEventsFile("${this.ws}/${BUILD_EVENTS_FILE}")
-  }
-
-  def testEvents() {
-    return parseEventsFile("${this.ws}/${TEST_EVENTS_FILE}")
-  }
-
-  @NonCPS
-  private def copyCommands(cp_lines, log, test_folder) {
-    if (log != null) {
-      def uri = URI.create(log.uri)
-      def path = uri.path
-      if (isWindows) {
-        // on windows the host is the drive letter, add it to the path.
-        path = "/${uri.host}${path}"
-      }
-      def relativePath = path.substring(path.indexOf("/testlogs/") + 10)
-      cp_lines.add("mkdir -p \$(dirname '${test_folder}/${relativePath}')")
-      cp_lines.add("cp -r '${path}' '${test_folder}/${relativePath}'")
-    }
-  }
-
-  @NonCPS
-  def generateTestLogsCopy(events, test_folder) {
-    // To avoid looking at all the files, including the stalled output log, we parse the events
-    // from the build.
-    // This is NonCPS because lambdas
-    def cp_lines = []
-    events.each { event ->
-      if("testResult" in event) {
-        copyCommands(cp_lines,
-                     event.testResult.testActionOutput.find { it.name == "test.xml" },
-                     test_folder)
-        // Also copy the test log
-        copyCommands(cp_lines,
-                     event.testResult.testActionOutput.find { it.name == "test.log" },
-                     test_folder)
-      }
-    }
-    return cp_lines.join('\n')
-  }
-
-  // Archive test results
-  def testlogs(test_folder) {
-    // JUnit test result does not look at test result if they are "old", copying them to a new
-    // location, unique accross configurations.
-    def res = script.sh(script: """#!/bin/sh
-echo 'Copying test outputs and events file for archiving'
-rm -fr ${test_folder}
-mkdir -p ${test_folder}
-touch ${BUILD_EVENTS_FILE} ${TEST_EVENTS_FILE}
-cp -f ${BUILD_EVENTS_FILE} ${TEST_EVENTS_FILE} ${test_folder}
-""" + generateTestLogsCopy(testEvents(), test_folder),
-                        returnStatus: true)
-    if (res == 0) {
-      // Archive the test logs and xml files
-      script.archiveArtifacts artifacts: "${test_folder}/**/test.log,${test_folder}/*.json"
-      script.junit testResults: "${test_folder}/**/test.xml", allowEmptyResults: true
-    }
-  }
-}
diff --git a/jenkins/lib/src/build/bazel/ci/GerritUtils.groovy b/jenkins/lib/src/build/bazel/ci/GerritUtils.groovy
deleted file mode 100644
index 778124c..0000000
--- a/jenkins/lib/src/build/bazel/ci/GerritUtils.groovy
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Inspired by https://gerrit.googlesource.com/gerrit-ci-scripts/+/master/jenkins/gerrit-verifier-flow.groovy
-package build.bazel.ci
-
-import com.cloudbees.groovy.cps.NonCPS
-import groovy.json.JsonOutput
-import groovy.json.JsonSlurper
-
-/*
- * This is a class to communicate with Gerrit (basically add code reviews).
- *
- * All methods to talk to gerrit are NonCPS to avoid serialization issues from Jenkins
- * and make them atomic.
- */
-class GerritUtils implements java.io.Serializable {
-  private String server
-  private String cookies
-  private String reviewer
-  private String reviewerEmail
-
-  // Parse a cookie file from cURL, ignoring most of the field
-  @NonCPS
-  private static def loadCookiesFile(String host, String cookieFile) {
-    def url = new URI(host)
-    host = url.host
-    try {
-      String[] fileContent = new File(cookieFile).text.split("\n")
-      def result = []
-      for (line in fileContent) {
-        if (!line.startsWith("#") && !line.isEmpty()) {
-          def elements = line.split("\t")
-          if (elements.length > 0 && host.endsWith(elements[0])) {
-            result << "${elements[5]}=${elements[6]}"
-          }
-        }
-      }
-      return result.join("; ")
-    } catch(IOException exn) {
-      return []
-    }
-  }
-
-  // Initialize the utilities to connect to ${server} using cookies
-  // from ${cookiesFile} and user ${reviewer} as the bot user.
-  def GerritUtils(String server, String cookiesFile, String reviewer) {
-    this.server = server
-    if (!this.server.endsWith("/")) {
-      this.server += "/"
-    }
-    this.cookies = loadCookiesFile(server, cookiesFile)
-    this.reviewer = reviewer
-    def m = reviewer =~ /^.*<([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)>$/
-    if (!m) {
-      // This is fine to use non checked exception since it's for bubbling up
-      // to jenkins
-      throw new Exception(
-          "Reviewer argument does not match the pattern 'Name <email@domain>'")
-    }
-    this.reviewerEmail = m[0][1]
-  }
-
-  // Getters
-  def getServer() {
-    return server
-  }
-
-  def getCookies() {
-    return cookies
-  }
-
-  def getReviewer() {
-    return reviewer
-  }
-
-  def getReviewerEmail() {
-    return reviewerEmail
-  }
-
-  // Return the URL of a change
-  def url(changeNum, patchNum = 0) {
-    return patchNum ? "${this.server}#/c/${changeNum}/${patchNum}" : "${this.server}#/c/${changeNum}"
-  }
-
-  // Post a JSON payload to the given url setting the correct cookies for authentication.
-  @NonCPS
-  private def post(path, data) {
-    def payload = JsonOutput.toJson(data)
-    def url = new URL(this.server + path)
-    URLConnection con = url.openConnection()
-    con.setDoOutput(true)
-    con.setRequestMethod("POST")
-    con.setRequestProperty("Cookie", cookies)
-    con.setRequestProperty("Content-Type", "application/json")
-    def wr = con.getOutputStream()
-    wr.write(payload.getBytes())
-    wr.flush()
-    wr.close()
-
-    int responseCode = con.getResponseCode()
-    return responseCode == 200
-  }
-
-  // Add the Gerrit bot as reviewer to change ${changeNum}
-  @NonCPS
-  def addReviewer(changeNum) {
-    return post("a/changes/${changeNum}/reviewers", [reviewer: this.reviewer])
-  }
-
-  // Set a change to verified +1/-1
-  // Parameters:
-  //   changeNum: number of the change to mark as verified
-  //   sha1: SHA-1 sum of the commit to mark as verified
-  //   verified: +1/-1 value for the verified flag on Gerrit
-  @NonCPS
-  def review(changeNum, sha1, verified, message = null) {
-    def payload = [
-      labels: ["Code-Review": 0, "Verified": verified],
-      notify: (verified < 0 ? "OWNER" : "NONE")
-    ]
-    if (message != null) {
-      payload["message"] = message
-    }
-    return post("a/changes/${changeNum}/revisions/${sha1}/review", payload)
-  }
-
-  // Add a comment without notifying everybody on the change.
-  //   buildUrl: URL of the build corresponding to that message
-  //   changeNum: change to comment on
-  //   sha1: SHA-1 of the commit to comment on
-  //   msgPrefix: the prefix of the message, the result message will be: <msgPrefix> Bazel CI: <buildUrl>
-  @NonCPS
-  def comment(changeNum, sha1, message) {
-    return post("a/changes/${changeNum}/revisions/${sha1}/review",
-                ["message": message, "notify": "NONE"])
-  }
-
-  // Query for gerrit for a list of change and return a list of
-  // changes as returned by the Gerrit API.
-  // See https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#list-changes
-  // Args:
-  //   query: the query of changes
-  //   maxChanges: maximum number of changes to return, default to 0 means no maximum
-  // Returns:
-  //   An object translated from JSON as returned by the list-changes operation when asked
-  //   for DETAILED_LABELS and CURRENT_REVISION.
-  // Note: this method is mostly for used by GerritUtils itself.
-  @NonCPS
-  def query(query, maxChanges = 0) {
-    def url = server + "changes/?pp=0&o=DETAILED_LABELS&o=CURRENT_REVISION"
-    if (maxChanges > 0) {
-      url += "&n=${maxChanges}"
-    }
-    url += "&q=${java.net.URLEncoder.encode(query.toString())}"
-    def changes = new URL(url).getText().substring(5)
-    def jsonSlurper = new JsonSlurper()
-    return jsonSlurper.parseText(changes)
-  }
-
-  @NonCPS
-  def removeVote(changeNumber, label, reviewer) {
-    def rev = java.net.URLEncoder.encode(reviewer.toString())
-    this.post("a/changes/${changeNumber}/reviewers/${rev}/votes/${label}/delete",
-              ["notify": "NONE"])
-  }
-
-  @NonCPS
-  def removeVotes(changeNumber, label) {
-    def changeLabels = query(changeNumber)[0].labels
-    if (label in changeLabels) {
-      for (reviewer in changeLabels[label].all) {
-        if (reviewer.value > 0) {
-	  this.removeVote(changeNumber, label, reviewer._account_id)
-        }
-      }
-    }
-  }
-
-  // Mark a code review as review started
-  @NonCPS
-  def startReview(changeNumber) {
-    this.addReviewer(changeNumber)
-    this.removeVotes(changeNumber, "Presubmit-Ready")
-    this.removeVote(changeNumber, "Verified", this.reviewer)
-  }
-
-  // Returns the list of verified changes not reviewed by the Gerrit reviewer and matching
-  // the given filter. The result is a list of dictionnary of matching change, containing the
-  // sha1 of the last patch, the number of this patch, the number of the change, the reference
-  // of the patch and the project of the change.
-  @NonCPS
-  def getVerifiedChanges(filter = "", verifiedLevel = 1, maxChanges = 0) {
-    def changesJson = query("status:open ${filter}",
-                            maxChanges).findAll { change ->
-        def verified = change.labels.get("Presubmit-Ready", [])
-        return verified.all.any({ it.value == verifiedLevel })
-    }.collect {
-      it ->
-        def sha1 = it.current_revision
-        def patch = it.revisions.get(sha1)
-        return [
-          "sha1": sha1,
-          "number": it._number,
-          "patchNumber": patch._number,
-          "ref": patch.ref,
-          "project": it.project]
-    }
-    return changesJson
-  }
-}
diff --git a/jenkins/lib/src/build/bazel/ci/JenkinsUtils.groovy b/jenkins/lib/src/build/bazel/ci/JenkinsUtils.groovy
deleted file mode 100644
index 60d0991..0000000
--- a/jenkins/lib/src/build/bazel/ci/JenkinsUtils.groovy
+++ /dev/null
@@ -1,249 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package build.bazel.ci
-
-// Automatic import in Jenkins but we need them to compile outside of Jenkins
-import com.cloudbees.groovy.cps.NonCPS
-import hudson.model.*
-import jenkins.model.*
-
-import hudson.FilePath
-import hudson.remoting.Channel
-import org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper
-
-/**
- * This class provide utility methods of the Jenkins API
- */
-class JenkinsUtils {
-  /** A list of regex aliases to know that ubuntu is linux */
-  private static def NODE_ALIASES = [
-    "ubuntu.*": "linux-x86_64",
-    "darwin.*": "darwin-x86_64",
-  ]
-
-  /** Normalize the node label into a compatible platform */
-  // TODO(dmarting): does that really belongs here?
-  @NonCPS
-  static def normalizeNodeLabel(node_label) {
-    for (e in NODE_ALIASES) {
-      if (node_label.matches(e.key)) {
-        return e.value
-      }
-    }
-    return node_label
-  }
-
-  /** Returns the list of all slave' names (optionally filtering by label) */
-  @NonCPS
-  static def nodeNames(label = null) {
-    def nodes = jenkins.model.Jenkins.instance.nodes
-    if (label != null) {
-      nodes = nodes.findAll { node -> label in node.labelString.split() }
-    }
-    return nodes.collect { node -> node.name }
-  }
-
-  /** Returns the list of job in the folder `folderName` (empty or null for top folder). */
-  @NonCPS
-  private static def folderJobs(folderName) {
-    if (folderName == null || folderName.isEmpty()) {
-      return jenkins.model.Jenkins.instance.items
-    } else {
-      return jenkins.model.Jenkins.instance.getItemByFullName(folderName).getAllJobs()
-    }
-  }
-
-  /**
-   * Returns the list of names of jobs in the folder `folderName` (empty or null for the
-   * top folder).
-   */
-  @NonCPS
-  static def jobs(folderName) {
-    return folderJobs(folderName).collect { job -> job.name }
-  }
-
-  /**
-   * Returns the list of names of jobs in the folder `folder` (empty or null for the top
-   * folder) whose description contains the string `descr`
-   */
-  @NonCPS
-  static def jobsWithDescription(folder, descr) {
-    def items = jenkins.model.Jenkins.instance.items
-    def jobs = folderJobs(folder)
-    return jobs.findAll {
-      job -> job.description != null && job.description.contains(descr) }.collect {
-      job -> job.name }
-  }
-
-  /** Returns the last build of a job in a specific folder */
-  @NonCPS
-  static def getLastRun(folder, job) {
-    def j = folderJobs(folder).find { it -> it.name.equals(job) }
-    if (j != null) {
-      def run = j.getLastCompletedBuild()
-      if (run != null) {
-        return new org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper(run, false)
-      }
-    }
-    return null
-  }
-
-  /** Returns the URL of the console for a job run */
-  @NonCPS
-  static def getConsoleUrl(RunWrapper run) {
-    return "${run.absoluteUrl}console"
-  }
-
-  /** Returns the URL of the blue ocean view for a job run */
-  @NonCPS
-  static def getBlueOceanUrl(RunWrapper run) {
-    def name = java.net.URLEncoder.encode(run.fullProjectName, "UTF-8")
-    def url = new URL(run.absoluteUrl)
-    def path = "/blue/organizations/jenkins/${name}/detail/${run.projectName}/${run.number}/pipeline/"
-    return new URL(url.protocol, url.host, url.port, path).toString()
-  }
-
-  /** Returns the URL to the small icon for a run */
-  @NonCPS
-  static def getSmallIconUrl(RunWrapper run) {
-    return "${Jenkins.RESOURCE_PATH}/images/16x16/${run.rawBuild.getIconColor()}.png"
-  }
-
-  /**
-   * A utility method that look for an artifact matching a pattern in upstream
-   * builds.
-   */
-  @NonCPS
-  static def findAndCopyUpstreamArtifacts(run, pattern) {
-    def build = findLastBuildWithUpstream(run.rawBuild)
-    if (build == null) {
-      return null
-    }
-    return _findAndCopyUpstreamArtifacts(build.getCauses(), pattern)
-  }
-
-  @NonCPS
-  private static def _findAndCopyUpstreamArtifacts(causes, pattern) {
-    for (cause in causes) {
-      if (cause instanceof Cause.UpstreamCause) {
-        def upstreamRun = cause.getUpstreamRun()
-        def artifacts = upstreamRun.getArtifacts()
-        for (artifact in artifacts) {
-          if (artifact.toString().matches(pattern)) {
-            return [artifactPath: artifact.toString(),
-                    artifactName: artifact.getFileName(),
-                    upstreamBuild: cause.getUpstreamBuild(),
-                    upstreamProject: cause.getUpstreamProject()]
-          }
-        }
-        def res = _findAndCopyUpstreamArtifacts(cause.upstreamCauses, pattern)
-        if (res != null && !res.isEmpty()) {
-          return res;
-        }
-      }
-    }
-    return null
-  }
-
-  /**
-   * Find the latest build that was run by upstream.
-   * In case of re-run, the current build will not be triggered by upstream project.
-   * In that case we want to look at build history to fetch the latest one that was build
-   * with upstream.
-   */
-  @NonCPS
-  private static def findLastBuildWithUpstream(run) {
-    while (run != null) {
-      if (run.getCauses().any { it.class.toString().contains("UpstreamCause") }) {
-        return run
-      }
-      run = run.getPreviousBuild()
-    }
-    return run
-  }
-
-  @NonCPS
-  private static def _pruneIfOlderThan(file, timestamp) throws IOException {
-    if (file.isDirectory()) {
-      boolean empty = true
-      for (child in file.list()) {
-        if (!_pruneIfOlderThan(child, timestamp)) {
-          empty = false
-        }
-      }
-      if (empty) {
-        if (file.delete()) {
-          return true
-        }
-      }
-    } else if (file.lastModified() < timestamp) {
-      if (file.delete()) {
-        return true
-      }
-    }
-    return false
-  }
-
-  @NonCPS
-  private static def createFilePath(env, path) {
-    if (env['NODE_NAME'].equals("master")) {
-        return new FilePath(path);
-    } else {
-        return new FilePath(Jenkins.getInstance().getComputer(env['NODE_NAME']).getChannel(), path);
-    }
-  }
-
-  /** Prune file that are older than timestamp on the current node. */
-  @NonCPS
-  public static def pruneIfOlderThan(env, path, timestamp) {
-    return _pruneIfOlderThan(createFilePath(env, path), timestamp)
-  }
-
-  /** Touch a file anywhere on the FS on the current node. */
-  @NonCPS
-  public static def touchFileIfExists(env, path) {
-    FilePath f = createFilePath(env, path)
-    def r = f.exists()
-    if (r) {
-      try {
-        f.touch(System.currentTimeMillis())
-      } catch(IOException ex) {
-        // The file might be busy, especially on windows, swallowing exception
-      }
-    }
-    return r;
-  }
-
-  /** Read a file from the node, but without reporting anything in the Jenkins UI. */
-  @NonCPS
-  public static def readFile(env, path) {
-    return createFilePath(env, path).readToString()
-  }
-
-  /** Save the current log to a file on the current node. */
-  @NonCPS
-  public static void saveLog(env, RunWrapper run, path) {
-    createFilePath(env, path).copyFrom(run.getRawBuild().getLogInputStream())
-  }
-
-  /** Returns the recursive list of files of a folder, ignoring some files. */
-  @NonCPS
-  public static def list(env, dir, excludes) {
-    def directory = createFilePath(env, dir)
-    def results = directory.list("**", excludes.join(","))
-    def directoryUri = directory.toURI()
-    return results.collect { it -> directoryUri.relativize(it.toURI()) }
-  }
-}
diff --git a/jenkins/lib/src/build/bazel/ci/JsonUtils.groovy b/jenkins/lib/src/build/bazel/ci/JsonUtils.groovy
deleted file mode 100644
index b774875..0000000
--- a/jenkins/lib/src/build/bazel/ci/JsonUtils.groovy
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package build.bazel.ci
-
-import com.cloudbees.groovy.cps.NonCPS
-import groovy.json.JsonSlurperClassic
-
-/**
- * A set of utility methods to handle JSON format emitted by Bazel.
- * This is a separate class to be able to test it without pulling in a lot
- * of dependency.
- */
-class JsonUtils {
-
-  @NonCPS
-  private static def tokenToText(token) {
-    if (token.getType() == groovy.json.JsonTokenType.STRING) {
-      return groovy.json.JsonOutput.toJson(token.value)
-    } else {
-      return token.text
-    }
-  }
-
-  @NonCPS
-  public static def parseJsonStream(String stream) {
-    // We require that weirdness because the format of the events are not one JSON object
-    // but a sequence of JSON Object. Note that even hacking an input stream and iterating
-    // over is not enough because JsonSlurper seems like to consume all the stream even
-    // though it returns only the first element.
-    def lexer = new groovy.json.JsonLexer(new StringReader(stream))
-    def parser = new JsonSlurperClassic()
-    def res = []
-    def builder = new StringBuffer()
-    def counter = 0
-    while (lexer.hasNext()) {
-      def tok = lexer.next()
-      if (tok.getType() == groovy.json.JsonTokenType.OPEN_CURLY) {
-        counter++;
-        builder.append("{")
-      } else if (tok.getType() == groovy.json.JsonTokenType.CLOSE_CURLY) {
-        counter--;
-        if (counter == 0) {
-          res <<= parser.parseText(builder.toString() + "}")
-          builder.setLength(0)
-        } else {
-          builder.append("}")
-        }
-      } else {
-        builder.append(tokenToText(tok))
-      }
-    }
-    // We might have trailing tokens, just ignore them as they would mean
-    // an incomplete file.
-    // TODO(dmarting): we should probably print a warning here.
-    return res
-  }
-}
diff --git a/jenkins/lib/tests/build/bazel/ci/BUILD b/jenkins/lib/tests/build/bazel/ci/BUILD
deleted file mode 100644
index 81ab68d..0000000
--- a/jenkins/lib/tests/build/bazel/ci/BUILD
+++ /dev/null
@@ -1,29 +0,0 @@
-package(default_visibility = ["//jenkins/lib/test:__subpackages__"])
-
-load("@io_bazel_rules_groovy//groovy:groovy.bzl", "groovy_library")
-load(":def.bzl", "bazel_groovy_test", "jenkins_library_test")
-
-groovy_library(
-    name = "BazelConfigurationParsingTest",
-    srcs = ["BazelConfigurationParsingTest.groovy"],
-    visibility = ["//jenkins:__subpackages__"],
-    deps = ["//jenkins/lib/src/build/bazel/ci:BazelConfiguration"],
-)
-
-bazel_groovy_test(
-    name = "BazelConfigurationTests",
-    srcs = ["BazelConfigurationTests.groovy"],
-    deps = ["//jenkins/lib/src/build/bazel/ci:BazelConfiguration"],
-)
-
-jenkins_library_test(
-    name = "BazelJobTest",
-    size = "small",
-    srcs = ["BazelJobTest.groovy"],
-)
-
-bazel_groovy_test(
-    name = "JsonUtilsTests",
-    srcs = ["JsonUtilsTests.groovy"],
-    deps = ["//jenkins/lib/src/build/bazel/ci:JsonUtils"],
-)
diff --git a/jenkins/lib/tests/build/bazel/ci/BazelConfigurationParsingTest.groovy b/jenkins/lib/tests/build/bazel/ci/BazelConfigurationParsingTest.groovy
deleted file mode 100644
index a12cfc5..0000000
--- a/jenkins/lib/tests/build/bazel/ci/BazelConfigurationParsingTest.groovy
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package build.bazel.ci
-
-import groovy.io.FileType
-import org.junit.Test
-
-/** Test that assert that all json files in the runfiles can be parsed with {@link BazelConguration} */
-class BazelConfigurationParsingTest {
-  private def findJSONFiles(File baseDir) {
-    def result = []
-    baseDir.eachFileRecurse(FileType.FILES) {
-      if(it.name.endsWith('.json')) {
-        result.add(it)
-      }
-    }
-    return result
-  }
-
-  @Test
-  void testParse() {
-    def runfileDir = System.getenv("JAVA_RUNFILES")
-    for (File f : findJSONFiles(new File(runfileDir))) {
-      // Just test that parsing succeed to ensure that we can at least load the
-      // file on Jenkins.
-      BazelConfiguration.parse(f)
-    }
-  }
-}
diff --git a/jenkins/lib/tests/build/bazel/ci/BazelConfigurationTests.groovy b/jenkins/lib/tests/build/bazel/ci/BazelConfigurationTests.groovy
deleted file mode 100644
index a4c3863..0000000
--- a/jenkins/lib/tests/build/bazel/ci/BazelConfigurationTests.groovy
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package build.bazel.ci
-
-import org.junit.Test
-
-/** Tests for {@link BazelConguration} */
-class BazelConfigurationTests {
-
-  // The contents of this JSON string don't matter, i.e. it doesn't have to
-  // refer to existing target patterns for example.
-  // The test only asserts the structure of the JSON.
-  static final String JSON_TEST = '''
-
-// This is a test
-// Double comment to test the workaround the parser issue
-
-// more comment
-// And now the initial bazel tests
-[
-    {
-        // This is a configuration that have 3 subconfiguration: linux, ubuntu and darwin
-        "configurations": [
-            {
-                "node": "linux-x86_64"
-            },
-            {
-                "node": "ubuntu_16.04-x86_64"
-            },
-            {
-                "node": "darwin-x86_64"
-            }
-        ],
-        // And specify the parameters for these configurations.
-        "parameters": {
-            "configure": [
-                "source scripts/ci/build.sh",
-                "setup_android_repositories"
-            ],
-            "test_opts": ["-k", "--build_tests_only"],
-            "tests": [
-                "//dummy_path1/...",
-                "//dummy_path2/...",
-                "//dummy/path3/..."
-            ],
-            "targets": []
-        }
-    }, {
-        "configurations": [{
-            "node": "windows-x86_64",
-        }],
-        "parameters": {
-            "test_opts": ["-k", "--build_tests_only"],
-            "tests": [
-                "//some/dummy/java_test/...",
-                "//some/dummy/cpp_test/...",
-                "//some/dummy/native_test:all_tests"
-            ],
-            "targets": ["//src:bazel"]
-        }
-    }
-]
-
-// Ending comment
-'''
-
-  private void assertConfigurationCorrect(confs) {
-    assert confs.size() == 2
-    assert confs[0].parameters.size() == 4
-    assert confs[0].parameters["configure"] == [
-      "source scripts/ci/build.sh",
-      "setup_android_repositories"
-    ]
-    assert confs[0].configurations.size() == 3
-    assert confs[1].parameters.size() == 3
-    assert confs[1].configurations.size() == 1
-  }
-
-  @Test
-  void testParseJsonString() {
-    assertConfigurationCorrect(BazelConfiguration.parse(JSON_TEST))
-  }
-
-  @Test
-  void testSerialization() {
-    // Just test that the object from parsing JSON is serializable
-    new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(BazelConfiguration.parse(JSON_TEST));
-  }
-
-  @Test
-  void testParseJsonFile() {
-    def tempDir = System.getenv("TEST_TMPDIR")
-    def tempDirFile = null
-    if (tempDir != null) {
-      tempDirFile = new File(tempDir)
-    }
-    def testFile = File.createTempFile('temp', '.json', tempDirFile)
-    try {
-      testFile.write(JSON_TEST)
-      assertConfigurationCorrect(BazelConfiguration.parse(testFile))
-    } finally {
-      testFile.delete()
-    }
-  }
-
-  @Test
-  void testFlatten() {
-    def result = BazelConfiguration.flattenConfigurations(BazelConfiguration.parse(JSON_TEST))
-    def allKeys = result.collect {
-      k, v -> k.collect { k1, v1 -> "${k1}=${v1}" }.toSorted().join(",") }.toSorted()
-    assert allKeys.join("\n") == '''node=darwin-x86_64
-node=linux-x86_64
-node=ubuntu_16.04-x86_64
-node=windows-x86_64'''
-  }
-
-  @Test
-  void testFlattenWithExclusion() {
-    def result = BazelConfiguration.flattenConfigurations(
-      BazelConfiguration.parse(JSON_TEST),
-      [node: ["ubuntu_16.04-x86_64", "darwin-x86_64"]])
-    def allKeys = result.collect {
-      k, v -> k.collect { k1, v1 -> "${k1}=${v1}" }.toSorted().join(",") }.toSorted()
-    assert allKeys.join("\n") == '''node=linux-x86_64
-node=windows-x86_64'''
-  }
-}
diff --git a/jenkins/lib/tests/build/bazel/ci/BazelJobTest.groovy b/jenkins/lib/tests/build/bazel/ci/BazelJobTest.groovy
deleted file mode 100644
index 7ce8dd2..0000000
--- a/jenkins/lib/tests/build/bazel/ci/BazelJobTest.groovy
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package build.bazel.ci
-
-import build.bazel.ci.utils.BaseLibraryTest
-import org.junit.Test
-
-// Test the bazelJob pipeline step
-class BazelJobTest extends BaseLibraryTest {
-
-  @Test
-  void testSimpleBazelJob() {
-    evalScript('''
-bazelJob(binary: "/path/to/bazel",
-         targets: ["//a", "//b"],
-         tests: ["//test1", "//test2"])
-''')
-    // TODO(dmarting): verify the stack trace
-    printCallStack()
-  }
-}
diff --git a/jenkins/lib/tests/build/bazel/ci/JsonUtilsTests.groovy b/jenkins/lib/tests/build/bazel/ci/JsonUtilsTests.groovy
deleted file mode 100644
index a575639..0000000
--- a/jenkins/lib/tests/build/bazel/ci/JsonUtilsTests.groovy
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package build.bazel.ci
-
-import org.junit.Test
-
-/** Tests for {@link JsonUtils} */
-class JsonUtilsTests {
-
-  private static assertJsonResult(result) {
-    assert result.size() == 2
-    assert result[0].size() == 1
-    assert "a" in result[0]
-    assert "b" in result[0].a
-    assert "c".equals(result[0].a.b)
-    assert result[1].size() == 1
-    assert "c" in result[1]
-    assert "d" in result[1].c
-    assert "e".equals(result[1].c.d)
-  }
-
-  @Test
-  void testParseJsonStreamOneLine() {
-    assertJsonResult(JsonUtils.parseJsonStream('{"a": {"b":"c"}}{"c": {"d":"e"}}'))
-  }
-
-  @Test
-  void testParseJsonStreamMultiLine() {
-    assertJsonResult(JsonUtils.parseJsonStream('{"a": {"b":"c"}}\n{"c": {"d":"e"}}\n'))
-  }
-
-  @Test
-  void testParseJsonStreamMultiMultiLine() {
-    assertJsonResult(JsonUtils.parseJsonStream('{"a": \n{\n"b":"c"\n}\n}\n{\n"c": \n{\n"d":"e"\n}\n}\n'))
-  }
-
-  @Test
-  void testParseTimestampLike() {
-    // Just test we do not raise an error
-    JsonUtils.parseJsonStream('{"a": "static const char kTimestampFormat[] = \\"%E4Y-%m-%dT%H:%M:%S\\";"}')
-  }
-
-  @Test
-  void testSerializable() {
-    // Try to serialize the output
-    def m = JsonUtils.parseJsonStream('{"a": \n{\n"b":"c"\n}\n}\n{\n"c": \n{\n"d":"e"\n}\n}\n')
-    def ostream = new PipedOutputStream()
-    def istream = new PipedInputStream(ostream)
-    new ObjectOutputStream(ostream).writeObject(m)
-    new ObjectInputStream(istream).readObject()
-  }
-}
diff --git a/jenkins/lib/tests/build/bazel/ci/def.bzl b/jenkins/lib/tests/build/bazel/ci/def.bzl
deleted file mode 100644
index e703ed3..0000000
--- a/jenkins/lib/tests/build/bazel/ci/def.bzl
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright (C) 2017 The Bazel Authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-load("@io_bazel_rules_groovy//groovy:groovy.bzl", "groovy_library")
-
-def bazel_groovy_test(name=None, test_class=None, size="small", deps=[], srcs=[], **kwargs):
-    """A wrapper around groovy test to use the Bazel test runner."""
-    test_class = "build.bazel.ci." + name if test_class == None else test_class
-    groovy_library(
-        name = name + "-lib",
-        deps = deps,
-        srcs = srcs)
-    native.java_test(
-        name = name,
-        test_class = test_class,
-	size = size,
-        runtime_deps = deps + [
-            "@org_codehaus_groovy_groovy_all//jar",
-            "@org_hamcrest_hamcrest_all//jar",
-            name + "-lib"],
-        **kwargs)
-
-def jenkins_library_test(deps=[], data=[], **kwargs):
-    bazel_groovy_test(
-	deps=deps+[
-      "//jenkins/lib/tests/build/bazel/ci/utils",
-      "//jenkins/lib/src/build/bazel/ci:lib"],
-	data=data+["//jenkins/lib:lib-files"],
-        **kwargs)
diff --git a/jenkins/lib/tests/build/bazel/ci/utils/BUILD b/jenkins/lib/tests/build/bazel/ci/utils/BUILD
deleted file mode 100644
index f11c961..0000000
--- a/jenkins/lib/tests/build/bazel/ci/utils/BUILD
+++ /dev/null
@@ -1,16 +0,0 @@
-package(default_visibility = ["//jenkins/lib/tests:__subpackages__"])
-
-load("@io_bazel_rules_groovy//groovy:groovy.bzl", "groovy_library")
-
-groovy_library(
-    name = "utils",
-    srcs = glob(
-        ["**"],
-        exclude = ["BUILD"],
-    ),
-    deps = [
-        "//3rdparty/jvm/com/lesfurets:jenkins_pipeline_unit",
-        "//3rdparty/jvm/junit",
-        "//3rdparty/jvm/org/jenkins_ci/plugins/workflow:workflow_step_api",
-    ],
-)
diff --git a/jenkins/lib/tests/build/bazel/ci/utils/BaseLibraryTest.groovy b/jenkins/lib/tests/build/bazel/ci/utils/BaseLibraryTest.groovy
deleted file mode 100644
index ebe8ea9..0000000
--- a/jenkins/lib/tests/build/bazel/ci/utils/BaseLibraryTest.groovy
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-package build.bazel.ci.utils
-
-import org.junit.Before
-import com.lesfurets.jenkins.unit.BasePipelineTest
-import com.lesfurets.jenkins.unit.global.lib.LibraryConfiguration
-
-// A base class for all test testing the library as a whole using PipelineUnitTest
-abstract class BaseLibraryTest extends BasePipelineTest {
-
-  @Override
-  @Before
-  void setUp() throws Exception {
-    def library = LibraryConfiguration.library()
-                .name('opt-lib')
-                .retriever(new FsSource("${System.getenv('TEST_SRCDIR')}/io_bazel_ci/jenkins/lib"))
-                .targetPath("does/not/matter")
-                .implicit(true)
-                .defaultVersion("master")
-                .build()
-    helper.registerSharedLibrary(library)
-    registerAllowedMethods()
-    super.setUp()
-  }
-
-  void registerAllowedMethods() {
-    // TODO(dmarting): these are dumnies, we probably want to control that more
-    // to test all codepaths.
-    helper.registerAllowedMethod("pwd", [], { -> "/some/path"})
-    helper.registerAllowedMethod("isUnix", [], { -> true})
-    helper.registerAllowedMethod("file", [Map.class], { m ->
-      def fileContent = "/path/to/${m.credentialsId})"
-      binding.setVariable(m['variable'], fileContent)
-      return fileContent
-    })
-    helper.registerAllowedMethod("writeFile", [Map.class], { m -> })
-    helper.registerAllowedMethod("withEnv", [List.class, Closure.class], { l, c -> c() })
-    helper.registerAllowedMethod("ansiColor", [String.class, Closure.class], { l, c -> c() })
-    helper.registerAllowedMethod("fileExists", [String.class], { f -> false })
-  }
-
-  def mktemp(fileName) {
-    def tempDir = new File(System.getenv("TEST_TMPDIR"))
-    def counter = 0
-    while (new File(tempDir, "${counter}${fileName}").exists()) {
-      counter++
-    }
-    return new File(tempDir, "${counter}${fileName}")
-  }
-
-  def evalScript(String script) {
-    def tempFile = mktemp("script.groovy")
-    try {
-      tempFile.write script
-      loadScript(tempFile.path)
-    } finally {
-      tempFile.delete()
-    }
-  }
-}
diff --git a/jenkins/lib/tests/build/bazel/ci/utils/FsSource.groovy b/jenkins/lib/tests/build/bazel/ci/utils/FsSource.groovy
deleted file mode 100644
index 5a02cb1..0000000
--- a/jenkins/lib/tests/build/bazel/ci/utils/FsSource.groovy
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// An implementation of SourceRetriever that simply reads a directory
-// LocalSource expect a sub-directory 'repository@branch', so we cannot use it.
-package build.bazel.ci.utils
-
-import com.lesfurets.jenkins.unit.global.lib.SourceRetriever
-import javax.annotation.concurrent.Immutable
-import groovy.transform.CompileStatic
-
-@Immutable
-@CompileStatic
-class FsSource implements SourceRetriever {
-  private final String directory
-
-  public FsSource(String directory) {
-    this.directory = directory;
-  }
-
-  @Override
-  List<URL> retrieve(String repository, String branch, String targetPath) {
-    def sourceDir = new File(directory)
-    if (sourceDir.exists()) {
-      return [sourceDir.toURI().toURL()]
-    }
-    throw new IllegalStateException("Directory ${directory} does not exists")
-  }
-
-  @Override
-  String toString() {
-    return "FsSource{directory='${directory}'}"
-  }
-}
diff --git a/jenkins/lib/vars/bazelCiConfiguredJob.groovy b/jenkins/lib/vars/bazelCiConfiguredJob.groovy
deleted file mode 100644
index d06f550..0000000
--- a/jenkins/lib/vars/bazelCiConfiguredJob.groovy
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-def createJobsFromConfiguration(config, configNames, script) {
-  def cfgs = []
-  def name = currentBuild.projectName
-  // Convert to an array to avoid serialization issue with Jenkins
-  def entrySet = readConfiguration(files: [".ci/${name}.json", "scripts/ci/${name}.json"],
-                                   repository: config.repository,
-                                   branch: config.branch,
-                                   refspec: config.refspec,
-                                   default_configuration: config.configuration
-                                  ).entrySet().toArray()
-  for (int k = 0; k < entrySet.length; k++) {
-    def params = entrySet[k].value
-    def conf = entrySet[k].key
-    def configName = build.bazel.ci.BazelConfiguration.descriptorToString(conf)
-    configNames.add(configName)
-    cfgs.add({ ->
-        script.bazelCiJob(name: configName,
-                          repository: config.repository,
-                          branch: config.branch,
-                          refspec: config.refspec,
-                          node_label: conf["node"],
-                          targets: params.get("targets", ["//..."]),
-                          tests: params.get("tests", ["//..."]),
-                          configuration: params.get("configure", []),
-                          build_opts: params.get("build_opts", []),
-                          test_opts: params.get("test_opts", []),
-                          startup_opts: params.get("startup_opts", []),
-                          bazel_version: config.bazel_version,
-                          extra_bazelrc: config.extra_bazelrc,
-                          build_tag_filters: params.get("build_tag_filters", []),
-                          test_tag_filters: params.get("test_tag_filters", []),
-                          workspace: config.workspace,
-                          sauce: config.sauce
-      )
-    })
-  }
-  entrySet = null
-  return cfgs
-}
-
-/**
- * This define a Jenkins step "bazelCiConfiguredJob" that use git and Bazel
- * with various configurations given by a list of platforms.
- * Each arguments is set by a variable in the body of the step and the list of possible arguments
- * is:
- *   - bazel_version is the baseline for the version of Bazel, generally a parameter for the job.
- *        If set to 'custom', the job will try to fetch the Bazel binary from upstream.
- *   - configuration: JSON configuration, see BazelConfiguration
- *   - extra_bazelrc: extraneous content for the rc file, will go after all other options.
- *        Generally to be provided as a parameter of the job.
- *   - workspace: a directory, relative to the root of the repository, that contains
- *        the workspace file, default to the top directory.
- *   - repository: git repository to clone.
- *   - branch: branch of the repository to clone (default: master).
- *   - refspec: specification of the references to fetch
- *   - sauce: identifier of the crendentials to connect to SauceLabs.
- *   - run_sequentially: run each configuration sequentially rather than in parallel
- */
-def call(config = [:]) {
-  config["bazel_version"] = config.get("bazel_version", "latest")
-  config["configuration"] = config.get("configuration", "[]")
-  config["extra_bazelrc"] = config.get("extra_bazelrc", "")
-  config["workspace"] = config.get("workspace", "")
-  config["repository"] = config.get("repository", "")
-  config["branch"] = config.get("branch", "master")
-  config["refspec"] = config.get("refspec", "+refs/heads/*:refs/remotes/origin/*")
-  config["sauce"] = config.get("sauce", "")
-  config["run_sequentially"] = config.get("run_sequentially", false)
-
-  // Remove special characters from bazel_version (which can be coming from a URL post):
-  //   everything except [a-zA-Z0-9_-.]
-  config.bazel_version = config.bazel_version.replaceAll("[^a-zA-Z0-9_\\.-]", "")
-
-  def configs = [:]
-  // Keep a list of keys of configs in configNames to workaround
-  // https://issues.jenkins-ci.org/browse/JENKINS-27421
-  def configNames = []
-  stage("Setting-up configurations") {
-    def cfgs = createJobsFromConfiguration(config, configNames, this)
-    for (int i = 0; i < cfgs.size; i++) {
-      configs[configNames[i]] = cfgs[i]
-    }
-    cfgs = null
-  }
-
-
-  timeout(240) {
-    try {
-      stage("Run configurations") {
-        if (config.run_sequentially) {
-          for (configName in configNames) {
-            configs[configName]()
-          }
-        } else {
-          parallel configs
-        }
-      }
-    } catch(build.bazel.ci.BazelTestFailure ex) {
-      // Do not mark the build as error with a test failure
-      currentBuild.result = "UNSTABLE"
-    }
-  }
-}
diff --git a/jenkins/lib/vars/bazelCiJob.groovy b/jenkins/lib/vars/bazelCiJob.groovy
deleted file mode 100644
index b4969b7..0000000
--- a/jenkins/lib/vars/bazelCiJob.groovy
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-@NonCPS
-private def getPlatformFromNodeName(node_label) {
-  def platforms = ["windows": "windows",
-                   "darwin": "darwin",
-                   "freebsd": "freebsd",
-                   "": "linux"]
-  return platforms.find { e -> node_label.startsWith(e.key) }.value
-}
-
-/**
- * This define a Jenkins step "bazelCiJob" that use git and Bazel to test one configuration.
- * Each arguments is set by a variable in the body of the step and the list of possible arguments
- * is:
- *   - name
- *   - bazel_version is the baseline for the version of Bazel, generally a parameter for the job.
- *        If set to 'custom.*', the job will try to fetch the Bazel binary from upstream.
- *   - targets: list of targets to build
- *   - tests: list of targets to test
- *   - configuration: list of shell step to configure the project
- *   - build_opts, test_opts: option for build and test (build options also applies for tests)
- *   - extra_bazelrc: extraneous content for the rc file, will go after all other options.
- *        Generally to be provided as a parameter of the job.
- *   - build_tag_filters, test_tag_filters: tag filters to pass to bazel
- *   - workspace: a directory, relative to the root of the repository, that contains
- *        the workspace file, default to the top directory.
- *   - repository: git repository to clone.
- *   - branch: branch of the repository to clone (default: master).
- *   - refspec: specification of the references to fetch
- *   - sauce: identifier of the credentials to connect to SauceLabs.
- *   - node_label: label of the node to run on
- */
-def call(config = [:]) {
-  config["bazel_version"] = config.get("bazel_version", "latest")
-  config["targets"] = config.get("targets", ["//..."])
-  config["tests"] = config.get("tests", ["//..."])
-  config["configuration"] = config.get("configuration", [])
-  config["build_opts"] = config.get("build_opts", [])
-  config["test_opts"] = config.get("test_opts", [])
-  config["startup_opts"] = config.get("startup_opts", [])
-  config["extra_bazelrc"] = config.get("extra_bazelrc", "")
-  config["build_tag_filters"] = config.get("build_tag_filters", [])
-  config["test_tag_filters"] = config.get("test_tag_filters", [])
-  config["workspace"] = config.get("workspace", "")
-  config["repository"] = config.get("repository", "")
-  config["sauce"] = config.get("sauce", "")
-  config["branch"] = config.get("branch", "master")
-  config["refspec"] = config.get("refspec", "+refs/heads/*:refs/remotes/origin/*")
-
-  def prefix = config.get("name", "${config.node_label}-${config.bazel_version}")
-  def workspace = ""
-
-  config.test_tag_filters += ["-noci", "-manual"]
-  def build_options = [
-    "--build_tag_filters=${config.build_tag_filters.join ','}"
-  ] + config.build_opts
-  def test_options = [
-    "--test_tag_filters=${config.test_tag_filters.join ','}",
-    "--build_tests_only",
-    "-k"
-  ] + config.test_opts
-  if (getPlatformFromNodeName(config.node_label) == "linux") {
-    build_options << "--sandbox_tmpfs_path=/tmp"
-  }
-  machine(config.node_label) {
-    ws("workspace/${currentBuild.fullProjectName}-${prefix}") {
-      maybeSauce(config.sauce) {
-        // Checkout the code
-        echo "Checkout ${config.repository}"
-        recursiveGit(repository: config.repository,
-                     refspec: config.refspec,
-                     branch: config.branch)
-
-        // And build
-        maybeDir(config.workspace) {
-          def bazel = bazelPath(config.bazel_version, config.node_label)
-          def extrarc = config.extra_bazelrc
-          if (config.bazel_version.startsWith("custom")) {
-            // Make the server dies after 10 minutes on custom bazel version.
-            // Other bazel servers stays alive for 3 hours, which is ok for
-            // release but not for custom binaries used for Global tests. We
-            // do not set the max_idle_secs to 1 because we still want the
-            // server to survive between steps.
-            extrarc += "\nstartup --max_idle_secs 600\n"
-          }
-          bazelJob(binary: bazel,
-                   build_opts: build_options,
-                   test_opts: test_options,
-                   startup_opts: config.startup_opts,
-                   extra_bazelrc: extrarc,
-                   targets: config.targets,
-                   tests: config.tests,
-                   configuration: config.configuration,
-                   stage_name: prefix
-          )
-        }
-      }
-    }
-  }
-}
-
diff --git a/jenkins/lib/vars/bazelJob.groovy b/jenkins/lib/vars/bazelJob.groovy
deleted file mode 100644
index 1546cc7..0000000
--- a/jenkins/lib/vars/bazelJob.groovy
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import build.bazel.ci.BazelUtils
-
-/**
- * This define a Jenkins step "bazelJob" that write a rc file, execute shell configuration steps,
- * run build and test with bazel and publish the XML reports.
- * Each arguments is set by a variable in the body of the step and the list of possible arguments
- * is:
- *   - binary: the path to the bazel binary
- *   - targets: list of targets to build
- *   - tests: list of targets to test
- *   - configuration: list of shell step to configure the project
- *   - build_opts, test_opts: option for build and test (build options also applies for tests)
- *   - extra_bazelrc: extraneous content for the rc file, will go after all other options.
- *        Generally to be provided as a parameter of the job.
- *   - stage_name: Name of the stage, for prefixing substages
- */
-def call(config = [:]) {
-  config["binary"] = config.get("binary", "bazel")
-  config["targets"] = config.get("targets", ["//..."])
-  config["tests"] = config.get("tests", ["//..."])
-  config["configuration"] = config.get("configuration", [])
-  config["build_opts"] = config.get("build_opts", [])
-  config["test_opts"] = config.get("test_opts", [])
-  config["startup_opts"] = config.get("startup_opts", [])
-  config["extra_bazelrc"] = config.get("extra_bazelrc", "")
-  config["stage_name"] = config.get("stage_name", "")
-
-  // Now configure the utility class
-  def utils = new BazelUtils();
-  utils.bazel = config.binary
-  utils.script = this;
-
-  withCredentials([file(credentialsId: 'remote-execution', variable: 'AUTH_FILE')]) {
-
-    // And now the various stage
-    def stage_prefix = config.stage_name.isEmpty() ? "" : "[${config.stage_name}] "
-    utils.writeRc(config.build_opts, config.test_opts, config.startup_opts, config.extra_bazelrc + "\nbuild --auth_credentials=${AUTH_FILE}")
-    stage("${stage_prefix}Bazel version") {
-      utils.bazelCommand("version")
-    }
-
-    if(!config.configuration.isEmpty()) {
-      stage("${stage_prefix}Configuration") {
-        utils.commandWithBazelOnPath(config.configuration.join("\n"))
-      }
-    }
-
-    stage("${stage_prefix}Build") {
-      utils.build(config.targets)
-    }
-
-    try {
-      stage("${stage_prefix}Tests") {
-        utils.test(config.tests)
-      }
-    } finally {
-      stage("${stage_prefix}Results") {
-        utils.testlogs("tests-${config.stage_name.replaceAll(',', '-')}")
-      }
-    }
-  }
-}
diff --git a/jenkins/lib/vars/bazelPath.groovy b/jenkins/lib/vars/bazelPath.groovy
deleted file mode 100644
index db5bdec..0000000
--- a/jenkins/lib/vars/bazelPath.groovy
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import build.bazel.ci.JenkinsUtils
-
-private def pruneOldCustomBazel(node_label) {
-  try {
-    // TODO(dmarting): unfortunately, this will trigger a RPC per file operation
-    // but using FilePath.act needs a class that can be shiped to the client, so
-    // needs to be in the client classpath. If the number of RPC became a problem,
-    // maybe we can use a Jenkins plugins.
-    JenkinsUtils.pruneIfOlderThan(env,
-                                  getBazelInstallBase(node_label) + "custom",
-                                  System.currentTimeMillis() - 172800000 /* 2 days */)
-  } catch(IOException ex) {
-    // Several error can occurs, we ignore them all as this step
-    // is just for convenience, not critical.
-  }
-}
-
-private def getBazelInstallBase(node_label) {
-  return node_label.startsWith("windows") ?
-      "c:\\bazel_ci\\installs\\" :
-      "${env.HOME}/.bazel/"
-}
-
-private def getBazelInstallPath(node_label, String... segments) {
-  def lastPart = node_label.startsWith("windows") ?
-      "${segments.join '\\'}\\bazel.exe" :
-      "${segments.join '/'}/binary/bazel"
-  return getBazelInstallBase(node_label) + lastPart
-}
-
-/**
- * A step that returns the path of a specific version of the bazel binary. If that version is
- * set to "custom", it will for look for the bazel binary in the list of artifacts transmitted
- * by upstream job (not yet implemented). In the other case, it looks for bazel in a well
- * known location.
- */
-def call(String bazel_version, String node_label) {
-  // Grab bazel
-  if (bazel_version.startsWith("custom")) {
-    node_label = JenkinsUtils.normalizeNodeLabel(node_label)
-    def cause = JenkinsUtils.findAndCopyUpstreamArtifacts(
-      currentBuild,
-      "^node=${node_label}/bazel(\\.exe)?\$")
-
-    if (cause == null) {
-      error("Failed to find upstream cause while asked to build with custom Bazel")
-    }
-
-    echo "Using Bazel binary from upstream project ${cause.upstreamProject} build #${cause.upstreamBuild} at path ${cause.artifactPath}"
-    def bazel = getBazelInstallPath(
-      node_label,
-      "custom",
-      cause.upstreamProject.toString().replaceAll("/", "_"),
-      cause.upstreamBuild.toString())
-    if (!JenkinsUtils.touchFileIfExists(env, bazel)) {
-      dir(".bazel") { deleteDir() }
-      step([$class: 'CopyArtifact',
-            filter: cause.artifactPath,
-            fingerprintArtifacts: true,
-            flatten: true,
-            projectName: cause.upstreamProject,
-            selector: [$class: 'SpecificBuildSelector',
-                       buildNumber: "${cause.upstreamBuild}"],
-            target: ".bazel/"])
-      if (node_label.startsWith("windows")) {
-        // File.parent is null, use custom substring
-        def bazelDir = bazel.substring(0, bazel.lastIndexOf("\\"))
-        bat "mkdir \"${bazelDir}\"\r\nmove /Y \"${pwd()}\\.bazel\\bazel.exe\" \"${bazel}\""
-      } else {
-        def bazelDir = bazel.substring(0, bazel.lastIndexOf("/"))
-        sh "mkdir -p ${bazelDir}; mv -f .bazel/bazel ${bazel}; chmod +x ${bazel}"
-      }
-    }
-    pruneOldCustomBazel(node_label)
-    echo "Using custom version of Bazel at ${bazel}"
-    return bazel
-  } else {
-    def bazel = getBazelInstallPath(node_label, bazel_version)
-    echo "Using released version of Bazel at ${bazel}"
-    return bazel
-  }
-}
diff --git a/jenkins/lib/vars/bootstrapBazel.groovy b/jenkins/lib/vars/bootstrapBazel.groovy
deleted file mode 100644
index fd849c0..0000000
--- a/jenkins/lib/vars/bootstrapBazel.groovy
+++ /dev/null
@@ -1,114 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import build.bazel.ci.BazelUtils
-
-@NonCPS
-def createCopyCommand(rootDir, toCopy, release_name) {
-  def replaceFn = { o -> o.replace("%{release_name}", release_name) }
-  def replacements = toCopy.collect(
-    { e ->
-      (e.value instanceof List) ?
-      e.value.collect { it -> "${e.key} ${replaceFn(it)}" }
-      : "${e.key} ${replaceFn(e.value)}"
-    }).flatten()
-  return replacements.collect({ e -> "cp ${rootDir}/${e}" }).join("\n")
-}
-
-// A step to bootstrap bazel on one platform
-def call(config = [:]) {
-  def repository = config.get("repository", "https://bazel.googlesource.com/bazel")
-  def branch = config.get("branch", "master")
-  def refspec = config.get("refspec", "+refs/heads/*:refs/remotes/origin/*")
-  def targets = config.get("targets", [])
-
-  machine(config.node) {
-    def utils = new BazelUtils()
-    def release_name = ""
-    def isWindows = !isUnix()
-    utils.script = this
-    utils.bazel = bazelPath("latest", config.node)
-    stage("[${config.node}] clone") {
-      recursiveGit(repository: repository,
-                   refspec: refspec,
-                   branch: branch)
-    }
-    stage("[${config.node}] get_version") {
-      release_name =
-        sh(script: "bash -c 'source scripts/release/common.sh; get_full_release_name'",
-           returnStdout: true).trim()
-      def opts = config.get("opts", [])
-      opts <<= "--stamp"
-      if (!isWindows) {
-        // TODO(dmarting): Windows status command fails :/
-        opts <<= "--workspace_status_command=scripts/ci/build_status_command.sh"
-      }
-      if (!release_name.isEmpty()) {
-        opts <<= "--embed_label ${release_name}"
-      }
-      utils.writeRc(opts)
-    }
-
-    // Configure, if necessary
-    def configuration = config.get("configure", [])
-    if (!configuration.isEmpty()) {
-      stage("[${config.node}] configure") {
-        if (isUnix()) {
-          sh "#!/bin/sh -x\n${configuration.join('\n')}"
-        } else {
-          bat configuration.join('\n')
-        }
-      }
-    }
-
-    stage("[${config.node}] bootstrap") {
-      def envs = ["BUILD_BY=Jenkins",
-                  "GIT_REPOSITORY_URL=${env.GIT_URL}"]
-      utils.build(["//src:bazel"] + targets)
-    }
-
-    // Archive artifacts
-    def toArchive = config.get("archive", [:])
-    def toStash = config.get("stash", [:])
-    toArchive = toArchive == null ? [:] : toArchive
-    toStash = toStash == null ? [:] : toStash
-
-    if (!toArchive.isEmpty() || !toStash.isEmpty()) {
-      stage("[${config.node}] archive") {
-        def rootDir = pwd()
-        if (isWindows) {
-          rootDir = sh(script: 'cygpath -u '+rootDir.replace("\\", "/"),
-                       returnStdout: true).trim()
-        }
-        dir("output") {
-          deleteDir()
-        }
-        if(!toArchive.isEmpty()) {
-          dir("output/node=${config.node}") {
-            sh createCopyCommand(rootDir, toArchive, release_name)
-          }
-          dir("output") {
-            archiveArtifacts artifacts: "**", fingerprint:true
-          }
-        }
-        if (!toStash.isEmpty()) {
-          dir("output/node=${config.node}") {
-            sh createCopyCommand(rootDir, toStash, release_name)
-          }
-        }
-        dir("output") {
-          stash name: "bazel--node=${config.node}"
-        }
-      }
-    }
-  }
-}
diff --git a/jenkins/lib/vars/bootstrapBazelAll.groovy b/jenkins/lib/vars/bootstrapBazelAll.groovy
deleted file mode 100644
index c975cee..0000000
--- a/jenkins/lib/vars/bootstrapBazelAll.groovy
+++ /dev/null
@@ -1,59 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// A step to bootstrap bazel on several platforms
-def call(config = [:]) {
-  def repository = config.get("repository", "https://bazel.googlesource.com/bazel")
-  def branch = config.get("branch", "master")
-  def refspec = config.get("refspec", "+refs/heads/*:refs/remotes/origin/*")
-  def configuration = config.get("configuration", "")
-
-  def jobs = [:]
-  // Convert to an array to avoid serialization issue with Jenkins
-  def entrySet = readConfiguration(files: ["scripts/ci/bootstrap.json"],
-                                   repository: config.repository,
-                                   branch: config.branch,
-                                   refspec: config.refspec,
-                                   default_configuration: config.get("configuration", null)
-                                  ).entrySet().toArray()
-  def values = []
-  def keys = []
-  for (int k = 0; k < entrySet.length; k++) {
-    values << entrySet[k].value
-    keys << entrySet[k].key
-  }
-  entrySet = null
-  config = null
-  flattenConfigurations = null
-
-  for (int k = 0; k < values.size; k++) {
-    def key = keys[k]
-    def value = values[k]
-    def name = build.bazel.ci.BazelConfiguration.descriptorToString(key)
-    jobs[name] = { ->
-      stage("Bootstrapping on ${name}") {
-        bootstrapBazel(repository: repository,
-                       branch: branch,
-                       refspec: refspec,
-                       node: key.node,
-                       archive: value.get("archive"),
-                       stash: value.get("stash"),
-                       targets: value.get("targets", []),
-                       configure: value.get("configure", []),
-                       opts: value.get("opts", []))
-      }
-    }
-  }
-
-  // The actual job
-  parallel jobs
-}
diff --git a/jenkins/lib/vars/gerritReview.groovy b/jenkins/lib/vars/gerritReview.groovy
deleted file mode 100644
index 230bdaa..0000000
--- a/jenkins/lib/vars/gerritReview.groovy
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-import build.bazel.ci.GerritUtils
-import build.bazel.ci.JenkinsUtils
-
-/**
- * Define a step "gerritReview" that wrap a build to be a "Gerrit review": the change
- * will be commented according to the result of the build and the verified bit will be
- * updated.
- * except if that argument is empty (in which case the body is executed directly).
- */
-def call(String server, String cookiesFile, String reviewer, changeNum, branch, Closure body) {
-  GerritUtils gerrit = new GerritUtils(server, cookiesFile, reviewer)
-  def url = gerrit.url(changeNum)
-  this.gerritBuild = currentBuild
-  stage("Start Gerrit review") {
-    echo "Reviewing change ${url} (${branch})"
-    gerrit.startReview(changeNum)
-    gerrit.comment(changeNum, branch,
-                   "Starting build at ${JenkinsUtils.getBlueOceanUrl(currentBuild)}")
-  }
-  def config = [gerritBuild: currentBuild, gerrit: gerrit, reportUrl: null]
-  def result = null
-  try {
-    body.delegate = config
-    body()
-  } catch(Exception ex) {
-    result = "ERROR"
-    throw ex
-  } finally {
-    if (result == null) {
-      result = config.gerritBuild.result == null ? "SUCCESS" : config.gerritBuild.result
-    }
-    def reportUrl = config.reportUrl ? config.reportUrl : JenkinsUtils.getBlueOceanUrl(config.gerritBuild)
-    def verified = result == "SUCCESS" ? "+" : "-"
-    echo "Setting ${verified}Verified to change ${url} after build returned ${result}"
-    gerrit.review(changeNum, branch, result == "SUCCESS" ? 1 : -1,
-                  "Build ${reportUrl} finished with status ${result}")
-  }
-}
diff --git a/jenkins/lib/vars/githubHook.groovy b/jenkins/lib/vars/githubHook.groovy
deleted file mode 100644
index 355da0b..0000000
--- a/jenkins/lib/vars/githubHook.groovy
+++ /dev/null
@@ -1,49 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import groovy.json.JsonSlurper
-
-@NonCPS
-private def parseGithubPayload(def payload) {
-  def json = new JsonSlurper().parseText(payload)
-  if (json.deleted) {
-    return null
-  }
-  return ["branch": json.ref, "repository": json.repository.full_name, "url": json.repository.url]
-}
-
-// A step that executes a subcommand if a given payload coming from Github describe an update
-// to a given branch / tag.
-// Parameters:
-//   - payload: the name of the parameters containing the Github webhook JSON payload.
-//   - refs: a regex to match the ref that was passed.
-//   - repositories: a list of allowed repositories.
-// Note that the body is executed either if there is a payload and the payload matche the
-// criteria or no payload was provided. The body will be passed as delegate a map containing
-// the branch ref ('branch'), the repository name ('repository') and url ('url'). They will be
-// null if no payload was provided.
-def call(def config, Closure body) {
-  def payloadName = config.get("payload", "payload")
-  def refs = config.get("refs", ".*")
-  def repositories = config.get("repositories", ["bazelbuild/bazel"])
-
-  body.delegate = ["branch": null, "repository": null, "url": null]
-  if (params[payloadName]) {
-    def payload = parseGithubPayload(params[payloadName])
-    if (payload && payload.branch.matches(refs) && payload.repository in repositories) {
-      body.delegate = payload
-      body()
-    }
-  } else {
-    body()
-  }
-}
diff --git a/jenkins/lib/vars/globalBazelTest.groovy b/jenkins/lib/vars/globalBazelTest.groovy
deleted file mode 100644
index 357f370..0000000
--- a/jenkins/lib/vars/globalBazelTest.groovy
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// A pipeline step that control a global test for Bazel:
-//   - Bootstrap bazel and do some basic tests
-//   - Deploy the artifacts (site, releases) and send mails
-//   - Run all downstream job
-def call(config = [:]) {
-  def repository = config.get("repository", "https://bazel.googlesource.com/bazel")
-  def branch = config.get("branch", "master")
-  def extra_bazelrc = config.get("extra_bazelrc", "")
-  def refspec = config.get("refspec", "+refs/heads/*:refs/remotes/origin/*")
-  def json_config = config.configuration
-
-  stage("Startup global test") {
-    echo "Running global test for branch ${branch} (refspec: ${refspec})"
-  }
-
-  // First we bootstrap bazel on all platform
-  stage("Bootstrap on all platforms") {
-    bootstrapBazelAll(repository: repository,
-                      branch: branch,
-                      refspec: refspec,
-                      configuration: json_config)
-  }
-
-
-  // Deployment steps
-  def is_master = branch.matches('^(.*/)?master$')
-  def is_rc = branch.matches('^(refs/heads/)?release-.*$')
-  def is_release = branch.matches('^refs/tags/.*$')
-  if(is_master || is_rc | is_release) {
-    stage(is_master ? "Push website" : "Push release") {
-      machine("deploy") {
-        recursiveGit(repository: repository,
-                     refspec: refspec,
-                     branch: branch)
-        if (!is_master) {
-          def r_name = sh(script: "bash -c 'source scripts/release/common.sh; get_full_release_name'",
-                          returnStdout: true).trim()
-          if (!r_name.isEmpty()) {
-            pushRelease(name: r_name,
-                        configuration: json_config,
-                        excludes: ["**/*.bazel.build.tar*", "**/bazel", "**/bazel.exe"])
-            if (is_release) {
-              stage("Install new release on all nodes") {
-                build(job: "/maintenance/install-bazel", wait: false, propagate: false)
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-
-  // Then we run all jobs in the Global folder except the global pipeline job (the current job).
-  report = null
-  stage("Test downstream jobs") {
-    report = runAll(folder: "Global",
-                    parameters: [
-                      [$class: 'TextParameterValue',
-                       name: 'EXTRA_BAZELRC',
-                       value: "${extra_bazelrc}"],
-                      [$class: 'StringParameterValue',
-                       name: 'REPOSITORY',
-                       value: "${repository}"],
-                      [$class: 'StringParameterValue',
-                       name: 'BRANCH',
-                       value: "${branch}"],
-                      [$class: 'StringParameterValue',
-                       name: 'REFSPEC',
-                       value: "${refspec}"]
-                    ],
-                    excludes: ["pipeline", currentBuild.getProjectName()])
-  }
-
-  stage("Publish report") {
-    reportAB report: report, name: "Downstream projects"
-  }
-}
diff --git a/jenkins/lib/vars/installBazel.groovy b/jenkins/lib/vars/installBazel.groovy
deleted file mode 100644
index a0d1398..0000000
--- a/jenkins/lib/vars/installBazel.groovy
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import java.nio.channels.Channels
-
-// Returns the latest Bazel version available on github
-@NonCPS
-def getLatestBazelVersion() {
-  def url = new URL("https://github.com/bazelbuild/bazel/releases/latest")
-  def conn = url.openConnection()
-  conn.setInstanceFollowRedirects(false)
-  String location = conn.getHeaderField("Location").trim()
-  return location.replaceAll("^.*/", "")  // Last component of the location is the release tag
-}
-
-// Install bazel version X from the web
-private def installBazel(script, version, platform) {
-  def release_url = "https://releases.bazel.build/${version}/release"
-  if (platform.startsWith("windows")) {
-    def url = "${release_url}/bazel-${version}-windows-x86_64.exe"
-    def dir = "c:\\bazel_ci\\installs\\${version}"
-    def to = "${dir}\\bazel.exe"
-    script.bat "powershell -Command \"New-Item -ItemType directory -Force -Path ${dir}; (New-Object Net.WebClient).DownloadFile('${url}', '${to}')\""
-  } else {
-    def destination ="${env.HOME}/.bazel/${version}"
-    script.sh """#!/bin/bash -x
-curl -L -o install.sh '${release_url}/bazel-${version}-without-jdk-installer-${platform}.sh'
-chmod 0755 install.sh
-./install.sh --base='${destination}' --bin='${destination}/binary'
-"""
-  }
-}
-
-@NonCPS
-private def getPlatformFromNodeName(node) {
-  def platforms = ["windows": "windows-x86_64",
-                   "darwin": "darwin-x86_64",
-                   "": "linux-x86_64"]
-  return platforms.find { e -> node.startsWith(e.key) }.value
-}
-
-// A step to install a released version of Bazel
-// parameters:
-//   version: the version to install, default to latest
-//   alias: alias of the version, if version is latest, this is set to "latest" too
-def call(params = [:]) {
-  params["version"] = params.get("version", "latest")
-  params["alias"] = params.get("alias", params.version == "latest" ? "latest" : "")
-
-  if (params.version == "latest") {
-    params.version = getLatestBazelVersion()
-  }
-
-  machine(params.node) {
-    // Determine the platform
-    def platform = getPlatformFromNodeName(params.node)
-
-    // install bazel
-    installBazel(this, params.version, platform)
-
-    // Symlinks
-    if (!params.alias.isEmpty()) {
-      def from = "${params.version}"
-      def to = "${params.alias}"
-      if (platform.startsWith("windows")) {
-        bat """
-rmdir /q c:\\bazel_ci\\installs\\${to}
-mklink /J c:\\bazel_ci\\installs\\${to} c:\\bazel_ci\\installs\\${from}
-"""
-      } else {
-        sh "rm -f ~/.bazel/${to}; ln -s ~/.bazel/${from} ~/.bazel/${to}"
-      }
-    }
-  }
-}
diff --git a/jenkins/lib/vars/machine.groovy b/jenkins/lib/vars/machine.groovy
deleted file mode 100644
index a7a8bc2..0000000
--- a/jenkins/lib/vars/machine.groovy
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * Define a step "machine" that wrap the "node" step but adding a line showing information
- * about the node it is being executed on.
- */
-def call(String node_label, Closure body) {
-  // We only do full node label matching to avoid people trying to book
-  // sensitive workers.
-  node_label = node_label.replaceAll('"', '')
-  node("\"${node_label}\"") {
-    stage("Node information") {
-      echo "node = ${env.NODE_NAME}\nworkspace = ${pwd()}"
-    }
-    body()
-  }
-}
diff --git a/jenkins/lib/vars/maybeDir.groovy b/jenkins/lib/vars/maybeDir.groovy
deleted file mode 100644
index 87f427d..0000000
--- a/jenkins/lib/vars/maybeDir.groovy
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * Define a step "maybeDir" that executes its body under the directory passed as argument,
- * except if that argument is empty (in which case the body is executed directly).
- */
-def call(String directory, Closure body) {
-  if (directory.isEmpty()) {
-    body()
-  } else {
-    dir(directory) {
-      body()
-    }
-  }
-}
diff --git a/jenkins/lib/vars/maybeSauce.groovy b/jenkins/lib/vars/maybeSauce.groovy
deleted file mode 100644
index d40f503..0000000
--- a/jenkins/lib/vars/maybeSauce.groovy
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * Define a step "maybeSauce" that executes its body under the SauceLabs wrapper with the
- * credentials identifier given in argument, except if that argument is empty (in which
- * case the body is executed directly).
- */
-def call(String id, Closure body) {
-  if (id.isEmpty()) {
-    body()
-  } else {
-    sauce(id) {
-      sauceconnect(useGeneratedTunnelIdentifier: true) {
-        body()
-      }
-    }
-  }
-}
diff --git a/jenkins/lib/vars/pushRelease.groovy b/jenkins/lib/vars/pushRelease.groovy
deleted file mode 100644
index e6c0d8d..0000000
--- a/jenkins/lib/vars/pushRelease.groovy
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import build.bazel.ci.JenkinsUtils
-import build.bazel.ci.BazelConfiguration
-
-private def ensureGpgSecretKeyImported() {
-  sh '''#!/bin/bash
-echo "Import GPG Secret key"
-(gpg --list-secret-keys | grep "${APT_GPG_KEY_ID}" > /dev/null) || \\
-  gpg --allow-secret-key-import --import "${APT_GPG_KEY_PATH}"
-# Make sure we use stronger digest algorithm.
-# We use reprepro to generate the debian repository,
-# but there is no way to pass flags to gpg using reprepro, so writting it into
-# ~/.gnupg/gpg.conf
-(grep "digest-algo sha256" ~/.gnupg/gpg.conf > /dev/null) || \\
-  echo "digest-algo sha256" >> ~/.gnupg/gpg.conf
-'''
-}
-
-// Generate the SHA-256 checksum and the GPG signature for a list of artifacts.
-// Returns a new list of artifacts that include the generated checksum and signature files.
-private def signArtifacts(files) {
-  def result = []
-  def script = []
-  for (def file : files) {
-    script <<= "echo 'Signing ${file}'"
-    script <<= "(cd \"\$(dirname '${file}')\" && sha256sum \"\$(basename '${file}')\") > '${file}.sha256'"
-    script <<= "gpg --no-tty --detach-sign -u \"\${APT_GPG_KEY_ID}\" '${file}'"
-    result <<= file
-    result <<= "${file}.sha256"
-    result <<= "${file}.sig"
-  }
-  sh "#!/bin/bash \n${script.join '\n'}"
-  return result
-}
-
-@NonCPS
-private def listArtifacts(ws, dir, excludes) {
-  return JenkinsUtils.list(env, "${ws}/${dir}", excludes).collect { "${dir}/${it}" }
-}
-
-private def listStashes(configuration) {
-  def result = []
-  def conf = BazelConfiguration.flattenConfigurations(
-    BazelConfiguration.parse(configuration))
-  for (k in conf.keySet()) {
-    if ("stash" in conf[k] || "archive" in conf[k]) {
-      result.add("bazel--node=${k.node}")
-    }
-  }
-  return result
-}
-
-// A step that push a release for Bazel.
-def call(params = [:]) {
-  // Parameters
-  def r_name = params.name
-  def bucket = params.get("bucket", "bazel")
-  def release_script = params.get("release_script", "source scripts/ci/build.sh; deploy_release")
-  def email_script = params.get("email_script", "source scripts/ci/build.sh; generate_email")
-  def repository = params.get("repository", "https://github.com/bazelbuild/bazel")
-  def replyTo = params.get("replyTo", "bazel-ci@googlegroups.com")
-
-  def ws = pwd()
-
-  // Save the build log
-  JenkinsUtils.saveLog(env, currentBuild, "${ws}/build.log")
-
-  // unstash all the things
-  dir("artifacts") {
-    def stashNames = listStashes(params.configuration)
-    for (def stashName : stashNames) {
-      unstash stashName
-    }
-  }
-  def artifacts = listArtifacts(ws, "artifacts", params.get("excludes", []))
-
-  // Now the actual release
-  withEnv(["GCS_BUCKET=${bucket}",
-           "GIT_REPOSITORY_URL=${repository}",
-           "GITHUB_TOKEN=${readFile(env.GITHUB_TOKEN_FILE).trim()}",
-           "APT_GPG_KEY_ID=${readFile(env.APT_GPG_KEY_ID_FILE).trim()}",
-           // TODO(dmarting): hack to work with release_to_apt(), we should get rid of it.
-           "tmpdir=${ws}/artifacts/node=linux-x86_64"]) {
-    // Sign artifacts
-    ensureGpgSecretKeyImported()
-    def artifact_list = signArtifacts(artifacts)
-
-    // Release
-    sh "#!/bin/bash\n${release_script} build.log ${artifact_list.join ' '}"
-
-    // Send email announcement
-    stage("Announcement mail") {
-      def email = sh(script: "bash -c '${email_script}'", returnStdout: true)
-      echo "Mail to: ${email}"
-      if (r_name.contains("test")) {
-        echo "Test release, skipping announcement mail."
-      } else {
-        def splittedEmail = email.split("\n", 3)
-        mail(subject: splittedEmail[1],
-             to: splittedEmail[0],
-             replyTo: replyTo,
-             body: splittedEmail[2])
-      }
-    }
-  }
-}
diff --git a/jenkins/lib/vars/readConfiguration.groovy b/jenkins/lib/vars/readConfiguration.groovy
deleted file mode 100644
index c981830..0000000
--- a/jenkins/lib/vars/readConfiguration.groovy
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import build.bazel.ci.BazelConfiguration
-
-// Step to read a configuration from the repository
-// Parameters:
-//   - repository, branch, refspec: which repository to fetch, see recursiveGit
-//   - files: the list of files to read from the repository (if the first one
-//     does not exists, try the second one and so on...), default to .ci/bazel.json.
-//   - default_configuration: default json content to use if the file cannot be found
-def call(config = [:]) {
-  def conf = null
-  def files = config.get("files", [".ci/bazel.json"])
-  def filename = null
-  if ("repository" in config) {
-    node {
-      recursiveGit(repository: config.repository,
-                   branch: config.get("branch", "master"),
-                   refspec: config.get("refspec", "+refs/heads/*:refs/remotes/origin/*"))
-      for(int k = 0; k < files.size() && conf == null; k++) {
-        if (fileExists(files[k])) {
-          filename = files[k]
-          conf = readFile(filename)
-        }
-      }
-    }
-  }
-  if (conf == null) {
-    conf = config.get("default_configuration")
-    if (conf == null) {
-      error(
-        """Cannot read configuration file from the repository and no fallback was provided.
-Please check a configuration file under one of: ${files.join ', '}.""")
-    }
-  }
-  try {
-    // We exclude the deploy slaves from being selected by the configuration, they
-    // have access to secrets.
-    return BazelConfiguration.flattenConfigurations(
-      BazelConfiguration.parse(conf), ["node": ["deploy"]])
-  } catch (Exception ex) {
-    error(filename != null ? "Failed to validate configuration (file was ${filename}): ${ex.message}"
-          : "Failed to validate default configuration: ${ex.message}")
-  }
-}
diff --git a/jenkins/lib/vars/recursiveGit.groovy b/jenkins/lib/vars/recursiveGit.groovy
deleted file mode 100644
index a0daa42..0000000
--- a/jenkins/lib/vars/recursiveGit.groovy
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (C) 2017 The Bazel Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * A step for our custom git, the normal git step does not allow to recurse
- * into submodule, nor to specify a custom refs.
- *
- * Params:
- *   repository (mandatory): the name of the repository to fetch
- *   branch (default to master): the name of the branch to checkout (can be a hash too)
- *   refspec (default to refs/heads/*): the list of refs to fetch
- */
-def call(config = [:]) {
-  config["branch"] = config.get("branch", "master")
-  config["refspec"] = config.get("refspec", "+refs/heads/*:refs/remotes/origin/*")
-  if (!("repository" in config)) {
-    error("recursiveGit needs a repository parameter")
-  }
-  def branch = config.branch.matches('^([a-f0-9]+|(origin|refs)/.*)$') ? config.branch : ("*/" + config.branch)
-  checkout(scm: [$class: 'GitSCM',
-                 branches: [[name: branch]],
-                 doGenerateSubmoduleConfigurations: false,
-                 extensions: [[$class: "SubmoduleOption",
-                               disableSubmodules: false,
-                               parentCredentials: false,
-                               recursiveSubmodules: true,
-                               reference: "",
-                               trackingSubmodules: false],
-                              [$class: 'CleanBeforeCheckout']],
-                 submoduleCfg: [],
-                 userRemoteConfigs: [[url: config.repository, refspec: config.refspec]]],
-           poll: true)
-}
diff --git a/jenkins/lib/vars/reportAB.groovy b/jenkins/lib/vars/reportAB.groovy
deleted file mode 100644
index 084c33e..0000000
--- a/jenkins/lib/vars/reportAB.groovy
+++ /dev/null
@@ -1,82 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Step to report failure of a set of jobs and comparing the result with
-// the latest jobs with the same name on another folder
-import build.bazel.ci.JenkinsUtils
-
-@NonCPS
-def formatRun(run) {
-  if (run == null) {
-    return "unkown status"
-  }
-  def console = JenkinsUtils.getConsoleUrl(run)
-  def url = JenkinsUtils.getBlueOceanUrl(run)
-  def icon = JenkinsUtils.getSmallIconUrl(run)
-  return "<a href=\"${console}\"><img src=\"${icon}\"/></a> <a href=\"${url}\">#${run.number}</a>"
-}
-
-@NonCPS
-def collectJobs(report, beforeFolder) {
-  def successes = []
-  def failures = []
-  def alreadyFailing = []
-  for (e in report) {
-    def key = e.key
-    def value = e.value
-    def beforeJob = JenkinsUtils.getLastRun(beforeFolder, key)
-    def element = "${key} ${formatRun(value)} (was ${formatRun(beforeJob)})"
-    if (value.result == "SUCCESS") {
-      successes <<= element
-    } else if (beforeJob == null || beforeJob.rawBuild.result.isWorseOrEqualTo(value.rawBuild.result)) {
-      alreadyFailing <<= element
-    } else {
-      failures <<= element
-    }
-  }
-  return [failures: failures, alreadyFailing: alreadyFailing, successes: successes]
-}
-
-@NonCPS
-def toHTMLList(lst) {
-  def listItems = lst.collect { "<li>${it}</li>" }
-  return "<ul>${listItems.join('\n')}</ul>"
-}
-
-def call(args = [:]) {
-  node {
-    def name = args.name
-    def jobs = collectJobs(args.report, args.get("beforeFolder", ""))
-    writeFile file: (".report/${name}.html"), text: """
-<html>
-<h2>Newly failing jobs</h2>
-<ul>${toHTMLList(jobs.failures)}</ul>
-<h2>Already failing jobs</h2>
-<ul>${toHTMLList(jobs.alreadyFailing)}</ul>
-<h2>Passing jobs</h2>
-<ul>${toHTMLList(jobs.successes)}</ul>
-</html>
-"""
-    publishHTML target: [
-      allowMissing: false,
-      alwaysLinkToLastBuild: false,
-      keepAll: true,
-      reportDir: ".report",
-      reportFiles: "${name}.html",
-      reportName: name
-    ]
-
-    if (args.get("unstableOnNewFailure", true) && !jobs.failures.empty) {
-      currentBuild.result = "UNSTABLE"
-    }
-  }
-}
diff --git a/jenkins/lib/vars/runAll.groovy b/jenkins/lib/vars/runAll.groovy
deleted file mode 100644
index 09ba730..0000000
--- a/jenkins/lib/vars/runAll.groovy
+++ /dev/null
@@ -1,50 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Step to run all job matching certain criterium
-import build.bazel.ci.JenkinsUtils
-
-def call(params = [:]) {
-  def folder = params.get("folder", null)
-  def excludes = params.get("excludes", [currentBuild.getProjectName()])
-  def parameters = params.get("parameters", [])
-  def wait = params.get("wait", true)
-  def catchError = params.get("catchError", false)
-  def jobs = JenkinsUtils.jobs(folder).toArray()
-  def toRun = [:]
-  def report = [:]
-  for (int k = 0; k < jobs.length; k++) {
-    def jobName = jobs[k]
-    if (!(jobName in excludes)) {
-      toRun[jobName] = { ->
-          r = build(job: folder ? "/${folder}/${jobName}" : jobName,
-                    parameters: parameters,
-                    wait: wait,
-                    propagate: false)
-          report.put(jobName, r)
-	  echo "Details of ${jobName}: ${JenkinsUtils.getBlueOceanUrl(r)}"
-          if (r.result == "FAILURE" || r.result == "UNSTABLE"
-	      || r.result == "ABORTED") {
-            throw new Exception("Failed on " + jobName + ": " + r.result);
-          }
-        }
-    }
-  }
-  jobs = null
-  try {
-    parallel(toRun)
-  } catch(Exception e) {
-    // back to normal execution, to have the report available
-  }
-
-  return report
-}
diff --git a/jenkins/setup-deploy.sh b/jenkins/setup-deploy.sh
deleted file mode 100755
index 3b22bcf..0000000
--- a/jenkins/setup-deploy.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2015 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Setup the various utilities for the deploy image (image that deploy releases).
-# This script will be run inside the deploy docker image at the docker instance
-# startup.
-
-pushd /opt/data
-
-# gsutil does change, we cannot use http_file as the SHA-256 would change over
-# time.
-wget https://storage.googleapis.com/pub/gsutil.tar.gz
-
-tar zxf hoedown.tar.gz && rm hoedown.tar.gz
-tar zxf github_release.tar.gz && rm github_release.tar.gz
-tar zxf gsutil.tar.gz && rm gsutil.tar.gz
-
-mv hoedown-* hoedown
-pushd hoedown
-make CC=gcc hoedown
-popd
-
-mv github-release-* github-release
-pushd github-release
-make
-popd
-
-popd
diff --git a/jenkins/slave_setup.sh b/jenkins/slave_setup.sh
deleted file mode 100644
index f3a380f..0000000
--- a/jenkins/slave_setup.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-#
-# Copyright 2015 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Scripts to configure a Jenkins executor node in a docker image.
-
-# {{ variables.HOME_FS }} is replaced by the template engine.
-HOME_FS={{ variables.HOME_FS }}
-
-# Install certificates
-(cd /usr/share/ca-certificates && find . -type f -name '*.crt' \
-    | sed -e 's|^\./||') > /etc/ca-certificates.conf
-update-ca-certificates
-
-# Create the Jenkins user.
-groupadd -g 1000 ci
-useradd -d ${HOME_FS} -r -g 1000 -u 1000 ci
-chown ci.ci ${HOME_FS}
-cd ${HOME_FS}
-
-# Execute additional setup scripts.
-for i in /opt/run/*.{,ba}sh; do
-  if [ -f "$i" ]; then
-    /bin/bash $i
-  fi
-done
-
-# Run the Jenkins agent.
-wget -O slave.jar https://ci.bazel.build/jnlpJars/slave.jar || exit 1
-su ci -c "${JAVA_HOME}/bin/java -jar slave.jar -jnlpUrl https://ci.bazel.build/computer/{{ variables.NODE_NAME }}/slave-agent.jnlp -noReconnect"
diff --git a/templating/BUILD b/templating/BUILD
deleted file mode 100644
index c0a525d..0000000
--- a/templating/BUILD
+++ /dev/null
@@ -1,22 +0,0 @@
-py_binary(
-    name = "template_engine",
-    srcs = ["main.py"],
-    main = "main.py",
-    visibility = ["//visibility:public"],
-    deps = [
-        "@com_github_google_python_gflags//:gflags",
-        "@org_pocoo_jinja_jinja2//:jinja2",
-    ],
-)
-
-py_test(
-    name = "integration_test",
-    srcs = [
-        "integration_test.py",
-        "main.py",
-    ],
-    deps = [
-        "@com_github_google_python_gflags//:gflags",
-        "@org_pocoo_jinja_jinja2//:jinja2",
-    ],
-)
diff --git a/templating/integration_test.py b/templating/integration_test.py
deleted file mode 100644
index 2217ef7..0000000
--- a/templating/integration_test.py
+++ /dev/null
@@ -1,102 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""End-to-end test of the template engine."""
-
-from collections import namedtuple, OrderedDict
-import templating.main as main
-import os
-import tempfile
-import unittest
-
-class IntegrationTest(unittest.TestCase):
-
-  def setUp(self):
-    self._tmpDir = os.getenv('TEST_TMPDIR')
-    os.chdir(self._tmpDir)
-    self._tmpFiles = []
-
-  def tearDown(self):
-    for f in self._tmpFiles:
-      os.remove(f)
-    self._tmpFiles = []
-
-  def _get_tmp(self):
-    tmp = tempfile.mkstemp(dir=self._tmpDir)
-    os.close(tmp[0])
-    self._tmpFiles.append(tmp[1])
-    return tmp[1]
-
-  def assert_template(self, expected, template, variables={},
-                      imports={}, escape_xml=True, executable=False):
-    tempfile = self._get_tmp()
-    outfile = self._get_tmp()
-    with open(tempfile, 'w') as f:
-      f.write(template)
-    imp = []
-    for v in imports:
-      fn = self._get_tmp()
-      imp.append((v[0], fn))
-      with open(fn, 'w') as f:
-        f.write(v[1])
-    MyStruct = namedtuple(
-        'MyStruct',
-        'template output variable imports escape_xml executable')
-    main.main(MyStruct(
-        template=tempfile,
-        output=outfile,
-        escape_xml=escape_xml,
-        executable=executable,
-        variable=['%s=%s' % (k, v) for k, v in variables.iteritems()],
-        imports=['%s=%s' % v for v in imp],
-    ), None)
-    with open(outfile, 'r') as f:
-      self.assertEquals(expected, f.read())
-
-  def test_no_substitution(self):
-    self.assert_template('toto', 'toto')
-
-  def test_one_substitution(self):
-    self.assert_template('toto', '{{ variables.toto }}',
-                        variables={'toto': 'toto'})
-
-  def test_one_import(self):
-    self.assert_template('toto', '{{ imports.toto }}', 
-                         imports=[('toto', 'toto')])
-
-  def test_cascaded_imports(self):
-    self.assert_template(
-        'd',
-        '{{ imports.a }}',
-        imports=[
-            ('c', 'd'),
-            ('b', '{{ imports.c }}'),
-            ('a', '{{ imports.b }}'),
-        ])
-
-  def test_escape_xml(self):
-    self.assert_template('&amp;', '{{ variables.a }}',
-                         variables={'a': '&'})
-    self.assert_template('&amp;', '{{ imports.a }}',
-                         imports=[('a', '&')])
-    self.assert_template('&amp;', '{{ imports.b }}',
-                         imports=[('a', '&'), ('b', '{{ imports.a }}')])
-    self.assert_template('&', '{{ variables.a }}', escape_xml=False,
-                         variables={'a': '&'})
-    self.assert_template('&', '{{ imports.a }}', escape_xml=False,
-                         imports=[('a', '&')])
-    self.assert_template('&', '{{ imports.b }}', escape_xml=False,
-                         imports=[('a', '&'), ('b', '{{ imports.a }}')])
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/templating/main.py b/templating/main.py
deleted file mode 100644
index c3da715..0000000
--- a/templating/main.py
+++ /dev/null
@@ -1,116 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""A template engine based on jinja2 to use as a tool for Skylark rules."""
-
-import gflags
-import jinja2
-import os
-import os.path
-import sys
-import xml.sax.saxutils as saxutils
-
-gflags.DEFINE_string('output', None, 'The output file, mandatory.')
-gflags.MarkFlagAsRequired('output')
-
-gflags.DEFINE_string('template', None, 'The input file, mandatory.')
-gflags.MarkFlagAsRequired('template')
-
-gflags.DEFINE_multistring(
-    'variable', [],
-    'A variable to expand in the template, in the format NAME=VALUE. Each '
-    'variable provided here will be available via the variables.NAME '
-    'variable.')
-
-gflags.DEFINE_multistring(
-    'imports', [],
-    'A file to import as another template, in the format NAME=filename. '
-    'Each file imported here will be considered as template and expanded '
-    'as such. The order of expansion happens in the order it is given on '
-    'the command line, making each file available for consumption for the '
-    'next one. All file content will be available via the imports.NAME '
-    'variable.')
-
-gflags.DEFINE_boolean(
-    'escape_xml', True,
-    'Whether to escape XML special characters in the import templates. '
-    'If set to True, all files specified through --imports and all values '
-    'specified through --variable will be escaped for XML characters '
-    'before inclusion in the main template.')
-
-gflags.DEFINE_boolean(
-    'executable', False, 'Whether to adds the executable bit to the output.')
-
-FLAGS = gflags.FLAGS
-
-class OneFileLoader(jinja2.BaseLoader):
-  """A file system loader that allows loading only one file."""
-  def __init__(self, path):
-    self.path = path
-
-  def get_source(self, environment, template):
-    if template != self.path or not os.path.exists(self.path):
-      raise TemplateNotFound(template)
-    mtime = os.path.getmtime(self.path)
-    source = ''
-    with file(self.path) as f:
-      source = f.read().decode('utf-8')
-    return source, self.path, lambda: mtime == os.path.getmtime(self.path)
-
-
-def expand_template(template, variables, imports, raw_imports=None):
-  """Expand a template."""
-  if raw_imports is None:
-    raw_imports = imports
-  env = jinja2.Environment(loader=OneFileLoader(template))
-  template = env.get_template(template)
-  return template.render(imports=imports, variables=variables, raw_imports=raw_imports)
-
-def quote_xml(d):
-  """Returns a copy of d where all values where escaped for XML."""
-  return {k: saxutils.escape(v) for k,v in d.iteritems()}
-
-def construct_imports(variables, imports):
-  """Construct the list of imports by expanding all command line arguments."""
-  result = {}
-  for i in imports:
-    kv = i.split('=', 1)
-    if len(kv) != 2:
-      print 'Invalid value for --imports: %s. See --help.' % i
-      sys.exit(1)
-    result[kv[0]] = expand_template(kv[1], variables, result)
-  return result
-
-def main(flags, unused_argv):
-  """Main method."""
-  variables = {}
-  for v in flags.variable:
-    kv = v.split('=', 1)
-    if len(kv) != 2:
-      print 'Invalid value for --variable: %s. See --help.' % v
-      sys.exit(-1)
-    variables[kv[0]] = kv[1]
-  imports = construct_imports(variables, flags.imports)
-  raw_imports = imports
-  if flags.escape_xml:
-    imports = quote_xml(imports)
-    variables = quote_xml(variables)
-  result = expand_template(flags.template, variables, imports, raw_imports)
-  with open(flags.output, "w") as f:
-    f.write(result)
-  if flags.executable:
-    os.chmod(flags.output, 0o755)
-
-if __name__ == '__main__':
-  unused_argv = FLAGS(sys.argv)
-  main(FLAGS, unused_argv)