Add alternative plugin update

13 April some new plugins were released leading old jenkins to be
inoperable. Adding semi-pin mechanism will allow us to handle it.

PROD-36857

Change-Id: Ic3d38cb9f86e16c316fb221e8a9d770dc1f5f400
(cherry picked from commit 22b44555bff43bec97ed797f236590ed3875fc06)
diff --git a/README.rst b/README.rst
index 42bcbeb..96e6b1e 100644
--- a/README.rst
+++ b/README.rst
@@ -465,6 +465,29 @@
             enabled: false
           plugin5: absent
 
+Alternative plugin management using version pins (baseline plugin management could not work with some
+modern version labels like "1.12+build.201809061734").
+
+.. code-block:: yaml
+
+    jenkins:
+      client:
+        plugin:
+          alt_update:
+            enabled: True
+            base_url: https://archives.jenkins-ci.org/plugins/
+            jenkins_home_volume_dir: /srv/volumes/jenkins/
+            plugins:
+              ace-editor:
+                source_hash: abc97028893c8a71581a5f559ea48e8e1f1a65164faee96dabfed9e95e9abad2
+                version: '1.1'
+              ant:
+                source_hash: f04961a8a42f1e2ccdf5001d33ae93fdc2b3a5af96f13bddc1d721f1d11a8b4b
+                version: '1.8'
+              apache-httpcomponents-client-4-api:
+                enabled: False
+
+
 Adding plugin params to job:
 
 .. code-block:: yaml
diff --git a/_modules/jenkins_common.py b/_modules/jenkins_common.py
index 64cede6..422be23 100644
--- a/_modules/jenkins_common.py
+++ b/_modules/jenkins_common.py
@@ -194,3 +194,41 @@
     ret['result'] = None if test else result
     return ret
 
+
+def jenkins_do_safe_restart(**kwargs):
+    """
+    Execute safe restart using jenkins groovy call
+
+    :returns: salt-specified state dict
+    """
+    restart_cmd_groovy = "Jenkins.instance.doSafeRestart()"
+    test = __opts__['test']  # noqa
+    module_name = 'jenkins_do_safe_restart'
+    ret = {
+        'name': module_name,
+        'changes': {},
+        'result': False,
+        'comment': '',
+    }
+    result = False
+    if test:
+        status = "SUCCESS"
+        ret['changes'][module_name] = status
+        ret['comment'] = 'Jenkins safe restart initiated (test mode)'
+        ret['result'] = None
+        return ret
+
+    call_result = __salt__['jenkins_common.call_groovy_script'](restart_cmd_groovy, [])
+    if call_result["code"] == 200:
+        status = call_result["msg"]
+        ret['changes'][module_name] = status
+        ret['comment'] = 'Jenkins safe restart initiated'
+        ret['result'] = True
+    else:
+        status = 'FAILED'
+        ret['changes'][module_name] = status
+        ret['comment'] = "Failed to initiate jenkins restart: {}".format(call_result["msg"])
+        logger.error("Failed to initiate jenkins restart: {}".format(call_result["msg"]))
+
+    return ret
+
diff --git a/jenkins/client/plugin.sls b/jenkins/client/plugin.sls
index c2da622..dd11c7c 100644
--- a/jenkins/client/plugin.sls
+++ b/jenkins/client/plugin.sls
@@ -1,11 +1,45 @@
 {% from "jenkins/map.jinja" import client with context %}
+{% from "jenkins/map.jinja" import jenkins_offline_deployment with context %}
 {%- if client.plugin is defined %}
+
+{%- set alt_update_manager_enabled = client.plugin.get("alt_update",{}).get('enabled', False) %}
+
+{%- if jenkins_offline_deployment == True or not alt_update_manager_enabled %}
+
 jenkins_plugins:
   jenkins_plugin.managed:
   - plugins: {{ client.plugin }}
   - remove_unwanted: {{ client.get('plugin_remove_unwanted', False) }}
   - force_remove: {{ client.get('plugin_force_remove', False) }}
 
