Update all Jenkins plug-ins and add a helper script to maintain them in the future

Change-Id: I4f340734ae577e6840e176b622d655b3b326247a
diff --git a/jenkins/base/plugins.bzl b/jenkins/base/plugins.bzl
index 4f54463..2993768 100644
--- a/jenkins/base/plugins.bzl
+++ b/jenkins/base/plugins.bzl
@@ -16,215 +16,211 @@
 JENKINS_PLUGINS = {
  'ace-editor': ['1.1',
                 'abc97028893c8a71581a5f559ea48e8e1f1a65164faee96dabfed9e95e9abad2'],
- 'ansicolor': ['0.5.0',
-               '4fd5b38959812712b62576ce98d0302f799bd950f5a6f777a8c0d862df336526'],
- 'antisamy-markup-formatter': ['1.5',
-                               '8e8e3e917d76b0432ab3c32a000e824f4ef32011ba5e77dd8b6b476310df8f1a'],
+ 'ansicolor': ['0.5.2',
+               '726c651a3ac8d080ff4aa5b962dd8b264801b8a3fde027da07fa1be30c709b31'],
+ 'apache-httpcomponents-client-4-api': ['4.5.3-2.0',
+                                        '6f4ef91ba8e07c235892bcfdc0240809ceb61c37e7e9940d9540de3644f9a620'],
  'authentication-tokens': ['1.3',
                            'f05736bc7da0df3bba5ceb4d893089706812ced3134adb2edc9ae341467f1ae3'],
- 'blueocean': ['1.1.6',
-               'f46548a9af58f47b3ddace3e56d6841d616a13c6fb4adcb3b041818f6e008cd7'],
- 'blueocean-autofavorite': ['1.0.0',
-                            '4ecaac0bbe0214469d16fe9a6953efb4c54d9cfcab6d96007890554c6eb04423'],
- 'blueocean-commons': ['1.1.6',
-                       'c1768341bcd83c2e81d2438d7e350485cfa1f9f0fc84922a9efdfec26622a1a9'],
- 'blueocean-config': ['1.1.6',
-                      '2c2dec55146fafdd48e1c0ea41d085776337dc045752fdc6d3c2db59ab26ec89'],
- 'blueocean-dashboard': ['1.1.6',
-                         '8bd926d7ab1643c1bb0e7ed2af344c6b53199afc66860e1fe5badda660f76c56'],
- 'blueocean-display-url': ['2.0',
-                           'ce46e5d2a0476cff482f7033ba2e8731fd5c4de010ba8fb7572f68ed22bbfb13'],
- 'blueocean-events': ['1.1.6',
-                      '919da868b56a7838241cdf1f2cee676272f6ec2a3495ad02af28eed9e280c061'],
- 'blueocean-git-pipeline': ['1.1.6',
-                            '9d984e502ce0f914d942c091163f6b3251b68a41f0a385af6c4d0756a5bbd1d0'],
- 'blueocean-github-pipeline': ['1.1.6',
-                               '21dbac4b336b2b022e3abaf0afb600c7e5576403afd3b53720e95c9ed2b4fe57'],
- 'blueocean-i18n': ['1.1.6',
-                    '50f4e02930676f2298bcf2e81e1f1dbdcec6578f326c4385afc1e89e6275a2ce'],
- 'blueocean-jwt': ['1.1.6',
-                   '4c42a529efc3d759396eb3ed9658da699e4d62d808726fb904cf8e47738ea960'],
- 'blueocean-personalization': ['1.1.6',
-                               '91b910c346c267bc17438b0423d240393df96cab5edfca7089ddfd47d191a8c1'],
- 'blueocean-pipeline-api-impl': ['1.1.6',
-                                 'dae16da9cf6d03ee9f006c2e52d49917f2895f6eb0a3cd55febbba135a8ef347'],
- 'blueocean-pipeline-editor': ['0.2.0',
-                               'cd3d0a7aeee37aa8df6135dc575a4d0458dc63f206f61034f57a79a58be83c64'],
- 'blueocean-pipeline-scm-api': ['1.1.6',
-                                '7c2be0081b02496f798f46f261a3081003e55f3df72bbedd865ef55191c0a5d6'],
- 'blueocean-rest': ['1.1.6',
-                    '91990d0e971346d418f2b09c0de013f83698611ced9a108828c96306e1cf1092'],
- 'blueocean-rest-impl': ['1.1.6',
-                         '192d525cf0abccee383278a5427d5e95251638d6075beea8259974458c998606'],
- 'blueocean-web': ['1.1.6',
-                   'd5e7db75a84fe0ed7e77494c806a64c72bb0bd127a4968505d9f19fc2e4cdfa9'],
- 'bouncycastle-api': ['2.16.1',
-                      '87bbc7e1f385524d6c5f5f49365c1f7e1cce7a1aee908ddd3ac0884d6b9055fc'],
- 'branch-api': ['2.0.9',
-                'f54cf77dc09d1d92ef2ec5ad6d04cb79fce7ac1d251dab7cb085c2ef398f2863'],
- 'build-monitor-plugin': ['1.11+build.201701152243',
-                          '4e8d5e0a00410f06e07a05cf1011563df7cd169e1961d3f334fc159a55b6a29b'],
- 'build-timeout': ['1.18',
-                   '6ea3eaa31d13314af1bcd7576fb07ee4a007c84ae56639eabc03e503de485dba'],
- 'cloudbees-folder': ['6.0.4',
-                      '4372996561c5118cfdf2ca801d7436ca6f4131da99b47dee3c7d9cc099da8c32'],
- 'conditional-buildstep': ['1.3.5',
-                           'bb505823eef199eef3b67bff5d7826d075329ce93c64784ae72d22fff88110d9'],
- 'copyartifact': ['1.38.1',
-                  '0171f402f064615a14b0adca348c2d49ee338cd49d54539793105a191d941501'],
- 'credentials': ['2.1.13',
-                 'e793895fb727b59d83a9e395984243cfee9abdf4d56238fb6f2594948b0487e5'],
+ 'blueocean': ['1.3.5',
+               '7d27f025bb272a09b5a821337d11ede5f2570b507332330c4b020b31735fa17d'],
+ 'blueocean-autofavorite': ['1.2.1',
+                            '91863ba4b29842c667a3cd264e5cd4e922e1770523a69f8cf903e54ea3441cd7'],
+ 'blueocean-bitbucket-pipeline': ['1.3.5',
+                                  '61c4d48d08c514d42698a59999972f2b96c176d488d50d91586f719567a75f51'],
+ 'blueocean-commons': ['1.3.5',
+                       'f33b8205b077415fea2f567630593bb8b9ecd9dc0c703da074060254f3149071'],
+ 'blueocean-config': ['1.3.5',
+                      'ca10776897319be6ccb8b74dd3b2e080c39c92173f758697f4a6c6d4b775b0dc'],
+ 'blueocean-dashboard': ['1.3.5',
+                         'ef321158bc22df3ebca93d0ff3f682ed2c3aba397389fc11394e336460f77649'],
+ 'blueocean-display-url': ['2.2.0',
+                           '4392cff3f4d75c678abadb7aad040b782be7ea61c5c87bdd5e3a62fa633e10ca'],
+ 'blueocean-events': ['1.3.5',
+                      'd8925552dfc929faec946e698b1954cf803f6d1efc0f64503f27dd767e3b2816'],
+ 'blueocean-git-pipeline': ['1.3.5',
+                            'afb74b1eb244f5c590ad0b9c233cfd48a7d5309d2270e89b2e517ef969b02864'],
+ 'blueocean-github-pipeline': ['1.3.5',
+                               'c9069367ee3b0c87616a507b5f4b35baf14d553821ef68fa469d961f8a468b75'],
+ 'blueocean-i18n': ['1.3.5',
+                    '0d9d2d42f361323b335adb36e79a03d0b223ad244d0cf81a4852301e27d72e36'],
+ 'blueocean-jira': ['1.3.5',
+                    'c1e6d12c46b985d877952cd1e3658f009324ddb5f9634ac24b604a88cd2a592c'],
+ 'blueocean-jwt': ['1.3.5',
+                   'acb5ec61dbbea2151563c695974bc3f7eb286fccda4abfcf73ddcb89969e3e4a'],
+ 'blueocean-personalization': ['1.3.5',
+                               '83866a6216f6e41b4149cc7218509aef4018be5c257049529e3110a92e84ffc4'],
+ 'blueocean-pipeline-api-impl': ['1.3.5',
+                                 '31a5b75357e68f2b01bad21b7760a11e69614775263854cf4f31db9d9e4e3c55'],
+ 'blueocean-pipeline-editor': ['1.3.5',
+                               'fa1a6d10c37bddcb9527edfc7933b9d0652249c3f769d93b35ca78791f9ff415'],
+ 'blueocean-pipeline-scm-api': ['1.3.5',
+                                '0023101aa540770a4c983cd4c0e05344fc55fb9ecae4fc3f7ecc41a6e465f502'],
+ 'blueocean-rest': ['1.3.5',
+                    '33f96f833ad04feeed56446c2b0d0d35b350eab13de98d718ed6cf63e26e2126'],
+ 'blueocean-rest-impl': ['1.3.5',
+                         '35fc89cba48a2395a65d782ee2fef6b50dbf1e0c5861f04d290e89529e4d691a'],
+ 'blueocean-web': ['1.3.5',
+                   'c24e1c371e61b749f7cea9c91c4740fe1ea3491c5b2392815cab7c0c46331732'],
+ 'bouncycastle-api': ['2.16.2',
+                      '6130c9a7132dfe50bde27e256942a7a45f568817e3ad9d5d40ce95330076fad6'],
+ 'branch-api': ['2.0.17',
+                '3dae63756c728eb4a6fb9c3244123c8c3bd4939041986c3d744210dfe79d11d7'],
+ 'build-monitor-plugin': ['1.12+build.201708172343',
+                          '1b00d08120d2a7b1ac8a0c8eec83cd224a103cf8c2c7e60aa87d470690d9ee5c'],
+ 'build-timeout': ['1.19',
+                   'a92b43adb9c668e3fd0ad307db43c2277cf15ea75c084b5bdc74fb294f80583d'],
+ 'cloudbees-bitbucket-branch-source': ['2.2.8',
+                                       '8087d87c917819b0e4d8b7e076fd4abdee3c05a5022ef05717ebddcbe9daad6f'],
+ 'cloudbees-folder': ['6.3',
+                      '4f21d3dedd352fe1fb0c6adea1d39dcb190180615e5cc5aa5ffac18b47c5a71a'],
+ 'conditional-buildstep': ['1.3.6',
+                           '4b550bc136fe66bb4eb396605f4036935963327b9c94662f7c441888adb99f77'],
+ 'copyartifact': ['1.39',
+                  '5014383a87922b6c2915c6323d43685801f0272e4e311dd4584fd4ac48c1e520'],
+ 'credentials': ['2.1.16',
+                 'b151673bb77ef585900d901684a4197c3018b6baa83ddd0dac8327e42aedfef9'],
  'credentials-binding': ['1.13',
                          '92284982f52e785cf802a1a83a3cd59c61f4d76c775f653a27ba2c21204fa4a3'],
- 'display-url-api': ['2.0',
-                     '4e438996e2b262075e5c4ec0d1dd93a767456205bca735e80db633ac392fd21f'],
- 'docker-commons': ['1.8',
-                    '468211603d88a6ac07004abf606d79a87f92432e2d6b90251f442183c8053ea3'],
- 'docker-workflow': ['1.10',
-                     '72669ece071e808edbd21d18f1021c8830ba7591d7b18e63af5b67148d35bc02'],
- 'durable-task': ['1.13',
-                  'e242f459b6662b84f3ab99f51cdbdb048d7a2bb1f1a27ffafb5f0c4bd6d5735c'],
- 'email-ext': ['2.57.2',
-               'b576b6c2cd69a159699341fe07f32ac824a02c309ec175902b7eba843d4c31e4'],
+ 'display-url-api': ['2.2.0',
+                     'f9a7acb09a0c649d2cfe25ed52d6a974e664f3a00e76d9dccf24f845d20bb754'],
+ 'docker-commons': ['1.11',
+                    '4cbb7cec0ceaec1b398b2f3620bcaf1116e177802c6f3339e0b3d176547a3998'],
+ 'docker-workflow': ['1.14',
+                     'cb2304a61477f06d619df39464f0dd952074b5ac1954b993126302abc2b97457'],
+ '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.0',
-              'cefc897311ce31aa0c02b290db8b353d81683272a3f3791aa84fb9572865ab82'],
- 'ghprb': ['1.36.2',
-           'ecf7cd881136e60e48e220172bd0ddedb77c50129bc9dac271b32c715be38541'],
- 'git': ['3.5.1',
-         '1f0a26022b2b61fe25679c49a6fabeabb0cfc9452d0dc40def73709d95cc3da3'],
- 'git-client': ['2.5.0',
-                'b26f4098bb8969cdf7125b79a937c2bec8df4065785c2eaeccc66d1bc3287b0f'],
- 'git-parameter': ['0.8.0',
-                   'c7251742e90110a0c6345a47373a20f8d97e0562bf543f04e6d2e7c9313e6ef1'],
+ 'favorite': ['2.3.1',
+              'b847647271830a3cec63035dea8fffe79b91331678cd306967cbc64227d4db28'],
+ 'ghprb': ['1.39.0',
+           '0fab963ba057882deb0c3b7b2cdba487d905ad20e00707dea8e4f36dd5c7b7e3'],
+ 'git': ['3.7.0',
+         '1cb33ab6027557d54bb6fb8ee31c211bef9ff217b71166f8423ba20fa7e7137c'],
+ 'git-client': ['2.7.0',
+                'acaf526ca3101deee5219b23b17398ce3bfec72d7393e8d19214d3a8d6e2108f'],
+ 'git-parameter': ['0.9.0',
+                   '329d5dad9bd84bcf75e396a0be73cfc6cfcc9ab0ee75bb505777f32991d57574'],
  'git-server': ['1.7',
                 '1a5dc733495681a6d1a6adce07e614e50f4e5d22580e6fafbd5ca260aa4367fc'],
