|
|
name: Docker Build and Push |
|
|
run-name: Docker Build and Push @${{ inputs.release_type }} by @${{ github.actor }} |
|
|
on: |
|
|
workflow_call: |
|
|
inputs: |
|
|
main_version: |
|
|
required: true |
|
|
type: string |
|
|
description: "Main version to tag images with. Required for both main and base releases." |
|
|
base_version: |
|
|
required: false |
|
|
type: string |
|
|
description: "Base version to tag images with. Required for base release type." |
|
|
release_type: |
|
|
required: true |
|
|
type: string |
|
|
description: "Release type. One of 'main', 'main-ep', 'base', 'nightly-main', 'nightly-base'." |
|
|
pre_release: |
|
|
required: false |
|
|
type: boolean |
|
|
default: false |
|
|
ref: |
|
|
required: false |
|
|
type: string |
|
|
description: "Ref to check out. If not specified, will default to the main version or current branch." |
|
|
|
|
|
workflow_dispatch: |
|
|
inputs: |
|
|
main_version: |
|
|
description: "Main version to tag images with. Required for both main and base releases." |
|
|
required: false |
|
|
type: string |
|
|
base_version: |
|
|
description: "Base version to tag images with. Required for base release type." |
|
|
required: false |
|
|
type: string |
|
|
release_type: |
|
|
description: "Type of release. One of 'main', 'main-ep', 'base', 'nightly-main', 'nightly-base'." |
|
|
required: true |
|
|
type: string |
|
|
pre_release: |
|
|
required: false |
|
|
type: boolean |
|
|
default: false |
|
|
ref: |
|
|
required: false |
|
|
type: string |
|
|
description: "Ref to check out. If not specified, will default to the main version or current branch." |
|
|
|
|
|
|
|
|
env: |
|
|
POETRY_VERSION: "1.8.2" |
|
|
TEST_TAG: "langflowai/langflow:test" |
|
|
|
|
|
jobs: |
|
|
get-version: |
|
|
name: Get Version |
|
|
runs-on: ubuntu-latest |
|
|
outputs: |
|
|
version: ${{ steps.get-version-input.outputs.version || steps.get-version-base.outputs.version || steps.get-version-main.outputs.version }} |
|
|
steps: |
|
|
- name: Verify a main version exists |
|
|
if: ${{ inputs.main_version == '' }} |
|
|
run: | |
|
|
# due to our how we split packages, we need to have a main version to check out. |
|
|
echo "Must specify a main version to check out." |
|
|
exit 1 |
|
|
|
|
|
- name: Check out the code at a specific ref |
|
|
uses: actions/checkout@v4 |
|
|
with: |
|
|
ref: ${{ inputs.ref || inputs.main_version || github.ref }} |
|
|
persist-credentials: true |
|
|
|
|
|
- name: Get Version to Tag |
|
|
if: ${{ inputs.main_version != '' }} |
|
|
id: get-version-input |
|
|
run: | |
|
|
# Produces the versions we will use to tag the docker images with. |
|
|
|
|
|
if [[ "${{ inputs.release_type }}" == "base" && "${{ inputs.base_version }}" == '' ]]; then |
|
|
echo "Must specify a base version for base release type." |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
if [[ "${{ inputs.release_type }}" == "nightly-base" && "${{ inputs.base_version }}" == '' ]]; then |
|
|
echo "Must specify a base version for nightly-base release type." |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
if [[ "${{ inputs.release_type }}" == "main" && "${{ inputs.main_version }}" == '' ]]; then |
|
|
echo "Must specify a main version for main release type." |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
if [[ "${{ inputs.release_type }}" == "main-ep" && "${{ inputs.main_version }}" == '' ]]; then |
|
|
echo "Must specify a main version for main-ep release type." |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
if [[ "${{ inputs.release_type }}" == "nightly-main" && "${{ inputs.main_version }}" == '' ]]; then |
|
|
echo "Must specify a main version for nightly-main release type." |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
if [[ "${{ inputs.release_type }}" == "base" || "${{ inputs.release_type }}" == "nightly-base" ]]; then |
|
|
version=${{ inputs.base_version }} |
|
|
echo "base version=${{ inputs.base_version }}" |
|
|
echo version=$version |
|
|
echo version=$version >> $GITHUB_OUTPUT |
|
|
elif [[ "${{ inputs.release_type }}" == "main" || "${{ inputs.release_type }}" == "main-ep" || "${{ inputs.release_type }}" == "nightly-main" ]]; then |
|
|
version=${{ inputs.main_version }} |
|
|
echo version=$version |
|
|
echo version=$version >> $GITHUB_OUTPUT |
|
|
else |
|
|
echo "No version or ref specified. Exiting the workflow." |
|
|
exit 1 |
|
|
fi |
|
|
- name: Get Version Base |
|
|
if: ${{ inputs.base_version == '' && (inputs.release_type == 'base' || inputs.release_type == 'nightly-base') }} |
|
|
id: get-version-base |
|
|
run: | |
|
|
version=$(uv tree | grep 'langflow-base' | awk '{print $3}' | sed 's/^v//') |
|
|
if [ -z "$version" ]; then |
|
|
echo "Failed to extract version from uv tree output" |
|
|
exit 1 |
|
|
fi |
|
|
echo version=$version |
|
|
echo version=$version >> $GITHUB_OUTPUT |
|
|
- name: Get Version Main |
|
|
if: ${{ inputs.main_version == '' && (inputs.release_type == 'main' || inputs.release_type == 'main-ep' || inputs.release_type == 'nightly-main') }} |
|
|
id: get-version-main |
|
|
run: | |
|
|
version=$(uv tree | grep 'langflow' | grep -v 'langflow-base' | awk '{print $2}' | sed 's/^v//') |
|
|
echo version=$version |
|
|
echo version=$version >> $GITHUB_OUTPUT |
|
|
setup: |
|
|
runs-on: ubuntu-latest |
|
|
needs: get-version |
|
|
outputs: |
|
|
docker_tags: ${{ steps.set-vars.outputs.docker_tags }} |
|
|
ghcr_tags: ${{ steps.set-vars.outputs.ghcr_tags }} |
|
|
file: ${{ steps.set-vars.outputs.file }} |
|
|
steps: |
|
|
- name: Set Dockerfile and Tags |
|
|
id: set-vars |
|
|
run: | |
|
|
nightly_suffix='' |
|
|
if [[ "${{ inputs.release_type }}" == "nightly-base" || "${{ inputs.release_type }}" == "nightly-main" ]]; then |
|
|
nightly_suffix="-nightly" |
|
|
fi |
|
|
|
|
|
if [[ "${{ inputs.release_type }}" == "base" || "${{ inputs.release_type }}" == "nightly-base" ]]; then |
|
|
|
|
|
echo "docker_tags=langflowai/langflow${nightly_suffix}:base-${{ needs.get-version.outputs.version }},langflowai/langflow${nightly_suffix}:base-latest" >> $GITHUB_OUTPUT |
|
|
echo "ghcr_tags=ghcr.io/langflow-ai/langflow${nightly_suffix}:base-${{ needs.get-version.outputs.version }},ghcr.io/langflow-ai/langflow${nightly_suffix}:base-latest" >> $GITHUB_OUTPUT |
|
|
echo "file=./docker/build_and_push_base.Dockerfile" >> $GITHUB_OUTPUT |
|
|
else |
|
|
if [[ "${{ inputs.pre_release }}" == "true" ]]; then |
|
|
|
|
|
echo "docker_tags=langflowai/langflow${nightly_suffix}:${{ needs.get-version.outputs.version }}" >> $GITHUB_OUTPUT |
|
|
echo "ghcr_tags=ghcr.io/langflow-ai/langflow${nightly_suffix}:${{ needs.get-version.outputs.version }}" >> $GITHUB_OUTPUT |
|
|
echo "file=./docker/build_and_push.Dockerfile" >> $GITHUB_OUTPUT |
|
|
elif [[ "${{ inputs.release_type }}" == "main-ep" ]]; then |
|
|
|
|
|
echo "docker_tags=langflowai/langflow-ep${nightly_suffix}:${{ needs.get-version.outputs.version }},langflowai/langflow-ep${nightly_suffix}:latest" >> $GITHUB_OUTPUT |
|
|
echo "ghcr_tags=ghcr.io/langflow-ai/langflow-ep${nightly_suffix}:${{ needs.get-version.outputs.version }},ghcr.io/langflow-ai/langflow-ep${nightly_suffix}:latest" >> $GITHUB_OUTPUT |
|
|
echo "file=./docker/build_and_push_ep.Dockerfile" >> $GITHUB_OUTPUT |
|
|
elif [[ "${{ inputs.release_type }}" == "main" || "${{ inputs.release_type }}" == "nightly-main" ]]; then |
|
|
|
|
|
echo "docker_tags=langflowai/langflow${nightly_suffix}:${{ needs.get-version.outputs.version }},langflowai/langflow${nightly_suffix}:latest" >> $GITHUB_OUTPUT |
|
|
echo "ghcr_tags=ghcr.io/langflow-ai/langflow${nightly_suffix}:${{ needs.get-version.outputs.version }},ghcr.io/langflow-ai/langflow${nightly_suffix}:latest" >> $GITHUB_OUTPUT |
|
|
echo "file=./docker/build_and_push.Dockerfile" >> $GITHUB_OUTPUT |
|
|
else |
|
|
echo "Invalid release type. Exiting the workflow." |
|
|
exit 1 |
|
|
fi |
|
|
fi |
|
|
build: |
|
|
runs-on: ubuntu-latest |
|
|
needs: [get-version, setup] |
|
|
steps: |
|
|
- name: Check out the code at a specific ref |
|
|
uses: actions/checkout@v4 |
|
|
with: |
|
|
ref: ${{ inputs.ref || inputs.main_version || github.ref }} |
|
|
persist-credentials: true |
|
|
- name: "Setup Environment" |
|
|
uses: ./.github/actions/setup-uv |
|
|
- name: Install the project |
|
|
run: | |
|
|
if [[ "${{ inputs.release_type }}" == "base" || "${{ inputs.release_type }}" == "nightly-base" ]]; then |
|
|
uv sync --directory src/backend/base --no-dev --no-sources |
|
|
else |
|
|
uv sync --no-dev --no-sources |
|
|
fi |
|
|
|
|
|
- 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 to Docker Hub |
|
|
uses: docker/build-push-action@v6 |
|
|
with: |
|
|
context: . |
|
|
push: true |
|
|
file: ${{ needs.setup.outputs.file }} |
|
|
tags: ${{ needs.setup.outputs.docker_tags }} |
|
|
platforms: linux/amd64,linux/arm64 |
|
|
cache-from: type=gha |
|
|
cache-to: type=gha,mode=max |
|
|
|
|
|
- name: Login to Github Container Registry |
|
|
uses: docker/login-action@v3 |
|
|
with: |
|
|
registry: ghcr.io |
|
|
username: ${{ github.actor }} |
|
|
password: ${{ secrets.TEMP_GHCR_TOKEN}} |
|
|
|
|
|
- name: Build and push to Github Container Registry |
|
|
uses: docker/build-push-action@v6 |
|
|
with: |
|
|
context: . |
|
|
push: true |
|
|
file: ${{ needs.setup.outputs.file }} |
|
|
tags: ${{ needs.setup.outputs.ghcr_tags }} |
|
|
platforms: linux/amd64,linux/arm64 |
|
|
cache-from: type=gha |
|
|
cache-to: type=gha,mode=max |
|
|
|
|
|
build_components: |
|
|
if: ${{ inputs.release_type == 'main' }} |
|
|
runs-on: ubuntu-latest |
|
|
permissions: |
|
|
packages: write |
|
|
needs: [build, get-version] |
|
|
strategy: |
|
|
matrix: |
|
|
component: [docker-backend, docker-frontend, ghcr-backend, ghcr-frontend] |
|
|
include: |
|
|
- component: docker-backend |
|
|
dockerfile: ./docker/build_and_push_backend.Dockerfile |
|
|
tags: langflowai/langflow-backend:${{ needs.get-version.outputs.version }},langflowai/langflow-backend:latest |
|
|
langflow_image: langflowai/langflow:${{ needs.get-version.outputs.version }} |
|
|
- component: docker-frontend |
|
|
dockerfile: ./docker/frontend/build_and_push_frontend.Dockerfile |
|
|
tags: langflowai/langflow-frontend:${{ needs.get-version.outputs.version }},langflowai/langflow-frontend:latest |
|
|
langflow_image: langflowai/langflow:${{ needs.get-version.outputs.version }} |
|
|
- component: ghcr-backend |
|
|
dockerfile: ./docker/build_and_push_backend.Dockerfile |
|
|
tags: ghcr.io/langflow-ai/langflow-backend:${{ needs.get-version.outputs.version }},ghcr.io/langflow-ai/langflow-backend:latest |
|
|
langflow_image: ghcr.io/langflow-ai/langflow:${{ needs.get-version.outputs.version }} |
|
|
- component: ghcr-frontend |
|
|
dockerfile: ./docker/frontend/build_and_push_frontend.Dockerfile |
|
|
tags: ghcr.io/langflow-ai/langflow-frontend:${{ needs.get-version.outputs.version }},ghcr.io/langflow-ai/langflow-frontend:latest |
|
|
langflow_image: ghcr.io/langflow-ai/langflow:${{ needs.get-version.outputs.version }} |
|
|
steps: |
|
|
- name: Check out the code at a specific ref |
|
|
uses: actions/checkout@v4 |
|
|
with: |
|
|
ref: ${{ inputs.ref || inputs.main_version || github.ref }} |
|
|
|
|
|
- name: Set up Docker Buildx |
|
|
uses: docker/setup-buildx-action@v3 |
|
|
|
|
|
- name: Login to Docker Hub |
|
|
if: ${{ matrix.component == 'docker-backend' }} || ${{ matrix.component == 'docker-frontend' }} |
|
|
uses: docker/login-action@v3 |
|
|
with: |
|
|
username: ${{ secrets.DOCKERHUB_USERNAME }} |
|
|
password: ${{ secrets.DOCKERHUB_TOKEN }} |
|
|
|
|
|
- name: Login to Github Container Registry |
|
|
if: ${{ matrix.component == 'ghcr-backend' }} || ${{ matrix.component == 'ghcr-frontend' }} |
|
|
uses: docker/login-action@v3 |
|
|
with: |
|
|
registry: ghcr.io |
|
|
username: ${{ github.actor }} |
|
|
password: ${{ secrets.TEMP_GHCR_TOKEN}} |
|
|
|
|
|
- name: Wait for propagation (for backend) |
|
|
run: sleep 120 |
|
|
|
|
|
- name: Build and push ${{ matrix.component }} |
|
|
uses: docker/build-push-action@v6 |
|
|
with: |
|
|
context: . |
|
|
push: true |
|
|
build-args: | |
|
|
LANGFLOW_IMAGE=${{ matrix.langflow_image }} |
|
|
file: ${{ matrix.dockerfile }} |
|
|
tags: ${{ matrix.tags }} |
|
|
|
|
|
provenance: false |
|
|
|
|
|
restart-space: |
|
|
name: Restart HuggingFace Spaces |
|
|
if: ${{ inputs.release_type == 'main' }} |
|
|
runs-on: ubuntu-latest |
|
|
needs: [build, get-version] |
|
|
strategy: |
|
|
matrix: |
|
|
python-version: |
|
|
- "3.12" |
|
|
steps: |
|
|
- name: Check out the code at a specific ref |
|
|
uses: actions/checkout@v4 |
|
|
with: |
|
|
ref: ${{ inputs.ref || inputs.main_version || github.ref }} |
|
|
- name: "Setup Environment" |
|
|
uses: ./.github/actions/setup-uv |
|
|
|
|
|
- name: Restart HuggingFace Spaces Build |
|
|
run: | |
|
|
uv run ./scripts/factory_restart_space.py --space "Langflow/Langflow" --token ${{ secrets.HUGGINGFACE_API_TOKEN }} |
|
|
|
|
|
|
|
|
|
|
|
|