From 548232afe28245d45fcb8b5f7bdad4df98a8a58b Mon Sep 17 00:00:00 2001 From: copilotcoder Date: Wed, 8 Jul 2026 17:19:19 -0400 Subject: [PATCH] Run Renovate via container instead of npm install --- .gitea/workflows/renovate.yml | 223 +++++++--------------------------- 1 file changed, 45 insertions(+), 178 deletions(-) diff --git a/.gitea/workflows/renovate.yml b/.gitea/workflows/renovate.yml index 012559a..20993d7 100644 --- a/.gitea/workflows/renovate.yml +++ b/.gitea/workflows/renovate.yml @@ -20,190 +20,44 @@ jobs: timeout-minutes: 90 steps: - - name: Setup Node.js for Renovate + - name: Prepare Renovate container image + env: + RENOVATE_IMAGE: ghcr.io/renovatebot/renovate:41 run: | - echo "=== Setting up Node.js 24 for Renovate ===" + set -euo pipefail - # Check existing Node.js - if command -v node &> /dev/null; then - echo "Current Node.js version: $(node --version)" - fi - if command -v npm &> /dev/null; then - echo "Current npm version: $(npm --version)" - fi + retry_cmd() { + attempts="${1:-3}" + backoff="${2:-10}" + shift 2 - # Aggressive cleanup of all Node.js/npm installations - echo "Performing complete Node.js cleanup..." - - # Stop any Node.js processes - sudo pkill -f node || true - - # Remove all package-managed Node.js installations - sudo apt-get remove -y --purge nodejs npm node || true - sudo apt-get autoremove -y --purge || true - - # Remove all manual installations and caches - sudo rm -rf /usr/local/bin/node* /usr/local/bin/npm* || true - sudo rm -rf /usr/local/lib/node* /usr/local/include/node* || true - sudo rm -rf ~/.npm ~/.nvm ~/.node* || true - sudo rm -rf /root/.npm /root/.nvm /root/.node* || true - sudo rm -rf /usr/share/nodejs || true - sudo rm -rf /etc/apt/sources.list.d/nodesource.list* || true - - # Clear npm environment variables that might conflict - unset npm_config_prefix npm_config_cache npm_config_globalconfig npm_config_init_module || true - - echo "✓ Cleanup completed" - - # Install Node.js 24 from NodeSource with error handling - echo "Installing Node.js 24..." - - # Remove any existing NodeSource repository - sudo rm -f /etc/apt/sources.list.d/nodesource.list || true - - # Add NodeSource repository - curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash - - - # Install with DEBIAN_FRONTEND to avoid interactive prompts - echo "Installing Node.js package..." - sudo DEBIAN_FRONTEND=noninteractive apt-get install -y nodejs - - # Verify and fix installation - echo "=== Verifying Node.js Installation ===" - - # Check Node.js - if command -v node &> /dev/null; then - NODE_VERSION=$(node --version) - echo "✓ Node.js installed: $NODE_VERSION" - else - echo "❌ Node.js installation failed" - exit 1 - fi - - # Check npm and fix if needed - if command -v npm &> /dev/null && npm --version &> /dev/null; then - NPM_VERSION=$(npm --version) - echo "✓ npm working: $NPM_VERSION" - else - echo "⚠️ npm not working properly, reinstalling..." - - # Method 1: Try to fix npm with the bundled version - if [ -f "/usr/bin/node" ] && [ -f "/usr/lib/node_modules/npm/bin/npm-cli.js" ]; then - echo "Using bundled npm..." - sudo ln -sf /usr/lib/node_modules/npm/bin/npm-cli.js /usr/bin/npm || true - sudo chmod +x /usr/bin/npm || true - fi - - # Method 2: If that doesn't work, reinstall npm manually - if ! npm --version &> /dev/null; then - echo "Manual npm installation..." - curl -L https://www.npmjs.com/install.sh | sudo sh - fi - - # Method 3: Last resort - use npx to bootstrap npm - if ! npm --version &> /dev/null; then - echo "Using node to run npm directly..." - # Create npm wrapper script - echo '#!/bin/bash' | sudo tee /usr/bin/npm > /dev/null - echo 'exec /usr/bin/node /usr/lib/node_modules/npm/bin/npm-cli.js "$@"' | sudo tee -a /usr/bin/npm > /dev/null - sudo chmod +x /usr/bin/npm - fi - - # Final verification - if npm --version &> /dev/null; then - echo "✓ npm recovered successfully: $(npm --version)" - else - echo "❌ npm recovery failed" - exit 1 - fi - fi - - # Test npm basic functionality - echo "Testing npm functionality..." - if npm config get registry &> /dev/null; then - echo "✓ npm configuration accessible" - else - echo "⚠️ npm configuration issues, but continuing..." - fi - - # Check version compatibility for Renovate - NODE_VERSION=$(node --version | cut -d'v' -f2) - echo "=== Version Compatibility Check ===" - echo "Node.js version: $NODE_VERSION" - - if [[ $(echo "$NODE_VERSION 24.10.0" | awk '{print ($1 >= $2)}') == 1 ]]; then - echo "✅ Node.js version $NODE_VERSION meets Renovate latest requirements" - echo "RENOVATE_VERSION=latest" >> $GITHUB_ENV - else - echo "⚠️ Node.js version $NODE_VERSION - will use compatible Renovate version" - echo "RENOVATE_VERSION=40.3.2" >> $GITHUB_ENV - fi - - - name: Install Renovate - run: | - echo "=== Installing Renovate ===" - - # Set npm configuration for memory efficiency - npm config set fund false - npm config set audit false - npm config set progress false - npm config set maxsockets 3 - npm config set fetch-retry-mintimeout 2000 - npm config set fetch-retry-maxtimeout 10000 - - # Use the version determined in previous step - echo "Installing Renovate version: $RENOVATE_VERSION" - - # Check available memory - echo "Memory info:" - free -h || echo "free command not available" - - # Install with retry logic and memory-efficient options - for i in 1 2 3; do - echo "Renovate installation attempt $i/3..." - - # Clear npm cache and temp files - npm cache clean --force || true - rm -rf /tmp/npm-* || true - - # Use memory-efficient installation with longer timeout - if NODE_OPTIONS="--max-old-space-size=2048" timeout 600 npm install -g "renovate@$RENOVATE_VERSION" \ - --no-audit \ - --no-fund \ - --no-optional \ - --production \ - --maxsockets=3 \ - --fetch-timeout=30000; then - echo "✓ Renovate installation successful on attempt $i" - break - else - exit_code=$? - echo "⚠️ Renovate installation attempt $i failed (exit code: $exit_code)" - - # Check if it was killed due to memory - if [ $exit_code -eq 137 ] || [ $exit_code -eq 143 ]; then - echo " Process was killed (likely out of memory)" + attempt=1 + while [ "${attempt}" -le "${attempts}" ]; do + if "$@"; then + return 0 fi - if [ $i -eq 3 ]; then - echo "❌ All Renovate installation attempts failed" - echo "Debugging information:" - echo "Node.js version: $(node --version)" - echo "npm version: $(npm --version)" - echo "Memory status:" - free -h || echo "Memory info unavailable" - echo "npm config:" - npm config list || echo "npm config failed" - exit 1 + if [ "${attempt}" -lt "${attempts}" ]; then + sleep_seconds=$((backoff * attempt)) + echo "Command failed (attempt ${attempt}/${attempts}): $*" + echo "Retrying in ${sleep_seconds}s" + sleep "${sleep_seconds}" fi - echo "Waiting 30 seconds before retry..." - sleep 30 - fi - done + attempt=$((attempt + 1)) + done - # Verify Renovate installation - echo "✓ Renovate version: $(renovate --version)" - echo "✓ Renovate location: $(which renovate)" + echo "Command failed after ${attempts} attempts: $*" + return 1 + } + + echo "=== Preparing Renovate container ===" + echo "Using Renovate image: ${RENOVATE_IMAGE}" + free -h || true + + retry_cmd 3 15 docker pull "${RENOVATE_IMAGE}" + docker run --rm "${RENOVATE_IMAGE}" --version + + echo "RENOVATE_IMAGE=${RENOVATE_IMAGE}" >> "$GITHUB_ENV" - name: Configure Renovate for Gitea run: | @@ -330,7 +184,20 @@ jobs: unset RENOVATE_DRY_RUN fi - renovate --platform "${RENOVATE_PLATFORM}" --endpoint "${RENOVATE_ENDPOINT}" DarkHelm.org/plex-playlist + docker run --rm \ + -v "$PWD:/work" \ + -w /work \ + -e LOG_LEVEL \ + -e NODE_TLS_REJECT_UNAUTHORIZED \ + -e RENOVATE_TOKEN \ + -e RENOVATE_PLATFORM \ + -e RENOVATE_ENDPOINT \ + -e RENOVATE_DRY_RUN \ + -e RENOVATE_CONFIG_FILE=/work/renovate-config.js \ + "${RENOVATE_IMAGE}" \ + --platform "${RENOVATE_PLATFORM}" \ + --endpoint "${RENOVATE_ENDPOINT}" \ + DarkHelm.org/plex-playlist | tee /tmp/renovate.log echo "✓ Renovate execution completed"