forked from phoenix/litellm-mirror
374 lines
15 KiB
YAML
374 lines
15 KiB
YAML
# this workflow is triggered by an API call when there is a new PyPI release of LiteLLM
|
|
name: Build, Publish LiteLLM Docker Image. New Release
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
tag:
|
|
description: "The tag version you want to build"
|
|
release_type:
|
|
description: "The release type you want to build. Can be 'latest', 'stable', 'dev'"
|
|
type: string
|
|
default: "latest"
|
|
commit_hash:
|
|
description: "Commit hash"
|
|
required: true
|
|
|
|
# Defines two custom environment variables for the workflow. Used for the Container registry domain, and a name for the Docker image that this workflow builds.
|
|
env:
|
|
REGISTRY: ghcr.io
|
|
IMAGE_NAME: ${{ github.repository }}
|
|
CHART_NAME: litellm-helm
|
|
|
|
# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.
|
|
jobs:
|
|
# print commit hash, tag, and release type
|
|
print:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- run: |
|
|
echo "Commit hash: ${{ github.event.inputs.commit_hash }}"
|
|
echo "Tag: ${{ github.event.inputs.tag }}"
|
|
echo "Release type: ${{ github.event.inputs.release_type }}"
|
|
docker-hub-deploy:
|
|
if: github.repository == 'BerriAI/litellm'
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
-
|
|
name: Checkout
|
|
uses: actions/checkout@v4
|
|
with:
|
|
ref: ${{ github.event.inputs.commit_hash }}
|
|
-
|
|
name: Set up QEMU
|
|
uses: docker/setup-qemu-action@v3
|
|
-
|
|
name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
-
|
|
name: Login to Docker Hub
|
|
uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
-
|
|
name: Build and push
|
|
uses: docker/build-push-action@v5
|
|
with:
|
|
context: .
|
|
push: true
|
|
tags: litellm/litellm:${{ github.event.inputs.tag || 'latest' }}
|
|
-
|
|
name: Build and push litellm-database image
|
|
uses: docker/build-push-action@v5
|
|
with:
|
|
context: .
|
|
push: true
|
|
file: ./docker/Dockerfile.database
|
|
tags: litellm/litellm-database:${{ github.event.inputs.tag || 'latest' }}
|
|
-
|
|
name: Build and push litellm-spend-logs image
|
|
uses: docker/build-push-action@v5
|
|
with:
|
|
context: .
|
|
push: true
|
|
file: ./litellm-js/spend-logs/Dockerfile
|
|
tags: litellm/litellm-spend_logs:${{ github.event.inputs.tag || 'latest' }}
|
|
|
|
build-and-push-image:
|
|
runs-on: ubuntu-latest
|
|
# Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.
|
|
permissions:
|
|
contents: read
|
|
packages: write
|
|
#
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
with:
|
|
ref: ${{ github.event.inputs.commit_hash }}
|
|
# Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.
|
|
- name: Log in to the Container registry
|
|
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
|
|
with:
|
|
registry: ${{ env.REGISTRY }}
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
# This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.
|
|
- name: Extract metadata (tags, labels) for Docker
|
|
id: meta
|
|
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
|
|
with:
|
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
# Configure multi platform Docker builds
|
|
- name: Set up QEMU
|
|
uses: docker/setup-qemu-action@e0e4588fad221d38ee467c0bffd91115366dc0c5
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@edfb0fe6204400c56fbfd3feba3fe9ad1adfa345
|
|
# This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.
|
|
# It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see "[Usage](https://github.com/docker/build-push-action#usage)" in the README of the `docker/build-push-action` repository.
|
|
# It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step.
|
|
- name: Build and push Docker image
|
|
uses: docker/build-push-action@4976231911ebf5f32aad765192d35f942aa48cb8
|
|
with:
|
|
context: .
|
|
push: true
|
|
tags: ${{ steps.meta.outputs.tags }}-${{ github.event.inputs.tag || 'latest' }}, ${{ steps.meta.outputs.tags }}-${{ github.event.inputs.release_type }} # if a tag is provided, use that, otherwise use the release tag, and if neither is available, use 'latest'
|
|
labels: ${{ steps.meta.outputs.labels }}
|
|
platforms: local,linux/amd64,linux/arm64,linux/arm64/v8
|
|
|
|
build-and-push-image-database:
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: read
|
|
packages: write
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
with:
|
|
ref: ${{ github.event.inputs.commit_hash }}
|
|
|
|
- name: Log in to the Container registry
|
|
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
|
|
with:
|
|
registry: ${{ env.REGISTRY }}
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Extract metadata (tags, labels) for database Dockerfile
|
|
id: meta-database
|
|
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
|
|
with:
|
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-database
|
|
# Configure multi platform Docker builds
|
|
- name: Set up QEMU
|
|
uses: docker/setup-qemu-action@e0e4588fad221d38ee467c0bffd91115366dc0c5
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@edfb0fe6204400c56fbfd3feba3fe9ad1adfa345
|
|
|
|
- name: Build and push Database Docker image
|
|
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
|
|
with:
|
|
context: .
|
|
file: ./docker/Dockerfile.database
|
|
push: true
|
|
tags: ${{ steps.meta-database.outputs.tags }}-${{ github.event.inputs.tag || 'latest' }}, ${{ steps.meta-database.outputs.tags }}-${{ github.event.inputs.release_type }}
|
|
labels: ${{ steps.meta-database.outputs.labels }}
|
|
platforms: local,linux/amd64,linux/arm64,linux/arm64/v8
|
|
|
|
build-and-push-image-non_root:
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: read
|
|
packages: write
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
with:
|
|
ref: ${{ github.event.inputs.commit_hash }}
|
|
|
|
- name: Log in to the Container registry
|
|
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
|
|
with:
|
|
registry: ${{ env.REGISTRY }}
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Extract metadata (tags, labels) for non_root Dockerfile
|
|
id: meta-non_root
|
|
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
|
|
with:
|
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-non_root
|
|
# Configure multi platform Docker builds
|
|
- name: Set up QEMU
|
|
uses: docker/setup-qemu-action@e0e4588fad221d38ee467c0bffd91115366dc0c5
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@edfb0fe6204400c56fbfd3feba3fe9ad1adfa345
|
|
|
|
- name: Build and push non_root Docker image
|
|
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
|
|
with:
|
|
context: .
|
|
file: ./docker/Dockerfile.non_root
|
|
push: true
|
|
tags: ${{ steps.meta-non_root.outputs.tags }}-${{ github.event.inputs.tag || 'latest' }}, ${{ steps.meta-non_root.outputs.tags }}-${{ github.event.inputs.release_type }}
|
|
labels: ${{ steps.meta-non_root.outputs.labels }}
|
|
platforms: local,linux/amd64,linux/arm64,linux/arm64/v8
|
|
|
|
build-and-push-image-spend-logs:
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: read
|
|
packages: write
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
with:
|
|
ref: ${{ github.event.inputs.commit_hash }}
|
|
|
|
- name: Log in to the Container registry
|
|
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
|
|
with:
|
|
registry: ${{ env.REGISTRY }}
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Extract metadata (tags, labels) for spend-logs Dockerfile
|
|
id: meta-spend-logs
|
|
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
|
|
with:
|
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-spend_logs
|
|
# Configure multi platform Docker builds
|
|
- name: Set up QEMU
|
|
uses: docker/setup-qemu-action@e0e4588fad221d38ee467c0bffd91115366dc0c5
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@edfb0fe6204400c56fbfd3feba3fe9ad1adfa345
|
|
|
|
- name: Build and push Database Docker image
|
|
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
|
|
with:
|
|
context: .
|
|
file: ./litellm-js/spend-logs/Dockerfile
|
|
push: true
|
|
tags: ${{ steps.meta-spend-logs.outputs.tags }}-${{ github.event.inputs.tag || 'latest' }}, ${{ steps.meta-spend-logs.outputs.tags }}-${{ github.event.inputs.release_type }}
|
|
platforms: local,linux/amd64,linux/arm64,linux/arm64/v8
|
|
|
|
build-and-push-helm-chart:
|
|
if: github.event.inputs.release_type != 'dev'
|
|
needs: [docker-hub-deploy, build-and-push-image, build-and-push-image-database]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Log in to the Container registry
|
|
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
|
|
with:
|
|
registry: ${{ env.REGISTRY }}
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: lowercase github.repository_owner
|
|
run: |
|
|
echo "REPO_OWNER=`echo ${{github.repository_owner}} | tr '[:upper:]' '[:lower:]'`" >>${GITHUB_ENV}
|
|
|
|
- name: Get LiteLLM Latest Tag
|
|
id: current_app_tag
|
|
shell: bash
|
|
run: |
|
|
LATEST_TAG=$(git describe --tags --exclude "*dev*" --abbrev=0)
|
|
if [ -z "${LATEST_TAG}" ]; then
|
|
echo "latest_tag=latest" | tee -a $GITHUB_OUTPUT
|
|
else
|
|
echo "latest_tag=${LATEST_TAG}" | tee -a $GITHUB_OUTPUT
|
|
fi
|
|
|
|
- name: Get last published chart version
|
|
id: current_version
|
|
shell: bash
|
|
run: |
|
|
CHART_LIST=$(helm show chart oci://${{ env.REGISTRY }}/${{ env.REPO_OWNER }}/${{ env.CHART_NAME }} 2>/dev/null || true)
|
|
if [ -z "${CHART_LIST}" ]; then
|
|
echo "current-version=0.1.0" | tee -a $GITHUB_OUTPUT
|
|
else
|
|
printf '%s' "${CHART_LIST}" | grep '^version:' | awk 'BEGIN{FS=":"}{print "current-version="$2}' | tr -d " " | tee -a $GITHUB_OUTPUT
|
|
fi
|
|
env:
|
|
HELM_EXPERIMENTAL_OCI: '1'
|
|
|
|
# Automatically update the helm chart version one "patch" level
|
|
- name: Bump release version
|
|
id: bump_version
|
|
uses: christian-draeger/increment-semantic-version@1.1.0
|
|
with:
|
|
current-version: ${{ steps.current_version.outputs.current-version || '0.1.0' }}
|
|
version-fragment: 'bug'
|
|
|
|
- uses: ./.github/actions/helm-oci-chart-releaser
|
|
with:
|
|
name: ${{ env.CHART_NAME }}
|
|
repository: ${{ env.REPO_OWNER }}
|
|
tag: ${{ github.event.inputs.chartVersion || steps.bump_version.outputs.next-version || '0.1.0' }}
|
|
app_version: ${{ steps.current_app_tag.outputs.latest_tag }}
|
|
path: deploy/charts/${{ env.CHART_NAME }}
|
|
registry: ${{ env.REGISTRY }}
|
|
registry_username: ${{ github.actor }}
|
|
registry_password: ${{ secrets.GITHUB_TOKEN }}
|
|
update_dependencies: true
|
|
|
|
release:
|
|
name: "New LiteLLM Release"
|
|
needs: [docker-hub-deploy, build-and-push-image, build-and-push-image-database]
|
|
|
|
runs-on: "ubuntu-latest"
|
|
|
|
steps:
|
|
- name: Display version
|
|
run: echo "Current version is ${{ github.event.inputs.tag }}"
|
|
- name: "Set Release Tag"
|
|
run: echo "RELEASE_TAG=${{ github.event.inputs.tag }}" >> $GITHUB_ENV
|
|
- name: Display release tag
|
|
run: echo "RELEASE_TAG is $RELEASE_TAG"
|
|
- name: "Create release"
|
|
uses: "actions/github-script@v6"
|
|
with:
|
|
github-token: "${{ secrets.GITHUB_TOKEN }}"
|
|
script: |
|
|
const commitHash = "${{ github.event.inputs.commit_hash}}";
|
|
console.log("Commit Hash:", commitHash); // Add this line for debugging
|
|
try {
|
|
const response = await github.rest.repos.createRelease({
|
|
draft: false,
|
|
generate_release_notes: true,
|
|
target_commitish: commitHash,
|
|
name: process.env.RELEASE_TAG,
|
|
owner: context.repo.owner,
|
|
prerelease: false,
|
|
repo: context.repo.repo,
|
|
tag_name: process.env.RELEASE_TAG,
|
|
});
|
|
|
|
core.exportVariable('RELEASE_ID', response.data.id);
|
|
core.exportVariable('RELEASE_UPLOAD_URL', response.data.upload_url);
|
|
} catch (error) {
|
|
core.setFailed(error.message);
|
|
}
|
|
- name: Fetch Release Notes
|
|
id: release-notes
|
|
uses: actions/github-script@v6
|
|
with:
|
|
github-token: "${{ secrets.GITHUB_TOKEN }}"
|
|
script: |
|
|
try {
|
|
const response = await github.rest.repos.getRelease({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
release_id: process.env.RELEASE_ID,
|
|
});
|
|
const formattedBody = JSON.stringify(response.data.body).slice(1, -1);
|
|
return formattedBody;
|
|
} catch (error) {
|
|
core.setFailed(error.message);
|
|
}
|
|
env:
|
|
RELEASE_ID: ${{ env.RELEASE_ID }}
|
|
- name: Github Releases To Discord
|
|
env:
|
|
WEBHOOK_URL: ${{ secrets.WEBHOOK_URL }}
|
|
REALEASE_TAG: ${{ env.RELEASE_TAG }}
|
|
RELEASE_NOTES: ${{ steps.release-notes.outputs.result }}
|
|
run: |
|
|
curl -H "Content-Type: application/json" -X POST -d '{
|
|
"content": "New LiteLLM release '"${RELEASE_TAG}"'",
|
|
"username": "Release Changelog",
|
|
"avatar_url": "https://cdn.discordapp.com/avatars/487431320314576937/bd64361e4ba6313d561d54e78c9e7171.png",
|
|
"embeds": [
|
|
{
|
|
"title": "Changelog for LiteLLM '"${RELEASE_TAG}"'",
|
|
"description": "'"${RELEASE_NOTES}"'",
|
|
"color": 2105893
|
|
}
|
|
]
|
|
}' $WEBHOOK_URL
|
|
|