|
--- |
|
name: 'build container images (reusable)' |
|
|
|
on: |
|
workflow_call: |
|
inputs: |
|
base-image: |
|
description: 'Base image' |
|
required: true |
|
type: string |
|
grpc-base-image: |
|
description: 'GRPC Base image, must be a compatible image with base-image' |
|
required: false |
|
default: '' |
|
type: string |
|
build-type: |
|
description: 'Build type' |
|
default: '' |
|
type: string |
|
cuda-major-version: |
|
description: 'CUDA major version' |
|
default: "12" |
|
type: string |
|
cuda-minor-version: |
|
description: 'CUDA minor version' |
|
default: "4" |
|
type: string |
|
platforms: |
|
description: 'Platforms' |
|
default: '' |
|
type: string |
|
tag-latest: |
|
description: 'Tag latest' |
|
default: '' |
|
type: string |
|
latest-image: |
|
description: 'Tag latest' |
|
default: '' |
|
type: string |
|
latest-image-aio: |
|
description: 'Tag latest' |
|
default: '' |
|
type: string |
|
tag-suffix: |
|
description: 'Tag suffix' |
|
default: '' |
|
type: string |
|
ffmpeg: |
|
description: 'FFMPEG' |
|
default: '' |
|
type: string |
|
image-type: |
|
description: 'Image type' |
|
default: '' |
|
type: string |
|
runs-on: |
|
description: 'Runs on' |
|
required: true |
|
default: '' |
|
type: string |
|
makeflags: |
|
description: 'Make Flags' |
|
required: false |
|
default: '--jobs=4 --output-sync=target' |
|
type: string |
|
aio: |
|
description: 'AIO Image Name' |
|
required: false |
|
default: '' |
|
type: string |
|
secrets: |
|
dockerUsername: |
|
required: true |
|
dockerPassword: |
|
required: true |
|
quayUsername: |
|
required: true |
|
quayPassword: |
|
required: true |
|
jobs: |
|
reusable_image-build: |
|
runs-on: ${{ inputs.runs-on }} |
|
steps: |
|
- name: Force Install GIT latest |
|
run: | |
|
sudo apt-get update \ |
|
&& sudo apt-get install -y software-properties-common \ |
|
&& sudo apt-get update \ |
|
&& sudo add-apt-repository -y ppa:git-core/ppa \ |
|
&& sudo apt-get update \ |
|
&& sudo apt-get install -y git |
|
- name: Checkout |
|
uses: actions/checkout@v4 |
|
|
|
- name: Release space from worker |
|
if: inputs.runs-on == 'ubuntu-latest' |
|
run: | |
|
echo "Listing top largest packages" |
|
pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr) |
|
head -n 30 <<< "${pkgs}" |
|
echo |
|
df -h |
|
echo |
|
sudo apt-get remove -y '^llvm-.*|^libllvm.*' || true |
|
sudo apt-get remove --auto-remove android-sdk-platform-tools || true |
|
sudo apt-get purge --auto-remove android-sdk-platform-tools || true |
|
sudo rm -rf /usr/local/lib/android |
|
sudo apt-get remove -y '^dotnet-.*|^aspnetcore-.*' || true |
|
sudo rm -rf /usr/share/dotnet |
|
sudo apt-get remove -y '^mono-.*' || true |
|
sudo apt-get remove -y '^ghc-.*' || true |
|
sudo apt-get remove -y '.*jdk.*|.*jre.*' || true |
|
sudo apt-get remove -y 'php.*' || true |
|
sudo apt-get remove -y hhvm powershell firefox monodoc-manual msbuild || true |
|
sudo apt-get remove -y '^google-.*' || true |
|
sudo apt-get remove -y azure-cli || true |
|
sudo apt-get remove -y '^mongo.*-.*|^postgresql-.*|^mysql-.*|^mssql-.*' || true |
|
sudo apt-get remove -y '^gfortran-.*' || true |
|
sudo apt-get remove -y microsoft-edge-stable || true |
|
sudo apt-get remove -y firefox || true |
|
sudo apt-get remove -y powershell || true |
|
sudo apt-get remove -y r-base-core || true |
|
sudo apt-get autoremove -y |
|
sudo apt-get clean |
|
echo |
|
echo "Listing top largest packages" |
|
pkgs=$(dpkg-query -Wf '${Installed-Size}\t${Package}\t${Status}\n' | awk '$NF == "installed"{print $1 "\t" $2}' | sort -nr) |
|
head -n 30 <<< "${pkgs}" |
|
echo |
|
sudo rm -rfv build || true |
|
sudo rm -rf /usr/share/dotnet || true |
|
sudo rm -rf /opt/ghc || true |
|
sudo rm -rf "/usr/local/share/boost" || true |
|
sudo rm -rf "$AGENT_TOOLSDIRECTORY" || true |
|
df -h |
|
|
|
- name: Docker meta |
|
id: meta |
|
if: github.event_name != 'pull_request' |
|
uses: docker/metadata-action@v5 |
|
with: |
|
images: | |
|
quay.io/go-skynet/local-ai |
|
localai/localai |
|
tags: | |
|
type=ref,event=branch |
|
type=semver,pattern={{raw}} |
|
type=sha |
|
flavor: | |
|
latest=${{ inputs.tag-latest }} |
|
suffix=${{ inputs.tag-suffix }} |
|
- name: Docker meta for PR |
|
id: meta_pull_request |
|
if: github.event_name == 'pull_request' |
|
uses: docker/metadata-action@v5 |
|
with: |
|
images: | |
|
ttl.sh/localai-ci-pr-${{ github.event.number }} |
|
tags: | |
|
type=ref,event=branch |
|
type=semver,pattern={{raw}} |
|
type=sha |
|
flavor: | |
|
latest=${{ inputs.tag-latest }} |
|
suffix=${{ inputs.tag-suffix }} |
|
- name: Docker meta AIO (quay.io) |
|
if: inputs.aio != '' |
|
id: meta_aio |
|
uses: docker/metadata-action@v5 |
|
with: |
|
images: | |
|
quay.io/go-skynet/local-ai |
|
tags: | |
|
type=ref,event=branch |
|
type=semver,pattern={{raw}} |
|
flavor: | |
|
latest=${{ inputs.tag-latest }} |
|
suffix=${{ inputs.aio }} |
|
|
|
- name: Docker meta AIO (dockerhub) |
|
if: inputs.aio != '' |
|
id: meta_aio_dockerhub |
|
uses: docker/metadata-action@v5 |
|
with: |
|
images: | |
|
localai/localai |
|
tags: | |
|
type=ref,event=branch |
|
type=semver,pattern={{raw}} |
|
flavor: | |
|
suffix=${{ inputs.aio }} |
|
|
|
- name: Set up QEMU |
|
uses: docker/setup-qemu-action@master |
|
with: |
|
platforms: all |
|
|
|
- name: Set up Docker Buildx |
|
id: buildx |
|
uses: docker/setup-buildx-action@master |
|
|
|
- name: Login to DockerHub |
|
if: github.event_name != 'pull_request' |
|
uses: docker/login-action@v3 |
|
with: |
|
username: ${{ secrets.dockerUsername }} |
|
password: ${{ secrets.dockerPassword }} |
|
|
|
- name: Login to DockerHub |
|
if: github.event_name != 'pull_request' |
|
uses: docker/login-action@v3 |
|
with: |
|
registry: quay.io |
|
username: ${{ secrets.quayUsername }} |
|
password: ${{ secrets.quayPassword }} |
|
|
|
- name: Build and push |
|
uses: docker/build-push-action@v6 |
|
if: github.event_name != 'pull_request' |
|
with: |
|
builder: ${{ steps.buildx.outputs.name }} |
|
|
|
|
|
|
|
|
|
build-args: | |
|
BUILD_TYPE=${{ inputs.build-type }} |
|
CUDA_MAJOR_VERSION=${{ inputs.cuda-major-version }} |
|
CUDA_MINOR_VERSION=${{ inputs.cuda-minor-version }} |
|
FFMPEG=${{ inputs.ffmpeg }} |
|
IMAGE_TYPE=${{ inputs.image-type }} |
|
BASE_IMAGE=${{ inputs.base-image }} |
|
GRPC_BASE_IMAGE=${{ inputs.grpc-base-image || inputs.base-image }} |
|
GRPC_MAKEFLAGS=--jobs=4 --output-sync=target |
|
GRPC_VERSION=v1.65.0 |
|
MAKEFLAGS=${{ inputs.makeflags }} |
|
context: . |
|
file: ./Dockerfile |
|
cache-from: type=gha |
|
platforms: ${{ inputs.platforms }} |
|
push: ${{ github.event_name != 'pull_request' }} |
|
tags: ${{ steps.meta.outputs.tags }} |
|
labels: ${{ steps.meta.outputs.labels }} |
|
|
|
- name: Build and push |
|
uses: docker/build-push-action@v6 |
|
if: github.event_name == 'pull_request' |
|
with: |
|
builder: ${{ steps.buildx.outputs.name }} |
|
|
|
|
|
|
|
|
|
build-args: | |
|
BUILD_TYPE=${{ inputs.build-type }} |
|
CUDA_MAJOR_VERSION=${{ inputs.cuda-major-version }} |
|
CUDA_MINOR_VERSION=${{ inputs.cuda-minor-version }} |
|
FFMPEG=${{ inputs.ffmpeg }} |
|
IMAGE_TYPE=${{ inputs.image-type }} |
|
BASE_IMAGE=${{ inputs.base-image }} |
|
GRPC_BASE_IMAGE=${{ inputs.grpc-base-image || inputs.base-image }} |
|
GRPC_MAKEFLAGS=--jobs=4 --output-sync=target |
|
GRPC_VERSION=v1.65.0 |
|
MAKEFLAGS=${{ inputs.makeflags }} |
|
context: . |
|
file: ./Dockerfile |
|
cache-from: type=gha |
|
platforms: ${{ inputs.platforms }} |
|
push: true |
|
tags: ${{ steps.meta_pull_request.outputs.tags }} |
|
labels: ${{ steps.meta_pull_request.outputs.labels }} |
|
- name: Testing image |
|
if: github.event_name == 'pull_request' |
|
run: | |
|
echo "Image is available at ttl.sh/localai-ci-pr-${{ github.event.number }}:${{ steps.meta_pull_request.outputs.version }}" >> $GITHUB_STEP_SUMMARY |
|
|
|
- name: Build and push AIO image |
|
if: inputs.aio != '' |
|
uses: docker/build-push-action@v6 |
|
with: |
|
builder: ${{ steps.buildx.outputs.name }} |
|
build-args: | |
|
BASE_IMAGE=quay.io/go-skynet/local-ai:${{ steps.meta.outputs.version }} |
|
MAKEFLAGS=${{ inputs.makeflags }} |
|
context: . |
|
file: ./Dockerfile.aio |
|
platforms: ${{ inputs.platforms }} |
|
push: ${{ github.event_name != 'pull_request' }} |
|
tags: ${{ steps.meta_aio.outputs.tags }} |
|
labels: ${{ steps.meta_aio.outputs.labels }} |
|
|
|
- name: Build and push AIO image (dockerhub) |
|
if: inputs.aio != '' |
|
uses: docker/build-push-action@v6 |
|
with: |
|
builder: ${{ steps.buildx.outputs.name }} |
|
build-args: | |
|
BASE_IMAGE=localai/localai:${{ steps.meta.outputs.version }} |
|
MAKEFLAGS=${{ inputs.makeflags }} |
|
context: . |
|
file: ./Dockerfile.aio |
|
platforms: ${{ inputs.platforms }} |
|
push: ${{ github.event_name != 'pull_request' }} |
|
tags: ${{ steps.meta_aio_dockerhub.outputs.tags }} |
|
labels: ${{ steps.meta_aio_dockerhub.outputs.labels }} |
|
|
|
- name: Latest tag |
|
|
|
if: github.event_name != 'pull_request' && inputs.latest-image != '' && github.ref_type == 'tag' |
|
run: | |
|
docker pull localai/localai:${{ steps.meta.outputs.version }} |
|
docker tag localai/localai:${{ steps.meta.outputs.version }} localai/localai:${{ inputs.latest-image }} |
|
docker push localai/localai:${{ inputs.latest-image }} |
|
docker pull quay.io/go-skynet/local-ai:${{ steps.meta.outputs.version }} |
|
docker tag quay.io/go-skynet/local-ai:${{ steps.meta.outputs.version }} quay.io/go-skynet/local-ai:${{ inputs.latest-image }} |
|
docker push quay.io/go-skynet/local-ai:${{ inputs.latest-image }} |
|
- name: Latest AIO tag |
|
|
|
if: github.event_name != 'pull_request' && inputs.latest-image-aio != '' && github.ref_type == 'tag' |
|
run: | |
|
docker pull localai/localai:${{ steps.meta_aio_dockerhub.outputs.version }} |
|
docker tag localai/localai:${{ steps.meta_aio_dockerhub.outputs.version }} localai/localai:${{ inputs.latest-image-aio }} |
|
docker push localai/localai:${{ inputs.latest-image-aio }} |
|
docker pull quay.io/go-skynet/local-ai:${{ steps.meta_aio.outputs.version }} |
|
docker tag quay.io/go-skynet/local-ai:${{ steps.meta_aio.outputs.version }} quay.io/go-skynet/local-ai:${{ inputs.latest-image-aio }} |
|
docker push quay.io/go-skynet/local-ai:${{ inputs.latest-image-aio }} |
|
|
|
- name: job summary |
|
run: | |
|
echo "Built image: ${{ steps.meta.outputs.labels }}" >> $GITHUB_STEP_SUMMARY |
|
|
|
- name: job summary(AIO) |
|
if: inputs.aio != '' |
|
run: | |
|
echo "Built image: ${{ steps.meta_aio.outputs.labels }}" >> $GITHUB_STEP_SUMMARY |
|
|