- 'github': ['1.27.0',
-            '11038b94997b698b6b7898dc68fcc7e28202c308ba6af927fc22c7bba8cbfef0'],
- 'github-api': ['1.86',
-                'b759e7365ca217623c1bbf068fd9401a491637afb55523a19e4f30122066ac45'],
- 'github-branch-source': ['2.2.2',
-                          '6e23c6c2b30c3e38ed1f83f8afe090ff0921f9b3c64f43f9549d2f76bd198288'],
+ 'github': ['1.28.1',
+            'b8a4327e9f9bd4b4a9e13e81e50725e2d8ed26030566c3c5eb1d7f9662fd61ff'],
+ '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'],
- 'htmlpublisher': ['1.13',
-                   'c5c3d99125110c0d8a63472f6b66b4a2481b78caadbb17632ef86a6f3a19ec4c'],
- 'icon-shim': ['2.0.3',
-               '8ab2f1617b68561a7f0254fb27578840aa9b7e158d0bd8c51628dbc64e8ab0ca'],
- 'jackson2-api': ['2.7.3',
-                  '6dfa1ba3db32ae47630b239399c3fc8d9102ff0b523a5c33dd32bc88d9874837'],
+ 'htmlpublisher': ['1.14',
+                   '08802f5f0a3915ac06432f432f2d4e5b051f1c976fd6251d7696b0f98ac02771'],
+ 'jackson2-api': ['2.8.10.1',
+                  'ea5cda3192e890500d1c09a123962cd576e2a6c8946f9f720511493b0cd7666a'],
  'javadoc': ['1.4',
              '2236e563d057a98b1bb2e56975756a008986289aa01a61c4655a31b62c760a22'],
