check_dependency_updates #8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |