Check for Updates #34
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 for Updates | |
| on: | |
| schedule: | |
| # Run daily at 2 AM UTC | |
| - cron: '0 2 * * *' | |
| workflow_dispatch: | |
| inputs: | |
| force_update: | |
| description: 'Force update even if versions match' | |
| type: boolean | |
| default: false | |
| permissions: | |
| contents: write | |
| pull-requests: write | |
| jobs: | |
| check-versions: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Check latest versions | |
| id: check | |
| run: | | |
| set -euo pipefail | |
| # --- Read current versions from versions.json --- | |
| CURRENT_CLI=$(jq -r '."claude-code-cli"' versions.json) | |
| CURRENT_SDK=$(jq -r '."claude-agent-sdk-cli"' versions.json) | |
| CURRENT_PYTHON=$(jq -r '."claude-agent-sdk-python"' versions.json) | |
| echo "Current Claude Code CLI: $CURRENT_CLI" | |
| echo "Current Claude Agent SDK: $CURRENT_SDK" | |
| echo "Current Python SDK: $CURRENT_PYTHON" | |
| # --- Fetch latest versions from registries --- | |
| LATEST_CLI=$(curl -sf https://registry.npmjs.org/@anthropic-ai/claude-code/latest | jq -r '.version') | |
| LATEST_SDK=$(curl -sf https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk/latest | jq -r '.version') | |
| LATEST_PYTHON=$(curl -sf https://pypi.org/pypi/claude-agent-sdk/json | jq -r '.info.version') | |
| echo "Latest Claude Code CLI: $LATEST_CLI" | |
| echo "Latest Claude Agent SDK: $LATEST_SDK" | |
| echo "Latest Python SDK: $LATEST_PYTHON" | |
| # --- Determine what changed --- | |
| NPM_CHANGED=false | |
| PYTHON_CHANGED=false | |
| if [[ "$CURRENT_CLI" != "$LATEST_CLI" ]] || [[ "$CURRENT_SDK" != "$LATEST_SDK" ]]; then | |
| NPM_CHANGED=true | |
| fi | |
| if [[ "$CURRENT_PYTHON" != "$LATEST_PYTHON" ]]; then | |
| PYTHON_CHANGED=true | |
| fi | |
| # Force flag overrides both | |
| if [[ "${{ github.event.inputs.force_update }}" == "true" ]]; then | |
| NPM_CHANGED=true | |
| PYTHON_CHANGED=true | |
| fi | |
| UPDATE_NEEDED=false | |
| if [[ "$NPM_CHANGED" == "true" ]] || [[ "$PYTHON_CHANGED" == "true" ]]; then | |
| UPDATE_NEEDED=true | |
| fi | |
| echo "npm_changed=$NPM_CHANGED" | tee -a "$GITHUB_OUTPUT" | |
| echo "python_changed=$PYTHON_CHANGED" | tee -a "$GITHUB_OUTPUT" | |
| echo "update_needed=$UPDATE_NEEDED" | tee -a "$GITHUB_OUTPUT" | |
| echo "cli_version=$LATEST_CLI" | tee -a "$GITHUB_OUTPUT" | |
| echo "sdk_version=$LATEST_SDK" | tee -a "$GITHUB_OUTPUT" | |
| echo "python_version=$LATEST_PYTHON" | tee -a "$GITHUB_OUTPUT" | |
| - name: Update versions and Dockerfiles | |
| if: steps.check.outputs.update_needed == 'true' | |
| env: | |
| NPM_CHANGED: ${{ steps.check.outputs.npm_changed }} | |
| PYTHON_CHANGED: ${{ steps.check.outputs.python_changed }} | |
| CLI_VERSION: ${{ steps.check.outputs.cli_version }} | |
| SDK_VERSION: ${{ steps.check.outputs.sdk_version }} | |
| PYTHON_VERSION: ${{ steps.check.outputs.python_version }} | |
| run: | | |
| set -euo pipefail | |
| TODAY=$(date -u +%Y-%m-%d) | |
| # --- Update versions.json with all latest versions + today's date --- | |
| jq --arg cli "$CLI_VERSION" \ | |
| --arg sdk "$SDK_VERSION" \ | |
| --arg py "$PYTHON_VERSION" \ | |
| --arg date "$TODAY" \ | |
| ' | |
| .["claude-code-cli"] = $cli | | |
| .["claude-agent-sdk-cli"] = $sdk | | |
| .["claude-agent-sdk-python"] = $py | | |
| .last_updated = $date | | |
| .last_check = $date | |
| ' versions.json > versions.json.tmp && mv versions.json.tmp versions.json | |
| echo "--- Updated versions.json ---" | |
| cat versions.json | |
| # --- Update Dockerfile comments (only affected files) --- | |
| if [[ "$NPM_CHANGED" == "true" ]]; then | |
| for f in Dockerfile.typescript Dockerfile.alpine; do | |
| echo "Updating $f (npm packages)" | |
| sed -i "s|^# Build Date: .*|# Build Date: $TODAY|" "$f" | |
| sed -i "s|^# Claude Code CLI: @anthropic-ai/claude-code ~v.*|# Claude Code CLI: @anthropic-ai/claude-code ~v${CLI_VERSION}|" "$f" | |
| sed -i "s|^# Claude Agent SDK: @anthropic-ai/claude-agent-sdk ~v.*|# Claude Agent SDK: @anthropic-ai/claude-agent-sdk ~v${SDK_VERSION}|" "$f" | |
| done | |
| fi | |
| if [[ "$PYTHON_CHANGED" == "true" ]]; then | |
| for f in Dockerfile Dockerfile.alpine-python; do | |
| echo "Updating $f (python package)" | |
| sed -i "s|^# Build Date: .*|# Build Date: $TODAY|" "$f" | |
| sed -i "s|^# Python SDK: claude-agent-sdk ~v.*|# Python SDK: claude-agent-sdk ~v${PYTHON_VERSION}|" "$f" | |
| done | |
| fi | |
| - name: Create pull request | |
| if: steps.check.outputs.update_needed == 'true' | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| NPM_CHANGED: ${{ steps.check.outputs.npm_changed }} | |
| PYTHON_CHANGED: ${{ steps.check.outputs.python_changed }} | |
| CLI_VERSION: ${{ steps.check.outputs.cli_version }} | |
| SDK_VERSION: ${{ steps.check.outputs.sdk_version }} | |
| PYTHON_VERSION: ${{ steps.check.outputs.python_version }} | |
| run: | | |
| set -euo pipefail | |
| TODAY=$(date -u +%Y-%m-%d) | |
| BRANCH="auto-update/sdk-${TODAY}" | |
| # --- Configure git identity --- | |
| git config user.name "github-actions[bot]" | |
| git config user.email "github-actions[bot]@users.noreply.github.com" | |
| # --- Delete remote branch if it already exists (same-day re-runs) --- | |
| git push origin --delete "$BRANCH" 2>/dev/null || true | |
| # --- Create branch and commit --- | |
| git checkout -b "$BRANCH" | |
| git add versions.json Dockerfile* | |
| # Build a meaningful commit message | |
| COMMIT_LINES="chore: update SDK versions ($TODAY)" | |
| COMMIT_LINES+=$'\n' | |
| if [[ "$NPM_CHANGED" == "true" ]]; then | |
| COMMIT_LINES+=$'\n'"- Claude Code CLI: v${CLI_VERSION}" | |
| COMMIT_LINES+=$'\n'"- Claude Agent SDK: v${SDK_VERSION}" | |
| fi | |
| if [[ "$PYTHON_CHANGED" == "true" ]]; then | |
| COMMIT_LINES+=$'\n'"- Python SDK: v${PYTHON_VERSION}" | |
| fi | |
| git commit -m "$COMMIT_LINES" | |
| git push -u origin "$BRANCH" | |
| # --- Build PR body --- | |
| BODY="## Automated SDK Version Update" | |
| BODY+=$'\n\n'"**Date:** ${TODAY}" | |
| BODY+=$'\n\n'"### Changes" | |
| if [[ "$NPM_CHANGED" == "true" ]]; then | |
| BODY+=$'\n'"- Claude Code CLI updated to v${CLI_VERSION}" | |
| BODY+=$'\n'"- Claude Agent SDK updated to v${SDK_VERSION}" | |
| BODY+=$'\n'"- Updated Dockerfile.typescript and Dockerfile.alpine" | |
| fi | |
| if [[ "$PYTHON_CHANGED" == "true" ]]; then | |
| BODY+=$'\n'"- Python SDK updated to v${PYTHON_VERSION}" | |
| BODY+=$'\n'"- Updated Dockerfile and Dockerfile.alpine-python" | |
| fi | |
| BODY+=$'\n\n'"### Automated actions" | |
| BODY+=$'\n'"- Updated \`versions.json\` with latest versions" | |
| BODY+=$'\n'"- Updated version comments in affected Dockerfiles" | |
| BODY+=$'\n'"- Container images will be rebuilt automatically upon merge" | |
| # --- Ensure labels exist --- | |
| gh label create "dependencies" --description "Dependency version updates" --color "0366d6" 2>/dev/null || true | |
| gh label create "automated" --description "Automated pull requests" --color "ededed" 2>/dev/null || true | |
| # --- Create PR --- | |
| PR_URL=$(gh pr create \ | |
| --title "chore: update SDK versions (${TODAY})" \ | |
| --body "$BODY" \ | |
| --label "dependencies,automated" \ | |
| --base main) | |
| echo "Created PR: $PR_URL" | |
| # --- Enable auto-merge --- | |
| gh pr merge --auto --squash "$PR_URL" | |
| echo "Auto-merge enabled for $PR_URL" |