- 'jquery': ['1.11.2-0',
-            'acf4940bd5a0d918d781b51a6f42f7a0cb9381ede8235582c629a5d347495029'],
+ 'jira': ['2.5',
+          'cee72ce7d24e0c0b7ec0404322c6ea3fe84947265de77adaa19785cd6d13832c'],
+ 'jquery': ['1.12.4-0',
+            'fdfb8c7b0370ecaf10985c8be8dd3f7f651c3bddd84c709df14c26508d2aeb1e'],
  'jquery-detached': ['1.2.1',
                      'a05273cd20c11557ffcb7dcb75150f21d35dc8be28355548b831c2960d7f11c0'],
- 'junit': ['1.20',
-           'be0c9079c1ed7e3bc9d7157e30d0e8fdd733a83cba11ab184ddb48cea1a579c3'],
- 'ldap': ['1.15',
-          '2ace1e160dab885680d0eee1b543d456fa97328c4befc911c2c531bf7697dbe6'],
+ 'jsch': ['0.1.54.1',
+          '5e979207485bd7c7c42eb2b1ff5dac4e5c10e6d717b89ab2a1052c404d6963bb'],
+ 'junit': ['1.23',
+           '2b109c49593cb051a04aa861338913a734fd797b34e71c9cd89bc8494391ee4a'],
  'mailer': ['1.20',
             'e78b7bb32957d11dcf58e57f2d7b60903bf31ace7858d19febb3b11a374a1187'],
