Files
homelab/scripts/run_updates.py
Alex Frantz 610c62b75a
All checks were successful
Deploy Containers / Prepare (push) Successful in 4s
fix update script
2025-11-22 17:20:46 -05:00

65 lines
2.5 KiB
Python

import requests
import subprocess
import os
import yaml
def search_for_image(image_name):
tasks_folder = os.path.realpath(os.path.join('./', 'tasks'))
if "library/" in image_name:
image_name = image_name.replace("library/", "")
for task in os.listdir(tasks_folder):
with open(os.path.join(tasks_folder, task), 'r') as file:
data = yaml.safe_load(file)
for key in data:
if "vars" in key:
if image_name in key["vars"]["image"]["name"] or image_name == key["vars"]["image"]["name"]:
return f"{task.split(".")[0]}_deploy"
def main():
update_list = requests.get("https://cup.fntz.net/api/v3/json")
update_list.raise_for_status()
update_list = update_list.json()
deployable_tags = []
with open("main.yml", 'r') as file:
data = yaml.safe_load(file)
for host in data:
for task in host['tasks']:
deployable_tags.append(task['tags'])
if len(update_list["images"]) > 0:
already_deployed = []
actually_updatable = []
blacklist = []
for image in update_list["images"]:
if image['result']['has_update']:
if image in blacklist:
print(f"[UPDATE] Ignoring '{image}' due to its blacklist")
elif 'version_update_type' in image['result']['info'] and image['result']['info']['version_update_type'] != "major":
actually_updatable.append({ 'reference': image['reference'], 'repository': image['parts']['repository'] })
elif 'type' in image['result']['info'] and image['result']['info']['type'] == "digest":
actually_updatable.append({ 'reference': image['reference'], 'repository': image['parts']['repository'] })
print(f"Redeploying {len(actually_updatable)} container(s)..")
for image in actually_updatable:
ansible_tag = search_for_image(image['repository'])
print(ansible_tag, image['reference'])
if ansible_tag and ansible_tag in deployable_tags and ansible_tag not in already_deployed:
print(f'[UPDATE] Deploying {ansible_tag}..')
subprocess.run(f'ANSIBLE_CONFIG=ansible.cfg ansible-playbook main.yml --tags {ansible_tag} --vault-password-file=~/.vault_pass.txt', shell=True)
else:
print('[UPDATE] Could not find corresponding task, cleaning up..')
subprocess.run(f"docker image remove {image['reference']}", shell=True)
already_deployed.append(ansible_tag)
print("\nAll images updated, refreshing Cup")
requests.get("https://cup.fntz.net/api/v3/refresh")
else:
print("No images to update!")
if __name__ == "__main__":
main()