Repository navigation
Agentic Maintenance #2937
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
| # This file was automatically generated by pkg/workflow/maintenance_workflow.go (v0.91.6). DO NOT EDIT. To debug this workflow, load the skill at https://github.com/github/gh-aw/blob/main/debug.md | |
| # | |
| # ___ _ _ | |
| # / _ \ | | (_) | |
| # | |_| | __ _ ___ _ __ | |_ _ ___ | |
| # | _ |/ _` |/ _ \ '_ \| __| |/ __| | |
| # | | | | (_| | __/ | | | |_| | (__ | |
| # \_| |_/\__, |\___|_| |_|\__|_|\___| | |
| # __/ | | |
| # _ _ |___/ | |
| # | | | | / _| | | |
| # | | | | ___ _ __ _ __| |_| | _____ ____ | |
| # | |/\| |/ _ \ '__| |/ /| _| |/ _ \ \ /\ / / ___| | |
| # \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ | |
| # \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ | |
| # | |
| # | |
| # To regenerate this workflow, run: | |
| # gh aw compile | |
| # Not all edits will cause changes to this file. | |
| # | |
| # For more information: https://github.github.com/gh-aw/introduction/overview/ | |
| # | |
| # This file defines the generated agentic maintenance workflow for this repository. | |
| # It runs scheduled cleanup for expiring safe outputs and supports manual maintenance operations. | |
| # | |
| # This workflow is generated automatically when workflows use expiring safe outputs, | |
| # when workflows declare compaction-enabled ledgers (tools.ledger), or when repository | |
| # maintenance features are enabled in .github/workflows/aw.json. | |
| # | |
| # To disable maintenance workflow generation, set in .github/workflows/aw.json: | |
| # {"maintenance": false} | |
| # | |
| # Agentic maintenance docs: | |
| # https://github.github.com/gh-aw/reference/ephemerals/#manual-maintenance-operations | |
| # | |
| name: Agentic Maintenance | |
| on: | |
| schedule: | |
| - cron: "37 */2 * * *" # Every 2 hours (based on minimum expires: 1 days) | |
| workflow_dispatch: | |
| inputs: | |
| operation: | |
| description: 'Optional maintenance operation to run' | |
| required: false | |
| type: choice | |
| default: 'none' | |
| options: | |
| - 'none' | |
| - 'disable' | |
| - 'enable' | |
| - 'update' | |
| - 'upgrade' | |
| - 'safe_outputs' | |
| - 'create_labels' | |
| - 'activity_report' | |
| - 'close_agentic_workflows_issues' | |
| - 'clean_cache_memories' | |
| - 'update_pull_request_branches' | |
| - 'validate' | |
| - 'forecast' | |
| run_url: | |
| description: 'Run URL or run ID to replay safe outputs from (e.g. https://github.com/owner/repo/actions/runs/12345 or 12345). Required when operation is safe_outputs.' | |
| required: false | |
| type: string | |
| default: '' | |
| workflow_call: | |
| inputs: | |
| operation: | |
| description: 'Optional maintenance operation to run (disable, enable, update, upgrade, safe_outputs, create_labels, activity_report, close_agentic_workflows_issues, clean_cache_memories, update_pull_request_branches, validate, forecast)' | |
| required: false | |
| type: string | |
| default: '' | |
| run_url: | |
| description: 'Run URL or run ID to replay safe outputs from (e.g. https://github.com/owner/repo/actions/runs/12345 or 12345). Required when operation is safe_outputs.' | |
| required: false | |
| type: string | |
| default: '' | |
| outputs: | |
| operation_completed: | |
| description: 'The maintenance operation that was completed (empty when none ran or a scheduled job ran)' | |
| value: ${{ jobs.run_operation.outputs.operation || (inputs.operation == 'safe_outputs' || inputs.operation == 'create_labels' || inputs.operation == 'activity_report' || inputs.operation == 'close_agentic_workflows_issues' || inputs.operation == 'update_pull_request_branches' || inputs.operation == 'validate' || inputs.operation == 'forecast' || inputs.operation == 'clean_cache_memories') && inputs.operation || '' }} | |
| applied_run_url: | |
| description: 'The run URL that safe outputs were applied from' | |
| value: ${{ jobs.apply_safe_outputs.outputs.run_url }} | |
| # Jobs request only the permissions needed for their individual maintenance operations. | |
| permissions: {} | |
| # Serialize maintenance runs to avoid overlapping writes to repository resources. | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.repository }} | |
| cancel-in-progress: false | |
| jobs: | |
| close-expired-discussions: | |
| name: Close expired discussions | |
| if: ${{ (!(github.event.repository.fork)) && github.event_name != 'push' && (github.event_name != 'workflow_dispatch' && github.event_name != 'workflow_call' || inputs.operation == '' || inputs.operation == 'none') }} | |
| runs-on: ubuntu-slim | |
| # Closing expired resources requires write access to this resource type only. | |
| permissions: | |
| discussions: write | |
| steps: | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Close expired discussions | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'close_expired_discussions.cjs')); | |
| await main(); | |
| close-expired-issues: | |
| name: Close expired issues | |
| if: ${{ (!(github.event.repository.fork)) && github.event_name != 'push' && (github.event_name != 'workflow_dispatch' && github.event_name != 'workflow_call' || inputs.operation == '' || inputs.operation == 'none') }} | |
| runs-on: ubuntu-slim | |
| # Closing expired resources requires write access to this resource type only. | |
| permissions: | |
| issues: write | |
| steps: | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Close expired issues | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'close_expired_issues.cjs')); | |
| await main(); | |
| close-expired-pull-requests: | |
| name: Close expired pull requests | |
| if: ${{ (!(github.event.repository.fork)) && github.event_name != 'push' && (github.event_name != 'workflow_dispatch' && github.event_name != 'workflow_call' || inputs.operation == '' || inputs.operation == 'none') }} | |
| runs-on: ubuntu-slim | |
| # Closing expired resources requires write access to this resource type only. | |
| permissions: | |
| pull-requests: write | |
| steps: | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Close expired pull requests | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'close_expired_pull_requests.cjs')); | |
| await main(); | |
| cleanup-cache-memory: | |
| name: Cleanup cache memory | |
| if: ${{ (!(github.event.repository.fork)) && github.event_name != 'push' && (github.event_name != 'workflow_dispatch' && github.event_name != 'workflow_call' || inputs.operation == '' || inputs.operation == 'none' || inputs.operation == 'clean_cache_memories') }} | |
| runs-on: ubuntu-slim | |
| # Removing obsolete Actions caches requires actions: write. | |
| permissions: | |
| actions: write | |
| steps: | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Cleanup outdated cache-memory entries | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'cleanup_cache_memory.cjs')); | |
| await main(); | |
| run_operation: | |
| name: Run maintenance operation | |
| if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation != '' && inputs.operation != 'none' && inputs.operation != 'safe_outputs' && inputs.operation != 'create_labels' && inputs.operation != 'activity_report' && inputs.operation != 'close_agentic_workflows_issues' && inputs.operation != 'clean_cache_memories' && inputs.operation != 'update_pull_request_branches' && inputs.operation != 'validate' && inputs.operation != 'forecast' && (!(github.event.repository.fork)) }} | |
| runs-on: ubuntu-slim | |
| # Updates, upgrades, and workflow enable/disable operations need repository write access. | |
| permissions: | |
| actions: write | |
| contents: write | |
| pull-requests: write | |
| outputs: | |
| operation: ${{ steps.record.outputs.operation }} | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Check admin/maintainer permissions | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'check_team_member.cjs')); | |
| await main(); | |
| - name: Install gh-aw | |
| uses: github/gh-aw-actions/setup-cli@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| version: v0.91.6 | |
| - name: Run operation | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| GH_AW_OPERATION: ${{ inputs.operation }} | |
| GH_AW_CMD_PREFIX: gh aw | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'run_operation_update_upgrade.cjs')); | |
| await main(); | |
| - name: Record outputs | |
| id: record | |
| env: | |
| GH_AW_OPERATION: ${{ inputs.operation }} | |
| run: echo "operation=$GH_AW_OPERATION" >> "$GITHUB_OUTPUT" | |
| update_pull_request_branches: | |
| name: Update pull request branches | |
| if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'update_pull_request_branches' && (!(github.event.repository.fork)) }} | |
| runs-on: ubuntu-slim | |
| # Branch updates may write commits and update pull requests. | |
| permissions: | |
| contents: write | |
| pull-requests: write | |
| steps: | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Check admin/maintainer permissions | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'check_team_member.cjs')); | |
| await main(); | |
| - name: Update pull request branches | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'update_pull_request_branches.cjs')); | |
| await main(); | |
| apply_safe_outputs: | |
| name: Apply safe outputs | |
| if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'safe_outputs' && (!(github.event.repository.fork)) }} | |
| runs-on: ubuntu-slim | |
| # Replay can create or update any supported safe-output resource. | |
| permissions: | |
| actions: read | |
| contents: write | |
| discussions: write | |
| issues: write | |
| pull-requests: write | |
| outputs: | |
| run_url: ${{ steps.record.outputs.run_url }} | |
| steps: | |
| - name: Checkout actions folder | |
| uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| sparse-checkout: | | |
| actions | |
| clean: false | |
| persist-credentials: false | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Check admin/maintainer permissions | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'check_team_member.cjs')); | |
| await main(); | |
| - name: Apply Safe Outputs | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| GH_AW_RUN_URL: ${{ inputs.run_url }} | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'apply_safe_outputs_replay.cjs')); | |
| await main(); | |
| - name: Record outputs | |
| id: record | |
| env: | |
| GH_AW_RUN_URL: ${{ inputs.run_url }} | |
| run: echo "run_url=$GH_AW_RUN_URL" >> "$GITHUB_OUTPUT" | |
| create_labels: | |
| name: Create labels | |
| if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'create_labels' && (!(github.event.repository.fork)) }} | |
| runs-on: ubuntu-slim | |
| # Creating repository labels uses the issues API. | |
| permissions: | |
| contents: read | |
| issues: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Check admin/maintainer permissions | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'check_team_member.cjs')); | |
| await main(); | |
| - name: Install gh-aw | |
| uses: github/gh-aw-actions/setup-cli@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| version: v0.91.6 | |
| - name: Create missing labels | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| env: | |
| GH_AW_CMD_PREFIX: gh aw | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'create_labels.cjs')); | |
| await main(); | |
| activity_report: | |
| name: activity report | |
| if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'activity_report' && (!(github.event.repository.fork)) }} | |
| runs-on: ubuntu-slim | |
| timeout-minutes: 120 | |
| # Read workflow logs and create the resulting report issue. | |
| permissions: | |
| actions: read | |
| contents: read | |
| issues: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Check admin/maintainer permissions | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'check_team_member.cjs')); | |
| await main(); | |
| - name: Install gh-aw | |
| uses: github/gh-aw-actions/setup-cli@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| version: v0.91.6 | |
| - name: Restore activity report logs cache | |
| id: activity_report_logs_cache | |
| uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| with: | |
| path: ./.cache/gh-aw/activity-report-logs | |
| key: ${{ runner.os }}-activity-report-logs-${{ github.repository }}-${{ github.ref_name }}-${{ github.run_id }} | |
| restore-keys: | | |
| ${{ runner.os }}-activity-report-logs-${{ github.repository }}- | |
| ${{ runner.os }}-activity-report-logs- | |
| - name: Download activity report logs | |
| timeout-minutes: 20 | |
| shell: bash | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| GH_AW_CMD_PREFIX: gh aw | |
| run: | | |
| ${GH_AW_CMD_PREFIX} logs \ | |
| --repo "$GITHUB_REPOSITORY" \ | |
| --start-date -1w \ | |
| --count 500 \ | |
| --output ./.cache/gh-aw/activity-report-logs \ | |
| --format markdown \ | |
| --report-file ./.cache/gh-aw/activity-report-logs/report.md | |
| - name: Save activity report logs cache | |
| if: ${{ always() }} | |
| uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| with: | |
| path: ./.cache/gh-aw/activity-report-logs | |
| key: ${{ steps.activity_report_logs_cache.outputs.cache-primary-key }} | |
| - name: Generate activity report issue | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const fs = require('node:fs'); | |
| const reportPath = './.cache/gh-aw/activity-report-logs/report.md'; | |
| if (!fs.existsSync(reportPath)) { | |
| core.warning('Activity report markdown not found at ' + reportPath + '; skipping issue creation.'); | |
| return; | |
| } | |
| let reportBody = ''; | |
| try { | |
| reportBody = fs.readFileSync(reportPath, 'utf8').trim(); | |
| } catch (error) { | |
| core.warning('Failed to read activity report markdown at ' + reportPath + ': ' + error.message); | |
| return; | |
| } | |
| if (!reportBody) { | |
| core.warning('Activity report markdown is empty at ' + reportPath + '; skipping issue creation.'); | |
| return; | |
| } | |
| const repoSlug = context.repo.owner + '/' + context.repo.repo; | |
| const body = [ | |
| '### Agentic workflow activity report', | |
| '', | |
| 'Repository: ' + repoSlug, | |
| 'Generated at: ' + new Date().toISOString(), | |
| '', | |
| reportBody, | |
| ].join('\n'); | |
| const createdIssue = await github.rest.issues.create({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| title: '[aw] agentic status report', | |
| body, | |
| labels: ['agentic-workflows'], | |
| }); | |
| core.info('Created issue #' + createdIssue.data.number + ': ' + createdIssue.data.html_url); | |
| forecast_report: | |
| name: forecast report | |
| if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'forecast' && (!(github.event.repository.fork)) }} | |
| runs-on: ubuntu-slim | |
| timeout-minutes: 60 | |
| # Read workflow logs and create the resulting report issue. | |
| permissions: | |
| actions: read | |
| contents: read | |
| issues: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Check admin/maintainer permissions | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'check_team_member.cjs')); | |
| await main(); | |
| - name: Install gh-aw | |
| uses: github/gh-aw-actions/setup-cli@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| version: v0.91.6 | |
| - name: Restore forecast report logs cache | |
| id: forecast_report_logs_cache | |
| uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| with: | |
| path: ./.github/aw/logs | |
| key: ${{ runner.os }}-forecast-report-logs-${{ github.repository }}-${{ github.ref_name }}-${{ github.run_id }} | |
| restore-keys: | | |
| ${{ runner.os }}-forecast-report-logs-${{ github.repository }}- | |
| ${{ runner.os }}-forecast-report-logs- | |
| - name: Generate forecast report | |
| id: generate_forecast_report | |
| timeout-minutes: 30 | |
| shell: bash | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| DEBUG: "*" | |
| GH_AW_CMD_PREFIX: gh aw | |
| run: | | |
| mkdir -p ./.cache/gh-aw/forecast | |
| set +e | |
| ${GH_AW_CMD_PREFIX} forecast --repo "$GITHUB_REPOSITORY" --timeout 30 --verbose --json > ./.cache/gh-aw/forecast/report.json | |
| forecast_exit_code=$? | |
| set -e | |
| if [ "${forecast_exit_code}" -eq 124 ]; then | |
| echo '{"outcome":"timeout","message":"Forecast computation timed out after 30 minutes."}' > ./.cache/gh-aw/forecast/error.json | |
| echo "::error::Forecast computation timed out after 30 minutes." | |
| exit 1 | |
| fi | |
| if [ "${forecast_exit_code}" -ne 0 ]; then | |
| echo '{"outcome":"error","message":"Forecast computation failed before producing a report."}' > ./.cache/gh-aw/forecast/error.json | |
| echo "::error::Forecast computation failed with exit code ${forecast_exit_code}." | |
| exit 1 | |
| fi | |
| - name: Debug forecast logs folder | |
| if: ${{ always() }} | |
| shell: bash | |
| run: | | |
| if [ ! -d ./.github/aw/logs ]; then | |
| echo "Logs directory not found: ./.github/aw/logs" | |
| exit 0 | |
| fi | |
| echo "Files under ./.github/aw/logs:" | |
| find ./.github/aw/logs -type f | sort | |
| - name: Save forecast report logs cache | |
| if: ${{ always() }} | |
| uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| with: | |
| path: ./.github/aw/logs | |
| key: ${{ runner.os }}-forecast-report-logs-${{ github.repository }}-${{ github.ref_name }}-${{ github.run_id }} | |
| - name: Generate forecast issue | |
| if: ${{ always() }} | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| env: | |
| FORECAST_STEP_OUTCOME: ${{ steps.generate_forecast_report.outcome }} | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'create_forecast_issue.cjs')); | |
| await main(); | |
| close_agentic_workflows_issues: | |
| name: Close agentic workflows issues | |
| if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'close_agentic_workflows_issues' && (!(github.event.repository.fork)) }} | |
| runs-on: ubuntu-slim | |
| # Closing no-repro issues requires issues: write. | |
| permissions: | |
| issues: write | |
| steps: | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Check admin/maintainer permissions | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'check_team_member.cjs')); | |
| await main(); | |
| - name: Close no-repro agentic-workflows issues | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'close_agentic_workflows_issues.cjs')); | |
| await main(); | |
| validate_workflows: | |
| name: Validate workflows | |
| if: ${{ (github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_call') && inputs.operation == 'validate' && (!(github.event.repository.fork)) }} | |
| runs-on: ubuntu-latest | |
| # Read workflow sources and file issues for validation findings. | |
| permissions: | |
| contents: read | |
| issues: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Setup Scripts | |
| uses: github/gh-aw-actions/setup@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| destination: ${{ runner.temp }}/gh-aw/actions | |
| - name: Check admin/maintainer permissions | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'check_team_member.cjs')); | |
| await main(); | |
| - name: Install gh-aw | |
| uses: github/gh-aw-actions/setup-cli@13f59f7032b1e9a26305dada85d6b99fa2a5e649 # v0.91.6 | |
| with: | |
| version: v0.91.6 | |
| - name: Validate workflows and file issue on findings | |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 | |
| env: | |
| GH_AW_CMD_PREFIX: gh aw | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const path = require('path'); | |
| const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); | |
| const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); | |
| setupGlobals(core, github, context, exec, io, getOctokit); | |
| const { main } = require(path.join(actionsDir, 'run_validate_workflows.cjs')); | |
| await main(); |