- 'mapdb-api': ['1.0.9.0',
-               '072c11a34cf21f87f9c44bf01b430c5ea77e8096d077e8533de654ef00f3f871'],
- 'matrix-auth': ['1.5',
-                 'ac31e6736f8e6aed26064d00c6aad7f4b39bfc49d80d32be757b035d4224863b'],
- 'matrix-project': ['1.10',
-                    'dd09d0c70ed566ac61accbf5afd4b9db3cd21c8bb4372d0d302df9052c6258dd'],
- 'maven-plugin': ['2.15.1',
-                  '61aeb7d787e312702b438c75ffd752394bbcaaf2b6d212a4fc169b3f28651c6e'],
- 'metrics': ['3.1.2.9',
-             '0828fe8dbd36d7f614ddc89cd2940f4004ee49cd9dca86c48cc1fd2f4495a542'],
+ 'matrix-auth': ['2.2',
+                 '56ea5d8313f3481196d73c60367eab037005d37d2b2aa8b40ac0abeb21d7c86f'],
+ 'matrix-project': ['1.12',
+                    'bc3300877704d41d42813d6cef18ea017dcb4be5e8faae45a7da4ce6c9b540e1'],
+ 'maven-plugin': ['3.0',
+                  '0bac73f24735632d1635121cd41f58714d1f7baccd6bc3b6a93359af36ecac0d'],
+ 'mercurial': ['2.2',
+               '7b22e37164107e4dca7b2970a14cf8a1a2d7e7be7ebee29868ed0f617e4b7931'],
  'momentjs': ['1.1.1',
               'ca3c2d264cff55f71e900dc7de1f13c0bfbffdb9b3419b854dce175bcb8a4848'],
  'nodelabelparameter': ['1.7.2',
                         '0f556ae48573db6bae28b24eae561121ed9931e8b1bc31ac4e586bc8d3238edf'],
