From 42ccf0b740677e2a41197b9ae0cd76334f6bea54 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:42:51 +0000 Subject: [PATCH 1/8] Initial plan From 4bb487c1621fab6fdb5d3f9b7188acd70d014e72 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:47:00 +0000 Subject: [PATCH 2/8] Add automated Geth version update script and workflow Co-authored-by: flisko <24591702+flisko@users.noreply.github.com> --- .../update_upstream.cpython-312.pyc | Bin 0 -> 12935 bytes .github/scripts/update_upstream.py | 295 ++++++++++++++++++ .github/workflows/update_upstream.yml | 66 ++++ 3 files changed, 361 insertions(+) create mode 100644 .github/scripts/__pycache__/update_upstream.cpython-312.pyc create mode 100755 .github/scripts/update_upstream.py create mode 100644 .github/workflows/update_upstream.yml diff --git a/.github/scripts/__pycache__/update_upstream.cpython-312.pyc b/.github/scripts/__pycache__/update_upstream.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b184405cd19a00aa54eed5b28aeb4c63cfc3cc61 GIT binary patch literal 12935 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 MIJOGOS}ctJ1&;ADB>(^b literal 0 HcmV?d00001 diff --git a/.github/scripts/update_upstream.py b/.github/scripts/update_upstream.py new file mode 100755 index 0000000..1451b5f --- /dev/null +++ b/.github/scripts/update_upstream.py @@ -0,0 +1,295 @@ +#!/usr/bin/env python3 +""" +Script to automatically update Geth upstream version and package version. + +This script: +1. Fetches the latest release from ethereum/go-ethereum +2. Compares it with the current upstream version in build/dappnode_package-mainnet.json +3. If a newer version is found: + - Increments the patch version in all dappnode_package-*.json files + - Updates the upstream version in all dappnode_package-*.json files + - Updates the image tag in all docker-compose-*.yml files + - Updates the VERSION build arg in all docker-compose-*.yml files +""" + +import json +import os +import re +import sys +from pathlib import Path +from typing import Dict, List, Tuple +import urllib.request +import urllib.error + + +def fetch_latest_geth_release() -> str: + """ + Fetch the latest release tag from ethereum/go-ethereum repository. + + Returns: + str: The latest release tag (e.g., "v1.16.9") + """ + api_url = "https://api.github.com/repos/ethereum/go-ethereum/releases/latest" + + try: + req = urllib.request.Request(api_url) + req.add_header('Accept', 'application/vnd.github+json') + + # Add GitHub token if available for authentication + github_token = os.environ.get('GITHUB_TOKEN') + if github_token: + req.add_header('Authorization', f'Bearer {github_token}') + + with urllib.request.urlopen(req) as response: + data = json.loads(response.read().decode()) + tag_name = data.get('tag_name', '') + print(f"Latest Geth release: {tag_name}") + return tag_name + except urllib.error.HTTPError as e: + print(f"Error fetching latest release: {e}") + print(f"Tip: Set GITHUB_TOKEN environment variable to avoid rate limiting") + sys.exit(1) + except Exception as e: + print(f"Unexpected error: {e}") + sys.exit(1) + + +def parse_version(version_str: str) -> Tuple[int, int, int]: + """ + Parse a version string into major, minor, patch components. + + Args: + version_str: Version string like "10.0.78" or "v1.16.8" + + Returns: + Tuple of (major, minor, patch) + """ + # Remove 'v' prefix if present + clean_version = version_str.lstrip('v') + parts = clean_version.split('.') + + if len(parts) != 3: + raise ValueError(f"Invalid version format: {version_str}") + + return int(parts[0]), int(parts[1]), int(parts[2]) + + +def increment_patch_version(version_str: str) -> str: + """ + Increment the patch version of a semver string. + + Args: + version_str: Version string like "10.0.78" + + Returns: + Incremented version string like "10.0.79" + """ + major, minor, patch = parse_version(version_str) + return f"{major}.{minor}.{patch + 1}" + + +def compare_versions(v1: str, v2: str) -> int: + """ + Compare two version strings. + + Args: + v1: First version string + v2: Second version string + + Returns: + -1 if v1 < v2, 0 if v1 == v2, 1 if v1 > v2 + """ + major1, minor1, patch1 = parse_version(v1) + major2, minor2, patch2 = parse_version(v2) + + if (major1, minor1, patch1) < (major2, minor2, patch2): + return -1 + elif (major1, minor1, patch1) == (major2, minor2, patch2): + return 0 + else: + return 1 + + +def update_package_json(file_path: Path, new_version: str, new_upstream: str) -> None: + """ + Update a dappnode_package-*.json file with new version and upstream. + + Args: + file_path: Path to the JSON file + new_version: New package version + new_upstream: New upstream Geth version + """ + with open(file_path, 'r') as f: + data = json.load(f) + + old_version = data.get('version', '') + old_upstream = data.get('upstream', '') + + data['version'] = new_version + data['upstream'] = new_upstream + + with open(file_path, 'w') as f: + json.dump(data, f, indent=2) + f.write('\n') # Add trailing newline + + print(f"Updated {file_path.name}: version {old_version} -> {new_version}, upstream {old_upstream} -> {new_upstream}") + + +def update_docker_compose(file_path: Path, new_image_tag: str, new_version_arg: str) -> None: + """ + Update a docker-compose-*.yml file with new image tag and VERSION build arg. + + Args: + file_path: Path to the docker-compose file + new_image_tag: New image tag (package version) + new_version_arg: New VERSION build argument (Geth version) + """ + with open(file_path, 'r') as f: + content = f.read() + + # Update image tag + # Pattern: image: 'service-name:version' + content = re.sub( + r"(image:\s+['\"][\w.-]+\.(?:public\.dappnode|avado\.dnp\.dappnode)\.eth:)[^'\"]+(['\"])", + rf"\g<1>{new_image_tag}\g<2>", + content + ) + + # Update VERSION build arg + # Pattern: VERSION: vX.Y.Z + content = re.sub( + r"(VERSION:\s+)v[\d.]+", + rf"\g<1>{new_version_arg}", + content + ) + + with open(file_path, 'w') as f: + f.write(content) + + print(f"Updated {file_path.name}: image tag -> {new_image_tag}, VERSION -> {new_version_arg}") + + +def main(): + """Main execution function.""" + # Get the repository root (3 levels up from this script) + script_dir = Path(__file__).parent + repo_root = script_dir.parent.parent + build_dir = repo_root / 'build' + + print("=" * 60) + print("Geth Upstream Version Update Script") + print("=" * 60) + + # Fetch latest Geth release + latest_geth_version = fetch_latest_geth_release() + + if not latest_geth_version: + print("Error: Could not fetch latest Geth release") + sys.exit(1) + + # Read current upstream version from mainnet package + mainnet_package_path = build_dir / 'dappnode_package-mainnet.json' + + if not mainnet_package_path.exists(): + print(f"Error: {mainnet_package_path} not found") + sys.exit(1) + + with open(mainnet_package_path, 'r') as f: + mainnet_data = json.load(f) + + current_upstream = mainnet_data.get('upstream', '') + current_version = mainnet_data.get('version', '') + + print(f"Current upstream version: {current_upstream}") + print(f"Current package version: {current_version}") + print(f"Latest Geth version: {latest_geth_version}") + + # Compare versions + if compare_versions(current_upstream, latest_geth_version) >= 0: + print("No update needed. Current version is up to date or newer.") + # Set output for GitHub Actions (no update) + if 'GITHUB_OUTPUT' in os.environ: + with open(os.environ['GITHUB_OUTPUT'], 'a') as f: + f.write(f"update_available=false\n") + sys.exit(0) + + print("\n" + "=" * 60) + print(f"Update available: {current_upstream} -> {latest_geth_version}") + print("=" * 60 + "\n") + + # Find all package JSON files + package_files = sorted(build_dir.glob('dappnode_package-*.json')) + + if not package_files: + print("Error: No dappnode_package-*.json files found") + sys.exit(1) + + print(f"Found {len(package_files)} package files to update") + + # Update each package file + for package_file in package_files: + # Read current version from this specific file + with open(package_file, 'r') as f: + pkg_data = json.load(f) + + current_pkg_version = pkg_data.get('version', '') + new_pkg_version = increment_patch_version(current_pkg_version) + + update_package_json(package_file, new_pkg_version, latest_geth_version) + + # Find all docker-compose YAML files + compose_files = sorted(build_dir.glob('docker-compose-*.yml')) + + if not compose_files: + print("Error: No docker-compose-*.yml files found") + sys.exit(1) + + print(f"\nFound {len(compose_files)} docker-compose files to update") + + # For docker-compose files, we need to match each with its corresponding package + for compose_file in compose_files: + # Extract network name from filename (e.g., docker-compose-mainnet.yml -> mainnet) + network_name = compose_file.stem.replace('docker-compose-', '') + + # Find corresponding package file + package_file = build_dir / f'dappnode_package-{network_name}.json' + + if not package_file.exists(): + print(f"Warning: No matching package file for {compose_file.name}, skipping") + continue + + # Read the new version from the package file + with open(package_file, 'r') as f: + pkg_data = json.load(f) + + new_pkg_version = pkg_data.get('version', '') + + update_docker_compose(compose_file, new_pkg_version, latest_geth_version) + + print("\n" + "=" * 60) + print("Update completed successfully!") + print("=" * 60) + + # Set outputs for GitHub Actions + if 'GITHUB_OUTPUT' in os.environ: + with open(os.environ['GITHUB_OUTPUT'], 'a') as f: + f.write(f"update_available=true\n") + f.write(f"old_version={current_upstream}\n") + f.write(f"new_version={latest_geth_version}\n") + f.write(f"old_package_version={current_version}\n") + + # Get the new package version from mainnet + with open(mainnet_package_path, 'r') as pf: + updated_data = json.load(pf) + new_package_version = updated_data.get('version', '') + + f.write(f"new_package_version={new_package_version}\n") + + print("\nSummary:") + print(f" Geth version: {current_upstream} -> {latest_geth_version}") + print(f" Package files updated: {len(package_files)}") + print(f" Docker-compose files updated: {len(compose_files)}") + + +if __name__ == '__main__': + main() diff --git a/.github/workflows/update_upstream.yml b/.github/workflows/update_upstream.yml new file mode 100644 index 0000000..5ed4a64 --- /dev/null +++ b/.github/workflows/update_upstream.yml @@ -0,0 +1,66 @@ +name: Update Geth Upstream Version + +on: + schedule: + # Run daily at 2 AM UTC + - cron: '0 2 * * *' + workflow_dispatch: + # Allow manual trigger + +jobs: + update-upstream: + runs-on: ubuntu-22.04 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Run update script + id: update + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + python .github/scripts/update_upstream.py + + - name: Create Pull Request + if: steps.update.outputs.update_available == 'true' + uses: peter-evans/create-pull-request@v6 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: "chore: update Geth to ${{ steps.update.outputs.new_version }}" + title: "chore: update Geth from ${{ steps.update.outputs.old_version }} to ${{ steps.update.outputs.new_version }}" + body: | + ## Automated Geth Upstream Update + + This PR updates the Geth upstream version from **${{ steps.update.outputs.old_version }}** to **${{ steps.update.outputs.new_version }}**. + + ### Changes made: + + - Updated `upstream` version in all `dappnode_package-*.json` files + - Incremented `version` (patch level) in all `dappnode_package-*.json` files + - Updated `image` tag in all `docker-compose-*.yml` files + - Updated `VERSION` build argument in all `docker-compose-*.yml` files + + ### Package version changes: + + - Package version: **${{ steps.update.outputs.old_package_version }}** → **${{ steps.update.outputs.new_package_version }}** + - Geth version: **${{ steps.update.outputs.old_version }}** → **${{ steps.update.outputs.new_version }}** + + --- + + *This PR was created automatically by the [update-upstream workflow](.github/workflows/update_upstream.yml).* + + Please review and merge if the changes look correct. + branch: automated/update-geth-${{ steps.update.outputs.new_version }} + delete-branch: true + labels: | + automated + dependencies + geth-update From c47b7205c541a961c93eaf1a237a565e8b36867f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:47:24 +0000 Subject: [PATCH 3/8] Remove __pycache__ and update .gitignore Co-authored-by: flisko <24591702+flisko@users.noreply.github.com> --- .../__pycache__/update_upstream.cpython-312.pyc | Bin 12935 -> 0 bytes .gitignore | 3 +++ 2 files changed, 3 insertions(+) delete mode 100644 .github/scripts/__pycache__/update_upstream.cpython-312.pyc diff --git a/.github/scripts/__pycache__/update_upstream.cpython-312.pyc b/.github/scripts/__pycache__/update_upstream.cpython-312.pyc deleted file mode 100644 index b184405cd19a00aa54eed5b28aeb4c63cfc3cc61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12935 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 MIJOGOS}ctJ1&;ADB>(^b diff --git a/.gitignore b/.gitignore index c561709..771b2f0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ build_* releases.json +__pycache__/ +*.py[cod] +*$py.class From af527e32014af9402787f861c2f5bbcb35791f9d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:49:13 +0000 Subject: [PATCH 4/8] Fix YAML formatting in update_upstream workflow Co-authored-by: flisko <24591702+flisko@users.noreply.github.com> --- .github/workflows/update_upstream.yml | 54 ++++++++++++++++----------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/.github/workflows/update_upstream.yml b/.github/workflows/update_upstream.yml index 5ed4a64..a73b895 100644 --- a/.github/workflows/update_upstream.yml +++ b/.github/workflows/update_upstream.yml @@ -10,53 +10,65 @@ on: jobs: update-upstream: runs-on: ubuntu-22.04 - + steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 1 - + - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.x' - + - name: Run update script id: update env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | python .github/scripts/update_upstream.py - + - name: Create Pull Request if: steps.update.outputs.update_available == 'true' uses: peter-evans/create-pull-request@v6 with: token: ${{ secrets.GITHUB_TOKEN }} - commit-message: "chore: update Geth to ${{ steps.update.outputs.new_version }}" - title: "chore: update Geth from ${{ steps.update.outputs.old_version }} to ${{ steps.update.outputs.new_version }}" + commit-message: >- + chore: update Geth to ${{ steps.update.outputs.new_version }} + title: >- + chore: update Geth from ${{ steps.update.outputs.old_version }} + to ${{ steps.update.outputs.new_version }} body: | ## Automated Geth Upstream Update - - This PR updates the Geth upstream version from **${{ steps.update.outputs.old_version }}** to **${{ steps.update.outputs.new_version }}**. - + + This PR updates the Geth upstream version from + **${{ steps.update.outputs.old_version }}** to + **${{ steps.update.outputs.new_version }}**. + ### Changes made: - - - Updated `upstream` version in all `dappnode_package-*.json` files - - Incremented `version` (patch level) in all `dappnode_package-*.json` files + + - Updated `upstream` version in all + `dappnode_package-*.json` files + - Incremented `version` (patch level) in all + `dappnode_package-*.json` files - Updated `image` tag in all `docker-compose-*.yml` files - - Updated `VERSION` build argument in all `docker-compose-*.yml` files - + - Updated `VERSION` build argument in all + `docker-compose-*.yml` files + ### Package version changes: - - - Package version: **${{ steps.update.outputs.old_package_version }}** → **${{ steps.update.outputs.new_package_version }}** - - Geth version: **${{ steps.update.outputs.old_version }}** → **${{ steps.update.outputs.new_version }}** - + + - Package version: + **${{ steps.update.outputs.old_package_version }}** → + **${{ steps.update.outputs.new_package_version }}** + - Geth version: **${{ steps.update.outputs.old_version }}** → + **${{ steps.update.outputs.new_version }}** + --- - - *This PR was created automatically by the [update-upstream workflow](.github/workflows/update_upstream.yml).* - + + *This PR was created automatically by the + [update-upstream workflow](.github/workflows/update_upstream.yml).* + Please review and merge if the changes look correct. branch: automated/update-geth-${{ steps.update.outputs.new_version }} delete-branch: true From 7b8c4a5c619c77454d4e4a9c31ee05847a869682 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:51:58 +0000 Subject: [PATCH 5/8] Update script to only handle mainnet network Co-authored-by: flisko <24591702+flisko@users.noreply.github.com> --- .github/scripts/update_upstream.py | 78 +++++++++------------------ .github/workflows/update_upstream.yml | 13 +++-- 2 files changed, 31 insertions(+), 60 deletions(-) diff --git a/.github/scripts/update_upstream.py b/.github/scripts/update_upstream.py index 1451b5f..3d04350 100755 --- a/.github/scripts/update_upstream.py +++ b/.github/scripts/update_upstream.py @@ -6,10 +6,12 @@ 1. Fetches the latest release from ethereum/go-ethereum 2. Compares it with the current upstream version in build/dappnode_package-mainnet.json 3. If a newer version is found: - - Increments the patch version in all dappnode_package-*.json files - - Updates the upstream version in all dappnode_package-*.json files - - Updates the image tag in all docker-compose-*.yml files - - Updates the VERSION build arg in all docker-compose-*.yml files + - Increments the patch version in dappnode_package-mainnet.json + - Updates the upstream version in dappnode_package-mainnet.json + - Updates the image tag in docker-compose-mainnet.yml + - Updates the VERSION build arg in docker-compose-mainnet.yml + +Note: Only mainnet files are updated by this script. """ import json @@ -217,54 +219,30 @@ def main(): print(f"Update available: {current_upstream} -> {latest_geth_version}") print("=" * 60 + "\n") - # Find all package JSON files - package_files = sorted(build_dir.glob('dappnode_package-*.json')) + # Only update mainnet files + mainnet_package = build_dir / 'dappnode_package-mainnet.json' + mainnet_compose = build_dir / 'docker-compose-mainnet.yml' - if not package_files: - print("Error: No dappnode_package-*.json files found") + if not mainnet_package.exists(): + print(f"Error: {mainnet_package} not found") sys.exit(1) - print(f"Found {len(package_files)} package files to update") + if not mainnet_compose.exists(): + print(f"Error: {mainnet_compose} not found") + sys.exit(1) - # Update each package file - for package_file in package_files: - # Read current version from this specific file - with open(package_file, 'r') as f: - pkg_data = json.load(f) - - current_pkg_version = pkg_data.get('version', '') - new_pkg_version = increment_patch_version(current_pkg_version) - - update_package_json(package_file, new_pkg_version, latest_geth_version) + print("Updating mainnet package file...") - # Find all docker-compose YAML files - compose_files = sorted(build_dir.glob('docker-compose-*.yml')) + # Calculate new version + new_pkg_version = increment_patch_version(current_version) - if not compose_files: - print("Error: No docker-compose-*.yml files found") - sys.exit(1) + # Update package JSON + update_package_json(mainnet_package, new_pkg_version, latest_geth_version) - print(f"\nFound {len(compose_files)} docker-compose files to update") + print("\nUpdating mainnet docker-compose file...") - # For docker-compose files, we need to match each with its corresponding package - for compose_file in compose_files: - # Extract network name from filename (e.g., docker-compose-mainnet.yml -> mainnet) - network_name = compose_file.stem.replace('docker-compose-', '') - - # Find corresponding package file - package_file = build_dir / f'dappnode_package-{network_name}.json' - - if not package_file.exists(): - print(f"Warning: No matching package file for {compose_file.name}, skipping") - continue - - # Read the new version from the package file - with open(package_file, 'r') as f: - pkg_data = json.load(f) - - new_pkg_version = pkg_data.get('version', '') - - update_docker_compose(compose_file, new_pkg_version, latest_geth_version) + # Update docker-compose + update_docker_compose(mainnet_compose, new_pkg_version, latest_geth_version) print("\n" + "=" * 60) print("Update completed successfully!") @@ -277,18 +255,12 @@ def main(): f.write(f"old_version={current_upstream}\n") f.write(f"new_version={latest_geth_version}\n") f.write(f"old_package_version={current_version}\n") - - # Get the new package version from mainnet - with open(mainnet_package_path, 'r') as pf: - updated_data = json.load(pf) - new_package_version = updated_data.get('version', '') - - f.write(f"new_package_version={new_package_version}\n") + f.write(f"new_package_version={new_pkg_version}\n") print("\nSummary:") print(f" Geth version: {current_upstream} -> {latest_geth_version}") - print(f" Package files updated: {len(package_files)}") - print(f" Docker-compose files updated: {len(compose_files)}") + print(f" Package version: {current_version} -> {new_pkg_version}") + print(f" Files updated: mainnet only") if __name__ == '__main__': diff --git a/.github/workflows/update_upstream.yml b/.github/workflows/update_upstream.yml index a73b895..4ebd0a4 100644 --- a/.github/workflows/update_upstream.yml +++ b/.github/workflows/update_upstream.yml @@ -48,13 +48,12 @@ jobs: ### Changes made: - - Updated `upstream` version in all - `dappnode_package-*.json` files - - Incremented `version` (patch level) in all - `dappnode_package-*.json` files - - Updated `image` tag in all `docker-compose-*.yml` files - - Updated `VERSION` build argument in all - `docker-compose-*.yml` files + - Updated `upstream` version in `dappnode_package-mainnet.json` + - Incremented `version` (patch level) in + `dappnode_package-mainnet.json` + - Updated `image` tag in `docker-compose-mainnet.yml` + - Updated `VERSION` build argument in + `docker-compose-mainnet.yml` ### Package version changes: From afd81be62f7434047fb27bb04716b34612232d2d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:54:36 +0000 Subject: [PATCH 6/8] Address code review feedback: improve error handling and version sanitization Co-authored-by: flisko <24591702+flisko@users.noreply.github.com> --- .github/scripts/update_upstream.py | 20 +++++++++++++++----- .github/workflows/update_upstream.yml | 10 +++++++++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/.github/scripts/update_upstream.py b/.github/scripts/update_upstream.py index 3d04350..e137d7e 100755 --- a/.github/scripts/update_upstream.py +++ b/.github/scripts/update_upstream.py @@ -46,10 +46,18 @@ def fetch_latest_geth_release() -> str: data = json.loads(response.read().decode()) tag_name = data.get('tag_name', '') print(f"Latest Geth release: {tag_name}") + + # Ensure the tag has 'v' prefix for consistency + if tag_name and not tag_name.startswith('v'): + tag_name = 'v' + tag_name + return tag_name except urllib.error.HTTPError as e: - print(f"Error fetching latest release: {e}") - print(f"Tip: Set GITHUB_TOKEN environment variable to avoid rate limiting") + if e.code == 403: + print(f"Error fetching latest release: Rate limit exceeded (HTTP 403)") + print(f"Tip: Ensure GITHUB_TOKEN is set and has sufficient quota") + else: + print(f"Error fetching latest release: HTTP {e.code} - {e.reason}") sys.exit(1) except Exception as e: print(f"Unexpected error: {e}") @@ -158,10 +166,12 @@ def update_docker_compose(file_path: Path, new_image_tag: str, new_version_arg: ) # Update VERSION build arg - # Pattern: VERSION: vX.Y.Z + # Pattern: VERSION: vX.Y.Z or VERSION: X.Y.Z + # Ensure the new version has 'v' prefix + version_with_v = new_version_arg if new_version_arg.startswith('v') else 'v' + new_version_arg content = re.sub( - r"(VERSION:\s+)v[\d.]+", - rf"\g<1>{new_version_arg}", + r"(VERSION:\s+)v?[\d.]+", + rf"\g<1>{version_with_v}", content ) diff --git a/.github/workflows/update_upstream.yml b/.github/workflows/update_upstream.yml index 4ebd0a4..abcdf57 100644 --- a/.github/workflows/update_upstream.yml +++ b/.github/workflows/update_upstream.yml @@ -29,6 +29,14 @@ jobs: run: | python .github/scripts/update_upstream.py + - name: Sanitize version for branch name + if: steps.update.outputs.update_available == 'true' + id: sanitize + run: | + # Remove 'v' prefix and replace any non-alphanumeric chars with hyphens + sanitized=$(echo "${{ steps.update.outputs.new_version }}" | sed 's/^v//; s/[^a-zA-Z0-9.]/-/g') + echo "branch_version=${sanitized}" >> $GITHUB_OUTPUT + - name: Create Pull Request if: steps.update.outputs.update_available == 'true' uses: peter-evans/create-pull-request@v6 @@ -69,7 +77,7 @@ jobs: [update-upstream workflow](.github/workflows/update_upstream.yml).* Please review and merge if the changes look correct. - branch: automated/update-geth-${{ steps.update.outputs.new_version }} + branch: automated/update-geth-${{ steps.sanitize.outputs.branch_version }} delete-branch: true labels: | automated From 3033b5a4dd3c301fc8be32a5597e4f4a68f224d1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 09:56:37 +0000 Subject: [PATCH 7/8] Add explicit permissions to workflow for security Co-authored-by: flisko <24591702+flisko@users.noreply.github.com> --- .github/workflows/update_upstream.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/update_upstream.yml b/.github/workflows/update_upstream.yml index abcdf57..0821a04 100644 --- a/.github/workflows/update_upstream.yml +++ b/.github/workflows/update_upstream.yml @@ -10,6 +10,9 @@ on: jobs: update-upstream: runs-on: ubuntu-22.04 + permissions: + contents: write + pull-requests: write steps: - name: Checkout repository From d75507154ca94fa072fc1b5a6d2f57bc286f8835 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 15 Jan 2026 10:19:41 +0000 Subject: [PATCH 8/8] Release ethchain-geth.public.dappnode.eth 10.0.78 Manifest hash: QmNV7gUuymhxvJ2SsQBAMjZkLqUeA14v4WJnumWpYE7QPH --- build/dappnode_package-mainnet.json | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/build/dappnode_package-mainnet.json b/build/dappnode_package-mainnet.json index c008254..8ebcb9a 100644 --- a/build/dappnode_package-mainnet.json +++ b/build/dappnode_package-mainnet.json @@ -10,8 +10,13 @@ "chain": "ethereum", "image": { "restart": "always", - "ports": ["30303:30303", "30303:30303/udp"], - "volumes": ["ethchain-geth:/root/.ethereum/ethchain-geth"], + "ports": [ + "30303:30303", + "30303:30303/udp" + ], + "volumes": [ + "ethchain-geth:/root/.ethereum/ethchain-geth" + ], "environment": [ "NETWORK=mainnet", "EXTRA_OPTS=--http.api eth,net,web3,txpool" @@ -25,4 +30,4 @@ "WS endpoint": "ws://ethchain-geth.my.ava.do:8546", "EE endpoint (http)": "http://ethchain-geth.my.ava.do:8551" } -} +} \ No newline at end of file