From 9881d5b4bf71358e5f08e85e1e83115681c34830 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Fri, 7 Jun 2024 08:16:31 -0700 Subject: [PATCH] build(circle-ci): separate main vs pr workflows for ci/cd --- .circleci/main.yml | 347 +++++++++++++++++++++++++++++++ .circleci/{config.yml => pr.yml} | 14 +- 2 files changed, 350 insertions(+), 11 deletions(-) create mode 100644 .circleci/main.yml rename .circleci/{config.yml => pr.yml} (97%) diff --git a/.circleci/main.yml b/.circleci/main.yml new file mode 100644 index 000000000..5f4628d26 --- /dev/null +++ b/.circleci/main.yml @@ -0,0 +1,347 @@ +version: 4.3.4 +jobs: + local_testing: + docker: + - image: cimg/python:3.11 + working_directory: ~/project + + steps: + - checkout + + - run: + name: Show git commit hash + command: | + echo "Git commit hash: $CIRCLE_SHA1" + + - run: + name: Check if litellm dir was updated or if pyproject.toml was modified + command: | + if [ -n "$(git diff --name-only $CIRCLE_SHA1^..$CIRCLE_SHA1 | grep -E 'pyproject\.toml|litellm/')" ]; then + echo "litellm updated" + else + echo "No changes to litellm or pyproject.toml. Skipping tests." + circleci step halt + fi + - restore_cache: + keys: + - v1-dependencies-{{ checksum ".circleci/requirements.txt" }} + - run: + name: Install Dependencies + command: | + python -m pip install --upgrade pip + python -m pip install -r .circleci/requirements.txt + pip install "pytest==7.3.1" + pip install "pytest-asyncio==0.21.1" + pip install mypy + pip install "google-generativeai==0.3.2" + pip install "google-cloud-aiplatform==1.43.0" + pip install pyarrow + pip install "boto3==1.34.34" + pip install "aioboto3==12.3.0" + pip install langchain + pip install lunary==0.2.5 + pip install "langfuse==2.27.1" + pip install "logfire==0.29.0" + pip install numpydoc + pip install traceloop-sdk==0.21.1 + pip install opentelemetry-api==1.25.0 + pip install opentelemetry-sdk==1.25.0 + pip install opentelemetry-exporter-otlp==1.25.0 + pip install openai + pip install prisma + pip install "httpx==0.24.1" + pip install fastapi + pip install "gunicorn==21.2.0" + pip install "anyio==3.7.1" + pip install "aiodynamo==23.10.1" + pip install "asyncio==3.4.3" + pip install "apscheduler==3.10.4" + pip install "PyGithub==1.59.1" + pip install argon2-cffi + pip install "pytest-mock==3.12.0" + pip install python-multipart + pip install google-cloud-aiplatform + pip install prometheus-client==0.20.0 + pip install "pydantic==2.7.1" + pip install "diskcache==5.6.1" + pip install "Pillow==10.3.0" + - save_cache: + paths: + - ./venv + key: v1-dependencies-{{ checksum ".circleci/requirements.txt" }} + - run: + name: Run prisma ./entrypoint.sh + command: | + set +e + chmod +x entrypoint.sh + ./entrypoint.sh + set -e + - run: + name: Black Formatting + command: | + cd litellm + python -m pip install black + python -m black . + cd .. + - run: + name: Linting Testing + command: | + cd litellm + python -m pip install types-requests types-setuptools types-redis types-PyYAML + if ! python -m mypy . --ignore-missing-imports; then + echo "mypy detected errors" + exit 1 + fi + cd .. + + # Run pytest and generate JUnit XML report + - run: + name: Run tests + command: | + pwd + ls + python -m pytest -vv litellm/tests/ -x --junitxml=test-results/junit.xml --durations=5 + no_output_timeout: 120m + + # Store test results + - store_test_results: + path: test-results + + installing_litellm_on_python: + docker: + - image: circleci/python:3.8 + working_directory: ~/project + + steps: + - checkout + - run: + name: Install Dependencies + command: | + python -m pip install --upgrade pip + pip install python-dotenv + pip install pytest + pip install tiktoken + pip install aiohttp + pip install click + pip install jinja2 + pip install tokenizers + pip install openai + - run: + name: Run tests + command: | + pwd + ls + python -m pytest -vv litellm/tests/test_python_38.py + + build_and_test: + machine: + image: ubuntu-2204:2023.10.1 + resource_class: xlarge + working_directory: ~/project + steps: + - checkout + - run: + name: Install Docker CLI (In case it's not already installed) + command: | + sudo apt-get update + sudo apt-get install -y docker-ce docker-ce-cli containerd.io + - run: + name: Install Python 3.9 + command: | + curl https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh --output miniconda.sh + bash miniconda.sh -b -p $HOME/miniconda + export PATH="$HOME/miniconda/bin:$PATH" + conda init bash + source ~/.bashrc + conda create -n myenv python=3.9 -y + conda activate myenv + python --version + - run: + name: Install Dependencies + command: | + pip install "pytest==7.3.1" + pip install "pytest-asyncio==0.21.1" + pip install aiohttp + pip install openai + python -m pip install --upgrade pip + python -m pip install -r .circleci/requirements.txt + pip install "pytest==7.3.1" + pip install "pytest-mock==3.12.0" + pip install "pytest-asyncio==0.21.1" + pip install mypy + pip install "google-generativeai==0.3.2" + pip install "google-cloud-aiplatform==1.43.0" + pip install pyarrow + pip install "boto3==1.34.34" + pip install "aioboto3==12.3.0" + pip install langchain + pip install "langfuse>=2.0.0" + pip install "logfire==0.29.0" + pip install numpydoc + pip install prisma + pip install fastapi + pip install "httpx==0.24.1" + pip install "gunicorn==21.2.0" + pip install "anyio==3.7.1" + pip install "aiodynamo==23.10.1" + pip install "asyncio==3.4.3" + pip install "PyGithub==1.59.1" + # Run pytest and generate JUnit XML report + - run: + name: Build Docker image + command: docker build -t my-app:latest -f Dockerfile.database . + - run: + name: Run Docker container + command: | + docker run -d \ + -p 4000:4000 \ + -e DATABASE_URL=$PROXY_DATABASE_URL \ + -e AZURE_API_KEY=$AZURE_API_KEY \ + -e REDIS_HOST=$REDIS_HOST \ + -e REDIS_PASSWORD=$REDIS_PASSWORD \ + -e REDIS_PORT=$REDIS_PORT \ + -e AZURE_FRANCE_API_KEY=$AZURE_FRANCE_API_KEY \ + -e AZURE_EUROPE_API_KEY=$AZURE_EUROPE_API_KEY \ + -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ + -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ + -e AWS_REGION_NAME=$AWS_REGION_NAME \ + -e AUTO_INFER_REGION=True \ + -e OPENAI_API_KEY=$OPENAI_API_KEY \ + -e LANGFUSE_PROJECT1_PUBLIC=$LANGFUSE_PROJECT1_PUBLIC \ + -e LANGFUSE_PROJECT2_PUBLIC=$LANGFUSE_PROJECT2_PUBLIC \ + -e LANGFUSE_PROJECT1_SECRET=$LANGFUSE_PROJECT1_SECRET \ + -e LANGFUSE_PROJECT2_SECRET=$LANGFUSE_PROJECT2_SECRET \ + --name my-app \ + -v $(pwd)/proxy_server_config.yaml:/app/config.yaml \ + my-app:latest \ + --config /app/config.yaml \ + --port 4000 \ + --detailed_debug \ + - run: + name: Install curl and dockerize + command: | + sudo apt-get update + sudo apt-get install -y curl + sudo wget https://github.com/jwilder/dockerize/releases/download/v0.6.1/dockerize-linux-amd64-v0.6.1.tar.gz + sudo tar -C /usr/local/bin -xzvf dockerize-linux-amd64-v0.6.1.tar.gz + sudo rm dockerize-linux-amd64-v0.6.1.tar.gz + - run: + name: Start outputting logs + command: docker logs -f my-app + background: true + - run: + name: Wait for app to be ready + command: dockerize -wait http://localhost:4000 -timeout 5m + - run: + name: Run tests + command: | + pwd + ls + python -m pytest -vv tests/ -x --junitxml=test-results/junit.xml --durations=5 + no_output_timeout: 120m + + # Store test results + - store_test_results: + path: test-results + + publish_to_pypi: + docker: + - image: cimg/python:3.8 + working_directory: ~/project + + environment: + TWINE_USERNAME: __token__ + + steps: + - checkout + + - run: + name: Copy model_prices_and_context_window File to model_prices_and_context_window_backup + command: | + cp model_prices_and_context_window.json litellm/model_prices_and_context_window_backup.json + + - run: + name: Check if litellm dir was updated or if pyproject.toml was modified + command: | + if [ -n "$(git diff --name-only $CIRCLE_SHA1^..$CIRCLE_SHA1 | grep -E 'pyproject\.toml|litellm/')" ]; then + echo "litellm updated" + else + echo "No changes to litellm or pyproject.toml. Skipping PyPI publish." + circleci step halt + fi + + - run: + name: Checkout code + command: git checkout $CIRCLE_SHA1 + + # Check if setup.py is modified and publish to PyPI + - run: + name: PyPI publish + command: | + echo "Install TOML package." + python -m pip install toml + VERSION=$(python -c "import toml; print(toml.load('pyproject.toml')['tool']['poetry']['version'])") + PACKAGE_NAME=$(python -c "import toml; print(toml.load('pyproject.toml')['tool']['poetry']['name'])") + if ! pip show -v $PACKAGE_NAME | grep -q "Version: ${VERSION}"; then + echo "pyproject.toml modified" + echo -e "[pypi]\nusername = $PYPI_PUBLISH_USERNAME\npassword = $PYPI_PUBLISH_PASSWORD" > ~/.pypirc + python -m pip install --upgrade pip + pip install build + pip install wheel + pip install --upgrade twine setuptools + rm -rf build dist + + echo "Building package" + python -m build + + echo "Twine upload to dist" + echo "Contents of dist directory:" + ls dist/ + twine upload --verbose dist/* + else + echo "Version ${VERSION} of package is already published on PyPI. Skipping PyPI publish." + circleci step halt + fi + - run: + name: Trigger Github Action for new Docker Container + command: | + echo "Install TOML package." + python3 -m pip install toml + VERSION=$(python3 -c "import toml; print(toml.load('pyproject.toml')['tool']['poetry']['version'])") + echo "LiteLLM Version ${VERSION}" + curl -X POST \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Authorization: Bearer $GITHUB_TOKEN" \ + "https://api.github.com/repos/BerriAI/litellm/actions/workflows/ghcr_deploy.yml/dispatches" \ + -d "{\"ref\":\"main\", \"inputs\":{\"tag\":\"v${VERSION}\", \"commit_hash\":\"$CIRCLE_SHA1\"}}" + +workflows: + version: 2 + build_and_test: + jobs: + - local_testing: + filters: + branches: + only: + - main + - /litellm_.*/ + - build_and_test: + filters: + branches: + only: + - main + - /litellm_.*/ + - installing_litellm_on_python: + filters: + branches: + only: + - main + - /litellm_.*/ + - publish_to_pypi: + requires: + - local_testing + - build_and_test + filters: + branches: + only: + - main \ No newline at end of file diff --git a/.circleci/config.yml b/.circleci/pr.yml similarity index 97% rename from .circleci/config.yml rename to .circleci/pr.yml index f806a4546..51ba0361b 100644 --- a/.circleci/config.yml +++ b/.circleci/pr.yml @@ -317,7 +317,7 @@ jobs: workflows: version: 2 - build_and_test: + build_and_test_pr: jobs: - hold: type: approval @@ -339,7 +339,7 @@ workflows: - hold filters: branches: - ignore: + ignore: - main - /litellm_.*/ - installing_litellm_on_python: @@ -349,12 +349,4 @@ workflows: branches: ignore: - main - - /litellm_.*/ - - publish_to_pypi: - requires: - - local_testing - - build_and_test - filters: - branches: - only: - - main + - /litellm_.*/ \ No newline at end of file