- 'pam-auth': ['1.3',
-              '1b1d32dca618f43f6c06786f3fde6cc0e0fa0c805cbb735fafd464cf2cfcf1e3'],
- 'parameterized-trigger': ['2.35',
-                           '5193a8e8bfc20fa2147210913874fa58c81ad0bc688df1ecf3fefe65303e727c'],
- 'pipeline-build-step': ['2.5.1',
-                         'a8ce93220bcd66b982757c2698504e9be2a0ec5445a3d27cc235d82de643f5c1'],
- 'pipeline-graph-analysis': ['1.3',
-                             'bb3235a0b5a62cd7be3983bfd40a202c582757c9633d23858aaa38af88ee61ea'],
+ 'parameterized-trigger': ['2.35.2',
+                           '36228ae6c41cf828cf472deabaeff50f8b4e9b69e742deab38d4a9b9a093fd97'],
+ 'pipeline-build-step': ['2.6',
+                         '9972fa5a5328133c9c99cd730846de91308132a1dcf58f26c7d6df69e030391a'],
+ 'pipeline-graph-analysis': ['1.6',
+                             'a20cedaa0b847f31cf88b51ee490c49eea8aa1052511b12d5af2a140af45e7e3'],
  'pipeline-input-step': ['2.8',
                          '8e9fa1654ec0c0ec726c894b079828737b8ce6d9ea3d05cd4378c37acc3235db'],
