From dde0c70a8138a9e80f0deb41fbe1fa16099b2728 Mon Sep 17 00:00:00 2001 From: Reinier van der Leer Date: Thu, 21 Mar 2024 21:15:46 +0100 Subject: ci(agent): Matrix CI tests across Linux, macOS and Windows (#7029) * Matrix the AutoGPT Python CI's `test` job across Ubuntu, macOS and Windows - Set up MinIO in a step rather than specifying it under `jobs[test].services`, because services are only supported on Linux runners - Add Windows version of step to install Poetry - Add macOS compatibility patches to 'Install Poetry (Unix)' and `setup_git_auth` steps **Caveats:** - **No Docker on macOS or Windows** * Windows comes with Docker but only supports running Windows containers, while we're mainly interested in using Linux containers for code execution and/or running auxiliary services. * [The macOS runner doesn't come with Docker](https://github.com/actions/runner-images/issues/17). Setting it up is possible but takes ~3-4 minutes, and the performance of the Colima engine is poor: a `docker pull` that takes 2 seconds on Linux takes 45 seconds on macOS. - **No S3 service available on Windows** It seems that running a background process [isn't possible on Windows](https://github.com/actions/runner/issues/598#issuecomment-2011890429), and neither is running Linux-based Docker containers. * Add `autogpt-agent` and OS-specific flags to Codecov upload step * Improve caching of Python dependencies in CI by changing the cache key - Include hash of `poetry.lock` instead of `pyproject.toml` in key - Remove date component from key; it was included to avoid getting stuck to old cached versions of packages when we were still using `requirements.txt`. With `poetry.lock` that is no longer a concern. * Fix skip check in test_s3_file_storage.py --- .github/workflows/autogpt-ci.yml | 76 +++++++++++++++++----- .../autogpt/tests/unit/test_s3_file_storage.py | 2 +- 2 files changed, 60 insertions(+), 18 deletions(-) diff --git a/.github/workflows/autogpt-ci.yml b/.github/workflows/autogpt-ci.yml index bd32028c4..0e7ba31a0 100644 --- a/.github/workflows/autogpt-ci.yml +++ b/.github/workflows/autogpt-ci.yml @@ -20,6 +20,7 @@ concurrency: defaults: run: + shell: bash working-directory: autogpts/autogpt jobs: @@ -77,22 +78,41 @@ jobs: test: permissions: contents: read - runs-on: ubuntu-latest timeout-minutes: 30 strategy: + fail-fast: false matrix: python-version: ["3.10"] - - services: - minio: - image: minio/minio:edge-cicd - ports: - - 9000:9000 - options: > - --health-interval=10s --health-timeout=5s --health-retries=3 - --health-cmd="curl -f http://localhost:9000/minio/health/live" + platform-os: [ubuntu, macos, windows] + runs-on: ${{ matrix.platform-os }}-latest steps: + # Quite slow on macOS (2~4 minutes to set up Docker) + # - name: Set up Docker (macOS) + # if: runner.os == 'macOS' + # uses: crazy-max/ghaction-setup-docker@v3 + + - name: Start MinIO service (Linux) + if: runner.os == 'Linux' + working-directory: '.' + run: | + docker pull minio/minio:edge-cicd + docker run -d -p 9000:9000 minio/minio:edge-cicd + + - name: Start MinIO service (macOS) + if: runner.os == 'macOS' + working-directory: ${{ runner.temp }} + run: | + brew install minio/stable/minio + mkdir data + minio server ./data & + + # No MinIO on Windows: + # - Windows doesn't support running Linux Docker containers + # - It doesn't seem possible to start background processes on Windows. They are + # killed after the step returns. + # See: https://github.com/actions/runner/issues/598#issuecomment-2011890429 + - name: Checkout repository uses: actions/checkout@v4 with: @@ -147,13 +167,30 @@ jobs: - name: Set up Python dependency cache uses: actions/cache@v4 with: - path: ~/.cache/pypoetry - key: ${{ runner.os }}-poetry-${{ hashFiles('autogpts/autogpt/pyproject.toml') }}-${{ steps.get_date.outputs.date }} + path: ${{ runner.os == 'Windows' && 'C:\Users\runneradmin\AppData\Local\pypoetry\Cache' || '~/.cache/pypoetry' }} + key: poetry-${{ runner.os }}-${{ hashFiles('autogpts/autogpt/poetry.lock') }} - - name: Install Python dependencies + - name: Install Poetry (Unix) + if: runner.os != 'Windows' run: | curl -sSL https://install.python-poetry.org | python3 - - poetry install + + if [ "${{ runner.os }}" = "macOS" ]; then + PATH="$HOME/.local/bin:$PATH" + echo "$HOME/.local/bin" >> $GITHUB_PATH + fi + + - name: Install Poetry (Windows) + if: runner.os == 'Windows' + shell: pwsh + run: | + (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python - + + $env:PATH += ";$env:APPDATA\Python\Scripts" + echo "$env:APPDATA\Python\Scripts" >> $env:GITHUB_PATH + + - name: Install Python dependencies + run: poetry install - name: Run pytest with coverage run: | @@ -165,7 +202,7 @@ jobs: CI: true PLAIN_OUTPUT: True OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - S3_ENDPOINT_URL: http://localhost:9000 + S3_ENDPOINT_URL: ${{ runner.os != 'Windows' && 'http://127.0.0.1:9000' || '' }} AWS_ACCESS_KEY_ID: minioadmin AWS_SECRET_ACCESS_KEY: minioadmin @@ -173,6 +210,7 @@ jobs: uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} + flags: autogpt-agent,${{ runner.os }} - id: setup_git_auth name: Set up git token authentication @@ -180,7 +218,11 @@ jobs: if: success() || failure() run: | config_key="http.${{ github.server_url }}/.extraheader" - base64_pat=$(echo -n "pat:${{ secrets.PAT_REVIEW }}" | base64 -w0) + if [ "${{ runner.os }}" = 'macOS' ]; then + base64_pat=$(echo -n "pat:${{ secrets.PAT_REVIEW }}" | base64) + else + base64_pat=$(echo -n "pat:${{ secrets.PAT_REVIEW }}" | base64 -w0) + fi git config "$config_key" \ "Authorization: Basic $base64_pat" @@ -241,7 +283,7 @@ jobs: echo "Adding label and comment..." echo $TOKEN | gh auth login --with-token gh issue edit $PR_NUMBER --add-label "behaviour change" - gh issue comment $PR_NUMBER --body "You changed AutoGPT's behaviour. The cassettes have been updated and will be merged to the submodule when this Pull Request gets merged." + gh issue comment $PR_NUMBER --body "You changed AutoGPT's behaviour on ${{ runner.os }}. The cassettes have been updated and will be merged to the submodule when this Pull Request gets merged." fi - name: Upload logs to artifact diff --git a/autogpts/autogpt/tests/unit/test_s3_file_storage.py b/autogpts/autogpt/tests/unit/test_s3_file_storage.py index d58490d80..2544a3e9d 100644 --- a/autogpts/autogpt/tests/unit/test_s3_file_storage.py +++ b/autogpts/autogpt/tests/unit/test_s3_file_storage.py @@ -8,7 +8,7 @@ from botocore.exceptions import ClientError from autogpt.file_storage.s3 import S3FileStorage, S3FileStorageConfiguration -if not os.getenv("S3_ENDPOINT_URL") and not os.getenv("AWS_ACCESS_KEY_ID"): +if not (os.getenv("S3_ENDPOINT_URL") and os.getenv("AWS_ACCESS_KEY_ID")): pytest.skip("S3 environment variables are not set", allow_module_level=True) -- cgit v1.2.3