diff --git a/.github/workflows/test_chained_e2e.yml b/.github/workflows/chained_e2e.yml similarity index 97% rename from .github/workflows/test_chained_e2e.yml rename to .github/workflows/chained_e2e.yml index efdb8d0737..32e6571ff4 100644 --- a/.github/workflows/test_chained_e2e.yml +++ b/.github/workflows/chained_e2e.yml @@ -1,4 +1,4 @@ -name: 'Test Chained E2E' +name: 'Testing: E2E (Chained)' on: push: @@ -130,7 +130,7 @@ jobs: - 'parse_run_context' runs-on: 'gemini-cli-ubuntu-16-core' if: | - always() && (needs.merge_queue_skipper.result !='success' || needs.merge_queue_skipper.outputs.skip == 'false') + always() && (needs.merge_queue_skipper.result !='success' || needs.merge_queue_skipper.outputs.skip != 'true') strategy: fail-fast: false matrix: @@ -182,7 +182,7 @@ jobs: - 'parse_run_context' runs-on: 'macos-latest' if: | - always() && (needs.merge_queue_skipper.result !='success' || needs.merge_queue_skipper.outputs.skip == 'false') + always() && (needs.merge_queue_skipper.result !='success' || needs.merge_queue_skipper.outputs.skip != 'true') steps: - name: 'Checkout' uses: 'actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955' # ratchet:actions/checkout@v5 @@ -220,7 +220,7 @@ jobs: - 'merge_queue_skipper' - 'parse_run_context' if: | - always() && (needs.merge_queue_skipper.result !='success' || needs.merge_queue_skipper.outputs.skip == 'false') + always() && (needs.merge_queue_skipper.result !='success' || needs.merge_queue_skipper.outputs.skip != 'true') runs-on: 'gemini-cli-windows-16-core' continue-on-error: true @@ -278,7 +278,7 @@ jobs: e2e: name: 'E2E' if: | - always() && (needs.merge_queue_skipper.result !='success' || needs.merge_queue_skipper.outputs.skip == 'false') + always() && (needs.merge_queue_skipper.result !='success' || needs.merge_queue_skipper.outputs.skip != 'true') needs: - 'e2e_linux' - 'e2e_mac' diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml deleted file mode 100644 index 19787b675b..0000000000 --- a/.github/workflows/e2e.yml +++ /dev/null @@ -1,247 +0,0 @@ -name: 'Testing: E2E' - -on: - push: - branches: - - 'main' - # This will run for PRs from the base repository, providing secrets. - pull_request: - branches: - - 'main' - - 'release/**' - # This will run for PRs from forks when a label is added. - pull_request_target: - types: ['labeled'] - merge_group: - workflow_dispatch: - inputs: - branch_ref: - description: 'Branch to run on' - required: true - default: 'main' - type: 'string' - -concurrency: - group: '${{ github.workflow }}-${{ github.head_ref || github.ref }}' - cancel-in-progress: |- - ${{ github.ref != 'refs/heads/main' && !startsWith(github.ref, 'refs/heads/release/') }} - -jobs: - merge_queue_skipper: - name: 'Merge Queue Skipper' - runs-on: 'gemini-cli-ubuntu-16-core' - permissions: 'read-all' - outputs: - skip: '${{ steps.merge-queue-e2e-skipper.outputs.skip-check }}' - steps: - - id: 'merge-queue-e2e-skipper' - uses: 'cariad-tech/merge-queue-ci-skipper@1032489e59437862c90a08a2c92809c903883772' # ratchet:cariad-tech/merge-queue-ci-skipper@main - with: - secret: '${{ secrets.GITHUB_TOKEN }}' - continue-on-error: true - - e2e_linux: - name: 'E2E Test (Linux) - ${{ matrix.sandbox }}' - needs: 'merge_queue_skipper' - if: | - (needs.merge_queue_skipper.result !='success' || needs.merge_queue_skipper.outputs.skip == 'false') && - (github.event_name == 'push' || - github.event_name == 'merge_group' || - github.event_name == 'workflow_dispatch' || - (github.event.pull_request.head.repo.full_name == github.repository) || - (github.event.label.name == 'maintainer:e2e:ok')) - runs-on: 'gemini-cli-ubuntu-16-core' - strategy: - fail-fast: false - matrix: - sandbox: - - 'sandbox:none' - - 'sandbox:docker' - node-version: - - '20.x' - - steps: - - name: 'Checkout (fork)' - uses: 'actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955' # ratchet:actions/checkout@v5 - if: "github.event_name == 'pull_request_target'" - with: - ref: '${{ github.event.pull_request.head.sha }}' - repository: '${{ github.event.pull_request.head.repo.full_name }}' - - - name: 'Checkout (internal)' - uses: 'actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955' # ratchet:actions/checkout@v5 - if: "github.event_name != 'pull_request_target'" - with: - ref: '${{ github.event.inputs.branch_ref || github.ref }}' - - - name: 'Set up Node.js ${{ matrix.node-version }}' - uses: 'actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020' # ratchet:actions-node@v4 - with: - node-version: '${{ matrix.node-version }}' - - - name: 'Install dependencies' - run: 'npm ci' - - - name: 'Build project' - run: 'npm run build' - - - name: 'Set up Docker' - if: "matrix.sandbox == 'sandbox:docker'" - uses: 'docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435' # ratchet:docker/setup-buildx-action@v3 - - - name: 'Run E2E tests' - env: - GEMINI_API_KEY: '${{ secrets.GEMINI_API_KEY }}' - KEEP_OUTPUT: 'true' - VERBOSE: 'true' - shell: 'bash' - run: | - if [[ "${{ matrix.sandbox }}" == "sandbox:docker" ]]; then - npm run test:integration:sandbox:docker - else - npm run test:integration:sandbox:none - fi - - e2e_mac: - name: 'E2E Test (macOS)' - needs: 'merge_queue_skipper' - if: | - (needs.merge_queue_skipper.result !='success' || needs.merge_queue_skipper.outputs.skip == 'false') && - (github.event_name == 'push' || - github.event_name == 'merge_group' || - github.event_name == 'workflow_dispatch' || - (github.event.pull_request.head.repo.full_name == github.repository) || - (github.event.label.name == 'maintainer:e2e:ok')) - runs-on: 'macos-latest' - steps: - - name: 'Checkout (fork)' - uses: 'actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955' # ratchet:actions/checkout@v5 - if: "github.event_name == 'pull_request_target'" - with: - ref: '${{ github.event.pull_request.head.sha }}' - repository: '${{ github.event.pull_request.head.repo.full_name }}' - - - name: 'Checkout (internal)' - uses: 'actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955' # ratchet:actions/checkout@v5 - if: "github.event_name != 'pull_request_target'" - with: - ref: '${{ github.event.inputs.branch_ref || github.ref }}' - - - name: 'Set up Node.js 20.x' - uses: 'actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020' # ratchet:actions-node@v4 - with: - node-version: '20.x' - - - name: 'Install dependencies' - run: 'npm ci' - - - name: 'Build project' - run: 'npm run build' - - - name: 'Fix rollup optional dependencies on macOS' - if: "runner.os == 'macOS'" - run: | - npm cache clean --force - - name: 'Run E2E tests (non-Windows)' - if: "runner.os != 'Windows'" - env: - GEMINI_API_KEY: '${{ secrets.GEMINI_API_KEY }}' - KEEP_OUTPUT: 'true' - SANDBOX: 'sandbox:none' - VERBOSE: 'true' - run: 'npm run test:integration:sandbox:none' - - e2e_windows: - name: 'Slow E2E - Win' - needs: 'merge_queue_skipper' - if: | - (needs.merge_queue_skipper.result !='success' || needs.merge_queue_skipper.outputs.skip == 'false') && - (github.event_name == 'push' || - github.event_name == 'merge_group' || - github.event_name == 'workflow_dispatch' || - (github.event.pull_request.head.repo.full_name == github.repository) || - (github.event.label.name == 'maintainer:e2e:ok')) - runs-on: 'gemini-cli-windows-16-core' - continue-on-error: true - - steps: - - name: 'Checkout (fork)' - uses: 'actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955' # ratchet:actions/checkout@v5 - if: "github.event_name == 'pull_request_target'" - with: - ref: '${{ github.event.pull_request.head.sha }}' - repository: '${{ github.event.pull_request.head.repo.full_name }}' - - - name: 'Checkout (internal)' - uses: 'actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955' # ratchet:actions/checkout@v5 - if: "github.event_name != 'pull_request_target'" - with: - ref: '${{ github.event.inputs.branch_ref || github.ref }}' - - - name: 'Set up Node.js 20.x' - uses: 'actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020' # ratchet:actions-node@v4 - with: - node-version: '20.x' - cache: 'npm' - - - name: 'Configure Windows Defender exclusions' - run: | - Add-MpPreference -ExclusionPath $env:GITHUB_WORKSPACE -Force - Add-MpPreference -ExclusionPath "$env:GITHUB_WORKSPACE\node_modules" -Force - Add-MpPreference -ExclusionPath "$env:GITHUB_WORKSPACE\packages" -Force - Add-MpPreference -ExclusionPath "$env:TEMP" -Force - shell: 'pwsh' - - - name: 'Configure npm for Windows performance' - run: | - npm config set progress false - npm config set audit false - npm config set fund false - npm config set loglevel error - npm config set maxsockets 32 - npm config set registry https://registry.npmjs.org/ - shell: 'pwsh' - - - name: 'Install dependencies' - run: 'npm ci' - shell: 'pwsh' - - - name: 'Build project' - run: 'npm run build' - shell: 'pwsh' - - - name: 'Run E2E tests' - env: - GEMINI_API_KEY: '${{ secrets.GEMINI_API_KEY }}' - KEEP_OUTPUT: 'true' - SANDBOX: 'sandbox:none' - VERBOSE: 'true' - NODE_OPTIONS: '--max-old-space-size=32768 --max-semi-space-size=256' - UV_THREADPOOL_SIZE: '32' - NODE_ENV: 'test' - shell: 'pwsh' - run: 'npm run test:integration:sandbox:none' - - e2e: - name: 'E2E' - if: | - always() && ( - github.event_name == 'push' || - github.event_name == 'merge_group' || - github.event_name == 'workflow_dispatch' || - (github.event.pull_request.head.repo.full_name == github.repository) || - (github.event.label.name == 'maintainer:e2e:ok') - ) - needs: - - 'e2e_linux' - - 'e2e_mac' - runs-on: 'gemini-cli-ubuntu-16-core' - steps: - - name: 'Check E2E test results' - run: | - if [[ (${{ needs.e2e_linux.result }} != 'success' && ${{ needs.e2e_linux.result }} != 'skipped') || \ - (${{ needs.e2e_mac.result }} != 'success' && ${{ needs.e2e_mac.result }} != 'skipped') ]]; then - echo "One or more E2E jobs failed." - exit 1 - fi - echo "All required E2E jobs passed!" diff --git a/README.md b/README.md index 006edb33a8..3d3fe95f7e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Gemini CLI [![Gemini CLI CI](https://github.com/google-gemini/gemini-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/google-gemini/gemini-cli/actions/workflows/ci.yml) -[![Gemini CLI E2E](https://github.com/google-gemini/gemini-cli/actions/workflows/e2e.yml/badge.svg)](https://github.com/google-gemini/gemini-cli/actions/workflows/e2e.yml) +[![Gemini CLI E2E (Chained)](https://github.com/google-gemini/gemini-cli/actions/workflows/chained_e2e.yml/badge.svg)](https://github.com/google-gemini/gemini-cli/actions/workflows/chained_e2e.yml) [![Version](https://img.shields.io/npm/v/@google/gemini-cli)](https://www.npmjs.com/package/@google/gemini-cli) [![License](https://img.shields.io/github/license/google-gemini/gemini-cli)](https://github.com/google-gemini/gemini-cli/blob/main/LICENSE) [![View Code Wiki](https://www.gstatic.com/_/boq-sdlc-agents-ui/_/r/YUi5dj2UWvE.svg)](https://codewiki.google/github.com/google-gemini/gemini-cli) diff --git a/docs/integration-tests.md b/docs/integration-tests.md index 351f832fba..f5784c344b 100644 --- a/docs/integration-tests.md +++ b/docs/integration-tests.md @@ -199,9 +199,9 @@ file, or case. ## Continuous integration To ensure the integration tests are always run, a GitHub Actions workflow is -defined in `.github/workflows/e2e.yml`. This workflow automatically runs the -integrations tests for pull requests against the `main` branch, or when a pull -request is added to a merge queue. +defined in `.github/workflows/chained_e2e.yml`. This workflow automatically runs +the integrations tests for pull requests against the `main` branch, or when a +pull request is added to a merge queue. The workflow runs the tests in different sandboxing environments to ensure Gemini CLI is tested across each: diff --git a/docs/release-confidence.md b/docs/release-confidence.md index 7d30fee0f0..f2dcccff4f 100644 --- a/docs/release-confidence.md +++ b/docs/release-confidence.md @@ -33,7 +33,7 @@ nightly) or the release branch (for preview/stable). ### 2. End-to-end (E2E) tests -All workflows in `.github/workflows/e2e.yml` must pass. +All workflows in `.github/workflows/chained_e2e.yml` must pass. - **Platforms:** **Linux, macOS and Windows**. - **Sandboxing:** Tests must pass with both `sandbox:none` and `sandbox:docker`