- 'pipeline-model-api': ['1.1.4',
-                        '6b3ac82391981a5a6068819508bbd127e7acc0b9f68ef75c4641d488b1df57df'],
+ 'pipeline-milestone-step': ['1.3.1',
+                             'd3a26629b656821c60a14fe403ab8afc50f084e338406dbc27e2b6b403f7cb20'],
+ 'pipeline-model-api': ['1.2.5',
+                        '50b8bc760b46e8b79c3938370d6d8677b6a98cfae23cd6220b2cddcc6cd3132d'],
  'pipeline-model-declarative-agent': ['1.1.1',
                                       'd5540c3973bf5f568910f93b3a002c413148b9d3dd4211ce5faf4a2a1214d4ef'],
- 'pipeline-model-definition': ['1.1.4',
-                               'ce98022ed5580b7fbd35adc57ee10d36b0ab79a43aa0f635d8907e008863ee48'],
- 'pipeline-model-extensions': ['1.1.4',
-                               'ca6edd0013553de18031c7c5daf20cee5723ca8d4719121223707742d1c2c713'],
- 'pipeline-rest-api': ['2.6',
-                       '4ecc8c111f86902a86860943390e1b98463437a33116df4feb888226daf42aaa'],
- 'pipeline-stage-step': ['2.2',
-                         '08f077bc8cd98fbf6cb7383d8bcfe3db69796f89cedcfb6f13c8c9375b2a11c8'],
- 'pipeline-stage-tags-metadata': ['1.1.4',
-                                  '5420089bf9984412c47824ea98d69400c5f9bf7794651b200d7f82bec97e2b55'],
- 'pipeline-stage-view': ['2.6',
-                         'e4b82a523fe8151a117c150073c8a0cad65277651ed6565150b6b058111d4c98'],
+ 'pipeline-model-definition': ['1.2.5',
+                               '74b69c7697956acf5d69d478c7920aeb25661517ecbf747a5ae5607630d12a84'],
+ 'pipeline-model-extensions': ['1.2.5',
+                               '5aff0b3b930421b80b1ef1870a6a722feec776424ce78568bfbfc0350f1c398c'],
+ 'pipeline-rest-api': ['2.9',
+                       '38d9f5dd0750a3ce3113ff3eeed32864ed4e0655ec5e3a5556f529d8c3cf86a8'],
+ 'pipeline-stage-step': ['2.3',
+                         'f6caab90742664289b0cb57b27755c3b8b963c3764894129fb954efbf796d310'],
+ 'pipeline-stage-tags-metadata': ['1.2.5',
+                                  '719ad659f61ac0593d2ff1455eded5222831469350b835cc475b5f212b379c00'],
+ 'pipeline-stage-view': ['2.9',
+                         '52879f4fc756bbe95c5ef9802ef9da15c4938833555046b23c9fc78c914b6525'],
  'plain-credentials': ['1.4',
                        '4f1834f99ffd7f2a7db1972fe46ee42d06af819b27297193ac89eb33a14292d8'],
