name: Test Llama Stack Build run-name: Test llama stack build on: push: branches: - main paths: - 'llama_stack/cli/stack/build.py' - 'llama_stack/cli/stack/_build.py' - 'llama_stack/core/build.*' - 'llama_stack/core/*.sh' - '.github/workflows/providers-build.yml' - 'llama_stack/distributions/**' - 'pyproject.toml' - 'containers/Containerfile' - '.dockerignore' pull_request: paths: - 'llama_stack/cli/stack/build.py' - 'llama_stack/cli/stack/_build.py' - 'llama_stack/core/build.*' - 'llama_stack/core/*.sh' - '.github/workflows/providers-build.yml' - 'llama_stack/distributions/**' - 'pyproject.toml' - 'containers/Containerfile' - '.dockerignore' concurrency: group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/main' && github.run_id || github.ref }} cancel-in-progress: true jobs: generate-matrix: runs-on: ubuntu-latest outputs: distros: ${{ steps.set-matrix.outputs.distros }} steps: - name: Checkout repository uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Generate Distribution List id: set-matrix run: | distros=$(ls llama_stack/distributions/*/*build.yaml | awk -F'/' '{print $(NF-1)}' | jq -R -s -c 'split("\n")[:-1]') echo "distros=$distros" >> "$GITHUB_OUTPUT" build: needs: generate-matrix runs-on: ubuntu-latest strategy: matrix: distro: ${{ fromJson(needs.generate-matrix.outputs.distros) }} image-type: [venv, container] fail-fast: false # We want to run all jobs even if some fail steps: - name: Checkout repository uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Install dependencies uses: ./.github/actions/setup-runner - name: Install distribution into venv if: matrix.image-type == 'venv' run: | uv run llama stack list-deps ${{ matrix.distro }} | xargs -L1 uv pip install - name: Build container image if: matrix.image-type == 'container' run: | docker build . \ -f containers/Containerfile \ --build-arg INSTALL_MODE=editable \ --build-arg DISTRO_NAME=${{ matrix.distro }} \ --tag llama-stack:${{ matrix.distro }}-ci - name: Print dependencies in the image if: matrix.image-type == 'venv' run: | uv pip list build-single-provider: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Install dependencies uses: ./.github/actions/setup-runner - name: Build a single provider run: | uv pip install -e . uv run --no-sync llama stack list-deps --providers inference=remote::ollama | xargs -L1 uv pip install build-custom-container-distribution: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Install dependencies uses: ./.github/actions/setup-runner - name: Build container image run: | BASE_IMAGE=$(yq -r '.distribution_spec.container_image // "python:3.12-slim"' llama_stack/distributions/ci-tests/build.yaml) docker build . \ -f containers/Containerfile \ --build-arg INSTALL_MODE=editable \ --build-arg DISTRO_NAME=ci-tests \ --build-arg BASE_IMAGE="$BASE_IMAGE" \ --build-arg RUN_CONFIG_PATH=/workspace/llama_stack/distributions/ci-tests/run.yaml \ -t llama-stack:ci-tests - name: Inspect the container image entrypoint run: | IMAGE_ID=$(docker images --format "{{.Repository}}:{{.Tag}}" | head -n 1) if [ -z "$IMAGE_ID" ]; then echo "No image found" exit 1 fi entrypoint=$(docker inspect --format '{{ .Config.Entrypoint }}' $IMAGE_ID) echo "Entrypoint: $entrypoint" if [ "$entrypoint" != "[/usr/local/bin/llama-stack-entrypoint.sh]" ]; then echo "Entrypoint is not correct" exit 1 fi build-ubi9-container-distribution: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Install dependencies uses: ./.github/actions/setup-runner - name: Pin distribution to UBI9 base run: | yq -i ' .distribution_spec.container_image = "registry.access.redhat.com/ubi9:latest" ' llama_stack/distributions/ci-tests/build.yaml - name: Build UBI9 container image run: | BASE_IMAGE=$(yq -r '.distribution_spec.container_image // "registry.access.redhat.com/ubi9:latest"' llama_stack/distributions/ci-tests/build.yaml) docker build . \ -f containers/Containerfile \ --build-arg INSTALL_MODE=editable \ --build-arg DISTRO_NAME=ci-tests \ --build-arg BASE_IMAGE="$BASE_IMAGE" \ --build-arg RUN_CONFIG_PATH=/workspace/llama_stack/distributions/ci-tests/run.yaml \ -t llama-stack:ci-tests-ubi9 - name: Inspect UBI9 image run: | IMAGE_ID=$(docker images --format "{{.Repository}}:{{.Tag}}" | head -n 1) if [ -z "$IMAGE_ID" ]; then echo "No image found" exit 1 fi entrypoint=$(docker inspect --format '{{ .Config.Entrypoint }}' $IMAGE_ID) echo "Entrypoint: $entrypoint" if [ "$entrypoint" != "[/usr/local/bin/llama-stack-entrypoint.sh]" ]; then echo "Entrypoint is not correct" exit 1 fi echo "Checking /etc/os-release in $IMAGE_ID" docker run --rm --entrypoint sh "$IMAGE_ID" -c \ 'source /etc/os-release && echo "$ID"' \ | grep -qE '^(rhel|ubi)$' \ || { echo "Base image is not UBI 9!"; exit 1; }