From c75e1aa5ed1cad4e3c53bef26644ad1a1137d30a Mon Sep 17 00:00:00 2001 From: Predrag Gruevski <2348618+obi1kenobi@users.noreply.github.com> Date: Tue, 22 Aug 2023 11:36:52 -0400 Subject: [PATCH] Eliminate special-casing from test CI workflows. (#9562) The previous approach was relying on `_test.yml` taking an input parameter, and then doing almost completely orthogonal things for each parameter value. I've separated out each of those test situations as its own job or workflow file, which eliminated all the special-casing and, in my opinion, improved maintainability by making it much more obvious what code runs when. --- .github/workflows/_pydantic_compatibility.yml | 76 +++++++++++++++++++ .github/workflows/_test.yml | 58 ++------------ .github/workflows/langchain_ci.yml | 44 ++++++++++- .../workflows/langchain_experimental_ci.yml | 3 +- 4 files changed, 124 insertions(+), 57 deletions(-) create mode 100644 .github/workflows/_pydantic_compatibility.yml diff --git a/.github/workflows/_pydantic_compatibility.yml b/.github/workflows/_pydantic_compatibility.yml new file mode 100644 index 00000000000..5a54c2f53c7 --- /dev/null +++ b/.github/workflows/_pydantic_compatibility.yml @@ -0,0 +1,76 @@ +name: pydantic v1/v2 compatibility + +on: + workflow_call: + inputs: + working-directory: + required: true + type: string + description: "From which folder this pipeline executes" + +env: + POETRY_VERSION: "1.5.1" + +jobs: + build: + defaults: + run: + working-directory: ${{ inputs.working-directory }} + runs-on: ubuntu-latest + strategy: + matrix: + python-version: + - "3.8" + - "3.9" + - "3.10" + - "3.11" + name: Pydantic v1/v2 compatibility - Python ${{ matrix.python-version }} + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: "./.github/actions/poetry_setup" + with: + python-version: ${{ matrix.python-version }} + working-directory: ${{ inputs.working-directory }} + poetry-version: ${{ env.POETRY_VERSION }} + cache-key: pydantic-cross-compat + install-command: poetry install + - name: Install the opposite major version of pydantic + # If normal tests use pydantic v1, here we'll use v2, and vice versa. + shell: bash + run: | + # Determine the major part of pydantic version + REGULAR_VERSION=$(poetry run python -c "import pydantic; print(pydantic.__version__)" | cut -d. -f1) + + if [[ "$REGULAR_VERSION" == "1" ]]; then + PYDANTIC_DEP=">=2.1,<3" + TEST_WITH_VERSION="2" + elif [[ "$REGULAR_VERSION" == "2" ]]; then + PYDANTIC_DEP="<2" + TEST_WITH_VERSION="1" + else + echo "Unexpected pydantic major version '$REGULAR_VERSION', cannot determine which version to use for cross-compatibility test." + exit 1 + fi + + # Install via `pip` instead of `poetry add` to avoid changing lockfile, + # which would prevent caching from working: the cache would get saved + # to a different key than where it gets loaded from. + poetry run pip install "pydantic${PYDANTIC_DEP}" + + # Ensure that the correct pydantic is installed now. + echo "Checking pydantic version... Expecting ${TEST_WITH_VERSION}" + + # Determine the major part of pydantic version + CURRENT_VERSION=$(poetry run python -c "import pydantic; print(pydantic.__version__)" | cut -d. -f1) + + # Check that the major part of pydantic version is as expected, if not + # raise an error + if [[ "$CURRENT_VERSION" != "$TEST_WITH_VERSION" ]]; then + echo "Error: expected pydantic version ${CURRENT_VERSION} to have been installed, but found: ${TEST_WITH_VERSION}" + exit 1 + fi + echo "Found pydantic version ${CURRENT_VERSION}, as expected" + - name: Run pydantic compatibility tests + shell: bash + run: make test diff --git a/.github/workflows/_test.yml b/.github/workflows/_test.yml index 3cc424cb7a1..179b6303d76 100644 --- a/.github/workflows/_test.yml +++ b/.github/workflows/_test.yml @@ -7,10 +7,6 @@ on: required: true type: string description: "From which folder this pipeline executes" - test_type: - type: string - description: "Test types to run" - default: '["core", "extended", "core-pydantic-2"]' env: POETRY_VERSION: "1.5.1" @@ -28,8 +24,7 @@ jobs: - "3.9" - "3.10" - "3.11" - test_type: ${{ fromJSON(inputs.test_type) }} - name: Python ${{ matrix.python-version }} ${{ matrix.test_type }} + name: Python ${{ matrix.python-version }} steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} @@ -38,51 +33,8 @@ jobs: python-version: ${{ matrix.python-version }} working-directory: ${{ inputs.working-directory }} poetry-version: ${{ env.POETRY_VERSION }} - cache-key: ${{ matrix.test_type }} - install-command: | - if [ "${{ matrix.test_type }}" == "core" ]; then - echo "Running core tests, installing dependencies with poetry..." - poetry install - elif [ "${{ matrix.test_type }}" == "core-pydantic-2" ]; then - echo "Running core-pydantic-v2 tests, installing dependencies with poetry..." - poetry install - - # Install via `pip` instead of `poetry add` to avoid changing lockfile, - # which would prevent caching from working: the cache would get saved - # to a different key than where it gets loaded from. - poetry run pip install 'pydantic>=2.1,<3' - else - echo "Running extended tests, installing dependencies with poetry..." - poetry install -E extended_testing - fi - - name: Verify pydantic version - run: | - if [ "${{ matrix.test_type }}" == "core-pydantic-2" ]; then - EXPECTED_VERSION=2 - else - EXPECTED_VERSION=1 - fi - echo "Checking pydantic version... Expecting ${EXPECTED_VERSION}" - - # Determine the major part of pydantic version - VERSION=$(poetry run python -c "import pydantic; print(pydantic.__version__)" | cut -d. -f1) - - # Check that the major part of pydantic version is as expected, if not - # raise an error - if [[ "$VERSION" -ne $EXPECTED_VERSION ]]; then - echo "Error: pydantic version must be equal to ${EXPECTED_VERSION}; Found: ${VERSION}" - exit 1 - fi - echo "Found pydantic version ${VERSION}, as expected" - shell: bash - - name: Run ${{matrix.test_type}} tests - run: | - case "${{ matrix.test_type }}" in - core | core-pydantic-2) - make test - ;; - *) - make extended_tests - ;; - esac + cache-key: core + install-command: poetry install + - name: Run core tests shell: bash + run: make test diff --git a/.github/workflows/langchain_ci.yml b/.github/workflows/langchain_ci.yml index 9dfbd8c3d6e..b91e039ea6f 100644 --- a/.github/workflows/langchain_ci.yml +++ b/.github/workflows/langchain_ci.yml @@ -8,10 +8,15 @@ on: paths: - '.github/workflows/_lint.yml' - '.github/workflows/_test.yml' + - '.github/workflows/_pydantic_compatibility.yml' - '.github/workflows/langchain_ci.yml' - 'libs/langchain/**' workflow_dispatch: # Allows to trigger the workflow manually in GitHub UI +env: + POETRY_VERSION: "1.5.1" + WORKDIR: "libs/langchain" + jobs: lint: uses: @@ -19,10 +24,45 @@ jobs: with: working-directory: libs/langchain secrets: inherit + test: uses: ./.github/workflows/_test.yml with: working-directory: libs/langchain - test_type: '["core", "extended", "core-pydantic-2"]' - secrets: inherit \ No newline at end of file + secrets: inherit + + pydantic-compatibility: + uses: + ./.github/workflows/_pydantic_compatibility.yml + with: + working-directory: libs/langchain + secrets: inherit + + extended-tests: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ${{ env.WORKDIR }} + strategy: + matrix: + python-version: + - "3.8" + - "3.9" + - "3.10" + - "3.11" + name: Python ${{ matrix.python-version }} extended tests + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: "./.github/actions/poetry_setup" + with: + python-version: ${{ matrix.python-version }} + working-directory: ${{ env.WORKDIR }} + poetry-version: ${{ env.POETRY_VERSION }} + cache-key: extended + install-command: | + echo "Running extended tests, installing dependencies with poetry..." + poetry install -E extended_testing + - name: Run extended tests + run: make extended_tests diff --git a/.github/workflows/langchain_experimental_ci.yml b/.github/workflows/langchain_experimental_ci.yml index 9c95634e49c..e1d6e66a846 100644 --- a/.github/workflows/langchain_experimental_ci.yml +++ b/.github/workflows/langchain_experimental_ci.yml @@ -25,5 +25,4 @@ jobs: ./.github/workflows/_test.yml with: working-directory: libs/experimental - test_type: '["core"]' - secrets: inherit \ No newline at end of file + secrets: inherit