Skip to content

Commit a8f0dca

Browse files
Use updates_url for plugin version if it exists
1 parent 2e39d0b commit a8f0dca

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

plugins/modules/jenkins_plugin.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,13 @@
9393
- A list of URL segment(s) to retrieve the update center JSON file from.
9494
default: ['update-center.json', 'updates/update-center.json']
9595
version_added: 3.3.0
96+
plugin_versions_url_segment:
97+
type: list
98+
elements: str
99+
description:
100+
- A list of URL segment(s) to retrieve the plugin versions JSON file from.
101+
default: ['plugin-versions.json', 'current/plugin-versions.json']
102+
version_added: 11.1.0
96103
latest_plugins_url_segments:
97104
type: list
98105
elements: str
@@ -137,6 +144,9 @@
137144
- Pinning works only if the plugin is installed and Jenkins service was successfully restarted after the plugin installation.
138145
- It is not possible to run the module remotely by changing the O(url) parameter to point to the Jenkins server. The module
139146
must be used on the host where Jenkins runs as it needs direct access to the plugin files.
147+
- If using a custom O(updates_url), ensure that the URL provides a C(plugin-versions.json) file.
148+
This file must include metadata for all available plugin versions to support version compatibility resolution.
149+
The file should be in the same format as the one provided by Jenkins update center (https://updates.jenkins.io/current/plugin-versions.json).
140150
extends_documentation_fragment:
141151
- ansible.builtin.url
142152
- ansible.builtin.files
@@ -688,6 +698,10 @@ def _get_latest_compatible_plugin_version(self, plugin_name=None):
688698
self.jenkins_version = self.parse_version(raw_version)
689699
name = plugin_name or self.params['name']
690700
cache_path = "{}/ansible_jenkins_plugin_cache.json".format(self.params['jenkins_home'])
701+
plugin_version_urls = []
702+
for base_url in self.params['updates_url']:
703+
for update_json in self.params['plugin_versions_url_segment']:
704+
plugin_version_urls.append("{}/{}".format(base_url, update_json))
691705

692706
try: # Check if file is saved localy
693707
if os.path.exists(cache_path):
@@ -697,9 +711,7 @@ def _get_latest_compatible_plugin_version(self, plugin_name=None):
697711

698712
now = time.time()
699713
if now - file_mtime >= 86400:
700-
response, info = fetch_url(self.module, "https://updates.jenkins.io/current/plugin-versions.json")
701-
if info['status'] != 200:
702-
self.module.fail_json(msg="Failed to fetch plugin-versions.json", details=info)
714+
response = self._get_urls_data(plugin_version_urls, what="plugin-versions.json")
703715
plugin_data = json.loads(to_native(response.read()), object_pairs_hook=OrderedDict)
704716

705717
# Save it to file for next time
@@ -710,6 +722,8 @@ def _get_latest_compatible_plugin_version(self, plugin_name=None):
710722
plugin_data = json.load(f)
711723

712724
except Exception as e:
725+
if os.path.exists(cache_path):
726+
os.remove(cache_path)
713727
self.module.fail_json(msg="Failed to parse plugin-versions.json", details=to_native(e))
714728

715729
plugin_versions = plugin_data.get("plugins", {}).get(name)
@@ -939,6 +953,8 @@ def main():
939953
updates_url_password=dict(type="str", no_log=True),
940954
update_json_url_segment=dict(type="list", elements="str", default=['update-center.json',
941955
'updates/update-center.json']),
956+
plugin_versions_url_segment=dict(type="list", elements="str", default=['plugin-versions.json',
957+
'current/plugin-versions.json']),
942958
latest_plugins_url_segments=dict(type="list", elements="str", default=['latest']),
943959
versioned_plugins_url_segments=dict(type="list", elements="str", default=['download/plugins', 'plugins']),
944960
url=dict(default='http://localhost:8080'),
@@ -968,7 +984,7 @@ def main():
968984
module.params['state'] = 'present'
969985
module.params['version'] = jp._get_latest_compatible_plugin_version()
970986

971-
# Ser version to latest compatible version if version is latest
987+
# Set version to latest compatible version if version is latest
972988
if module.params['version'] == 'latest':
973989
module.params['version'] = jp._get_latest_compatible_plugin_version()
974990

tests/unit/plugins/modules/test_jenkins_plugin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ def test__get_latest_compatible_plugin_version(fetch_mock, mocker):
209209
"name": "git",
210210
"version": "latest",
211211
"updates_url": ["https://some.base.url"],
212+
"plugin_versions_url_segment": ["plugin-versions.json"],
212213
"latest_plugins_url_segments": ["test_latest"],
213214
"jenkins_home": "/var/lib/jenkins",
214215
}

0 commit comments

Comments
 (0)