Skip to content

check_dependency_updates #8

check_dependency_updates

check_dependency_updates #8

name: check_dependency_updates
on:
schedule:
- cron: "0 0 15 */2 *"
workflow_dispatch:
jobs:
check-repository:
runs-on: ubuntu-latest
outputs:
is_remote_main: ${{ steps.check.outputs.is_remote_main }}
steps:
- name: Check repository
id: check
run: |
if [ "$GITHUB_REPOSITORY" = "activist-org/activist" ]; then
echo "is_remote_main=true" >> "$GITHUB_OUTPUT"
else
echo "is_remote_main=false" >> "$GITHUB_OUTPUT"
echo "::warning::This workflow should only run in activist-org/activist repository."
fi
update_dependencies:
needs: check-repository
if: needs.check-repository.outputs.is_remote_main == 'true'
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v6
- name: Set up Node Environment
uses: actions/setup-node@v5
with:
node-version: 20
- name: Initialize Report
run: |
echo "# Dependency Update Report $(date '+%B %d, %Y') 🤖📝" > reports.md
echo "## Available Update ⚙️" >> reports.md
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.12"
- name: Setup Yarn
working-directory: ./frontend
continue-on-error: true
run: |
corepack enable
corepack prepare yarn@4.6.0 --activate
- name: Install Frontend Dependencies
id: install-frontend
working-directory: ./frontend
continue-on-error: true
run: |
rm -rf .yarn .pnp.* yarn.lock node_modules
yarn set version 4.6.0
yarn install --no-immutable
- name: Update Frontend Dependencies
id: frontend-updates
working-directory: ./frontend
continue-on-error: true
run: |
cp package.json package.old.json
npm install -g npm-check-updates
cat > compare_versions.js << 'EOF'
#!/usr/bin/env node
const oldPkg = require('./package.old.json');
const newPkg = require('./package.json');
const allDeps = new Set([
...Object.keys(oldPkg.dependencies || {}),
...Object.keys(oldPkg.devDependencies || {}),
...Object.keys(newPkg.dependencies || {}),
...Object.keys(newPkg.devDependencies || {})
]);
const getVersion = (pkg, name) => {
return (pkg.dependencies && pkg.dependencies[name])
|| (pkg.devDependencies && pkg.devDependencies[name])
|| 'not present';
};
for (const dep of Array.from(allDeps).sort()) {
const oldVersion = getVersion(oldPkg, dep);
const newVersion = getVersion(newPkg, dep);
if (oldVersion !== newVersion) {
console.log(`- ${dep}: ${oldVersion} → ${newVersion}`);
}
}
EOF
chmod +x compare_versions.js
ncu -u
echo -e "\n### Dependencies" >> ../reports.md
echo -e "| Package Name | Old Version | New Available Version | Type |" >> ../reports.md
echo -e "|--------------|-------------|-----------------------|------|" >> ../reports.md
node compare_versions.js | sed 's/- \(.*\): \(.*\) → \(.*\)/| \1 | \2 | \3 | Frontend |/' >> ../reports.md || echo "No frontend changes found" >> ../reports.md
- name: Create Python Virtual Environment
id: setup-venv
working-directory: ./backend
continue-on-error: true
run: python -m venv .venv
- name: Install Backend Dependencies
id: install-backend
working-directory: ./backend
continue-on-error: true
run: |
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements-dev.txt
- name: Update Backend Dependencies
id: backend-updates
working-directory: ./backend
continue-on-error: true
run: |
source .venv/bin/activate
echo PATH=$PATH >> $GITHUB_ENV
cp requirements.txt requirements.old.txt
pip install -U pip-tools
pip-compile --upgrade requirements.in
cat > compare_versions.py << 'EOF'
import re
def parse_req_file(filename):
deps = {}
with open(filename, "r") as f:
for line in f:
line = line.strip()
if line and not line.startswith("#") and "==" in line:
parts = re.split("==|>=|<=", line, 1)
if len(parts) == 2:
name = parts[0].strip()
version = parts[1].strip()
deps[name] = version
return deps
old_deps = parse_req_file("requirements.old.txt")
new_deps = parse_req_file("requirements.txt")
all_deps = set(list(old_deps.keys()) + list(new_deps.keys()))
for dep in sorted(all_deps):
old_ver = old_deps.get(dep, "not present")
new_ver = new_deps.get(dep, "not present")
if old_ver != new_ver:
print(f"| {dep} | {old_ver} | {new_ver} | Backend |")
EOF
python compare_versions.py >> ../reports.md || echo "No backend changes found" >> ../reports.md
- name: Add Test Results Header
id: add-test-results-header
continue-on-error: true
run: |
source .venv/bin/activate
echo -e "\n## Test Results" >> ../reports.md
- name: Run Backend Tests
id: backend-tests
working-directory: ./backend
continue-on-error: true
run: |
# Note: Don't check formatting.
# echo -e "\n### Ruff Format Results" >> ../reports.md
# echo "\`\`\`" >> ../reports.md
# ruff format . 2>&1 | tee -a ../reports.md || true
# echo "\`\`\`" >> ../reports.md
echo -e "\n### Ruff Lint Results" >> ../reports.md
echo "\`\`\`" >> ../reports.md
ruff check . 2>&1 | tee -a ../reports.md || true
echo "\`\`\`" >> ../reports.md
echo -e "\n### mypy Results" >> ../reports.md
echo "\`\`\`" >> ../reports.md
mypy . --config-file pyproject.toml 2>&1 | tee -a ../reports.md || true
echo "\`\`\`" >> ../reports.md
echo -e "\n### Pytest Results" >> ../reports.md
echo "\`\`\`" >> ../reports.md
pytest --cov=. --cov-report=term-missing --cov-fail-under=85 --cov-config=pyproject.toml -vv 2>&1 | tee -a ../reports.md || true
echo "\`\`\`" >> ../reports.md
- name: Run Frontend Tests
id: frontend-tests
working-directory: ./frontend
continue-on-error: true
run: |
# Note: Don't check formatting.
# echo "compare_versions.js" >> ../.prettierignore
# echo -e "\n### Prettier Results" >> ../reports.md
# echo "\`\`\`" >> ../reports.md
# yarn prettier . --check --config ../.prettierrc --ignore-path ../.prettierignore 2>&1 | tee -a ../reports.md || true
# echo "\`\`\`" >> ../reports.md
echo -e "\n### ESLint Results" >> ../reports.md
echo "\`\`\`" >> ../reports.md
yarn lint 2>&1 | tee -a ../reports.md || true
echo "\`\`\`" >> ../reports.md
echo -e "\n### Type Check Results" >> ../reports.md
echo "\`\`\`" >> ../reports.md
yarn typecheck 2>&1 | tee -a ../reports.md || true
echo "\`\`\`" >> ../reports.md
echo -e "\n### Vitest Results" >> ../reports.md
echo "\`\`\`" >> ../reports.md
yarn test --silent 2>&1 | tee -a ../reports.md || true
echo "\`\`\`" >> ../reports.md
- name: Set date
id: date
run: echo "REPORT_DATE=$(date '+%B %d, %Y')" >> $GITHUB_ENV
- name: Create GitHub Issue
if: always()
uses: peter-evans/create-issue-from-file@v4
with:
title: "Dependency Update Report - ${{ env.REPORT_DATE }} 🤖"
content-filepath: reports.md
labels: |
dependencies
help wanted
good first issue