Auto-release updates #521
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: Auto-release updates | |
| on: | |
| schedule: | |
| - cron: "0 */6 * * *" # every 6 hours | |
| workflow_dispatch: | |
| permissions: | |
| contents: write | |
| pull-requests: write | |
| actions: write | |
| jobs: | |
| refresh: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: "20" | |
| # Use the existing chore/changelog-refresh branch (if any) as the | |
| # comparison baseline instead of main. This prevents re-triggering the | |
| # Mintlify agent every 6 hours for releases that were already processed | |
| # but whose PR has not been merged yet. When the PR is merged or closed | |
| # (with delete-branch: true below), the branch disappears and the next | |
| # release is detected normally. | |
| - name: Use existing changelog refresh branch as baseline | |
| run: | | |
| if git ls-remote --exit-code --heads origin chore/changelog-refresh >/dev/null 2>&1; then | |
| git fetch origin chore/changelog-refresh | |
| git checkout origin/chore/changelog-refresh -- docs/changelog/ || true | |
| echo "Baseline restored from chore/changelog-refresh branch." | |
| else | |
| echo "No chore/changelog-refresh branch; using main as baseline." | |
| fi | |
| - name: Regenerate docs/changelog from GitHub releases | |
| run: node scripts/generate-changelog.js | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| CHANGELOG_CACHE_TTL_SECONDS: "0" | |
| CHANGELOG_CHANGES_FILE: /tmp/changelog-changes.json | |
| - name: Read changelog changes | |
| id: changes | |
| run: | | |
| if [ ! -f /tmp/changelog-changes.json ] || [ "$(jq length /tmp/changelog-changes.json)" -eq 0 ]; then | |
| echo "No changelog changes detected." | |
| echo "pages=" >> "$GITHUB_OUTPUT" | |
| echo "has_sdk_updates=false" >> "$GITHUB_OUTPUT" | |
| exit 0 | |
| fi | |
| PAGES=$(jq -r '[.[].page] | join(" ")' /tmp/changelog-changes.json) | |
| echo "pages=${PAGES}" >> "$GITHUB_OUTPUT" | |
| # Read ALL latest versions from the cache file (updated by generate-changelog.js). | |
| # This ensures the pre-release workflow always gets every SDK's current version, | |
| # not just the ones whose changelog page happened to change in this run. | |
| CACHE=scripts/.changelog-cache.json | |
| echo "restate_version=$(jq -r '.repos.restate.releases[0].tag_name // empty' "$CACHE" | sed 's/^v//')" >> "$GITHUB_OUTPUT" | |
| echo "ts_version=$(jq -r '.repos["sdk-typescript"].releases[0].tag_name // empty' "$CACHE" | sed 's/^v//')" >> "$GITHUB_OUTPUT" | |
| echo "python_version=$(jq -r '.repos["sdk-python"].releases[0].tag_name // empty' "$CACHE" | sed 's/^v//')" >> "$GITHUB_OUTPUT" | |
| echo "java_version=$(jq -r '.repos["sdk-java"].releases[0].tag_name // empty' "$CACHE" | sed 's/^v//')" >> "$GITHUB_OUTPUT" | |
| echo "go_version=$(jq -r '.repos["sdk-go"].releases[0].tag_name // empty' "$CACHE" | sed 's/^v//')" >> "$GITHUB_OUTPUT" | |
| echo "rust_version=$(jq -r '.repos["sdk-rust"].releases[0].tag_name // empty' "$CACHE" | sed 's/^v//')" >> "$GITHUB_OUTPUT" | |
| # Check if any non-operator SDK page changed | |
| HAS=$(jq -r '[.[] | select(.page != "operator") | .latestVersion // empty | select(. != "")] | if length > 0 then "true" else "false" end' /tmp/changelog-changes.json) | |
| echo "has_sdk_updates=${HAS}" >> "$GITHUB_OUTPUT" | |
| echo "Changes detected:" | |
| jq -r '.[] | " \(.label) \(.latestVersion) — \(.latestReleaseUrl)"' /tmp/changelog-changes.json | |
| - name: Trigger pre-release workflow | |
| if: steps.changes.outputs.has_sdk_updates == 'true' | |
| continue-on-error: true | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| ARGS="" | |
| RESTATE_V="${{ steps.changes.outputs.restate_version }}" | |
| TS_V="${{ steps.changes.outputs.ts_version }}" | |
| PYTHON_V="${{ steps.changes.outputs.python_version }}" | |
| JAVA_V="${{ steps.changes.outputs.java_version }}" | |
| GO_V="${{ steps.changes.outputs.go_version }}" | |
| RUST_V="${{ steps.changes.outputs.rust_version }}" | |
| [ -n "$RESTATE_V" ] && ARGS="$ARGS -f restateVersion=$RESTATE_V" | |
| [ -n "$TS_V" ] && ARGS="$ARGS -f sdkTypescriptVersion=$TS_V" | |
| [ -n "$PYTHON_V" ] && ARGS="$ARGS -f sdkPythonVersion=$PYTHON_V" | |
| [ -n "$JAVA_V" ] && ARGS="$ARGS -f sdkJavaVersion=$JAVA_V" | |
| [ -n "$GO_V" ] && ARGS="$ARGS -f sdkGoVersion=$GO_V" | |
| [ -n "$RUST_V" ] && ARGS="$ARGS -f sdkRustVersion=$RUST_V" | |
| echo "Dispatching pre-release workflow with:${ARGS}" | |
| gh workflow run pre-release.yml $ARGS | |
| sleep 5 | |
| RUN_URL=$(gh run list --workflow pre-release.yml --limit 1 --json url --jq '.[0].url') | |
| echo "Pre-release workflow run: ${RUN_URL}" | |
| - name: Open or update changelog refresh PR | |
| uses: peter-evans/create-pull-request@v6 | |
| with: | |
| commit-message: "chore: refresh changelog from GitHub releases" | |
| title: "chore: refresh changelog" | |
| body: | | |
| Automated changelog refresh from GitHub releases across the | |
| restatedev org. Review the rendered `docs/changelog.mdx` and merge | |
| when the output looks right. | |
| branch: chore/changelog-refresh | |
| delete-branch: true | |
| add-paths: docs/changelog | |
| reviewers: gvdongen | |
| labels: | | |
| automated | |
| changelog |