This is an automated email from the ASF dual-hosted git repository.

shuke987 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 0785d907483 [fix](code review) Use validated complete Codex package 
(#68547)
0785d907483 is described below

commit 0785d907483b647bf44ffd828c786bb190ee2c65
Author: shuke <[email protected]>
AuthorDate: Mon Sep 28 14:56:45 2026 +0800

    [fix](code review) Use validated complete Codex package (#68547)
    
    The review runner installs a current Codex CLI, then overwrites its
    executable with an older standalone goal binary. That binary reports
    version 0.0.0 and sends `gpt-6-sol` through a legacy request path,
    resulting in ChatGPT account 400 errors.
---
 .github/workflows/code-review-runner.yml | 242 +++++++++++++++++++++++++------
 1 file changed, 194 insertions(+), 48 deletions(-)

diff --git a/.github/workflows/code-review-runner.yml 
b/.github/workflows/code-review-runner.yml
index 75461551e89..bfa518584fc 100644
--- a/.github/workflows/code-review-runner.yml
+++ b/.github/workflows/code-review-runner.yml
@@ -5,14 +5,19 @@ on:
     types: [created]
   workflow_dispatch:
     inputs:
+      runtime_canary:
+        description: Test the staged Codex package without submitting a review.
+        required: false
+        type: boolean
+        default: false
       pr_number:
-        required: true
+        required: false
         type: string
       head_sha:
-        required: true
+        required: false
         type: string
       base_sha:
-        required: true
+        required: false
         type: string
       review_focus:
         required: false
@@ -35,8 +40,159 @@ env:
   REVIEW_TIMEOUT_MINUTES: 120
 
 jobs:
+  runtime-canary:
+    if: ${{ github.event_name == 'workflow_dispatch' && inputs.runtime_canary 
== true }}
+    runs-on: ubuntu-24.04
+    timeout-minutes: 25
+    permissions:
+      contents: read
+    steps:
+      - name: Install ossutil
+        run: |
+          tmp_dir="$(mktemp -d)"
+          trap 'rm -rf "$tmp_dir"' EXIT
+          curl -fsSL -o "$tmp_dir/ossutil.zip" 
https://gosspublic.alicdn.com/ossutil/1.7.19/ossutil-v1.7.19-linux-amd64.zip
+          unzip -q "$tmp_dir/ossutil.zip" -d "$tmp_dir"
+          sudo install -m 0755 "$tmp_dir/ossutil-v1.7.19-linux-amd64/ossutil" 
/usr/local/bin/ossutil
+
+      - name: Install staged Codex package
+        env:
+          OSS_AK: ${{ secrets.OSS_AK }}
+          OSS_SK: ${{ secrets.OSS_SK }}
+          OSS_ENDPOINT: oss-cn-hongkong.aliyuncs.com
+        run: |
+          set -euo pipefail
+          archive="$RUNNER_TEMP/codex-exec-goal.tar.gz"
+          package="$RUNNER_TEMP/codex-exec-goal"
+          ossutil -i "$OSS_AK" -k "$OSS_SK" -e "$OSS_ENDPOINT" \
+            cp -f 
oss://doris-community-ci/codex/releases/codex-exec-goal-0.156.1-a310d33f7ebb-x86_64-unknown-linux-gnu.tar.gz
 "$archive"
+          echo 
"2ee3073479bc8c94436684b55a13d7a3f299e768d04436d90e0427814a3954bc  $archive" | 
sha256sum --check
+          mkdir -p "$package"
+          tar -xzf "$archive" -C "$package"
+          (cd "$package" && sha256sum --check SHA256SUMS)
+          test "$(jq -r .version "$package/codex-package.json")" = 0.156.1
+          "$package/bin/codex" --version
+          "$package/bin/codex" exec --help | grep -q -- '--goal'
+          echo "CODEX_CANARY_BIN=$package/bin/codex" >> "$GITHUB_ENV"
+
+      - name: Load one review auth snapshot
+        id: auth
+        env:
+          OSS_AK: ${{ secrets.OSS_AK }}
+          OSS_SK: ${{ secrets.OSS_SK }}
+          OSS_ENDPOINT: oss-cn-hongkong.aliyuncs.com
+        run: |
+          set -euo pipefail
+          umask 077
+          home="$RUNNER_TEMP/codex-canary-home"
+          install -m 700 -d "$home"
+          ossutil -i "$OSS_AK" -k "$OSS_SK" -e "$OSS_ENDPOINT" \
+            cp -f oss://doris-community-ci/codex/auth.json.4 "$home/auth.json" 
>/dev/null
+          jq -e '
+            .auth_mode == "chatgpt"
+            and (.tokens.access_token | type == "string" and length > 0)
+            and (.tokens.refresh_token | type == "string" and length > 0)
+          ' "$home/auth.json" >/dev/null
+          sha256sum "$home/auth.json" | awk '{print $1}' \
+            > "$RUNNER_TEMP/codex-canary-auth-original.sha256"
+          cat > "$home/config.toml" <<'EOF'
+          cli_auth_credentials_store = "file"
+          approval_policy = "never"
+
+          [features]
+          memories = true
+
+          [memories]
+          use_memories = true
+          generate_memories = true
+
+          [otel]
+          environment = "github-actions"
+          exporter = "none"
+          trace_exporter = "none"
+          metrics_exporter = "none"
+          EOF
+          echo "CODEX_HOME=$home" >> "$GITHUB_ENV"
+
+      - name: Test ChatGPT model access and goal mode without GitHub writes
+        timeout-minutes: 12
+        run: |
+          set -uo pipefail
+          run_model() {
+            local label="$1" model="$2" goal="$3"
+            local events="$RUNNER_TEMP/codex-canary-$label.jsonl"
+            local final="$RUNNER_TEMP/codex-canary-$label.txt"
+            local args=(exec --skip-git-repo-check --json --model "$model"
+              --config model_reasoning_effort=low --sandbox read-only
+              --color never --output-last-message "$final")
+            if [ "$goal" = true ]; then
+              args+=(--goal)
+            fi
+            local prompt="Reply with exactly OK. Do not access files or 
external services."
+            if [ "$goal" = true ]; then
+              prompt="Create a goal to reply OK, mark it complete, then reply 
OK. Do not access files or external services."
+            fi
+            timeout --signal=INT --kill-after=10s 180s \
+              env -u GH_TOKEN -u GITHUB_TOKEN "$CODEX_CANARY_BIN" \
+              "${args[@]}" "$prompt" > "$events" 2> 
"$RUNNER_TEMP/codex-canary-$label.stderr"
+            local status=$?
+            echo "$label: exit_status=$status"
+            jq -r 'select(.type == "turn.failed" or .type == "error") |
+              .error.message // .message // empty' "$events" | tail -n 2 || 
true
+            if [ "$status" -ne 0 ] ||
+               ! jq -e 'select(.type == "turn.completed")' "$events" 
>/dev/null; then
+              return 1
+            fi
+            return 0
+          }
+
+          run_model sol gpt-6-sol false
+          sol_status=$?
+          run_model prior-sol gpt-5.6-sol false
+          prior_status=$?
+          goal_status=1
+          if [ "$sol_status" -eq 0 ]; then
+            run_model sol-goal gpt-6-sol true
+            goal_status=$?
+          fi
+          echo "model_canary: gpt-6-sol=$sol_status gpt-5.6-sol=$prior_status 
gpt-6-sol-goal=$goal_status"
+          test "$sol_status" -eq 0 && test "$goal_status" -eq 0
+
+      - name: Sync refreshed canary auth
+        if: ${{ always() && steps.auth.outcome == 'success' }}
+        env:
+          OSS_AK: ${{ secrets.OSS_AK }}
+          OSS_SK: ${{ secrets.OSS_SK }}
+          OSS_ENDPOINT: oss-cn-hongkong.aliyuncs.com
+        run: |
+          set -euo pipefail
+          auth_object=oss://doris-community-ci/codex/auth.json.4
+          jq -e '
+            .auth_mode == "chatgpt"
+            and (.tokens.access_token | type == "string" and length > 0)
+            and (.tokens.refresh_token | type == "string" and length > 0)
+          ' "$CODEX_HOME/auth.json" >/dev/null
+          original_hash="$(cat 
"$RUNNER_TEMP/codex-canary-auth-original.sha256")"
+          local_hash="$(sha256sum "$CODEX_HOME/auth.json" | awk '{print $1}')"
+          if [ "$local_hash" = "$original_hash" ]; then
+            echo "Canary auth was unchanged."
+            exit 0
+          fi
+          remote_auth="$(mktemp "$RUNNER_TEMP/codex-canary-current.XXXXXX")"
+          trap 'rm -f "$remote_auth"' EXIT
+          ossutil -i "$OSS_AK" -k "$OSS_SK" -e "$OSS_ENDPOINT" \
+            cp -f "$auth_object" "$remote_auth" >/dev/null
+          remote_hash="$(sha256sum "$remote_auth" | awk '{print $1}')"
+          if [ "$remote_hash" != "$original_hash" ]; then
+            echo "::error::Auth changed concurrently; refusing to overwrite 
it."
+            exit 1
+          fi
+          ossutil -i "$OSS_AK" -k "$OSS_SK" -e "$OSS_ENDPOINT" \
+            cp -f "$CODEX_HOME/auth.json" "$auth_object" >/dev/null
+          echo "Synced refreshed canary auth."
+
   code-review:
-    runs-on: ubuntu-latest
+    runs-on: ubuntu-24.04
     outputs:
       base_sha: ${{ steps.review_inputs.outputs.base_sha }}
       head_sha: ${{ steps.review_inputs.outputs.head_sha }}
@@ -46,15 +202,18 @@ jobs:
     # leaving 12 minutes for runner setup and post-job cleanup.
     timeout-minutes: 238
     if: >-
-      inputs.pr_number != '' ||
+      inputs.runtime_canary != true &&
       (
-        github.event_name == 'issue_comment' &&
-        github.event.issue.pull_request &&
-        startsWith(github.event.comment.body, '/review') &&
+        inputs.pr_number != '' ||
         (
-          github.event.comment.author_association == 'MEMBER' ||
-          github.event.comment.author_association == 'OWNER' ||
-          github.event.comment.author_association == 'COLLABORATOR'
+          github.event_name == 'issue_comment' &&
+          github.event.issue.pull_request &&
+          startsWith(github.event.comment.body, '/review') &&
+          (
+            github.event.comment.author_association == 'MEMBER' ||
+            github.event.comment.author_association == 'OWNER' ||
+            github.event.comment.author_association == 'COLLABORATOR'
+          )
         )
       )
     steps:
@@ -157,20 +316,6 @@ jobs:
           sudo apt-get update
           sudo apt-get install -y ripgrep
 
-      - name: Install Codex
-        timeout-minutes: 5
-        run: |
-          for attempt in 1 2 3; do
-            if npm install -g @openai/codex; then
-              codex --version
-              exit 0
-            fi
-            echo "Install attempt $attempt failed, retrying in 10s..."
-            sleep 10
-          done
-          echo "All install attempts failed"
-          exit 1
-
       - name: Install ossutil
         timeout-minutes: 5
         run: |
@@ -180,35 +325,36 @@ jobs:
           unzip -q "$tmp_dir/ossutil.zip" -d "$tmp_dir"
           sudo install -m 0755 "$tmp_dir/ossutil-v1.7.19-linux-amd64/ossutil" 
/usr/local/bin/ossutil
 
-      - name: Install Codex goal binary
+      - name: Install pinned Codex package
         timeout-minutes: 10
         run: |
-          codex_cmd="$(command -v codex)"
-          codex_target="$(readlink -f "$codex_cmd")"
-          tmp_dir="$(mktemp -d)"
-          trap 'rm -rf "$tmp_dir"' EXIT
-
-          downloaded=false
-          for object in "$OSS_CODEX_GOAL_OBJECT" 
"$OSS_CODEX_GOAL_FALLBACK_OBJECT"; do
-            if ossutil -i "$OSS_AK" -k "$OSS_SK" -e "$OSS_ENDPOINT" cp -f 
"$object" "$tmp_dir/codex-goal"; then
-              downloaded=true
-              break
-            fi
-          done
-          test "$downloaded" = "true"
-          test -s "$tmp_dir/codex-goal"
-          sudo install -m 0755 "$tmp_dir/codex-goal" "$codex_target"
-          "$codex_cmd" exec --help | grep -q -- '--goal'
-          "$codex_cmd" --version
-          # The deployed goal binary currently reports only 0.0.0. Record its
-          # identity so a resume failure can be reproduced with the same build.
-          sha256sum "$codex_target"
+          set -euo pipefail
+          archive="$RUNNER_TEMP/codex-exec-goal.tar.gz"
+          package="$RUNNER_TEMP/codex-exec-goal"
+          ossutil -i "$OSS_AK" -k "$OSS_SK" -e "$OSS_ENDPOINT" \
+            cp -f "$OSS_CODEX_PACKAGE_OBJECT" "$archive"
+          echo 
"2ee3073479bc8c94436684b55a13d7a3f299e768d04436d90e0427814a3954bc  $archive" | 
sha256sum --check
+          mkdir -p "$package"
+          tar -xzf "$archive" -C "$package"
+          (cd "$package" && sha256sum --check SHA256SUMS)
+          test "$(jq -r .version "$package/codex-package.json")" = 0.156.1
+          echo "$package/bin" >> "$GITHUB_PATH"
         env:
           OSS_AK: ${{ secrets.OSS_AK }}
           OSS_SK: ${{ secrets.OSS_SK }}
           OSS_ENDPOINT: oss-cn-hongkong.aliyuncs.com
-          OSS_CODEX_GOAL_OBJECT: oss://doris-community-ci/codex-goal
-          OSS_CODEX_GOAL_FALLBACK_OBJECT: 
oss://doris-community-ci/codex/codex-goal
+          OSS_CODEX_PACKAGE_OBJECT: 
oss://doris-community-ci/codex/releases/codex-exec-goal-0.156.1-a310d33f7ebb-x86_64-unknown-linux-gnu.tar.gz
+
+      - name: Verify pinned Codex runtime
+        timeout-minutes: 2
+        run: |
+          set -euo pipefail
+          codex_cmd="$(command -v codex)"
+          test "$(readlink -f "$codex_cmd")" = 
"$RUNNER_TEMP/codex-exec-goal/bin/codex"
+          echo 
"e07e6d32e9333cbc52ba058195d6b225c6e072c8c438541d61ec97645b811906  $codex_cmd" 
| sha256sum --check
+          codex --version
+          codex exec --help | grep -q -- '--goal'
+          codex exec --goal resume --help >/dev/null
 
       - name: Configure Codex auth
         id: auth


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to