Skip to content

Update workflow to use default inputs on push and fix step summary si… #3

Update workflow to use default inputs on push and fix step summary si…

Update workflow to use default inputs on push and fix step summary si… #3

name: Compare Dependencies
on:
workflow_dispatch:
inputs:
package:
description: 'Maven package (e.g., org.springframework.boot:spring-boot-dependencies)'
required: true
default: 'org.springframework.boot:spring-boot-dependencies'
type: string
version:
description: 'Version to compare against (e.g., 3.5.9)'
required: true
default: '3.5.9'
type: string
push:
branches: [ feature/add-compare-dependencies-workflow ]
jobs:
compare:
permissions:
contents: read
issues: write
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'zulu'
- name: Cache Maven dependencies
uses: actions/cache@v4
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
- name: Run Maven versions:compare-dependencies
id: compare
run: |
mvn versions:compare-dependencies -DremotePom=${{ inputs.package || 'org.springframework.boot:spring-boot-dependencies' }}:${{ inputs.version || '3.5.9' }} > compare-output.txt 2>&1 || true
cat compare-output.txt
- name: Parse and generate summary
id: summary
env:
PACKAGE: ${{ inputs.package || 'org.springframework.boot:spring-boot-dependencies' }}
VERSION: ${{ inputs.version || '3.5.9' }}
run: |
python3 << 'EOF'
import re
import os
downgrades = set()
upgrades = []
notable_upgrades = []
# Notable upgrade patterns (major version changes, security updates, etc.)
notable_patterns = [
r'spring-boot',
r'spring-framework',
r'spring-security',
r'hibernate',
r'junit',
r'mockito',
r'log4j',
r'jackson',
r'netty',
r'tomcat',
r'jetty',
]
def is_notable(dep_name):
dep_lower = dep_name.lower()
return any(pattern in dep_lower for pattern in notable_patterns)
def compare_versions(old_ver, new_ver):
"""Compare two version strings. Returns -1 if downgrade, 1 if upgrade, 0 if same."""
old_parts = re.findall(r'\d+', old_ver)
new_parts = re.findall(r'\d+', new_ver)
if not old_parts or not new_parts:
return 0
for i in range(min(len(old_parts), len(new_parts))):
old_num = int(old_parts[i])
new_num = int(new_parts[i])
if new_num < old_num:
return -1
elif new_num > old_num:
return 1
# If all compared parts are equal, check minor version
if len(old_parts) >= 2 and len(new_parts) >= 2:
if int(new_parts[1]) < int(old_parts[1]):
return -1
elif int(new_parts[1]) > int(old_parts[1]):
return 1
return 0
with open('compare-output.txt', 'r') as f:
for line in f:
if '[INFO] ' in line and ' -> ' in line:
match = re.search(r'\[INFO\]\s+([^\s].*?)\s+\.+\s+([0-9.]+[^\s]*)\s+->\s+([0-9.]+[^\s]*)', line)
if match:
dep = match.group(1).strip()
old_ver = match.group(2).strip()
new_ver = match.group(3).strip()
comparison = compare_versions(old_ver, new_ver)
if comparison < 0:
downgrades.add(f'{dep}: {old_ver} -> {new_ver}')
elif comparison > 0:
upgrade_entry = f'{dep}: {old_ver} -> {new_ver}'
upgrades.append(upgrade_entry)
if is_notable(dep):
notable_upgrades.append(upgrade_entry)
# Generate summary
package = os.environ.get('PACKAGE', 'unknown')
version = os.environ.get('VERSION', 'unknown')
summary_lines = []
summary_lines.append("# Dependency Comparison Summary")
summary_lines.append(f"\n**Comparing against:** `{package}:{version}`\n")
if downgrades:
summary_lines.append("## ⚠️ DOWNGRADES (Most Important)")
summary_lines.append("")
for d in sorted(downgrades):
summary_lines.append(f"- `{d}`")
summary_lines.append(f"\n**Total downgrades:** {len(downgrades)}\n")
else:
summary_lines.append("## ✅ No Downgrades Found\n")
if notable_upgrades:
summary_lines.append("## 📈 Notable Upgrades")
summary_lines.append("")
for u in sorted(notable_upgrades):
summary_lines.append(f"- `{u}`")
summary_lines.append(f"\n**Total notable upgrades:** {len(notable_upgrades)}\n")
if upgrades:
summary_lines.append("## 📦 All Upgrades")
summary_lines.append(f"\n**Total upgrades:** {len(upgrades)}\n")
summary_lines.append("<details>")
summary_lines.append("<summary>Click to expand full upgrade list</summary>")
summary_lines.append("")
for u in sorted(upgrades):
summary_lines.append(f"- `{u}`")
summary_lines.append("</details>")
summary = "\n".join(summary_lines)
# Write full summary to file
with open('summary.md', 'w') as f:
f.write(summary)
# Create truncated summary for step summary (GitHub limit: 1024k)
# Only include downgrades and limited notable upgrades
step_summary_lines = []
step_summary_lines.append("# Dependency Comparison Summary")
step_summary_lines.append(f"\n**Comparing against:** `{package}:{version}`\n")
if downgrades:
step_summary_lines.append("## ⚠️ DOWNGRADES (Most Important)")
step_summary_lines.append("")
for d in sorted(downgrades):
step_summary_lines.append(f"- `{d}`")
step_summary_lines.append(f"\n**Total downgrades:** {len(downgrades)}\n")
else:
step_summary_lines.append("## ✅ No Downgrades Found\n")
if notable_upgrades:
step_summary_lines.append("## 📈 Notable Upgrades (First 50)")
step_summary_lines.append("")
unique_notable = sorted(set(notable_upgrades))[:50]
for u in unique_notable:
step_summary_lines.append(f"- `{u}`")
total_unique = len(set(notable_upgrades))
if total_unique > 50:
step_summary_lines.append(f"\n... and {total_unique - 50} more notable upgrades")
step_summary_lines.append(f"\n**Total notable upgrades:** {total_unique}\n")
step_summary_lines.append("---\n")
step_summary_lines.append("📦 **Full details available in the workflow artifact:** `dependency-comparison-summary`")
step_summary = "\n".join(step_summary_lines)
# Write truncated summary for step summary
with open('step-summary.md', 'w') as f:
f.write(step_summary)
# Also print to console
print("\n" + "="*80)
print(summary)
print("="*80)
EOF
- name: Display summary
run: |
cat summary.md
- name: Add job summary
run: |
cat step-summary.md >> $GITHUB_STEP_SUMMARY
- name: Comment on workflow (if PR)
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const summary = fs.readFileSync('summary.md', 'utf8');
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: summary
});
- name: Upload summary as artifact
uses: actions/upload-artifact@v4
with:
name: dependency-comparison-summary
path: summary.md
retention-days: 30