+{%- else %}
+
+{%- for plugin_name, plugin_params in client.plugin.get('alt_update',{}).get('plugins',{}).iteritems() %}
+
+{%- if plugin_params.get('enabled', True) %}
+jenkins_plugin_{{ plugin_name }}_pin_install:
+  file.managed:
+    - source: {{ client.plugin.alt_update.base_url }}/{{ plugin_name }}/{{ plugin_params.get('version', 'latest') }}/{{ plugin_name }}.hpi
+    - name: {{ client.plugin.alt_update.jenkins_home_volume_dir }}/plugins/{{ plugin_name }}.jpi
+    - user: 1000
+    - group: 1000
+    - replace: True
+    - source_hash: {{ plugin_params.source_hash }}
+{%- else %}
+jenkins_plugin_{{ plugin_name }}_pin_uninstall:
+  file.absent:
+    - name: {{ client.plugin.alt_update.jenkins_home_volume_dir }}/plugins/{{ plugin_name }}.jpi
+{%- endif %}
+
+{%- endfor %}
+
+jenkins_plugin_call_safe_restart:
+  module.run:
+  - name: jenkins_common.jenkins_do_safe_restart
+
+{%- endif %}
+
+
 jenkins_wait_functional:
   cmd.script:
   - source: salt://jenkins/files/wait4jenkins.sh
@@ -15,5 +49,9 @@
     - WAIT_TIME: "300"
     - INTERVAL: "5"
   - require:
+  {%- if alt_update_manager_enabled %}
+    - jenkins_plugin_call_safe_restart
+  {%- else %}
     - jenkins_plugins
+  {%- endif %}
 {%- endif %}
diff --git a/jenkins/map.jinja b/jenkins/map.jinja
index 3a33f07..6cba6a4 100644
--- a/jenkins/map.jinja
+++ b/jenkins/map.jinja
@@ -83,3 +83,5 @@
         }
     },
 }, merge=pillar.jenkins.get('client', {})) %}
+
+{% set jenkins_offline_deployment = pillar.get('_param', {}).get('jenkins_offline_deployment', False) %}
diff --git a/metadata/service/client.yml b/metadata/service/client.yml
index 822a025..9e31c7c 100644
--- a/metadata/service/client.yml
+++ b/metadata/service/client.yml
@@ -4,3 +4,465 @@
   jenkins:
     client:
       enabled: true
