diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml index e42fe68e..705a5478 100644 --- a/.github/workflows/image.yml +++ b/.github/workflows/image.yml @@ -14,11 +14,25 @@ concurrency: cancel-in-progress: true jobs: - image-build: + extras-image-build: + uses: ./.github/workflows/image_build.yml + with: + tag-latest: ${{ matrix.tag-latest }} + tag-suffix: ${{ matrix.tag-suffix }} + ffmpeg: ${{ matrix.ffmpeg }} + image-type: ${{ matrix.image-type }} + build-type: ${{ matrix.build-type }} + cuda-major-version: ${{ matrix.cuda-major-version }} + cuda-minor-version: ${{ matrix.cuda-minor-version }} + platforms: ${{ matrix.platforms }} + runs-on: ${{ matrix.runs-on }} + secrets: + dockerUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }} + dockerPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }} strategy: # Pushing with all jobs in parallel # eats the bandwidth of all the nodes - max-parallel: ${{ github.event_name != 'pull_request' && 1 || 4 }} + max-parallel: ${{ github.event_name != 'pull_request' && 2 || 4 }} matrix: include: - build-type: '' @@ -37,8 +51,8 @@ jobs: image-type: 'extras' runs-on: 'arc-runner-set' - build-type: 'cublas' - cuda-major-version: 11 - cuda-minor-version: 7 + cuda-major-version: "11" + cuda-minor-version: "7" platforms: 'linux/amd64' tag-latest: 'false' tag-suffix: '-cublas-cuda11' @@ -46,8 +60,8 @@ jobs: image-type: 'extras' runs-on: 'arc-runner-set' - build-type: 'cublas' - cuda-major-version: 12 - cuda-minor-version: 1 + cuda-major-version: "12" + cuda-minor-version: "1" platforms: 'linux/amd64' tag-latest: 'false' tag-suffix: '-cublas-cuda12' @@ -55,8 +69,8 @@ jobs: image-type: 'extras' runs-on: 'arc-runner-set' - build-type: 'cublas' - cuda-major-version: 11 - cuda-minor-version: 7 + cuda-major-version: "11" + cuda-minor-version: "7" platforms: 'linux/amd64' tag-latest: 'false' tag-suffix: '-cublas-cuda11-ffmpeg' @@ -64,8 +78,8 @@ jobs: image-type: 'extras' runs-on: 'arc-runner-set' - build-type: 'cublas' - cuda-major-version: 12 - cuda-minor-version: 1 + cuda-major-version: "12" + cuda-minor-version: "1" platforms: 'linux/amd64' tag-latest: 'false' tag-suffix: '-cublas-cuda12-ffmpeg' @@ -80,6 +94,24 @@ jobs: ffmpeg: '' image-type: 'extras' runs-on: 'arc-runner-set' + core-image-build: + uses: ./.github/workflows/image_build.yml + with: + tag-latest: ${{ matrix.tag-latest }} + tag-suffix: ${{ matrix.tag-suffix }} + ffmpeg: ${{ matrix.ffmpeg }} + image-type: ${{ matrix.image-type }} + build-type: ${{ matrix.build-type }} + cuda-major-version: ${{ matrix.cuda-major-version }} + cuda-minor-version: ${{ matrix.cuda-minor-version }} + platforms: ${{ matrix.platforms }} + runs-on: ${{ matrix.runs-on }} + secrets: + dockerUsername: ${{ secrets.LOCALAI_REGISTRY_USERNAME }} + dockerPassword: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }} + strategy: + matrix: + include: - build-type: '' platforms: 'linux/amd64' tag-latest: 'false' @@ -88,8 +120,8 @@ jobs: image-type: 'core' runs-on: 'ubuntu-latest' - build-type: 'cublas' - cuda-major-version: 11 - cuda-minor-version: 7 + cuda-major-version: "11" + cuda-minor-version: "7" platforms: 'linux/amd64' tag-latest: 'false' tag-suffix: '-cublas-cuda11-core' @@ -97,8 +129,8 @@ jobs: image-type: 'core' runs-on: 'ubuntu-latest' - build-type: 'cublas' - cuda-major-version: 12 - cuda-minor-version: 1 + cuda-major-version: "12" + cuda-minor-version: "1" platforms: 'linux/amd64' tag-latest: 'false' tag-suffix: '-cublas-cuda12-core' @@ -106,8 +138,8 @@ jobs: image-type: 'core' runs-on: 'ubuntu-latest' - build-type: 'cublas' - cuda-major-version: 11 - cuda-minor-version: 7 + cuda-major-version: "11" + cuda-minor-version: "7" platforms: 'linux/amd64' tag-latest: 'false' tag-suffix: '-cublas-cuda11-ffmpeg-core' @@ -115,106 +147,11 @@ jobs: image-type: 'core' runs-on: 'ubuntu-latest' - build-type: 'cublas' - cuda-major-version: 12 - cuda-minor-version: 1 + cuda-major-version: "12" + cuda-minor-version: "1" platforms: 'linux/amd64' tag-latest: 'false' tag-suffix: '-cublas-cuda12-ffmpeg-core' ffmpeg: 'true' image-type: 'core' runs-on: 'ubuntu-latest' - - runs-on: ${{ matrix.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 - # 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 - # df -h - - name: Docker meta - id: meta - uses: docker/metadata-action@v5 - with: - images: quay.io/go-skynet/local-ai - tags: | - type=ref,event=branch - type=semver,pattern={{raw}} - type=sha - flavor: | - latest=${{ matrix.tag-latest }} - suffix=${{ matrix.tag-suffix }} - - - 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: - registry: quay.io - username: ${{ secrets.LOCALAI_REGISTRY_USERNAME }} - password: ${{ secrets.LOCALAI_REGISTRY_PASSWORD }} - - - name: Build and push - uses: docker/build-push-action@v5 - with: - builder: ${{ steps.buildx.outputs.name }} - build-args: | - BUILD_TYPE=${{ matrix.build-type }} - CUDA_MAJOR_VERSION=${{ matrix.cuda-major-version }} - CUDA_MINOR_VERSION=${{ matrix.cuda-minor-version }} - FFMPEG=${{ matrix.ffmpeg }} - IMAGE_TYPE=${{ matrix.image-type }} - context: . - file: ./Dockerfile - platforms: ${{ matrix.platforms }} - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/image_build.yml b/.github/workflows/image_build.yml new file mode 100644 index 00000000..73d4a675 --- /dev/null +++ b/.github/workflows/image_build.yml @@ -0,0 +1,147 @@ +--- +name: 'build container images' + +on: + workflow_call: + inputs: + build-type: + description: 'Build type' + default: '' + type: string + cuda-major-version: + description: 'CUDA major version' + default: "11" + type: string + cuda-minor-version: + description: 'CUDA minor version' + default: "7" + type: string + platforms: + description: 'Platforms' + default: '' + type: string + tag-latest: + 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 + secrets: + dockerUsername: + required: true + dockerPassword: + 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 + # 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 + # df -h + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: quay.io/go-skynet/local-ai + tags: | + type=ref,event=branch + type=semver,pattern={{raw}} + type=sha + flavor: | + latest=${{ inputs.tag-latest }} + suffix=${{ inputs.tag-suffix }} + + - 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: + registry: quay.io + username: ${{ secrets.dockerUsername }} + password: ${{ secrets.dockerPassword }} + + - name: Build and push + uses: docker/build-push-action@v5 + 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 }} + context: . + file: ./Dockerfile + platforms: ${{ inputs.platforms }} + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + - name: job summary + run: | + echo "Built image: ${{ steps.meta.outputs.labels }}" >> $GITHUB_STEP_SUMMARY