- 'pubsub-light': ['1.8',
-                  '08de8779e50f731cb1b62be27ebe30d93a358ec54e22852a1c639419f7e16dd3'],
+ 'pubsub-light': ['1.12',
+                  '666cbc579d82849bef8d0396a57335c9994222e8b0ba52f07be76dab9fb56c40'],
  'run-condition': ['1.0',
                    '4e55ebf4bde1202784404d856f98f7de85470ed145cde06feb45f641891780fb'],
- 'sauce-ondemand': ['1.164',
-                    '48649855b80bc30dad03ced7a4ba76ef3aa5daa939f0521720e5aec5b5d1d949'],
- 'scm-api': ['2.2.0',
-             '31f60f8ab713237a03e6357c97fe0e6f0bb493d274573751fc5483b489392670'],
- 'scoring-load-balancer': ['1.0.1',
-                           'a7229d2945e347afb472d3c45e83ea3c4409c8710c4168912601eb46684dd3a3'],
- 'script-security': ['1.31',
-                     'fbd2f2fc8f7cb7fda738eef74eb9c732e79bb75a72561b5f8031f116a90ff2c7'],
+ 'sauce-ondemand': ['1.171',
+                    '5a7a1e1eccb199d82227e41e9bce655d33b2e33219f40a9cd0c884780cc26ae8'],
+ 'scm-api': ['2.2.6',
+             'be7cb7c513ebeb361a8ccb5c636541313c1c54b3119566b969fe10a3552cca14'],
+ 'script-security': ['1.39',
+                     '45f488c4635bb8d621e44ebe71d86a4533d6830c600e64338838332ea8a09f6a'],
  'sse-gateway': ['1.15',
                  '56b19b7a48f646dc8269bae4aca41ec11f71756d618d302b1f8b9d688441850f'],
  'ssh-agent': ['1.15',
                'd1c955b883a3e82522a1b97ff044812193bc325c5eb095e23ba8673c2b16e181'],
  'ssh-credentials': ['1.13',
                      'd4f979223cc543dfd9bf72a1177471bb08748d2c79e1115d7bb12198bbbf2010'],
- 'ssh-slaves': ['1.17',
-                '5120c316190a160c85e6c77f97529f93a5a602658eeb18a4d527cf89a9d838df'],
- 'structs': ['1.9',
-             'f8f8afdc02ecc4464d2efd82426c2983ad73d1322a7a64575734a7a8f5f572b9'],
- 'subversion': ['2.9',
-                '509d42da6a1011bd83a0dd0562894ec08ff6e9a11220574be3ca662579801e9a'],
+ 'structs': ['1.10',
+             '090f15f4535eaa1e4789f4acf854478386393432bc0c85558809f0173851a403'],
  'test-results-analyzer': ['0.3.4',
                            'b3aa8c11d59a5c1ac007f86a054a259766bc64ee0ad91be0c2dd1981bce3c6f8'],
- 'token-macro': ['2.1',
-                 'a7e4a70beefb64aa715ba8679cd0a2d41eec0446e65d6d89311a92b63edfed2d'],
- 'translation': ['1.15',
-                 '11a0dd4aaa66d506d1bfc32d367e9c1f28b957296b5729ae9bf0947f5f1301ce'],
+ 'token-macro': ['2.3',
+                 'c3da743e97e958dcbe7f9a41c64ee693c3174824be7faf2ad4625d3dcc7d17f8'],
  'variant': ['1.1',
              '971893fb05da213631b8ea977a32a5d4953f1cb7ab6fbdec9020d503550275ff'],
  'windows-slaves': ['1.3.1',
                     '4364f88286745a48962b86b53df3739a6978886e72ec83289a3cfc750f1adcc6'],