+      plugin:
+        alt_update:
+          enabled: true
+          base_url: https://archives.jenkins-ci.org/plugins/
+          jenkins_home_volume_dir: /srv/volumes/jenkins/
+          plugins:
+            ace-editor:
+              source_hash: abc97028893c8a71581a5f559ea48e8e1f1a65164faee96dabfed9e95e9abad2
+              version: '1.1'
+            ant:
+              source_hash: f04961a8a42f1e2ccdf5001d33ae93fdc2b3a5af96f13bddc1d721f1d11a8b4b
+              version: '1.8'
+            antisamy-markup-formatter:
+              source_hash: 8e8e3e917d76b0432ab3c32a000e824f4ef32011ba5e77dd8b6b476310df8f1a
+              version: '1.5'
+            apache-httpcomponents-client-4-api:
+              source_hash: 1fa5adafcd043c582a9b6ec44a6a37166db77bb6d5b7d2c4f9902ad263a65636
+              version: 4.5.13-1.0
+            artifactory:
+              source_hash: 3d89362b653073969ebc051e2bc0e6899a193a201e31fa110cb2ab253ca2a4ac
+              version: 3.15.4
+            audit-trail:
+              source_hash: 0d9ab920ae4637c2a1abdc7e816b47b718391cdc9c6e5f311caf5bdc4e73aeff
+              version: '3.8'
+            authentication-tokens:
+              source_hash: f05736bc7da0df3bba5ceb4d893089706812ced3134adb2edc9ae341467f1ae3
+              version: '1.3'
+            blueocean:
+              source_hash: 406b7a3e38956aecec3b4780b8413cc6dfd724abd74750d07aefbc5281fe8f26
+              version: 1.24.8
+            blueocean-autofavorite:
+              source_hash: 274679e99b23b03dc4203df76b34966cc317fbb6cb46149eeec88770c6999146
+              version: 1.2.5
+            blueocean-bitbucket-pipeline:
+              source_hash: 4583996cf6951be5261f96c3f90dd93f7c9ed28d8f5a92a21ab31fca211e7b5b
+              version: 1.24.8
+            blueocean-commons:
+              source_hash: 6637636a19e85e2d6c9c0150a02dfcbb88fb1f975ffb28ee68ba6994de014944
+              version: 1.24.8
+            blueocean-config:
+              source_hash: 61994738b9436664966ce790562dab9285acad72c2f380162f813f84eacf06ee
+              version: 1.24.8
+            blueocean-core-js:
+              source_hash: 92d4fef4ef4f42dd303d08547997384798e76f058afc45c46a15768914c80914
+              version: 1.24.8
+            blueocean-dashboard:
+              source_hash: 9a62639272634a4444403f45f6fcb406e51ad4c09f752cbb82e809e354a2aa7f
+              version: 1.24.8
+            blueocean-display-url:
+              source_hash: f4179b8221e6c330317bd8a037d4074a03361290687a25c162335ee82710b303
+              version: 2.4.1
+            blueocean-events:
+              source_hash: 43bd236b0a9963e1fc3ff34a4d24c8e2eb83b9c2771ac9744721ea567c7c629b
+              version: 1.24.8
+            blueocean-git-pipeline:
+              source_hash: 8792cf273933c80e95021961c3f73fd3ada7ced7a66c600055b2c531d2797122
+              version: 1.24.8
+            blueocean-github-pipeline:
+              source_hash: 103907cdb206d16b0fdb789b5ceeaa4724fa26d53b39f6890f8cb252f313ee29
+              version: 1.24.8
+            blueocean-i18n:
+              source_hash: 4b1d40944c6098268a3a3e6f724f573aafb09a1dd9441f50ff8787b0e2751086
+              version: 1.24.8
+            blueocean-jira:
+              source_hash: bcf7caed265f258d0f341892c2a6e1b94b6837b995de1ffbbdee3c2eca5ad309
+              version: 1.24.8
+            blueocean-jwt:
+              source_hash: fc678f8406ca46075232aba9da353ac5c4f4f62ec449a763b8b31c0368eb3315
+              version: 1.24.8
+            blueocean-personalization:
+              source_hash: aa26e2a0f53927c7e6ba35e95de4b88c8d2c40b930337158c9d6a64868060858
+              version: 1.24.8
+            blueocean-pipeline-api-impl:
+              source_hash: d92bab4d4ea8508a37cb8dd955bd56007192502976a682880151219e31658283
+              version: 1.24.8
+            blueocean-pipeline-editor:
+              source_hash: c1cc5b99be80fde7bfdc3c7c09d6e7de8748b84bfd1e2a23b8b409edd4a600c5
+              version: 1.24.8
+            blueocean-pipeline-scm-api:
+              source_hash: a6c1cdeb1d57c261ba75d6a3e83020d71084863ed98f6cec1dd0c012129c44c3
+              version: 1.24.8
+            blueocean-rest:
+              source_hash: 10c13594eb283259ced63101eda0caa99821801851ec87c62a62b4d04e4627ca
+              version: 1.24.8
+            blueocean-rest-impl:
+              source_hash: 7ca1446798e500b2f363e8dac326db37ceee477024553a7b7f7243c53c65606e
+              version: 1.24.8
+            blueocean-web:
+              source_hash: c7e8cd7f609115ef70ce05eba998ad24ec4a5bba034237ee655869341252343c
+              version: 1.24.8
+            bootstrap4-api:
+              source_hash: 5ed055fc291662a02a01d3763aef9de5f3f0fb86ebe946e939a5dc27a87bd513
+              version: 4.6.0-3
+            bootstrap5-api:
+              source_hash: b7cb160844d959c2f4ef4bb938bae45366fd7bb9ade0675989f4da3aa7def3cb
+              version: 5.1.1-1
+            bouncycastle-api:
+              source_hash: bf71f88eda34bd304ded9ac374bbcdaeb0dccb8618dd94bdfa2af486d7971f21
+              version: '2.17'
+            branch-api:
+              source_hash: f018c684cd93d362e14136a6d4f5c1dfa699dd7bc71fdc620c94edd73159675d
+              version: 2.6.2
+            build-blocker-plugin:
+              source_hash: 2d9947ab2b4eb99dadaeb172f543008a1c39c54f9f13563422f02f10dbdaf1d9
+              version: 1.7.3
+            build-monitor-plugin:
+              source_hash: 6ac31c808e7e8ccd26faccc17987fdff36253c5b06b712510d8d5e63f80abd7a
+              version: 1.12+build.201809061734
+            build-timeout:
+              source_hash: a92b43adb9c668e3fd0ad307db43c2277cf15ea75c084b5bdc74fb294f80583d
+              version: '1.19'
+            build-user-vars-plugin:
+              source_hash: d4cb821c1767a5fa80933dd679793af67539fc72a8be80806080dfd102094932
+              version: '1.5'
+            caffeine-api:
+              source_hash: f505f5d151faf606f1e5633f741abff86229e88e09bed3dba63a9453698be68a
+              version: 2.9.2-29.v717aac953ff3
+            categorized-view:
+              source_hash: d23d6618df9f4c3442c35baa62467546f535e49c277566461cfff2bfe7bcb2fa
+              version: '1.10'
+            checks-api:
+              source_hash: effbec009c054395fd6052edea58887a16f3c4f96fbb86a14933fa9bcc9a8d0b
+              version: 1.7.2
+            cloudbees-bitbucket-branch-source:
+              source_hash: 585f5378a2a3bbfa745ef6d69e655bb4b0082229e62dcb440cb3932bdb092640
+              version: 726.vb0c1ea6c9336
+            cloudbees-folder:
+              source_hash: 63acd32d95df62dd040f53e8bab4086699cd581f4701699aeff795473415c9fe
+              version: 6.688.vfc7a_a_69059e0
+            command-launcher:
+              source_hash: c4f964c6deb599816f6740ef674cb6dd2644d5f1b4e7b886a948f778ec5c189e
+              version: '1.2'
+            config-file-provider:
+              source_hash: 7fad7e046f3a0de7d0fb289165e7234384400a52bf37a061135de28ac0f24364
+              version: 3.8.0
+            copyartifact:
+              source_hash: e59163cf42abd8c308c10f14c6e3611afe293ab54e6576cb6f6b25bba7380cdd
+              version: 1.46.2
+            credentials:
+              source_hash: 6baec982cc0419218c0e523ab8e28dcc80c50c09ed84cc1afabf075567ab8d28
+              version: 2.6.1
+            credentials-binding:
+              source_hash: d9abd18c6bdcf4ad4ba6553e10dd71fa13d2846729517a9244a94707fb580231
+              version: 1.27.1
+            description-setter:
+              source_hash: 5e7446ef3e8654216e0356958266c02385a7bf247fdb0709878067847ae30168
+              version: '1.10'
+            discard-old-build:
+              source_hash: 6f677030e6b8b9bc1e8ad9d4de7c72c4a39db15e853b7e86b9d0a37749ca8e82
+              version: '1.05'
+            display-url-api:
+              source_hash: 4a418820b9faa7f01cfa990b75ddc67f090809d3f9bd8b95707cd7840eb45209
+              version: 2.3.5
+            docker-commons:
+              source_hash: 33039e977d93adf6f57a8938d2b9d3725464f7dedcf248feb754434d4fa0104a
+              version: '1.13'
+            docker-workflow:
+              source_hash: 2e661e881dbf700cae09bf97514e9ad13853e0acbbdd366c14b1584e288f5f04
+              version: '1.17'
+            durable-task:
+              source_hash: 18d3d8b2535427968e4af94379802bb7e6a59ebfce432794e47bd2ac98c23346
+              version: '1.37'
+            echarts-api:
+              source_hash: fc8af480b2cfdd461ea9402200a07ba7efddcb1ba28ae30279806b2c61efe256
+              version: 5.2.1-2
+            email-ext:
+              source_hash: ce1d6004b5d9f84af7f5d658fe31e1241296dd1969cfbf7223d3ec77c932215a
+              version: '2.84'
+            envinject:
+              source_hash: 161010a696fbe1d74a5e2f846794d79e094fae17e8cfa5ffc78810b822cfbc6e
+              version: 2.3.0
+            envinject-api:
+              source_hash: 1e754499945fd4d76e8dba6490f894c3ecafc4834daa1b2b3ae4b7e80124635f
+              version: '1.8'
+            extended-choice-parameter:
+              source_hash: 6854b430db8b3b48dd89975214a4b8d449e70746ed176cfda4a82c66a0c3ba64
+              version: '0.76'
+            extensible-choice-parameter:
+              source_hash: 1c46bcbb0022889cb95aea9a5b017eeb7496fdfb689c40adf88be2c01dfaa42a
+              version: 1.6.0
+            external-monitor-job:
+              source_hash: fb10e5a8bb82c04b707aa44df30a97ba8285761f8247122486d87ce0b5fb3d8b
+              version: '1.4'
+            favorite:
+              source_hash: d51563ddf4541e20fb568a81d2b64632b940eaa0338d01e41c8ff51fec35c1b3
+              version: 2.3.2
+            font-awesome-api:
+              source_hash: f4a2dad824756bda645818b8d4d9fa0722c0903e55d238e2322a6f676f6b7fff
+              version: 5.15.4-1
+            gerrit-trigger:
+              source_hash: 75451831af12f866a810d5f8493a436b075f0883174e6a4de5f19aa985a9cb3e
+              version: 2.35.2
+            git:
+              source_hash: 89b8f162ad2bd977229cf7553df108248ccb7ed2b83df0d3bb0dc9460898d49e
+              version: 4.8.3
+            git-client:
+              source_hash: 2e721684fa82cddbc2488cd11ad45ef24ca63ad06c571466da9e619afc2ee986
+              version: 3.9.0
+            git-server:
+              source_hash: aea06b730b6a55ed4f29ab5f912152ec070314b5cd70ac78eb6ad0dc05833de9
+              version: '1.9'
+            github:
+              source_hash: 555fbde2a2726540bbb3e10dba1695d15de1a3c5ad0ad159e37cb5094077af20
+              version: 1.34.2
+            github-api:
+              source_hash: 7aaeb031751e359ea392d2690d5b3d27cd1351cdc032d740cfdcc3b085f5f926
+              version: 1.301-378.v9807bd746da5
+            github-branch-source:
+              source_hash: 432580f60a472390fb89f345993da0a1819f9a838630b0ef595cdf84fb116ee2
+              version: 2.9.9
+            gradle:
+              source_hash: f7c904f935e9bbf56d7975a2648d7cd8f443a99ca9509d76adf1b57896cb7015
+              version: '1.29'
+            handlebars:
+              source_hash: bc5cc7b3eca17ba6cec0a8def94f3aa78ad7a19387a19aa3a56f857a18966afa
+              version: 1.1.1
+            handy-uri-templates-2-api:
+              source_hash: cd678d9809f695c7c40af1e8ee0a5e73efca07e2a3227fe60db1c3fb6d1d6fe8
+              version: 2.1.8-1.0
+            heavy-job:
+              source_hash: 92314994153c2371bf2f9a0ffcb087158ad571057372ece67ea5e6e9605849c4
+              version: '1.1'
+            htmlpublisher:
+              source_hash: 6b973b9aacd1642ebf6ef53fb677ffca94ce576d13970eb26aad55da07a0d327
+              version: '1.25'
+            ivy:
+              source_hash: 30c88dbdcc7907a2dd9168640a78552fb04b0251fd6a1ecaebdf3d7f8135c13b
+              version: '2.1'
+            jackson2-api:
+              source_hash: 7b8aac0bad8a857653f8137711548428d38c45a2bb3541931e77980d4d402e93
+              version: 2.13.1-246.va8a9f3eaf46a
+            javadoc:
+              source_hash: a5f2321aed9ec068781962114413f305665dfbcc89ba13bee9b797551de6bbc9
+              version: '1.6'
+            jdk-tool:
+              source_hash: 87ffa354eb3c3eba1185d6086abdd32d60e22fabdd98dfb52cbeba7b1a1a3d4c
+              version: '1.1'
+            jenkins-design-language:
+              source_hash: 0bedbc3001c3e4538f5fc7df60dc190d4dee9176150ea891f16a2928e2f99f2f
+              version: 1.24.8
+            jira:
+              source_hash: 2fadcbe90f193ce62c7c75334ed8f6f68950ece8b41e90929e26486aacffd796
+              version: '3.3'
+            jjwt-api:
+              source_hash: b051f96e04239821191c3144cd17a52701d10433cb742851cd329b5140253fd3
+              version: 0.11.2-9.c8b45b8bb173
+            jobConfigHistory:
+              source_hash: 0a2237112f35a1d34bd460a1e7e1678ad0647e930a3e0b82998a4f78ceb21ba4
+              version: 2.18.2
+            jquery:
+              source_hash: fdfb8c7b0370ecaf10985c8be8dd3f7f651c3bddd84c709df14c26508d2aeb1e
+              version: 1.12.4-0
+            jquery-detached:
+              source_hash: a05273cd20c11557ffcb7dcb75150f21d35dc8be28355548b831c2960d7f11c0
+              version: 1.2.1
+            jquery3-api:
+              source_hash: 09b75305611160148c572f76953a020278d64960768cb76f5e435a665170de4e
+              version: 3.6.0-2
+            jsch:
+              source_hash: cdc74bf8e43eb40ae6ad98ba2f866c8891408038699da9b836518a1d8923fc44
+              version: 0.1.55.2
+            junit:
+              source_hash: d57138eead1432a04bb89a90fad29e3cc7675144c8ac3989597d7abe84e970c5
+              version: '1.53'
+            ldap:
+              source_hash: 19b6e782be2731eba4922de991bde52e0d0623c6743b1f39a395682b4bc1c0ef
+              version: '1.20'
+            lockable-resources:
+              source_hash: d3aa322beddd3ba007d186f57283719e107355e37748dea440123188e2113c2e
+              version: '2.14'
+            mailer:
+              source_hash: f91e1adef97bd08960f8e8a775920e98989bc778e6c0f1f9d5ed5561063e25f9
+              version: 1.34.2
+            matrix-auth:
+              source_hash: 0e2a9c6258fff7e4965cb5b30e8d1ae66f41916192f4adb4f79aa0b12ad07be5
+              version: 2.6.6
+            matrix-project:
+              source_hash: d84c0f2dcb7d6e4259c82607f663b4f3ec76c8f7c833eafa6abc71fe46c185c9
+              version: 1.18.1
+            maven-plugin:
+              source_hash: 0e832156b1bd28b0e8f2679d27678818d914846ff413fc173973da8ac435f760
+              version: 3.8.1
+            mercurial:
+              source_hash: 1521b8c68a8fb3a94f266fe3506b929deea8dfea2ecc8c8ea42d68bc591ee3b9
+              version: '2.14'
+            metrics:
+              source_hash: b60b49ab946cd8b960f999876b7da880fadf9ca07dd9524f9f0af63a5d0342eb
+              version: 4.0.2.2
+            momentjs:
+              source_hash: ca3c2d264cff55f71e900dc7de1f13c0bfbffdb9b3419b854dce175bcb8a4848
+              version: 1.1.1
+            monitoring:
+              source_hash: a891afa36be4558d2fa2653bb58a20ccb4414090022f4cd848f3328597f7ef60
+              version: 1.87.0
+            multiple-scms:
+              source_hash: 9c404682d51654c2a70134c8567c1d0b6abe3b8d5f926d6e6cd974afa04fb2ca
+              version: '0.6'
+            okhttp-api:
+              source_hash: 6b5cf02b0faa6df2f9615bd249f472283326886d3cbe824f11933d17eb5e1809
+              version: 4.9.3-105.vb96869f8ac3a
+            pam-auth:
+              source_hash: ab3a13f094bf379f9e3fbf98bf49bfe677b2548ac5874483022d69cd9571c746
+              version: 1.5.1
+            performance:
+              source_hash: dc203b7cfff3f07a254d97a3c9e9992b17a592a02057f7244551b5302a57ee4b
+              version: '3.12'
+            permissive-script-security:
+              source_hash: 828f000f7048f6bd5de72a0a4e1b15ec79f383969aa362ff0fe83606e0395eea
+              version: '0.3'
+            pipeline-build-step:
+              source_hash: dac99bde913279d7cb8a1c33c947549023f8dd9af99844b441cce2fb2da33cb4
+              version: '2.16'
+            pipeline-graph-analysis:
+              source_hash: 2a8965fabd0563832df74fe8a403d91a8828acafd4d972722e71fcce9abf64ce
+              version: '1.11'
+            pipeline-input-step:
+              source_hash: e35f3324e38bfc853cb196b1c1cd0e10b6059f464876b96db2edb75960bda82f
+              version: 427.va6441fa17010
+            pipeline-milestone-step:
+              source_hash: d3a26629b656821c60a14fe403ab8afc50f084e338406dbc27e2b6b403f7cb20
+              version: 1.3.1
+            pipeline-model-api:
+              source_hash: 10bc0c6d33ce721bf236b3c6ec04d7e0a66d9e86ec6aeb543fcbea9d262a9cf3
+              version: 1.9.3
+            pipeline-model-declarative-agent:
+              source_hash: d5540c3973bf5f568910f93b3a002c413148b9d3dd4211ce5faf4a2a1214d4ef
+              version: 1.1.1
+            pipeline-model-definition:
+              source_hash: 0b14a247d4e8a9d3a41e74acc5a127eb4aa4d28a048e262da5c2a6ef76b0010e
+              version: 1.9.3
+            pipeline-model-extensions:
+              source_hash: b6a4d28b1fc752e9554affa6e13028b8bce96809c77bd182407f00b2b1c18375
+              version: 1.9.3
+            pipeline-rest-api:
+              source_hash: 39ff14bddd40519100c7ba4b31b5c5aa067561ed5b4f857118f0ec915c17e8d4
+              version: '2.10'
+            pipeline-stage-step:
+              source_hash: 04fcd62490bb50c51609f62bc6f47a343f72369e28f6b10b6720caaf564656be
+              version: 291.vf0a8a7aeeb50
+            pipeline-stage-tags-metadata:
+              source_hash: e63b26ba9b756591491aea6b75830babc51c6fa82501a50306a9eddad660a2c5
+              version: 1.9.3
+            pipeline-stage-view:
+              source_hash: bb551d1e9e421868a4e8b58a0159b54e3660fdfc3b7f8178b92dea3d029e0f95
+              version: '2.10'
+            pipeline-utility-steps:
+              source_hash: 1eb4ed77ad887f956d44af7caead7c2b255bd64ddf8927a95ad904e0a1d16952
+              version: 2.1.0
+            plain-credentials:
+              source_hash: 8dfd05ea601968df1fe5530a09bb502c33985530a0e4950234117cc5ee46c3b3
+              version: '1.8'
+            plot:
+              source_hash: 0d901de7e672b9bb940e267c77bed337e97c1a68864335800b3a64a0cf75d001
+              version: 2.1.0
+            plugin-util-api:
+              source_hash: 65da4025061b18629677799a67314c600bd4fc178b94c973f026f0935da03ffb
+              version: 2.5.0
+            popper-api:
+              source_hash: c5bbf6279fa3492724e86376da2ecc038a27b089287012f6f11b50b6ab65e3f2
+              version: 1.16.1-2
+            popper2-api:
+              source_hash: 8c9b9bf9b755707e6a176a5d1186063626521be3aed51744991bc87cc863391c
+              version: 2.10.2-1
+            prometheus:
+              source_hash: ae8c53a74417aa1f3d6a774a6957c5f11a6fcab51fcc28f99bfe0ff54ede766e
+              version: 2.0.0
+            pubsub-light:
+              source_hash: 0a7d642c7f66b589a375c0e06d13fb125ad90bf28a551a445ff5a37fd4bd486c
+              version: '1.13'
+            rebuild:
+              source_hash: 4f17fe9da81e00c9d22e48ac862eca47bf8181aa24b3657481c40f720304517c
+              version: '1.33'
+            run-condition:
+              source_hash: 7ed94d7196676c00e45b5bf7e191831eee0e49770dced1c266b8055980b339ca
+              version: '1.5'
+            scm-api:
+              source_hash: 20adc461e6459098ffc538dace079d76b948f7ee6f86b247703720e803e2c840
+              version: 2.6.5
+            script-security:
+              source_hash: abb08e9ea19ff8711edc4fa0948c9a22c2bc87a207000b2faf85cf0422b97024
+              version: 1138.v8e727069a_025
+            simple-theme-plugin:
+              source_hash: d823ac7fa1d5861051fc69534f5678c32d10c98a00987a045b0b7836fd733584
+              version: 0.5.1
+            slack:
+              source_hash: 0ae8977a94b13dd54522793d9f97854dcf10de853b9e5059d059c8c62e10dad9
+              version: '2.49'
+            snakeyaml-api:
+              source_hash: 9f8b34f1e657a4e88349663988b405e2dead6b1f9e737e8fac9736a69b6e5595
+              version: 1.29.1
+            sse-gateway:
+              source_hash: 8e9209c8a8a41389a2052c2a22e32ce016386caac9acd2acfb0a3332c2c8d51c
+              version: '1.24'
+            ssh-agent:
+              source_hash: 196a6bc5c8e41a57d9d1f2db0b5fce16b2544143409e85f1b83455ad94728a50
+              version: '1.17'
+            ssh-credentials:
+              source_hash: 8db908c484737f260cfab6682a42cbeaf390b3b9efd87925375691e45c370492
+              version: 1.18.1
+            ssh-slaves:
+              source_hash: 8a38d77f7859551552ef98e11119f491e4c1389892b72c159e4d15825fc2822a
+              version: 1.29.4
+            structs:
+              source_hash: 2cbcb66e0f77daf616f53f42c97ded31f70bd117c6d9ddf25432f2ada1ba4d6d
+              version: 308.v852b473a2b8c
+            test-stability:
+              source_hash: 6a996ab33025e105510a3d765e9cc405eb254351a8d70eff8cbcdfae3cc4794e
+              version: '2.3'
+            throttle-concurrents:
+              source_hash: 626ebc75c0b9c21be6e08bd421447846ef4d53a20538043cbc16a89386f64ade
+              version: 2.0.1
+            timestamper:
+              source_hash: c6720665ff685310025634cb64cafa3374a9512d326d86938a018e09526143e6
+              version: '1.16'
+            token-macro:
+              source_hash: 6c5361d99e40fe053b30d3f12d865ae7804c78776d1f9b236ef91e49ba773331
+              version: '2.13'
+            trilead-api:
+              source_hash: 62b46838e493cfc6950382b4e4975d865cd3bfbfc58ada704b9dd96ff101e457
+              version: 1.0.13
+            variant:
+              source_hash: 4c2985249aa9223dd4471898b0fe16849f7b2a16bf05870544062174605b67f3
+              version: '1.4'
+            windows-slaves:
+              source_hash: 139b628df407177ea8e939b438bfbca5922e2b7e6a0ea2809c5ca895c671bf32
+              version: '1.0'
+            workflow-aggregator:
+              source_hash: f5122377769a5e43ee4c2d88c720dd893054c3658fc4d29f21d362eabcaac86a
+              version: '2.5'
+            workflow-api:
+              source_hash: b82d12b6765791536a38090b70d03953e61fb0830e68ef994ed1fdab68f4897b
+              version: 1138.v619fd5201b_2f
+            workflow-basic-steps:
+              source_hash: 3cb39af3c0c8a83be7a6ff987901c04940cdf442e02ee44a15c99e829b510506
+              version: '2.24'
+            workflow-cps:
+              source_hash: 043cc00edc77a659de86a712a6d301c9964e81e1b7b10f4e23f224932d235c37
+              version: 2659.v52d3de6044d0
+            workflow-cps-global-lib:
+              source_hash: febe5b4f114f771b535f0de326f39a46f0d8d6bd81ce072e448a8ce6b2eca499
+              version: '2.19'
+            workflow-durable-task-step:
+              source_hash: 9c764107396216791d3c8ed89d7398f8ffe56628e6173ff497d92d9a841c0cca
+              version: '2.40'
+            workflow-job:
+              source_hash: 79f3373e4471f3f3019f6d6dd9df0384f9edf7a4423b7dd390755aba723eeb30
+              version: 1145.v7f2433caa07f
+            workflow-multibranch:
+              source_hash: 374ff453a7c249061d72a98be13e02c2df22716f6ed946b1e3ab30ad9bba1616
+              version: '2.24'
+            workflow-remote-loader:
+              source_hash: ad1edf0c8fe7afc2f5266e22a30883f14a1b39c03a2f3e27dd093ec55be7aa03
+              version: '1.5'
+            workflow-scm-step:
+              source_hash: 6a97728795e3a77104760e5fca74d42c3d20755173675f706196ac142209c5e4
+              version: '2.13'
+            workflow-step-api:
+              source_hash: a05122f286e4be35f438df26fb13c54d9190a7ba2905c0e543b90ec0e8c644ca
+              version: 622.vb_8e7c15b_c95a_
+            workflow-support:
+              source_hash: e88769cb88a05277a2df8d8793bba34550f223e27161bfb44194c0918ec93138
+              version: '3.8'