Files
PEASS-ng/.github/workflows/update_windows_version_definitions.yml
T
Carlos PolopandClaude Opus 4.8 f4c29dbb03 ci: build, wait and merge windows definition PRs inline (no workflow_run/PAT-dispatch)
CODEX_FIXER_TOKEN is a fine-grained PAT with Contents/Pull-requests write but NOT
Actions:write, so it cannot create a workflow_dispatch event; and a github.token
-dispatched run never emits a workflow_run event to drive the triage merge job. So
neither half of the old cross-workflow design could work.

Instead, update_windows_version_definitions.yml now dispatches PR-tests with
github.token (this workflow already has actions:write), polls that run directly,
and on success squash-merges the PR with the CODEX_FIXER_TOKEN PAT so the push to
master triggers CI-master_test -> Publish_release. Remove the now-dead
auto_merge_windows_definition_bot_pr job from chack-agent-pr-triage.yml and the
temporary token probe. Bump the job timeout to 90m to cover the inline wait.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 20:33:50 +02:00

149 lines
5.8 KiB
YAML

name: Update Windows Version Definitions
on:
schedule:
- cron: "17 4 */14 * *"
workflow_dispatch:
permissions:
actions: write
contents: write
pull-requests: write
jobs:
update-definitions:
runs-on: ubuntu-latest
timeout-minutes: 90
steps:
- name: Checkout
uses: actions/checkout@v5
with:
ref: master
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: "3.x"
- name: Install Python dependencies
run: python3 -m pip install --disable-pip-version-check openpyxl
- name: Update windows version definitions
timeout-minutes: 50
run: python3 build_lists/update_windows_version_defs.py --verbose
- name: Validate windows version definitions
run: python3 build_lists/validate_windows_version_defs.py
- name: Create validated update pull request
env:
GH_TOKEN: ${{ github.token }}
MERGE_TOKEN: ${{ secrets.CODEX_FIXER_TOKEN }}
run: |
title="chore(winpeas): update windows version vulnerability definitions"
branch="bot/update-windows-version-definitions"
if git diff --quiet -- build_lists/windows_version_exploits.json; then
echo "No windows version definition updates detected."
exit 0
fi
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git checkout -B "$branch"
git add build_lists/windows_version_exploits.json
git commit -m "$title"
git push --force origin "$branch"
pr_number="$(gh pr list --state open --head "$branch" --base master --json number --jq '.[0].number')"
if [ -z "$pr_number" ]; then
gh pr create \
--base master \
--head "$branch" \
--title "$title" \
--body "Automated update of \`build_lists/windows_version_exploits.json\`. The generated JSON passed \`build_lists/validate_windows_version_defs.py\` before this PR was created."
else
gh pr edit "$pr_number" \
--title "$title" \
--body "Automated update of \`build_lists/windows_version_exploits.json\`. The generated JSON passed \`build_lists/validate_windows_version_defs.py\` before this PR was updated."
fi
pr_number="$(gh pr list --state open --head "$branch" --base master --json number --jq '.[0].number')"
if [ -z "$pr_number" ]; then
echo "Could not resolve the generated pull request after creating/updating it."
exit 1
fi
# Run the winPEAS PR-tests build for the bot branch, wait for it, and merge on
# success. We dispatch with github.token (this workflow has `actions: write`) and
# then poll the dispatched run directly, instead of relying on a cross-workflow
# `workflow_run` trigger: runs owned by GITHUB_TOKEN do not emit `workflow_run`
# events, and the auto-created `pull_request` PR-tests run for a bot-authored PR is
# held in `action_required`. The merge itself is done with a PAT (see below).
if [ -z "$MERGE_TOKEN" ]; then
echo "CODEX_FIXER_TOKEN (MERGE_TOKEN) is required to merge the validated bot PR."
exit 1
fi
dispatch_ts="$(date -u +%s)"
gh workflow run PR-tests.yml --ref "$branch"
echo "Dispatched PR-tests for $branch (PR #$pr_number); locating the run..."
run_id=""
for attempt in $(seq 1 18); do
row="$(gh run list --workflow=PR-tests.yml --branch "$branch" --event workflow_dispatch \
--limit 1 --json databaseId,createdAt --jq '.[0] | [.databaseId, .createdAt] | @tsv')"
cid="$(printf '%s' "$row" | cut -f1)"
cts_iso="$(printf '%s' "$row" | cut -f2)"
if [ -n "$cid" ]; then
cts="$(date -u -d "$cts_iso" +%s 2>/dev/null || echo 0)"
if [ "$cts" -ge "$((dispatch_ts - 60))" ]; then
run_id="$cid"
break
fi
fi
sleep 10
done
if [ -z "$run_id" ]; then
echo "Could not locate the dispatched PR-tests run."
exit 1
fi
echo "Watching PR-tests run $run_id until it completes..."
status=""
conclusion=""
for attempt in $(seq 1 70); do
status="$(gh run view "$run_id" --json status --jq .status)"
if [ "$status" = "completed" ]; then
conclusion="$(gh run view "$run_id" --json conclusion --jq .conclusion)"
break
fi
sleep 30
done
if [ "$conclusion" != "success" ]; then
echo "PR-tests run $run_id did not pass (status=$status conclusion=$conclusion); not merging PR #$pr_number."
exit 1
fi
echo "PR-tests passed. Squash-merging PR #$pr_number..."
# Merge with the PAT (not github.token) so the resulting push to master triggers
# CI-master_test -> Publish_release. A github.token-authored merge would not.
for attempt in $(seq 1 6); do
if GH_TOKEN="$MERGE_TOKEN" gh api -X PUT \
-H "Accept: application/vnd.github+json" \
"/repos/${{ github.repository }}/pulls/${pr_number}/merge" \
-f merge_method=squash \
-f commit_title="$title"; then
echo "Merged windows definitions PR #$pr_number. CI-master_test will build and publish the release."
exit 0
fi
echo "Merge attempt $attempt failed for PR #$pr_number; retrying."
sleep 10
done
echo "Failed to merge PR #$pr_number after retries."
exit 1