From ebe5a23417ae8d94c2aff6eee6004a762f0d2ca7 Mon Sep 17 00:00:00 2001 From: even-wei Date: Wed, 11 Feb 2026 14:41:37 +0800 Subject: [PATCH 1/8] test(cloud): add staging smoke test for recce-cloud upload E2E test covering GitHub and RECCE_API_TOKEN upload flows against the staging server. Uses static dbt fixtures (no dbt build needed) and a cleanup trap to delete PR sessions after each run. Co-Authored-By: Claude Opus 4.6 Signed-off-by: even-wei --- .github/workflows/upload-smoke-test.yaml | 75 ++++++++ .../fixtures/minimal-target/catalog.json | 13 ++ .../fixtures/minimal-target/manifest.json | 21 +++ .../recce_cloud/smoke_test_upload.sh | 161 ++++++++++++++++++ 4 files changed, 270 insertions(+) create mode 100644 .github/workflows/upload-smoke-test.yaml create mode 100644 integration_tests/recce_cloud/fixtures/minimal-target/catalog.json create mode 100644 integration_tests/recce_cloud/fixtures/minimal-target/manifest.json create mode 100755 integration_tests/recce_cloud/smoke_test_upload.sh diff --git a/.github/workflows/upload-smoke-test.yaml b/.github/workflows/upload-smoke-test.yaml new file mode 100644 index 000000000..99652aaa4 --- /dev/null +++ b/.github/workflows/upload-smoke-test.yaml @@ -0,0 +1,75 @@ +name: Upload Smoke Test (recce-cloud) + +on: + push: + branches: [main] + paths: + - "recce_cloud/**" + - "integration_tests/recce_cloud/**" + pull_request: + branches: [main] + paths: + - "recce_cloud/**" + - "integration_tests/recce_cloud/**" + +permissions: + contents: read + pull-requests: read + +jobs: + authorize: + runs-on: ubuntu-latest + outputs: + authorized: ${{ steps.check.outputs.authorized }} + steps: + - name: Check if PR author has write permission + id: check + run: | + if [[ "${{ github.event_name }}" == "push" ]]; then + echo "authorized=true" >> $GITHUB_OUTPUT + exit 0 + fi + PERMISSION=$(gh api repos/${{ github.repository }}/collaborators/${{ github.triggering_actor }}/permission --jq '.permission' 2>/dev/null || echo "none") + if [[ "$PERMISSION" == "write" || "$PERMISSION" == "admin" ]]; then + echo "authorized=true" >> $GITHUB_OUTPUT + else + echo "authorized=false" >> $GITHUB_OUTPUT + echo "::warning::Upload smoke test skipped — requires write permission." + fi + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + upload-smoke-test: + needs: authorize + if: needs.authorize.outputs.authorized == 'true' + concurrency: + group: upload-smoke-test + cancel-in-progress: false + runs-on: ubuntu-latest + strategy: + max-parallel: 1 + matrix: + python-version: ["3.11"] + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + + - name: Install uv + uses: astral-sh/setup-uv@v4 + with: + version: "latest" + + - name: Install recce-cloud + run: | + uv venv + uv sync --no-dev --python ${{ matrix.python-version }} + + - name: Run upload smoke test + run: | + source .venv/bin/activate + ./integration_tests/recce_cloud/smoke_test_upload.sh + env: + GITHUB_TOKEN: ${{ secrets.RECCE_CLOUD_TOKEN }} + SMOKE_TEST_GITHUB_REPO: ${{ secrets.SMOKE_TEST_GITHUB_REPO }} + SMOKE_TEST_API_TOKEN: ${{ secrets.SMOKE_TEST_API_TOKEN }} diff --git a/integration_tests/recce_cloud/fixtures/minimal-target/catalog.json b/integration_tests/recce_cloud/fixtures/minimal-target/catalog.json new file mode 100644 index 000000000..815145e2b --- /dev/null +++ b/integration_tests/recce_cloud/fixtures/minimal-target/catalog.json @@ -0,0 +1,13 @@ +{ + "metadata": { + "dbt_schema_version": "https://schemas.getdbt.com/dbt/catalog/v1/catalog.json", + "dbt_version": "1.8.0", + "adapter_type": "duckdb", + "generated_at": "2026-01-01T00:00:00.000000Z", + "invocation_id": "00000000-0000-0000-0000-000000000000", + "env": {} + }, + "nodes": {}, + "sources": {}, + "errors": null +} diff --git a/integration_tests/recce_cloud/fixtures/minimal-target/manifest.json b/integration_tests/recce_cloud/fixtures/minimal-target/manifest.json new file mode 100644 index 000000000..9f2e146c5 --- /dev/null +++ b/integration_tests/recce_cloud/fixtures/minimal-target/manifest.json @@ -0,0 +1,21 @@ +{ + "metadata": { + "dbt_schema_version": "https://schemas.getdbt.com/dbt/manifest/v11/manifest.json", + "dbt_version": "1.8.0", + "adapter_type": "duckdb", + "generated_at": "2026-01-01T00:00:00.000000Z", + "invocation_id": "00000000-0000-0000-0000-000000000000", + "env": {} + }, + "nodes": {}, + "sources": {}, + "macros": {}, + "docs": {}, + "exposures": {}, + "metrics": {}, + "groups": {}, + "selectors": {}, + "disabled": [], + "parent_map": {}, + "child_map": {} +} diff --git a/integration_tests/recce_cloud/smoke_test_upload.sh b/integration_tests/recce_cloud/smoke_test_upload.sh new file mode 100755 index 000000000..a8e954c4b --- /dev/null +++ b/integration_tests/recce_cloud/smoke_test_upload.sh @@ -0,0 +1,161 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ============================================================ +# Smoke test for `recce-cloud upload` +# +# Tests all upload flows against the staging server: +# 1. GitHub PR Upload (GITHUB_TOKEN, platform-specific) +# 2. GitHub Prod Upload (GITHUB_TOKEN, --type prod) +# 3. RECCE_API_TOKEN PR Upload (generic endpoint) +# 4. RECCE_API_TOKEN Prod Upload (generic endpoint, --type prod) +# +# Required env vars: +# GITHUB_TOKEN - PAT with repo scope for staging test repo +# SMOKE_TEST_GITHUB_REPO - Staging test repo (e.g., DataRecce/jaffle_shop_duckdb) +# +# Optional env vars: +# SMOKE_TEST_API_TOKEN - RECCE_API_TOKEN for generic endpoint tests (tests 3-4) +# +# Provided by GitHub Actions (already set): +# GITHUB_ACTIONS, GITHUB_SHA, GITHUB_REF_NAME +# ============================================================ + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +FIXTURES_DIR="${SCRIPT_DIR}/fixtures/minimal-target" +TEST_BRANCH="smoke-test-upload-$(date +%s)" +PASS_COUNT=0 +FAIL_COUNT=0 + +# ---- Prerequisite checks ---- +if [[ "${GITHUB_ACTIONS:-}" != "true" ]]; then + echo "ERROR: This test must run inside GitHub Actions" + exit 1 +fi + +for var in GITHUB_TOKEN SMOKE_TEST_GITHUB_REPO; do + if [[ -z "${!var:-}" ]]; then + echo "ERROR: $var is required" + exit 1 + fi +done + +# ---- Recce Cloud config ---- +export RECCE_CLOUD_API_HOST="${RECCE_CLOUD_API_HOST:-https://cloud.datarecce.io}" + +# Disable anonymous tracking +mkdir -p ~/.recce +cat > ~/.recce/profile.yml < "$SYNTHETIC_EVENT" </dev/null || true + rm -f "$SYNTHETIC_EVENT" + echo "Cleanup complete" +} +trap cleanup EXIT + +# ---- Test helper ---- +run_test() { + local test_name="$1" + shift + echo "" + echo "=== $test_name ===" + if "$@"; then + echo "PASS: $test_name" + PASS_COUNT=$((PASS_COUNT + 1)) + else + echo "FAIL: $test_name (exit code: $?)" + FAIL_COUNT=$((FAIL_COUNT + 1)) + fi +} + +echo "============================================" +echo "Upload Smoke Test" +echo "============================================" +echo "Test repo: $SMOKE_TEST_GITHUB_REPO" +echo "Test branch: $TEST_BRANCH" +echo "Fixtures: $FIXTURES_DIR" +echo "API host: $RECCE_CLOUD_API_HOST" +echo "API token: ${SMOKE_TEST_API_TOKEN:+set}${SMOKE_TEST_API_TOKEN:-not set}" + +# ==== Test 1: GitHub PR Upload ==== +# Uses GITHUB_TOKEN (Priority 2 path). RECCE_API_TOKEN must NOT be set. +run_test "Test 1: GitHub PR Upload" \ + env -u RECCE_API_TOKEN \ + GITHUB_REPOSITORY="$SMOKE_TEST_GITHUB_REPO" \ + GITHUB_EVENT_PATH="$SYNTHETIC_EVENT" \ + GITHUB_HEAD_REF="$TEST_BRANCH" \ + GITHUB_BASE_REF="main" \ + recce-cloud upload --target-path "$FIXTURES_DIR" + +# ==== Test 2: GitHub Prod Upload ==== +# Uses GITHUB_TOKEN + --type prod. RECCE_API_TOKEN must NOT be set. +run_test "Test 2: GitHub Prod Upload" \ + env -u RECCE_API_TOKEN \ + GITHUB_REPOSITORY="$SMOKE_TEST_GITHUB_REPO" \ + GITHUB_EVENT_PATH="$SYNTHETIC_EVENT" \ + GITHUB_HEAD_REF="$TEST_BRANCH" \ + GITHUB_BASE_REF="main" \ + recce-cloud upload --target-path "$FIXTURES_DIR" --type prod + +# ==== Test 3: RECCE_API_TOKEN PR Upload ==== +if [[ -n "${SMOKE_TEST_API_TOKEN:-}" ]]; then + # Uses RECCE_API_TOKEN (Priority 1 path). CI env vars still needed for platform detection. + run_test "Test 3: RECCE_API_TOKEN PR Upload" \ + env RECCE_API_TOKEN="$SMOKE_TEST_API_TOKEN" \ + GITHUB_REPOSITORY="$SMOKE_TEST_GITHUB_REPO" \ + GITHUB_EVENT_PATH="$SYNTHETIC_EVENT" \ + GITHUB_HEAD_REF="$TEST_BRANCH" \ + GITHUB_BASE_REF="main" \ + recce-cloud upload --target-path "$FIXTURES_DIR" + + # ==== Test 4: RECCE_API_TOKEN Prod Upload ==== + run_test "Test 4: RECCE_API_TOKEN Prod Upload" \ + env RECCE_API_TOKEN="$SMOKE_TEST_API_TOKEN" \ + GITHUB_REPOSITORY="$SMOKE_TEST_GITHUB_REPO" \ + GITHUB_EVENT_PATH="$SYNTHETIC_EVENT" \ + GITHUB_HEAD_REF="$TEST_BRANCH" \ + GITHUB_BASE_REF="main" \ + recce-cloud upload --target-path "$FIXTURES_DIR" --type prod +else + echo "" + echo "SKIP: Tests 3-4 (RECCE_API_TOKEN) — SMOKE_TEST_API_TOKEN not set" +fi + +# ==== TODO: GitLab CI Upload ==== +# Cannot test from GitHub Actions — server verifies CI_JOB_TOKEN +# by calling GitLab /job API. Needs a real GitLab CI pipeline. + +# ==== Summary ==== +echo "" +echo "============================================" +echo "Results: $PASS_COUNT passed, $FAIL_COUNT failed" +echo "============================================" + +if [[ $FAIL_COUNT -gt 0 ]]; then + exit 1 +fi From f7becfebd7ace16a6a7ead302cf0c10bd61996fb Mon Sep 17 00:00:00 2001 From: even-wei Date: Wed, 11 Feb 2026 14:43:35 +0800 Subject: [PATCH 2/8] test(cloud): remove state file operations from dbt smoke test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The recce state download/upload/purge tests are no longer needed — state file workflows are separate from the artifact pipeline tested here. Co-Authored-By: Claude Opus 4.6 Signed-off-by: even-wei --- integration_tests/dbt/smoke_test_cloud.sh | 6 ------ 1 file changed, 6 deletions(-) diff --git a/integration_tests/dbt/smoke_test_cloud.sh b/integration_tests/dbt/smoke_test_cloud.sh index 60f34a447..20b275f79 100755 --- a/integration_tests/dbt/smoke_test_cloud.sh +++ b/integration_tests/dbt/smoke_test_cloud.sh @@ -37,11 +37,6 @@ recce cloud download-artifacts --branch $GIT_BRANCH # Recce Run recce run --cloud -# Recce state -recce cloud download -recce cloud purge --force -recce cloud upload recce_state.json - # Recce Summary recce summary --cloud @@ -66,6 +61,5 @@ function check_server_status() { echo "Starting the server (cloud and review mode)..." recce server --cloud --review & check_server_status -recce cloud purge --force export GITHUB_EVENT_PATH="$HOLD_GITHUB_EVENT_PATH" From 897c0adb5d2cd473e196f8a9f3e450e062671888 Mon Sep 17 00:00:00 2001 From: even-wei Date: Thu, 12 Feb 2026 12:08:08 +0800 Subject: [PATCH 3/8] test(cloud): hardcode DataRecce/recce-smoke-test as test target Remove SMOKE_TEST_GITHUB_REPO secret in favor of hardcoded repo name. Co-Authored-By: Claude Opus 4.6 Signed-off-by: even-wei --- .github/workflows/upload-smoke-test.yaml | 1 - integration_tests/recce_cloud/smoke_test_upload.sh | 14 ++++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/.github/workflows/upload-smoke-test.yaml b/.github/workflows/upload-smoke-test.yaml index 99652aaa4..62fdedc22 100644 --- a/.github/workflows/upload-smoke-test.yaml +++ b/.github/workflows/upload-smoke-test.yaml @@ -71,5 +71,4 @@ jobs: ./integration_tests/recce_cloud/smoke_test_upload.sh env: GITHUB_TOKEN: ${{ secrets.RECCE_CLOUD_TOKEN }} - SMOKE_TEST_GITHUB_REPO: ${{ secrets.SMOKE_TEST_GITHUB_REPO }} SMOKE_TEST_API_TOKEN: ${{ secrets.SMOKE_TEST_API_TOKEN }} diff --git a/integration_tests/recce_cloud/smoke_test_upload.sh b/integration_tests/recce_cloud/smoke_test_upload.sh index a8e954c4b..bb80fb19c 100755 --- a/integration_tests/recce_cloud/smoke_test_upload.sh +++ b/integration_tests/recce_cloud/smoke_test_upload.sh @@ -11,8 +11,7 @@ set -euo pipefail # 4. RECCE_API_TOKEN Prod Upload (generic endpoint, --type prod) # # Required env vars: -# GITHUB_TOKEN - PAT with repo scope for staging test repo -# SMOKE_TEST_GITHUB_REPO - Staging test repo (e.g., DataRecce/jaffle_shop_duckdb) +# GITHUB_TOKEN - PAT with repo scope for the test repo # # Optional env vars: # SMOKE_TEST_API_TOKEN - RECCE_API_TOKEN for generic endpoint tests (tests 3-4) @@ -23,6 +22,7 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" FIXTURES_DIR="${SCRIPT_DIR}/fixtures/minimal-target" +SMOKE_TEST_GITHUB_REPO="DataRecce/recce-smoke-test" TEST_BRANCH="smoke-test-upload-$(date +%s)" PASS_COUNT=0 FAIL_COUNT=0 @@ -33,12 +33,10 @@ if [[ "${GITHUB_ACTIONS:-}" != "true" ]]; then exit 1 fi -for var in GITHUB_TOKEN SMOKE_TEST_GITHUB_REPO; do - if [[ -z "${!var:-}" ]]; then - echo "ERROR: $var is required" - exit 1 - fi -done +if [[ -z "${GITHUB_TOKEN:-}" ]]; then + echo "ERROR: GITHUB_TOKEN is required" + exit 1 +fi # ---- Recce Cloud config ---- export RECCE_CLOUD_API_HOST="${RECCE_CLOUD_API_HOST:-https://cloud.datarecce.io}" From 3771429a347b2c884e1b6640676f01b3a1181d79 Mon Sep 17 00:00:00 2001 From: even-wei Date: Fri, 13 Feb 2026 20:36:57 +0800 Subject: [PATCH 4/8] test(cloud): add session-name and session-id upload tests Tests 5-6 cover the --session-name (dev session) and --session-id upload flows. Test 6 reuses the session created by test 5. Both require SMOKE_TEST_API_TOKEN + SMOKE_TEST_ORG + SMOKE_TEST_PROJECT. Co-Authored-By: Claude Opus 4.6 Signed-off-by: even-wei --- .github/workflows/upload-smoke-test.yaml | 2 + .../recce_cloud/smoke_test_upload.sh | 60 ++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/.github/workflows/upload-smoke-test.yaml b/.github/workflows/upload-smoke-test.yaml index 62fdedc22..241691000 100644 --- a/.github/workflows/upload-smoke-test.yaml +++ b/.github/workflows/upload-smoke-test.yaml @@ -72,3 +72,5 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.RECCE_CLOUD_TOKEN }} SMOKE_TEST_API_TOKEN: ${{ secrets.SMOKE_TEST_API_TOKEN }} + SMOKE_TEST_ORG: ${{ secrets.SMOKE_TEST_ORG }} + SMOKE_TEST_PROJECT: ${{ secrets.SMOKE_TEST_PROJECT }} diff --git a/integration_tests/recce_cloud/smoke_test_upload.sh b/integration_tests/recce_cloud/smoke_test_upload.sh index bb80fb19c..ce632fba0 100755 --- a/integration_tests/recce_cloud/smoke_test_upload.sh +++ b/integration_tests/recce_cloud/smoke_test_upload.sh @@ -9,12 +9,16 @@ set -euo pipefail # 2. GitHub Prod Upload (GITHUB_TOKEN, --type prod) # 3. RECCE_API_TOKEN PR Upload (generic endpoint) # 4. RECCE_API_TOKEN Prod Upload (generic endpoint, --type prod) +# 5. Session Name Upload (--session-name, dev session) +# 6. Session ID Upload (--session-id, reuses session from test 5) # # Required env vars: # GITHUB_TOKEN - PAT with repo scope for the test repo # # Optional env vars: -# SMOKE_TEST_API_TOKEN - RECCE_API_TOKEN for generic endpoint tests (tests 3-4) +# SMOKE_TEST_API_TOKEN - RECCE_API_TOKEN for generic endpoint tests (tests 3-6) +# SMOKE_TEST_ORG - Recce Cloud org ID for session-name/ID tests (tests 5-6) +# SMOKE_TEST_PROJECT - Recce Cloud project ID for session-name/ID tests (tests 5-6) # # Provided by GitHub Actions (already set): # GITHUB_ACTIONS, GITHUB_SHA, GITHUB_REF_NAME @@ -24,6 +28,8 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" FIXTURES_DIR="${SCRIPT_DIR}/fixtures/minimal-target" SMOKE_TEST_GITHUB_REPO="DataRecce/recce-smoke-test" TEST_BRANCH="smoke-test-upload-$(date +%s)" +DEV_SESSION_NAME="smoke-test-dev-$(date +%s)" +DEV_SESSION_ID="" PASS_COUNT=0 FAIL_COUNT=0 @@ -71,6 +77,13 @@ cleanup() { GITHUB_HEAD_REF="$TEST_BRANCH" \ GITHUB_BASE_REF="main" \ recce-cloud delete --force 2>/dev/null || true + + # Delete dev session created by session-name test (if any). + if [[ -n "$DEV_SESSION_ID" ]]; then + env RECCE_API_TOKEN="$SMOKE_TEST_API_TOKEN" \ + recce-cloud delete --session-id "$DEV_SESSION_ID" --force 2>/dev/null || true + fi + rm -f "$SYNTHETIC_EVENT" echo "Cleanup complete" } @@ -99,6 +112,7 @@ echo "Test branch: $TEST_BRANCH" echo "Fixtures: $FIXTURES_DIR" echo "API host: $RECCE_CLOUD_API_HOST" echo "API token: ${SMOKE_TEST_API_TOKEN:+set}${SMOKE_TEST_API_TOKEN:-not set}" +echo "Org/Project: ${SMOKE_TEST_ORG:-not set}/${SMOKE_TEST_PROJECT:-not set}" # ==== Test 1: GitHub PR Upload ==== # Uses GITHUB_TOKEN (Priority 2 path). RECCE_API_TOKEN must NOT be set. @@ -144,6 +158,50 @@ else echo "SKIP: Tests 3-4 (RECCE_API_TOKEN) — SMOKE_TEST_API_TOKEN not set" fi +# ==== Test 5: Session Name Upload (dev session) ==== +# ==== Test 6: Session ID Upload (reuses session from test 5) ==== +if [[ -n "${SMOKE_TEST_API_TOKEN:-}" && -n "${SMOKE_TEST_ORG:-}" && -n "${SMOKE_TEST_PROJECT:-}" ]]; then + # Test 5: Upload with --session-name (creates a dev session) + run_test "Test 5: Session Name Upload" \ + env RECCE_API_TOKEN="$SMOKE_TEST_API_TOKEN" \ + RECCE_ORG="$SMOKE_TEST_ORG" \ + RECCE_PROJECT="$SMOKE_TEST_PROJECT" \ + recce-cloud upload --target-path "$FIXTURES_DIR" \ + --session-name "$DEV_SESSION_NAME" --yes + + # Look up the session ID for the dev session we just created. + DEV_SESSION_ID=$( + env RECCE_API_TOKEN="$SMOKE_TEST_API_TOKEN" \ + RECCE_ORG="$SMOKE_TEST_ORG" \ + RECCE_PROJECT="$SMOKE_TEST_PROJECT" \ + recce-cloud list --type dev --json 2>/dev/null \ + | python3 -c " +import sys, json +sessions = json.load(sys.stdin) +for s in sessions: + if s.get('name') == '$DEV_SESSION_NAME': + print(s['id']) + break +" 2>/dev/null || true + ) + + if [[ -n "$DEV_SESSION_ID" ]]; then + echo "Dev session ID: $DEV_SESSION_ID" + + # Test 6: Upload with --session-id (reuses the session from test 5) + run_test "Test 6: Session ID Upload" \ + env RECCE_API_TOKEN="$SMOKE_TEST_API_TOKEN" \ + recce-cloud upload --target-path "$FIXTURES_DIR" \ + --session-id "$DEV_SESSION_ID" + else + echo "FAIL: Could not retrieve dev session ID for test 6" + FAIL_COUNT=$((FAIL_COUNT + 1)) + fi +else + echo "" + echo "SKIP: Tests 5-6 (session-name/ID) — SMOKE_TEST_API_TOKEN, SMOKE_TEST_ORG, or SMOKE_TEST_PROJECT not set" +fi + # ==== TODO: GitLab CI Upload ==== # Cannot test from GitHub Actions — server verifies CI_JOB_TOKEN # by calling GitLab /job API. Needs a real GitLab CI pipeline. From 27245a81a922c146532a7354fc0cb722d4727624 Mon Sep 17 00:00:00 2001 From: even-wei Date: Fri, 13 Feb 2026 23:25:06 +0800 Subject: [PATCH 5/8] test(cloud): use staging API host as default Co-Authored-By: Claude Opus 4.6 Signed-off-by: even-wei --- integration_tests/recce_cloud/smoke_test_upload.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration_tests/recce_cloud/smoke_test_upload.sh b/integration_tests/recce_cloud/smoke_test_upload.sh index ce632fba0..726a09345 100755 --- a/integration_tests/recce_cloud/smoke_test_upload.sh +++ b/integration_tests/recce_cloud/smoke_test_upload.sh @@ -45,7 +45,7 @@ if [[ -z "${GITHUB_TOKEN:-}" ]]; then fi # ---- Recce Cloud config ---- -export RECCE_CLOUD_API_HOST="${RECCE_CLOUD_API_HOST:-https://cloud.datarecce.io}" +export RECCE_CLOUD_API_HOST="${RECCE_CLOUD_API_HOST:-https://staging.cloud.datarecce.io}" # Disable anonymous tracking mkdir -p ~/.recce From 524aa8c6f54aac113436cb4d416aa0a267f5414f Mon Sep 17 00:00:00 2001 From: even-wei Date: Fri, 13 Feb 2026 23:32:49 +0800 Subject: [PATCH 6/8] fix(ci): install recce-cloud from its subdirectory uv sync at the repo root doesn't install the recce_cloud workspace member's entry point. Install from recce_cloud/ like tests-recce-cloud workflow does. Co-Authored-By: Claude Opus 4.6 Signed-off-by: even-wei --- .github/workflows/upload-smoke-test.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/upload-smoke-test.yaml b/.github/workflows/upload-smoke-test.yaml index 241691000..b12f6aacb 100644 --- a/.github/workflows/upload-smoke-test.yaml +++ b/.github/workflows/upload-smoke-test.yaml @@ -61,13 +61,14 @@ jobs: version: "latest" - name: Install recce-cloud + working-directory: recce_cloud run: | uv venv uv sync --no-dev --python ${{ matrix.python-version }} - name: Run upload smoke test run: | - source .venv/bin/activate + source recce_cloud/.venv/bin/activate ./integration_tests/recce_cloud/smoke_test_upload.sh env: GITHUB_TOKEN: ${{ secrets.RECCE_CLOUD_TOKEN }} From 997c2ee80fcdd66c9db34ac1b02eaa77f93b5726 Mon Sep 17 00:00:00 2001 From: even-wei Date: Fri, 13 Feb 2026 23:48:09 +0800 Subject: [PATCH 7/8] fix(ci): use uv run to invoke smoke test script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Match the pattern from tests-recce-cloud.yaml — let uv manage the venv and PATH instead of manually activating. Co-Authored-By: Claude Opus 4.6 Signed-off-by: even-wei --- .github/workflows/upload-smoke-test.yaml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/upload-smoke-test.yaml b/.github/workflows/upload-smoke-test.yaml index b12f6aacb..bfc21b942 100644 --- a/.github/workflows/upload-smoke-test.yaml +++ b/.github/workflows/upload-smoke-test.yaml @@ -62,14 +62,11 @@ jobs: - name: Install recce-cloud working-directory: recce_cloud - run: | - uv venv - uv sync --no-dev --python ${{ matrix.python-version }} + run: uv sync --no-dev --python ${{ matrix.python-version }} - name: Run upload smoke test - run: | - source recce_cloud/.venv/bin/activate - ./integration_tests/recce_cloud/smoke_test_upload.sh + working-directory: recce_cloud + run: uv run ../integration_tests/recce_cloud/smoke_test_upload.sh env: GITHUB_TOKEN: ${{ secrets.RECCE_CLOUD_TOKEN }} SMOKE_TEST_API_TOKEN: ${{ secrets.SMOKE_TEST_API_TOKEN }} From 368dd28fedfd13a67d4dd04557c2c45d66fb69e5 Mon Sep 17 00:00:00 2001 From: even-wei Date: Sat, 14 Feb 2026 00:05:13 +0800 Subject: [PATCH 8/8] test(cloud): use real PR #1 from recce-smoke-test repo Co-Authored-By: Claude Opus 4.6 Signed-off-by: even-wei --- integration_tests/recce_cloud/smoke_test_upload.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration_tests/recce_cloud/smoke_test_upload.sh b/integration_tests/recce_cloud/smoke_test_upload.sh index 726a09345..8f5c3d7d7 100755 --- a/integration_tests/recce_cloud/smoke_test_upload.sh +++ b/integration_tests/recce_cloud/smoke_test_upload.sh @@ -59,7 +59,7 @@ SYNTHETIC_EVENT=$(mktemp) cat > "$SYNTHETIC_EVENT" <