Если extract_ds_job_url(get_ds_jobs(BASE_JOB_URL))
возвращает пустой набор, вы навсегда назовете get_all_downstream_jobs_urls(temp)
. Это потому, что цикл for
ничего не собирается делать.
Тест наверху должен проверить вместо None
:
if ds_jobs is None:
и отдельный тест для ds_jobs
, должно быть завершено рекурсией:
if not ds_jobs:
# no downstream jobs to process
return set()
Я не могу ручаться за остальную часть логики, но в коде есть много ошибок стиля. Я бы реорганизовал его на , по крайней мере, , чтобы избавиться от некоторых из этих ошибок:
JENKINS_JOBS
никогда не восстанавливается, поэтому global JENKINS_JOBS
является избыточным и запутанным и должен удаляться. _
является по соглашению , переменной выброса. Он сигнализирует, что значение не будет использоваться. Однако здесь код использует . Его следует переименовать вместо job_url
. ;
в производственном коде. ds_jobs = set()
, тогда ds_jobs.update(...)
является слишком верным написанием ds_jobs = set(...)
. temp
не является хорошим именем переменной, updated
может быть лучшим именем. Он должен быть сделан при назначении, поэтому updated = set(ds_jobs)
, а вызов .copy()
можно удалить из цикла for
. return
, когда первый URL-адрес задания не имеет нисходящие URL-адреса, вероятно, не то, что вы хотите. Следующий код удаляет рекурсию с использованием стека вместо этого и гарантированно вызывает вызов Jenkins API для каждого URL-адреса задания только один раз :
def get_all_downstream_jobs_urls():
ds_jobs = set()
stack = [extract_ds_job_url(get_ds_jobs(BASE_JOB_URL))]
while stack:
job_url = stack.pop()
if job_url in ds_jobs:
# already seen before, skip
continue
ds_jobs.add(job_url)
# add downstream jobs to the stack for further processing
stack.extend(extract_ds_job_url(get_ds_jobs(job_url)))
return ds_jobs
Последнее, но не менее важное, я сильно подозреваю, что использование сторонней библиотеки, такой как пакет jenkinsapi
сделает все это еще проще; API Jenkins, вероятно, позволяет вам запрашивать эту информацию всего за один вызов, но библиотека, вероятно, делает такой вызов для вас и предоставляет вам легко анализируемые объекты Python для информации.
Я бы порекомендовал установить свою собственную базу данных на сервере с подсчетом «нравится и не нравится» и веб-сервисами, которые действительно нравятся и не нравятся, так как похоже, что вы хотите, чтобы это было многопользовательское приложение и подключенное к Интернету.
Буду признателен, если вы добавите больше подробностей о том, как вы хотите его реализовать, чтобы дать вам лучший ответ.