From d66f5d73808fb0c0de15f50b018b073bd632e54c Mon Sep 17 00:00:00 2001 From: enxebre Date: Tue, 18 Aug 2026 12:30:39 +0200 Subject: [PATCH 1/5] mco: add jira-agent solve and review-agent workflows Add MCO-specific wrappers for the generic jira-agent and review-agent workflows, mirroring the existing installer agent configuration. This enables automated Jira bug solving and PR review for the openshift/machine-config-operator repository. - mco-jira-agent: daily periodic that processes OCPBUGS issues with component "Machine Config Operator" and label "issue-for-agent" - mco-review-agent: on-demand periodic triggered via gangway - mco-review-agent-trigger: presubmit that triggers the review agent for PRs via /test address-review-comments Co-Authored-By: Claude Opus 4.6 --- ...penshift-machine-config-operator-main.yaml | 16 ++ ...achine-config-operator-main-periodics.yaml | 167 ++++++++++++++++++ ...chine-config-operator-main-presubmits.yaml | 84 +++++++++ .../step-registry/mco/jira-agent/OWNERS | 10 ++ .../mco-jira-agent-workflow.metadata.json | 17 ++ .../jira-agent/mco-jira-agent-workflow.yaml | 29 +++ .../step-registry/mco/review-agent/OWNERS | 10 ++ .../mco-review-agent-workflow.metadata.json | 17 ++ .../mco-review-agent-workflow.yaml | 19 ++ .../mco/review-agent/trigger/OWNERS | 10 ++ .../mco-review-agent-trigger-commands.sh | 110 ++++++++++++ ...mco-review-agent-trigger-ref.metadata.json | 17 ++ .../trigger/mco-review-agent-trigger-ref.yaml | 33 ++++ ...eview-agent-trigger-workflow.metadata.json | 17 ++ .../mco-review-agent-trigger-workflow.yaml | 9 + 15 files changed, 565 insertions(+) create mode 100644 ci-operator/jobs/openshift/machine-config-operator/openshift-machine-config-operator-main-periodics.yaml create mode 100644 ci-operator/step-registry/mco/jira-agent/OWNERS create mode 100644 ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.metadata.json create mode 100644 ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.yaml create mode 100644 ci-operator/step-registry/mco/review-agent/OWNERS create mode 100644 ci-operator/step-registry/mco/review-agent/mco-review-agent-workflow.metadata.json create mode 100644 ci-operator/step-registry/mco/review-agent/mco-review-agent-workflow.yaml create mode 100644 ci-operator/step-registry/mco/review-agent/trigger/OWNERS create mode 100644 ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-commands.sh create mode 100644 ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.metadata.json create mode 100644 ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.yaml create mode 100644 ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.metadata.json create mode 100644 ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.yaml diff --git a/ci-operator/config/openshift/machine-config-operator/openshift-machine-config-operator-main.yaml b/ci-operator/config/openshift/machine-config-operator/openshift-machine-config-operator-main.yaml index 953d5df5d7b29..93a1763b34ac8 100644 --- a/ci-operator/config/openshift/machine-config-operator/openshift-machine-config-operator-main.yaml +++ b/ci-operator/config/openshift/machine-config-operator/openshift-machine-config-operator-main.yaml @@ -855,6 +855,22 @@ tests: - ref: tls-13 - ref: tls-scanner-run workflow: ipi-aws +- as: periodic-jira-agent + cron: 0 9 * * * + steps: + env: + JIRA_AGENT_MAX_ISSUES: "1" + workflow: mco-jira-agent +- as: periodic-review-agent + cron: '@yearly' + steps: + workflow: mco-review-agent +- always_run: false + as: address-review-comments + optional: true + skip_if_only_changed: .* + steps: + workflow: mco-review-agent-trigger zz_generated_metadata: branch: main org: openshift diff --git a/ci-operator/jobs/openshift/machine-config-operator/openshift-machine-config-operator-main-periodics.yaml b/ci-operator/jobs/openshift/machine-config-operator/openshift-machine-config-operator-main-periodics.yaml new file mode 100644 index 0000000000000..e342515c66db5 --- /dev/null +++ b/ci-operator/jobs/openshift/machine-config-operator/openshift-machine-config-operator-main-periodics.yaml @@ -0,0 +1,167 @@ +periodics: +- agent: kubernetes + cluster: build01 + cron: 0 9 * * * + decorate: true + decoration_config: + sparse_checkout_files: + - .ci-operator.yaml + - Dockerfile.rhel7 + extra_refs: + - base_ref: main + org: openshift + repo: machine-config-operator + sparse_checkout_files: + - .ci-operator.yaml + - Dockerfile.rhel7 + labels: + ci.openshift.io/generator: prowgen + pj-rehearse.openshift.io/can-be-rehearsed: "true" + name: periodic-ci-openshift-machine-config-operator-main-periodic-jira-agent + spec: + containers: + - args: + - --gcs-upload-secret=/secrets/gcs/service-account.json + - --image-import-pull-secret=/etc/pull-secret/.dockerconfigjson + - --lease-server-credentials-file=/etc/boskos/credentials + - --report-credentials-file=/etc/report/credentials + - --secret-dir=/secrets/ci-pull-credentials + - --target=periodic-jira-agent + command: + - ci-operator + env: + - name: HTTP_SERVER_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + image: quay-proxy.ci.openshift.org/openshift/ci:ci_ci-operator_latest + imagePullPolicy: Always + name: "" + ports: + - containerPort: 8080 + name: http + resources: + requests: + cpu: 10m + volumeMounts: + - mountPath: /etc/boskos + name: boskos + readOnly: true + - mountPath: /secrets/ci-pull-credentials + name: ci-pull-credentials + readOnly: true + - mountPath: /secrets/gcs + name: gcs-credentials + readOnly: true + - mountPath: /secrets/manifest-tool + name: manifest-tool-local-pusher + readOnly: true + - mountPath: /etc/pull-secret + name: pull-secret + readOnly: true + - mountPath: /etc/report + name: result-aggregator + readOnly: true + serviceAccountName: ci-operator + volumes: + - name: boskos + secret: + items: + - key: credentials + path: credentials + secretName: boskos-credentials + - name: ci-pull-credentials + secret: + secretName: ci-pull-credentials + - name: manifest-tool-local-pusher + secret: + secretName: manifest-tool-local-pusher + - name: pull-secret + secret: + secretName: registry-pull-credentials + - name: result-aggregator + secret: + secretName: result-aggregator +- agent: kubernetes + cluster: build01 + cron: '@yearly' + decorate: true + decoration_config: + sparse_checkout_files: + - .ci-operator.yaml + - Dockerfile.rhel7 + extra_refs: + - base_ref: main + org: openshift + repo: machine-config-operator + sparse_checkout_files: + - .ci-operator.yaml + - Dockerfile.rhel7 + labels: + ci.openshift.io/generator: prowgen + pj-rehearse.openshift.io/can-be-rehearsed: "true" + name: periodic-ci-openshift-machine-config-operator-main-periodic-review-agent + spec: + containers: + - args: + - --gcs-upload-secret=/secrets/gcs/service-account.json + - --image-import-pull-secret=/etc/pull-secret/.dockerconfigjson + - --lease-server-credentials-file=/etc/boskos/credentials + - --report-credentials-file=/etc/report/credentials + - --secret-dir=/secrets/ci-pull-credentials + - --target=periodic-review-agent + command: + - ci-operator + env: + - name: HTTP_SERVER_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + image: quay-proxy.ci.openshift.org/openshift/ci:ci_ci-operator_latest + imagePullPolicy: Always + name: "" + ports: + - containerPort: 8080 + name: http + resources: + requests: + cpu: 10m + volumeMounts: + - mountPath: /etc/boskos + name: boskos + readOnly: true + - mountPath: /secrets/ci-pull-credentials + name: ci-pull-credentials + readOnly: true + - mountPath: /secrets/gcs + name: gcs-credentials + readOnly: true + - mountPath: /secrets/manifest-tool + name: manifest-tool-local-pusher + readOnly: true + - mountPath: /etc/pull-secret + name: pull-secret + readOnly: true + - mountPath: /etc/report + name: result-aggregator + readOnly: true + serviceAccountName: ci-operator + volumes: + - name: boskos + secret: + items: + - key: credentials + path: credentials + secretName: boskos-credentials + - name: ci-pull-credentials + secret: + secretName: ci-pull-credentials + - name: manifest-tool-local-pusher + secret: + secretName: manifest-tool-local-pusher + - name: pull-secret + secret: + secretName: registry-pull-credentials + - name: result-aggregator + secret: + secretName: result-aggregator diff --git a/ci-operator/jobs/openshift/machine-config-operator/openshift-machine-config-operator-main-presubmits.yaml b/ci-operator/jobs/openshift/machine-config-operator/openshift-machine-config-operator-main-presubmits.yaml index e57b66050df65..a71d45877386f 100644 --- a/ci-operator/jobs/openshift/machine-config-operator/openshift-machine-config-operator-main-presubmits.yaml +++ b/ci-operator/jobs/openshift/machine-config-operator/openshift-machine-config-operator-main-presubmits.yaml @@ -1,5 +1,89 @@ presubmits: openshift/machine-config-operator: + - agent: kubernetes + always_run: false + branches: + - ^main$ + - ^main- + cluster: build10 + context: ci/prow/address-review-comments + decorate: true + decoration_config: + sparse_checkout_files: + - .ci-operator.yaml + - Dockerfile.rhel7 + labels: + ci.openshift.io/generator: prowgen + pj-rehearse.openshift.io/can-be-rehearsed: "true" + name: pull-ci-openshift-machine-config-operator-main-address-review-comments + optional: true + rerun_command: /test address-review-comments + skip_if_only_changed: .* + spec: + containers: + - args: + - --gcs-upload-secret=/secrets/gcs/service-account.json + - --image-import-pull-secret=/etc/pull-secret/.dockerconfigjson + - --lease-server-credentials-file=/etc/boskos/credentials + - --report-credentials-file=/etc/report/credentials + - --secret-dir=/secrets/ci-pull-credentials + - --target=address-review-comments + command: + - ci-operator + env: + - name: HTTP_SERVER_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + image: quay-proxy.ci.openshift.org/openshift/ci:ci_ci-operator_latest + imagePullPolicy: Always + name: "" + ports: + - containerPort: 8080 + name: http + resources: + requests: + cpu: 10m + volumeMounts: + - mountPath: /etc/boskos + name: boskos + readOnly: true + - mountPath: /secrets/ci-pull-credentials + name: ci-pull-credentials + readOnly: true + - mountPath: /secrets/gcs + name: gcs-credentials + readOnly: true + - mountPath: /secrets/manifest-tool + name: manifest-tool-local-pusher + readOnly: true + - mountPath: /etc/pull-secret + name: pull-secret + readOnly: true + - mountPath: /etc/report + name: result-aggregator + readOnly: true + serviceAccountName: ci-operator + volumes: + - name: boskos + secret: + items: + - key: credentials + path: credentials + secretName: boskos-credentials + - name: ci-pull-credentials + secret: + secretName: ci-pull-credentials + - name: manifest-tool-local-pusher + secret: + secretName: manifest-tool-local-pusher + - name: pull-secret + secret: + secretName: registry-pull-credentials + - name: result-aggregator + secret: + secretName: result-aggregator + trigger: (?m)^/test( | .* )address-review-comments,?($|\s.*) - agent: kubernetes always_run: false branches: diff --git a/ci-operator/step-registry/mco/jira-agent/OWNERS b/ci-operator/step-registry/mco/jira-agent/OWNERS new file mode 100644 index 0000000000000..08ccacb339494 --- /dev/null +++ b/ci-operator/step-registry/mco/jira-agent/OWNERS @@ -0,0 +1,10 @@ +approvers: +- bryan-cox +- csrwng +- celebdor +- enxebre +reviewers: +- bryan-cox +- csrwng +- celebdor +- enxebre diff --git a/ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.metadata.json b/ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.metadata.json new file mode 100644 index 0000000000000..ea67a523db990 --- /dev/null +++ b/ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.metadata.json @@ -0,0 +1,17 @@ +{ + "path": "mco/jira-agent/mco-jira-agent-workflow.yaml", + "owners": { + "approvers": [ + "bryan-cox", + "csrwng", + "celebdor", + "enxebre" + ], + "reviewers": [ + "bryan-cox", + "csrwng", + "celebdor", + "enxebre" + ] + } +} \ No newline at end of file diff --git a/ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.yaml b/ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.yaml new file mode 100644 index 0000000000000..6e512ba5466b8 --- /dev/null +++ b/ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.yaml @@ -0,0 +1,29 @@ +workflow: + as: mco-jira-agent + steps: + pre: + - ref: jira-agent-setup + - ref: jira-agent-github-app-auth + - ref: jira-agent-slack-pr-notify + - ref: jira-agent-claude-helpers + - ref: jira-agent-jira-helpers + - ref: jira-agent-git-helpers + test: + - ref: jira-agent-process + post: + - ref: jira-agent-report + env: + JIRA_AGENT_AUTH_MODE: "pat" + JIRA_AGENT_FORK_ORG: "jira-solve-bot" + JIRA_AGENT_UPSTREAM_REPO: "openshift/machine-config-operator" + JIRA_AGENT_JQL: 'project = OCPBUGS AND resolution = Unresolved AND status in (New, "To Do") AND component = "Machine Config Operator" AND labels = issue-for-agent AND labels != agent-processed' + JIRA_AGENT_TARGET_STATUS: '{"OCPBUGS":"ASSIGNED"}' + JIRA_AGENT_TOOL_SETUP_SCRIPT: "GOFLAGS='' go install golang.org/x/tools/gopls@v0.21.0" + JIRA_AGENT_REVIEW_LANGUAGE: "go" + JIRA_AGENT_SLACK_EMOJI: ":robot:" + documentation: |- + MCO-specific wrapper for the generic Jira Agent workflow. + Uses PAT auth mode — auto-forks openshift/machine-config-operator into jira-solve-bot + and creates PRs against the upstream repo. + + Credentials: Uses hypershift-team-claude-prow (shared secret with gh-pat). diff --git a/ci-operator/step-registry/mco/review-agent/OWNERS b/ci-operator/step-registry/mco/review-agent/OWNERS new file mode 100644 index 0000000000000..08ccacb339494 --- /dev/null +++ b/ci-operator/step-registry/mco/review-agent/OWNERS @@ -0,0 +1,10 @@ +approvers: +- bryan-cox +- csrwng +- celebdor +- enxebre +reviewers: +- bryan-cox +- csrwng +- celebdor +- enxebre diff --git a/ci-operator/step-registry/mco/review-agent/mco-review-agent-workflow.metadata.json b/ci-operator/step-registry/mco/review-agent/mco-review-agent-workflow.metadata.json new file mode 100644 index 0000000000000..114ee54c53df8 --- /dev/null +++ b/ci-operator/step-registry/mco/review-agent/mco-review-agent-workflow.metadata.json @@ -0,0 +1,17 @@ +{ + "path": "mco/review-agent/mco-review-agent-workflow.yaml", + "owners": { + "approvers": [ + "bryan-cox", + "csrwng", + "celebdor", + "enxebre" + ], + "reviewers": [ + "bryan-cox", + "csrwng", + "celebdor", + "enxebre" + ] + } +} \ No newline at end of file diff --git a/ci-operator/step-registry/mco/review-agent/mco-review-agent-workflow.yaml b/ci-operator/step-registry/mco/review-agent/mco-review-agent-workflow.yaml new file mode 100644 index 0000000000000..ac094cdd6af70 --- /dev/null +++ b/ci-operator/step-registry/mco/review-agent/mco-review-agent-workflow.yaml @@ -0,0 +1,19 @@ +workflow: + as: mco-review-agent + steps: + pre: + - ref: review-agent-setup + test: + - ref: review-agent-process + post: + - ref: review-agent-report + env: + REVIEW_AGENT_AUTH_MODE: "pat" + REVIEW_AGENT_FORK_ORG: "jira-solve-bot" + REVIEW_AGENT_UPSTREAM_REPO: "openshift/machine-config-operator" + documentation: |- + MCO-specific wrapper for the generic review-agent workflow. + Uses PAT auth mode — auto-forks openshift/machine-config-operator into jira-solve-bot + for push operations. + + Credentials: Uses hypershift-team-claude-prow (shared secret with gh-pat). diff --git a/ci-operator/step-registry/mco/review-agent/trigger/OWNERS b/ci-operator/step-registry/mco/review-agent/trigger/OWNERS new file mode 100644 index 0000000000000..08ccacb339494 --- /dev/null +++ b/ci-operator/step-registry/mco/review-agent/trigger/OWNERS @@ -0,0 +1,10 @@ +approvers: +- bryan-cox +- csrwng +- celebdor +- enxebre +reviewers: +- bryan-cox +- csrwng +- celebdor +- enxebre diff --git a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-commands.sh b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-commands.sh new file mode 100644 index 0000000000000..7d49a39ef76c0 --- /dev/null +++ b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-commands.sh @@ -0,0 +1,110 @@ +#!/bin/bash +set -euo pipefail + +echo "=== MCO Review Agent Trigger ===" + +PR_NUMBER="${PULL_NUMBER:-}" +if [ -z "$PR_NUMBER" ]; then + echo "ERROR: PULL_NUMBER not set. This step must run as a presubmit." + exit 1 +fi +echo "Triggering review agent for PR #$PR_NUMBER" + +UPSTREAM_REPO="${REVIEW_AGENT_UPSTREAM_REPO:-openshift/machine-config-operator}" +CREDS_DIR="/var/run/claude-code-service-account" +TOKEN_FILE="${CREDS_DIR}/gangway-token" +PAT_FILE="${CREDS_DIR}/${REVIEW_AGENT_PAT_KEY:-gh-pat}" + +if [ ! -f "$TOKEN_FILE" ]; then + echo "ERROR: Gangway token not found at ${TOKEN_FILE}" + exit 1 +fi + +POST_DATA=$(jq -n --arg pr "$PR_NUMBER" \ + '{job_execution_type: "1", pod_spec_options: {envs: {MULTISTAGE_PARAM_OVERRIDE_REVIEW_AGENT_TARGET_PR: $pr}}}') + +echo "Triggering periodic job: ${PERIODIC_JOB_NAME}" + +MAX_RETRIES=10 +RETRY_INTERVAL=10 +JOB_ID="" + +for ((i=1; i<=MAX_RETRIES; i++)); do + set +x + RESPONSE=$(curl -s -X POST -d "${POST_DATA}" \ + -H "Authorization: Bearer $(cat "${TOKEN_FILE}")" \ + "${GANGWAY_API}/v1/executions/${PERIODIC_JOB_NAME}" \ + -w "\n%{http_code}") + set -x + HTTP_STATUS=$(echo "$RESPONSE" | tail -1) + JSON_BODY=$(echo "$RESPONSE" | sed '$d') + + if [ "$HTTP_STATUS" -eq 200 ]; then + JOB_ID=$(echo "$JSON_BODY" | jq -r '.id') + echo "Job triggered successfully. Job ID: ${JOB_ID}" + break + else + echo "[$i/$MAX_RETRIES] Gangway API returned HTTP $HTTP_STATUS. Retrying in ${RETRY_INTERVAL}s..." + sleep "$RETRY_INTERVAL" + fi +done + +if [ -z "$JOB_ID" ] || [ "$JOB_ID" = "null" ]; then + echo "ERROR: Failed to trigger periodic job after $MAX_RETRIES retries" + exit 1 +fi + +# Poll gangway for the Prow job URL (up to ~60s) +sleep 10 + +set +x +JOB_URL="" +for ((i=1; i<=10; i++)); do + STATUS_RESPONSE=$(curl -s -X GET \ + -H "Authorization: Bearer $(cat "${TOKEN_FILE}")" \ + "${GANGWAY_API}/v1/executions/${JOB_ID}" \ + -w "\n%{http_code}") + STATUS_HTTP=$(echo "$STATUS_RESPONSE" | tail -1) + STATUS_BODY=$(echo "$STATUS_RESPONSE" | sed '$d') + + if [ "$STATUS_HTTP" -eq 200 ]; then + JOB_URL=$(echo "$STATUS_BODY" | jq -r '.job_url // empty') + if [ -n "$JOB_URL" ]; then + echo "Job URL: ${JOB_URL}" + break + fi + fi + echo "[$i/10] Waiting for Prow job URL..." + sleep 5 +done +set -x + +# Post a comment on the PR using the PAT +if [ -f "$PAT_FILE" ]; then + echo "Posting PR comment..." + [[ $- == *x* ]] && _was_tracing=true || _was_tracing=false + set +x + + GITHUB_TOKEN_PAT=$(cat "$PAT_FILE") + + if [ -n "$JOB_URL" ]; then + COMMENT_BODY="Review agent triggered. [View job](${JOB_URL})" + else + COMMENT_BODY="Review agent triggered (Gangway execution ID: \`${JOB_ID}\`). The Prow job has not started yet — check the [job history](https://prow.ci.openshift.org/job-history/gs/test-platform-results/logs/${PERIODIC_JOB_NAME}) for the run once it begins." + fi + + curl --fail --silent --show-error -X POST \ + -H "Authorization: token ${GITHUB_TOKEN_PAT}" \ + -H "Accept: application/vnd.github+json" \ + "https://api.github.com/repos/${UPSTREAM_REPO}/issues/${PR_NUMBER}/comments" \ + -d "$(jq -n --arg body "$COMMENT_BODY" '{body: $body}')" > /dev/null + + $_was_tracing && set -x || true + echo "Comment posted on PR #$PR_NUMBER" +else + echo "WARNING: PAT not found at ${PAT_FILE}, skipping PR comment" +fi + +echo "=== Trigger Complete ===" +echo "Job ID: ${JOB_ID}" +echo "Job URL: ${JOB_URL:-pending}" diff --git a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.metadata.json b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.metadata.json new file mode 100644 index 0000000000000..b243f0e7d6683 --- /dev/null +++ b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.metadata.json @@ -0,0 +1,17 @@ +{ + "path": "mco/review-agent/trigger/mco-review-agent-trigger-ref.yaml", + "owners": { + "approvers": [ + "bryan-cox", + "csrwng", + "celebdor", + "enxebre" + ], + "reviewers": [ + "bryan-cox", + "csrwng", + "celebdor", + "enxebre" + ] + } +} \ No newline at end of file diff --git a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.yaml b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.yaml new file mode 100644 index 0000000000000..d0bff0603517c --- /dev/null +++ b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.yaml @@ -0,0 +1,33 @@ +ref: + as: mco-review-agent-trigger + from: claude-ai-helpers + commands: mco-review-agent-trigger-commands.sh + env: + - name: GANGWAY_API + default: "https://gangway-ci.apps.ci.l2s4.p1.openshiftapps.com" + documentation: |- + Gangway API endpoint for triggering periodic jobs. + - name: PERIODIC_JOB_NAME + default: "periodic-ci-openshift-machine-config-operator-main-periodic-review-agent" + documentation: |- + Name of the periodic job to trigger via gangway. + - name: REVIEW_AGENT_UPSTREAM_REPO + default: "openshift/machine-config-operator" + documentation: |- + Upstream repo for posting PR comments. + - name: REVIEW_AGENT_PAT_KEY + default: "gh-pat" + documentation: |- + Key name in the credential secret for the GitHub PAT. + resources: + requests: + cpu: 100m + memory: 256Mi + credentials: + - namespace: test-credentials + name: hypershift-team-claude-prow + mount_path: /var/run/claude-code-service-account + documentation: |- + Trigger step for the MCO Review Agent. + Uses PAT auth to post a PR comment. Triggers the periodic review-agent + job via gangway instead of running inline (avoids presubmit abort on push). diff --git a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.metadata.json b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.metadata.json new file mode 100644 index 0000000000000..faf5573882ee2 --- /dev/null +++ b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.metadata.json @@ -0,0 +1,17 @@ +{ + "path": "mco/review-agent/trigger/mco-review-agent-trigger-workflow.yaml", + "owners": { + "approvers": [ + "bryan-cox", + "csrwng", + "celebdor", + "enxebre" + ], + "reviewers": [ + "bryan-cox", + "csrwng", + "celebdor", + "enxebre" + ] + } +} \ No newline at end of file diff --git a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.yaml b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.yaml new file mode 100644 index 0000000000000..09301643d0ea0 --- /dev/null +++ b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.yaml @@ -0,0 +1,9 @@ +workflow: + as: mco-review-agent-trigger + steps: + test: + - ref: mco-review-agent-trigger + documentation: |- + Lightweight workflow that triggers the MCO review-agent periodic + job via gangway instead of running the agent inline. This avoids the + presubmit aborting when the agent pushes to the PR branch. From 9917c70d68d40aa07b8c11c2dba2410362e67372 Mon Sep 17 00:00:00 2001 From: enxebre Date: Tue, 18 Aug 2026 16:38:15 +0200 Subject: [PATCH 2/5] mco: reuse shared review-agent-trigger ref from #83182 Switch the MCO review-agent trigger workflow to use the shared review-agent-trigger ref (introduced in #83182) instead of a per-repo copy. The workflow just sets PERIODIC_JOB_NAME and REVIEW_AGENT_UPSTREAM_REPO env vars. Co-Authored-By: Claude Opus 4.6 --- .../mco-review-agent-trigger-commands.sh | 110 ------------------ ...mco-review-agent-trigger-ref.metadata.json | 17 --- .../trigger/mco-review-agent-trigger-ref.yaml | 33 ------ .../mco-review-agent-trigger-workflow.yaml | 5 +- .../trigger/review-agent-trigger-commands.sh | 0 5 files changed, 4 insertions(+), 161 deletions(-) delete mode 100644 ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-commands.sh delete mode 100644 ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.metadata.json delete mode 100644 ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.yaml mode change 100755 => 100644 ci-operator/step-registry/review-agent/trigger/review-agent-trigger-commands.sh diff --git a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-commands.sh b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-commands.sh deleted file mode 100644 index 7d49a39ef76c0..0000000000000 --- a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-commands.sh +++ /dev/null @@ -1,110 +0,0 @@ -#!/bin/bash -set -euo pipefail - -echo "=== MCO Review Agent Trigger ===" - -PR_NUMBER="${PULL_NUMBER:-}" -if [ -z "$PR_NUMBER" ]; then - echo "ERROR: PULL_NUMBER not set. This step must run as a presubmit." - exit 1 -fi -echo "Triggering review agent for PR #$PR_NUMBER" - -UPSTREAM_REPO="${REVIEW_AGENT_UPSTREAM_REPO:-openshift/machine-config-operator}" -CREDS_DIR="/var/run/claude-code-service-account" -TOKEN_FILE="${CREDS_DIR}/gangway-token" -PAT_FILE="${CREDS_DIR}/${REVIEW_AGENT_PAT_KEY:-gh-pat}" - -if [ ! -f "$TOKEN_FILE" ]; then - echo "ERROR: Gangway token not found at ${TOKEN_FILE}" - exit 1 -fi - -POST_DATA=$(jq -n --arg pr "$PR_NUMBER" \ - '{job_execution_type: "1", pod_spec_options: {envs: {MULTISTAGE_PARAM_OVERRIDE_REVIEW_AGENT_TARGET_PR: $pr}}}') - -echo "Triggering periodic job: ${PERIODIC_JOB_NAME}" - -MAX_RETRIES=10 -RETRY_INTERVAL=10 -JOB_ID="" - -for ((i=1; i<=MAX_RETRIES; i++)); do - set +x - RESPONSE=$(curl -s -X POST -d "${POST_DATA}" \ - -H "Authorization: Bearer $(cat "${TOKEN_FILE}")" \ - "${GANGWAY_API}/v1/executions/${PERIODIC_JOB_NAME}" \ - -w "\n%{http_code}") - set -x - HTTP_STATUS=$(echo "$RESPONSE" | tail -1) - JSON_BODY=$(echo "$RESPONSE" | sed '$d') - - if [ "$HTTP_STATUS" -eq 200 ]; then - JOB_ID=$(echo "$JSON_BODY" | jq -r '.id') - echo "Job triggered successfully. Job ID: ${JOB_ID}" - break - else - echo "[$i/$MAX_RETRIES] Gangway API returned HTTP $HTTP_STATUS. Retrying in ${RETRY_INTERVAL}s..." - sleep "$RETRY_INTERVAL" - fi -done - -if [ -z "$JOB_ID" ] || [ "$JOB_ID" = "null" ]; then - echo "ERROR: Failed to trigger periodic job after $MAX_RETRIES retries" - exit 1 -fi - -# Poll gangway for the Prow job URL (up to ~60s) -sleep 10 - -set +x -JOB_URL="" -for ((i=1; i<=10; i++)); do - STATUS_RESPONSE=$(curl -s -X GET \ - -H "Authorization: Bearer $(cat "${TOKEN_FILE}")" \ - "${GANGWAY_API}/v1/executions/${JOB_ID}" \ - -w "\n%{http_code}") - STATUS_HTTP=$(echo "$STATUS_RESPONSE" | tail -1) - STATUS_BODY=$(echo "$STATUS_RESPONSE" | sed '$d') - - if [ "$STATUS_HTTP" -eq 200 ]; then - JOB_URL=$(echo "$STATUS_BODY" | jq -r '.job_url // empty') - if [ -n "$JOB_URL" ]; then - echo "Job URL: ${JOB_URL}" - break - fi - fi - echo "[$i/10] Waiting for Prow job URL..." - sleep 5 -done -set -x - -# Post a comment on the PR using the PAT -if [ -f "$PAT_FILE" ]; then - echo "Posting PR comment..." - [[ $- == *x* ]] && _was_tracing=true || _was_tracing=false - set +x - - GITHUB_TOKEN_PAT=$(cat "$PAT_FILE") - - if [ -n "$JOB_URL" ]; then - COMMENT_BODY="Review agent triggered. [View job](${JOB_URL})" - else - COMMENT_BODY="Review agent triggered (Gangway execution ID: \`${JOB_ID}\`). The Prow job has not started yet — check the [job history](https://prow.ci.openshift.org/job-history/gs/test-platform-results/logs/${PERIODIC_JOB_NAME}) for the run once it begins." - fi - - curl --fail --silent --show-error -X POST \ - -H "Authorization: token ${GITHUB_TOKEN_PAT}" \ - -H "Accept: application/vnd.github+json" \ - "https://api.github.com/repos/${UPSTREAM_REPO}/issues/${PR_NUMBER}/comments" \ - -d "$(jq -n --arg body "$COMMENT_BODY" '{body: $body}')" > /dev/null - - $_was_tracing && set -x || true - echo "Comment posted on PR #$PR_NUMBER" -else - echo "WARNING: PAT not found at ${PAT_FILE}, skipping PR comment" -fi - -echo "=== Trigger Complete ===" -echo "Job ID: ${JOB_ID}" -echo "Job URL: ${JOB_URL:-pending}" diff --git a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.metadata.json b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.metadata.json deleted file mode 100644 index b243f0e7d6683..0000000000000 --- a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.metadata.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "path": "mco/review-agent/trigger/mco-review-agent-trigger-ref.yaml", - "owners": { - "approvers": [ - "bryan-cox", - "csrwng", - "celebdor", - "enxebre" - ], - "reviewers": [ - "bryan-cox", - "csrwng", - "celebdor", - "enxebre" - ] - } -} \ No newline at end of file diff --git a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.yaml b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.yaml deleted file mode 100644 index d0bff0603517c..0000000000000 --- a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-ref.yaml +++ /dev/null @@ -1,33 +0,0 @@ -ref: - as: mco-review-agent-trigger - from: claude-ai-helpers - commands: mco-review-agent-trigger-commands.sh - env: - - name: GANGWAY_API - default: "https://gangway-ci.apps.ci.l2s4.p1.openshiftapps.com" - documentation: |- - Gangway API endpoint for triggering periodic jobs. - - name: PERIODIC_JOB_NAME - default: "periodic-ci-openshift-machine-config-operator-main-periodic-review-agent" - documentation: |- - Name of the periodic job to trigger via gangway. - - name: REVIEW_AGENT_UPSTREAM_REPO - default: "openshift/machine-config-operator" - documentation: |- - Upstream repo for posting PR comments. - - name: REVIEW_AGENT_PAT_KEY - default: "gh-pat" - documentation: |- - Key name in the credential secret for the GitHub PAT. - resources: - requests: - cpu: 100m - memory: 256Mi - credentials: - - namespace: test-credentials - name: hypershift-team-claude-prow - mount_path: /var/run/claude-code-service-account - documentation: |- - Trigger step for the MCO Review Agent. - Uses PAT auth to post a PR comment. Triggers the periodic review-agent - job via gangway instead of running inline (avoids presubmit abort on push). diff --git a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.yaml b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.yaml index 09301643d0ea0..eaec4206d2343 100644 --- a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.yaml +++ b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.yaml @@ -2,7 +2,10 @@ workflow: as: mco-review-agent-trigger steps: test: - - ref: mco-review-agent-trigger + - ref: review-agent-trigger + env: + PERIODIC_JOB_NAME: "periodic-ci-openshift-machine-config-operator-main-periodic-review-agent" + REVIEW_AGENT_UPSTREAM_REPO: "openshift/machine-config-operator" documentation: |- Lightweight workflow that triggers the MCO review-agent periodic job via gangway instead of running the agent inline. This avoids the diff --git a/ci-operator/step-registry/review-agent/trigger/review-agent-trigger-commands.sh b/ci-operator/step-registry/review-agent/trigger/review-agent-trigger-commands.sh old mode 100755 new mode 100644 From d6e7d16b4bac1a9fa9419dc8369be57ab46afc72 Mon Sep 17 00:00:00 2001 From: enxebre Date: Wed, 19 Aug 2026 11:30:55 +0200 Subject: [PATCH 3/5] Add MCO team members to step-registry OWNERS files Co-Authored-By: Claude Opus 4.6 --- .../step-registry/mco/jira-agent/OWNERS | 26 ++++++++++++++-- .../mco-jira-agent-workflow.metadata.json | 30 ++++++++++++++++--- .../step-registry/mco/review-agent/OWNERS | 26 ++++++++++++++-- .../mco-review-agent-workflow.metadata.json | 30 ++++++++++++++++--- .../mco/review-agent/trigger/OWNERS | 26 ++++++++++++++-- ...eview-agent-trigger-workflow.metadata.json | 30 ++++++++++++++++--- 6 files changed, 150 insertions(+), 18 deletions(-) diff --git a/ci-operator/step-registry/mco/jira-agent/OWNERS b/ci-operator/step-registry/mco/jira-agent/OWNERS index 08ccacb339494..b842ac86d54c1 100644 --- a/ci-operator/step-registry/mco/jira-agent/OWNERS +++ b/ci-operator/step-registry/mco/jira-agent/OWNERS @@ -1,10 +1,32 @@ approvers: - bryan-cox -- csrwng - celebdor +- cheesesashimi +- csrwng +- djoshy +- dkhater-redhat - enxebre +- harshwardhanpatil07 +- isabella-janssen +- pablintino +- proietfb +- ptalgulk01 +- sergiordlr +- umohnani8 +- yuqi-zhang reviewers: - bryan-cox -- csrwng - celebdor +- cheesesashimi +- csrwng +- djoshy +- dkhater-redhat - enxebre +- harshwardhanpatil07 +- isabella-janssen +- pablintino +- proietfb +- ptalgulk01 +- sergiordlr +- umohnani8 +- yuqi-zhang diff --git a/ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.metadata.json b/ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.metadata.json index ea67a523db990..3c4bf416d9b5f 100644 --- a/ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.metadata.json +++ b/ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.metadata.json @@ -3,15 +3,37 @@ "owners": { "approvers": [ "bryan-cox", - "csrwng", "celebdor", - "enxebre" + "cheesesashimi", + "csrwng", + "djoshy", + "dkhater-redhat", + "enxebre", + "harshwardhanpatil07", + "isabella-janssen", + "pablintino", + "proietfb", + "ptalgulk01", + "sergiordlr", + "umohnani8", + "yuqi-zhang" ], "reviewers": [ "bryan-cox", - "csrwng", "celebdor", - "enxebre" + "cheesesashimi", + "csrwng", + "djoshy", + "dkhater-redhat", + "enxebre", + "harshwardhanpatil07", + "isabella-janssen", + "pablintino", + "proietfb", + "ptalgulk01", + "sergiordlr", + "umohnani8", + "yuqi-zhang" ] } } \ No newline at end of file diff --git a/ci-operator/step-registry/mco/review-agent/OWNERS b/ci-operator/step-registry/mco/review-agent/OWNERS index 08ccacb339494..b842ac86d54c1 100644 --- a/ci-operator/step-registry/mco/review-agent/OWNERS +++ b/ci-operator/step-registry/mco/review-agent/OWNERS @@ -1,10 +1,32 @@ approvers: - bryan-cox -- csrwng - celebdor +- cheesesashimi +- csrwng +- djoshy +- dkhater-redhat - enxebre +- harshwardhanpatil07 +- isabella-janssen +- pablintino +- proietfb +- ptalgulk01 +- sergiordlr +- umohnani8 +- yuqi-zhang reviewers: - bryan-cox -- csrwng - celebdor +- cheesesashimi +- csrwng +- djoshy +- dkhater-redhat - enxebre +- harshwardhanpatil07 +- isabella-janssen +- pablintino +- proietfb +- ptalgulk01 +- sergiordlr +- umohnani8 +- yuqi-zhang diff --git a/ci-operator/step-registry/mco/review-agent/mco-review-agent-workflow.metadata.json b/ci-operator/step-registry/mco/review-agent/mco-review-agent-workflow.metadata.json index 114ee54c53df8..1f56337b7de4f 100644 --- a/ci-operator/step-registry/mco/review-agent/mco-review-agent-workflow.metadata.json +++ b/ci-operator/step-registry/mco/review-agent/mco-review-agent-workflow.metadata.json @@ -3,15 +3,37 @@ "owners": { "approvers": [ "bryan-cox", - "csrwng", "celebdor", - "enxebre" + "cheesesashimi", + "csrwng", + "djoshy", + "dkhater-redhat", + "enxebre", + "harshwardhanpatil07", + "isabella-janssen", + "pablintino", + "proietfb", + "ptalgulk01", + "sergiordlr", + "umohnani8", + "yuqi-zhang" ], "reviewers": [ "bryan-cox", - "csrwng", "celebdor", - "enxebre" + "cheesesashimi", + "csrwng", + "djoshy", + "dkhater-redhat", + "enxebre", + "harshwardhanpatil07", + "isabella-janssen", + "pablintino", + "proietfb", + "ptalgulk01", + "sergiordlr", + "umohnani8", + "yuqi-zhang" ] } } \ No newline at end of file diff --git a/ci-operator/step-registry/mco/review-agent/trigger/OWNERS b/ci-operator/step-registry/mco/review-agent/trigger/OWNERS index 08ccacb339494..b842ac86d54c1 100644 --- a/ci-operator/step-registry/mco/review-agent/trigger/OWNERS +++ b/ci-operator/step-registry/mco/review-agent/trigger/OWNERS @@ -1,10 +1,32 @@ approvers: - bryan-cox -- csrwng - celebdor +- cheesesashimi +- csrwng +- djoshy +- dkhater-redhat - enxebre +- harshwardhanpatil07 +- isabella-janssen +- pablintino +- proietfb +- ptalgulk01 +- sergiordlr +- umohnani8 +- yuqi-zhang reviewers: - bryan-cox -- csrwng - celebdor +- cheesesashimi +- csrwng +- djoshy +- dkhater-redhat - enxebre +- harshwardhanpatil07 +- isabella-janssen +- pablintino +- proietfb +- ptalgulk01 +- sergiordlr +- umohnani8 +- yuqi-zhang diff --git a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.metadata.json b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.metadata.json index faf5573882ee2..cfd296eb978fc 100644 --- a/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.metadata.json +++ b/ci-operator/step-registry/mco/review-agent/trigger/mco-review-agent-trigger-workflow.metadata.json @@ -3,15 +3,37 @@ "owners": { "approvers": [ "bryan-cox", - "csrwng", "celebdor", - "enxebre" + "cheesesashimi", + "csrwng", + "djoshy", + "dkhater-redhat", + "enxebre", + "harshwardhanpatil07", + "isabella-janssen", + "pablintino", + "proietfb", + "ptalgulk01", + "sergiordlr", + "umohnani8", + "yuqi-zhang" ], "reviewers": [ "bryan-cox", - "csrwng", "celebdor", - "enxebre" + "cheesesashimi", + "csrwng", + "djoshy", + "dkhater-redhat", + "enxebre", + "harshwardhanpatil07", + "isabella-janssen", + "pablintino", + "proietfb", + "ptalgulk01", + "sergiordlr", + "umohnani8", + "yuqi-zhang" ] } } \ No newline at end of file From 006ceb05a1e536350330dcd02b9a55956783be3f Mon Sep 17 00:00:00 2001 From: enxebre Date: Wed, 19 Aug 2026 12:14:23 +0200 Subject: [PATCH 4/5] Add claude-ai-helpers base image for MCO jira-agent The jira-agent-setup step requires the claude-ai-helpers image but it was missing from the MCO CI config base_images. Co-Authored-By: Claude Opus 4.6 --- .../openshift-machine-config-operator-main.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ci-operator/config/openshift/machine-config-operator/openshift-machine-config-operator-main.yaml b/ci-operator/config/openshift/machine-config-operator/openshift-machine-config-operator-main.yaml index 93a1763b34ac8..8f80d2a565dff 100644 --- a/ci-operator/config/openshift/machine-config-operator/openshift-machine-config-operator-main.yaml +++ b/ci-operator/config/openshift/machine-config-operator/openshift-machine-config-operator-main.yaml @@ -23,6 +23,10 @@ base_images: name: backplane-5.1 namespace: edge-infrastructure tag: assisted-test-infra + claude-ai-helpers: + name: claude-ai-helpers + namespace: ci + tag: latest dev-scripts: name: test namespace: ocp-kni From 2d871c70bca02b69b26330d1034b066446d56151 Mon Sep 17 00:00:00 2001 From: enxebre Date: Wed, 19 Aug 2026 13:28:22 +0200 Subject: [PATCH 5/5] Update MCO jira-agent JQL to include MCO project Add MCO project tickets alongside OCPBUGS with component scoping. Co-Authored-By: Claude Opus 4.6 --- .../step-registry/mco/jira-agent/mco-jira-agent-workflow.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.yaml b/ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.yaml index 6e512ba5466b8..c99af61dc3b98 100644 --- a/ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.yaml +++ b/ci-operator/step-registry/mco/jira-agent/mco-jira-agent-workflow.yaml @@ -16,8 +16,8 @@ workflow: JIRA_AGENT_AUTH_MODE: "pat" JIRA_AGENT_FORK_ORG: "jira-solve-bot" JIRA_AGENT_UPSTREAM_REPO: "openshift/machine-config-operator" - JIRA_AGENT_JQL: 'project = OCPBUGS AND resolution = Unresolved AND status in (New, "To Do") AND component = "Machine Config Operator" AND labels = issue-for-agent AND labels != agent-processed' - JIRA_AGENT_TARGET_STATUS: '{"OCPBUGS":"ASSIGNED"}' + JIRA_AGENT_JQL: '(project = MCO OR (project = OCPBUGS AND component = "Machine Config Operator")) AND resolution = Unresolved AND status in (New, "To Do") AND labels = issue-for-agent AND labels != agent-processed' + JIRA_AGENT_TARGET_STATUS: '{"OCPBUGS":"ASSIGNED","MCO":"ASSIGNED"}' JIRA_AGENT_TOOL_SETUP_SCRIPT: "GOFLAGS='' go install golang.org/x/tools/gopls@v0.21.0" JIRA_AGENT_REVIEW_LANGUAGE: "go" JIRA_AGENT_SLACK_EMOJI: ":robot:"