diff --git a/.github/workflows/check-candidate-release.yml b/.github/workflows/check-candidate-release.yml index 4e36e9a4..2a311fc4 100644 --- a/.github/workflows/check-candidate-release.yml +++ b/.github/workflows/check-candidate-release.yml @@ -13,13 +13,9 @@ jobs: - name: Check out repository uses: actions/checkout@v2 - - name: Fetch JSON Response - run: | - curl -s "https://hg.mozilla.org/releases/mozilla-release/json-tags" > rc-response.json - - name: Check for any updates env: DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} DISCORD_PING_IDS: ${{ secrets.DISCORD_PING_IDS }} run: | - python3 scripts/check-rc-response.py || true + python3 scripts/check_rc_response.py || true diff --git a/scripts/check_rc_response.py b/scripts/check_rc_response.py new file mode 100644 index 00000000..9cb81f6d --- /dev/null +++ b/scripts/check_rc_response.py @@ -0,0 +1,87 @@ +import json +import os +import sys +import requests +from typing import Optional + +METADATA_FILENAME = "surfer.json" +TAGS_API_URL = "https://hg.mozilla.org/releases/mozilla-release/json-tags" + +def get_current_version() -> Optional[str]: + """Retrieve the current version from the metadata file.""" + try: + with open(METADATA_FILENAME) as f: + metadata = json.load(f) + return metadata["version"]["candidate"] + except (FileNotFoundError, json.JSONDecodeError) as e: + print(f"Error reading current version: {e}") + return None + +def get_repo_data() -> Optional[str]: + """Retrieve the repository data from the API.""" + try: + print(f"Retrieving repository data from {TAGS_API_URL}") + response = requests.get(TAGS_API_URL) + response.raise_for_status() # Raise an error for bad responses + return response.json() + except requests.RequestException as e: + print(f"Error retrieving repository data: {e}") + return None + +def get_rc_response() -> Optional[str]: + """Get the release candidate response from the response file.""" + try: + data = get_repo_data() + for tag_dict in data["tags"]: + tag = tag_dict["tag"] + if (tag.startswith("FIREFOX") and tag.endswith("_BUILD1") + and "ESR" not in tag and "b" not in tag): + return (tag.replace("FIREFOX_", "").replace("_BUILD1", + "").replace("_", ".")) + except (FileNotFoundError, json.JSONDecodeError) as e: + print(f"Error reading RC response: {e}") + return None + + +def get_pings() -> str: + """Build a string of Discord user IDs for mentions.""" + ping_ids = os.getenv("DISCORD_PING_IDS", "") + return " ".join(f"<@{ping.strip()}>" for ping in ping_ids.split(",") + if ping.strip()) + + +def send_webhook(rc: str) -> None: + """Send a message to the Discord webhook.""" + text = f"||{get_pings()}|| New Firefox RC version is available: **{rc}**" + webhook_url = os.getenv("DISCORD_WEBHOOK_URL") + + if webhook_url: + message = { + "content": text, + "username": "Firefox RC Checker", + } + try: + response = requests.post(webhook_url, json=message) + response.raise_for_status() # Raise an error for bad responses + except requests.RequestException as e: + print(f"Error sending webhook: {e}") + else: + print("Webhook URL not set.") + +def rc_should_be_updated(rc_response: str, current_version: str) -> bool: + return rc_response and rc_response != current_version + +def main() -> int: + current_version = get_current_version() + rc_response = get_rc_response() + + if rc_should_be_updated(rc_response, current_version): + send_webhook(rc_response) + return 0 + + print(f"Current version: {current_version}, RC version: {rc_response}") + return 1 + + +if __name__ == "__main__": + sys.exit(main())