- 'workflow-api': ['2.18',
-                  'c272bb4030edd79febac8f1b89e18bbfc0c2c3b5ef23ddb911bb070c92cabcc8'],
- 'workflow-basic-steps': ['2.4',
-                          'c57d5308a01df1990a7f491ddb6dfc7aab5b7b713ad9cfc458cbef76d27fdbab'],
- 'workflow-cps': ['2.39',
-                  '2fe72eb2b644ffd269a449b44d7b7de4a07ea099cef970c58a6be0056336a85b'],
- 'workflow-cps-global-lib': ['2.8',
-                             '0f09eb5ea402141769d8d923519101d51baaa0e187ecdd3efe275483e4b0ca79'],
- 'workflow-durable-task-step': ['2.11',
-                                '8783a0717d4ab67aaecde4b6c12c77a90784a2f604b75e1ac98506b407c3c5c8'],
- 'workflow-job': ['2.10',
-                  'fd5d5a68270fae99a4514eac6cc2b58ebc37673f5e535f778286a4d36d94405a'],
- 'workflow-multibranch': ['2.14',
-                          '823986f18fc02508d9edae9c9876d0fa08e0b4f4b785707e224eab01bda9f018'],
- 'workflow-scm-step': ['2.4',
-                       '69d58ceb58111663e82928c8db367ba8e857c29aaee9c4264aeb4100fc459e22'],
- 'workflow-step-api': ['2.10',
-                       'ebc6d6555805848bdfd20636fec9a57384f74ece082608dae70e303b4f45e762'],
- 'workflow-support': ['2.14',
-                      '49bf65953ad684e5d4f0f0750dce6f5efed9e67f5d0de26da405945bbd46f01d']}
+ 'workflow-api': ['2.24',
+                  '7478c854502dff163a4e8d0ffc908dadf955c9fa4c7f05be574d5bb635f95a11'],
+ 'workflow-basic-steps': ['2.6',
+                          'ba6bc7f586b902ba6aacae571a8ae78916e7f3e106d8a7da14c348ea933f0016'],
+ 'workflow-cps': ['2.42',
+                  'bc429851596a4975df4b7534600d604c40d76eea84007e177d5f69514331b1dd'],
+ 'workflow-cps-global-lib': ['2.9',
+                             'b5a141c4896be15e09d76fc5b60df3fe701e94d2c2d2015a99ca5147a78b09d1'],
+ 'workflow-durable-task-step': ['2.17',
+                                '1b2dc8bc29c94c4f1dbce1451e727fb5e929ff41ae9a8fc77972b5fea1b9698e'],
+ 'workflow-job': ['2.16',
+                  '86f34b5d505b58922090e06d865d7c36d963dfaea68dfe4e64a82fd20d295f5a'],
+ 'workflow-multibranch': ['2.16',
+                          'c9da6f3085fcde2db4649658779b3230f6356e74a043ab28dc578ef24c756e57'],
+ 'workflow-scm-step': ['2.6',
+                       'a382864adaf0fc80d58243568157a1450028e6d0503a03b81111d4c4de8275d0'],
+ 'workflow-step-api': ['2.14',
+                       '4a0c25d4bb9f985a786774f14c1bdaa02853173e18ad40d49dd13d4c7c8f420e'],
+ 'workflow-support': ['2.16',
+                      '8ae9a3aa7ace6cb11c9b03abf04b4808d1f349efedfef6e1a88c154255929224']}
diff --git a/jenkins/base/update_plugins.py b/jenkins/base/update_plugins.py
new file mode 100644
index 0000000..56db5a8
--- /dev/null
+++ b/jenkins/base/update_plugins.py
@@ -0,0 +1,112 @@
+#!/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:])