cd5c8f6471
* Optimize container images for startup This change adjusts how to handle runner payloads to support container builds where we keep them extracted in the filesystem. This makes it easier to optimize the cpu/cuda vs cpu/rocm images for size, and should result in faster startup times for container images. * Refactor payload logic and add buildx support for faster builds * Move payloads around * Review comments * Converge to buildx based helper scripts * Use docker buildx action for release
647 lines
25 KiB
YAML
647 lines
25 KiB
YAML
name: release
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*'
|
|
|
|
jobs:
|
|
# Full build of the Mac assets
|
|
build-darwin:
|
|
runs-on: macos-12
|
|
environment: release
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: Set Version
|
|
shell: bash
|
|
run: |
|
|
echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_ENV
|
|
echo "RELEASE_VERSION=$(echo ${GITHUB_REF_NAME} | cut -f1 -d-)" >> $GITHUB_ENV
|
|
- name: key
|
|
env:
|
|
MACOS_SIGNING_KEY: ${{ secrets.MACOS_SIGNING_KEY }}
|
|
MACOS_SIGNING_KEY_PASSWORD: ${{ secrets.MACOS_SIGNING_KEY_PASSWORD }}
|
|
run: |
|
|
echo $MACOS_SIGNING_KEY | base64 --decode > certificate.p12
|
|
security create-keychain -p password build.keychain
|
|
security default-keychain -s build.keychain
|
|
security unlock-keychain -p password build.keychain
|
|
security import certificate.p12 -k build.keychain -P $MACOS_SIGNING_KEY_PASSWORD -T /usr/bin/codesign
|
|
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k password build.keychain
|
|
security set-keychain-settings -lut 3600 build.keychain
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version-file: go.mod
|
|
cache: true
|
|
- name: Build Darwin
|
|
env:
|
|
APPLE_IDENTITY: ${{ secrets.APPLE_IDENTITY }}
|
|
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
|
APPLE_TEAM_ID: ${{ vars.APPLE_TEAM_ID }}
|
|
APPLE_ID: ${{ vars.APPLE_ID }}
|
|
SDKROOT: /Applications/Xcode_13.4.1.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
|
|
DEVELOPER_DIR: /Applications/Xcode_13.4.1.app/Contents/Developer
|
|
run: |
|
|
./scripts/build_darwin.sh
|
|
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: dist-darwin
|
|
path: |
|
|
dist/*arwin*
|
|
!dist/*-cov
|
|
|
|
# Windows builds take a long time to both install the dependencies and build, so parallelize
|
|
# CPU generation step
|
|
generate-windows-cpu:
|
|
environment: release
|
|
runs-on: windows
|
|
env:
|
|
KEY_CONTAINER: ${{ vars.KEY_CONTAINER }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: Set Version
|
|
shell: bash
|
|
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_ENV
|
|
- uses: 'google-github-actions/auth@v2'
|
|
with:
|
|
project_id: 'ollama'
|
|
credentials_json: '${{ secrets.GOOGLE_SIGNING_CREDENTIALS }}'
|
|
- run: echo "${{ vars.OLLAMA_CERT }}" > ollama_inc.crt
|
|
- name: install Windows SDK 8.1 to get signtool
|
|
run: |
|
|
$ErrorActionPreference = "Stop"
|
|
write-host "downloading SDK"
|
|
Invoke-WebRequest -Uri "https://go.microsoft.com/fwlink/p/?LinkId=323507" -OutFile "${env:RUNNER_TEMP}\sdksetup.exe"
|
|
Start-Process "${env:RUNNER_TEMP}\sdksetup.exe" -ArgumentList @("/q") -NoNewWindow -Wait
|
|
write-host "Win SDK 8.1 installed"
|
|
gci -path 'C:\Program Files (x86)\Windows Kits\' -r -fi 'signtool.exe'
|
|
- name: install signing plugin
|
|
run: |
|
|
$ErrorActionPreference = "Stop"
|
|
write-host "downloading plugin"
|
|
Invoke-WebRequest -Uri "https://github.com/GoogleCloudPlatform/kms-integrations/releases/download/cng-v1.0/kmscng-1.0-windows-amd64.zip" -OutFile "${env:RUNNER_TEMP}\plugin.zip"
|
|
Expand-Archive -Path "${env:RUNNER_TEMP}\plugin.zip" -DestinationPath ${env:RUNNER_TEMP}\plugin\
|
|
write-host "Installing plugin"
|
|
& "${env:RUNNER_TEMP}\plugin\*\kmscng.msi" /quiet
|
|
write-host "plugin installed"
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version-file: go.mod
|
|
cache: true
|
|
- run: go get ./...
|
|
- run: |
|
|
$gopath=(get-command go).source | split-path -parent
|
|
& "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\Launch-VsDevShell.ps1"
|
|
cd $env:GITHUB_WORKSPACE
|
|
$env:CMAKE_SYSTEM_VERSION="10.0.22621.0"
|
|
$env:PATH="$gopath;$env:PATH"
|
|
go generate -x ./...
|
|
name: go generate
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: generate-windows-cpu
|
|
path: |
|
|
build/**/*
|
|
build/**/*.a
|
|
dist/windows-amd64/**
|
|
|
|
# ROCm generation step
|
|
generate-windows-rocm:
|
|
environment: release
|
|
runs-on: windows
|
|
env:
|
|
KEY_CONTAINER: ${{ vars.KEY_CONTAINER }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: Set Version
|
|
shell: bash
|
|
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_ENV
|
|
- uses: 'google-github-actions/auth@v2'
|
|
with:
|
|
project_id: 'ollama'
|
|
credentials_json: '${{ secrets.GOOGLE_SIGNING_CREDENTIALS }}'
|
|
- run: echo "${{ vars.OLLAMA_CERT }}" > ollama_inc.crt
|
|
- name: install Windows SDK 8.1 to get signtool
|
|
run: |
|
|
$ErrorActionPreference = "Stop"
|
|
write-host "downloading SDK"
|
|
Invoke-WebRequest -Uri "https://go.microsoft.com/fwlink/p/?LinkId=323507" -OutFile "${env:RUNNER_TEMP}\sdksetup.exe"
|
|
Start-Process "${env:RUNNER_TEMP}\sdksetup.exe" -ArgumentList @("/q") -NoNewWindow -Wait
|
|
write-host "Win SDK 8.1 installed"
|
|
gci -path 'C:\Program Files (x86)\Windows Kits\' -r -fi 'signtool.exe'
|
|
- name: install signing plugin
|
|
run: |
|
|
$ErrorActionPreference = "Stop"
|
|
write-host "downloading plugin"
|
|
Invoke-WebRequest -Uri "https://github.com/GoogleCloudPlatform/kms-integrations/releases/download/cng-v1.0/kmscng-1.0-windows-amd64.zip" -OutFile "${env:RUNNER_TEMP}\plugin.zip"
|
|
Expand-Archive -Path "${env:RUNNER_TEMP}\plugin.zip" -DestinationPath ${env:RUNNER_TEMP}\plugin\
|
|
write-host "Installing plugin"
|
|
& "${env:RUNNER_TEMP}\plugin\*\kmscng.msi" /quiet
|
|
write-host "plugin installed"
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version-file: go.mod
|
|
cache: true
|
|
- name: 'Install ROCm'
|
|
run: |
|
|
$ErrorActionPreference = "Stop"
|
|
write-host "downloading AMD HIP Installer"
|
|
Invoke-WebRequest -Uri "https://download.amd.com/developer/eula/rocm-hub/AMD-Software-PRO-Edition-24.Q3-WinSvr2022-For-HIP.exe" -OutFile "${env:RUNNER_TEMP}\rocm-install.exe"
|
|
write-host "Installing AMD HIP"
|
|
Start-Process "${env:RUNNER_TEMP}\rocm-install.exe" -ArgumentList '-install' -NoNewWindow -Wait
|
|
write-host "Completed AMD HIP"
|
|
- name: 'Verify ROCm'
|
|
run: |
|
|
& 'C:\Program Files\AMD\ROCm\*\bin\clang.exe' --version
|
|
- run: go get ./...
|
|
- run: |
|
|
$gopath=(get-command go).source | split-path -parent
|
|
& "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\Launch-VsDevShell.ps1"
|
|
cd $env:GITHUB_WORKSPACE
|
|
$env:CMAKE_SYSTEM_VERSION="10.0.22621.0"
|
|
$env:PATH="$gopath;$env:PATH"
|
|
$env:OLLAMA_SKIP_CPU_GENERATE="1"
|
|
$env:HIP_PATH=$(Resolve-Path 'C:\Program Files\AMD\ROCm\*\bin\clang.exe' | split-path | split-path)
|
|
go generate -x ./...
|
|
name: go generate
|
|
- name: 'gather rocm dependencies'
|
|
run: |
|
|
$HIP_PATH=$(Resolve-Path 'C:\Program Files\AMD\ROCm\*\bin\clang.exe' | split-path | split-path)
|
|
md "dist\deps\bin\rocblas\library"
|
|
cp "${HIP_PATH}\bin\hipblas.dll" "dist\deps\bin\"
|
|
cp "${HIP_PATH}\bin\rocblas.dll" "dist\deps\bin\"
|
|
cp "${HIP_PATH}\bin\rocblas\library\*" "dist\deps\bin\rocblas\library\"
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: generate-windows-rocm
|
|
path: |
|
|
build/**/*
|
|
dist/windows-amd64/**
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: windows-rocm-deps
|
|
path: dist/deps/*
|
|
|
|
# CUDA generation step
|
|
generate-windows-cuda:
|
|
environment: release
|
|
runs-on: windows
|
|
strategy:
|
|
matrix:
|
|
cuda:
|
|
- version: "11"
|
|
url: 'https://developer.download.nvidia.com/compute/cuda/11.3.1/local_installers/cuda_11.3.1_465.89_win10.exe'
|
|
- version: "12"
|
|
url: 'https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda_12.4.0_551.61_windows.exe'
|
|
env:
|
|
KEY_CONTAINER: ${{ vars.KEY_CONTAINER }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: Set Version
|
|
shell: bash
|
|
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_ENV
|
|
- uses: 'google-github-actions/auth@v2'
|
|
with:
|
|
project_id: 'ollama'
|
|
credentials_json: '${{ secrets.GOOGLE_SIGNING_CREDENTIALS }}'
|
|
- run: echo "${{ vars.OLLAMA_CERT }}" > ollama_inc.crt
|
|
- name: install Windows SDK 8.1 to get signtool
|
|
run: |
|
|
$ErrorActionPreference = "Stop"
|
|
write-host "downloading SDK"
|
|
Invoke-WebRequest -Uri "https://go.microsoft.com/fwlink/p/?LinkId=323507" -OutFile "${env:RUNNER_TEMP}\sdksetup.exe"
|
|
Start-Process "${env:RUNNER_TEMP}\sdksetup.exe" -ArgumentList @("/q") -NoNewWindow -Wait
|
|
write-host "Win SDK 8.1 installed"
|
|
gci -path 'C:\Program Files (x86)\Windows Kits\' -r -fi 'signtool.exe'
|
|
- name: install signing plugin
|
|
run: |
|
|
$ErrorActionPreference = "Stop"
|
|
write-host "downloading plugin"
|
|
Invoke-WebRequest -Uri "https://github.com/GoogleCloudPlatform/kms-integrations/releases/download/cng-v1.0/kmscng-1.0-windows-amd64.zip" -OutFile "${env:RUNNER_TEMP}\plugin.zip"
|
|
Expand-Archive -Path "${env:RUNNER_TEMP}\plugin.zip" -DestinationPath ${env:RUNNER_TEMP}\plugin\
|
|
write-host "Installing plugin"
|
|
& "${env:RUNNER_TEMP}\plugin\*\kmscng.msi" /quiet
|
|
write-host "plugin installed"
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version-file: go.mod
|
|
cache: true
|
|
- name: 'Install CUDA ${{ matrix.cuda.version }}'
|
|
run: |
|
|
$ErrorActionPreference = "Stop"
|
|
write-host "downloading CUDA Installer"
|
|
Invoke-WebRequest -Uri "${{ matrix.cuda.url }}" -OutFile "${env:RUNNER_TEMP}\cuda-install.exe"
|
|
write-host "Installing CUDA"
|
|
Start-Process "${env:RUNNER_TEMP}\cuda-install.exe" -ArgumentList '-s' -NoNewWindow -Wait
|
|
write-host "Completed CUDA"
|
|
$cudaPath=((resolve-path "c:\Program Files\NVIDIA*\CUDA\v*\bin\nvcc.exe")[0].path | split-path | split-path)
|
|
$cudaVer=($cudaPath | split-path -leaf ) -replace 'v(\d+).(\d+)', '$1_$2'
|
|
echo "$cudaPath\bin" >> $env:GITHUB_PATH
|
|
echo "CUDA_PATH=$cudaPath" >> $env:GITHUB_ENV
|
|
echo "CUDA_PATH_V${cudaVer}=$cudaPath" >> $env:GITHUB_ENV
|
|
echo "CUDA_PATH_VX_Y=CUDA_PATH_V${cudaVer}" >> $env:GITHUB_ENV
|
|
- name: 'Verify CUDA'
|
|
run: nvcc -V
|
|
- run: go get ./...
|
|
- name: go generate
|
|
run: |
|
|
$gopath=(get-command go).source | split-path -parent
|
|
$cudabin=(get-command nvcc).source | split-path
|
|
& "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\Launch-VsDevShell.ps1"
|
|
cd $env:GITHUB_WORKSPACE
|
|
$env:CMAKE_SYSTEM_VERSION="10.0.22621.0"
|
|
$env:PATH="$gopath;$cudabin;$env:PATH"
|
|
$env:OLLAMA_SKIP_CPU_GENERATE="1"
|
|
go generate -x ./...
|
|
- name: 'gather cuda dependencies'
|
|
run: |
|
|
$NVIDIA_DIR=(resolve-path 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\*\bin\')[0]
|
|
md "dist\deps"
|
|
cp "${NVIDIA_DIR}\cudart64_*.dll" "dist\deps\"
|
|
cp "${NVIDIA_DIR}\cublas64_*.dll" "dist\deps\"
|
|
cp "${NVIDIA_DIR}\cublasLt64_*.dll" "dist\deps\"
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: generate-windows-cuda-${{ matrix.cuda.version }}
|
|
path: |
|
|
build/**/*
|
|
dist/windows-amd64/**
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: windows-cuda-deps-${{ matrix.cuda.version }}
|
|
path: dist/deps/*
|
|
|
|
|
|
# Import the prior generation steps and build the final windows assets
|
|
build-windows:
|
|
environment: release
|
|
runs-on: windows
|
|
needs:
|
|
- generate-windows-cuda
|
|
- generate-windows-rocm
|
|
- generate-windows-cpu
|
|
env:
|
|
KEY_CONTAINER: ${{ vars.KEY_CONTAINER }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
- name: Set Version
|
|
shell: bash
|
|
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_ENV
|
|
- uses: 'google-github-actions/auth@v2'
|
|
with:
|
|
project_id: 'ollama'
|
|
credentials_json: '${{ secrets.GOOGLE_SIGNING_CREDENTIALS }}'
|
|
- run: echo "${{ vars.OLLAMA_CERT }}" > ollama_inc.crt
|
|
- name: install Windows SDK 8.1 to get signtool
|
|
run: |
|
|
$ErrorActionPreference = "Stop"
|
|
write-host "downloading SDK"
|
|
Invoke-WebRequest -Uri "https://go.microsoft.com/fwlink/p/?LinkId=323507" -OutFile "${env:RUNNER_TEMP}\sdksetup.exe"
|
|
Start-Process "${env:RUNNER_TEMP}\sdksetup.exe" -ArgumentList @("/q") -NoNewWindow -Wait
|
|
write-host "Win SDK 8.1 installed"
|
|
gci -path 'C:\Program Files (x86)\Windows Kits\' -r -fi 'signtool.exe'
|
|
- name: install signing plugin
|
|
run: |
|
|
$ErrorActionPreference = "Stop"
|
|
write-host "downloading plugin"
|
|
Invoke-WebRequest -Uri "https://github.com/GoogleCloudPlatform/kms-integrations/releases/download/cng-v1.0/kmscng-1.0-windows-amd64.zip" -OutFile "${env:RUNNER_TEMP}\plugin.zip"
|
|
Expand-Archive -Path "${env:RUNNER_TEMP}\plugin.zip" -DestinationPath ${env:RUNNER_TEMP}\plugin\
|
|
write-host "Installing plugin"
|
|
& "${env:RUNNER_TEMP}\plugin\*\kmscng.msi" /quiet
|
|
write-host "plugin installed"
|
|
- uses: actions/setup-go@v5
|
|
with:
|
|
go-version-file: go.mod
|
|
cache: true
|
|
- run: go get
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
name: generate-windows-cpu
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
name: generate-windows-cuda-11
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
name: generate-windows-cuda-12
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
name: windows-cuda-deps-11
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
name: windows-cuda-deps-12
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
name: windows-rocm-deps
|
|
- uses: actions/download-artifact@v4
|
|
with:
|
|
name: generate-windows-rocm
|
|
- run: dir build
|
|
- run: |
|
|
$gopath=(get-command go).source | split-path -parent
|
|
& "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\Launch-VsDevShell.ps1"
|
|
cd $env:GITHUB_WORKSPACE
|
|
$env:CMAKE_SYSTEM_VERSION="10.0.22621.0"
|
|
$env:PATH="$gopath;$env:PATH"
|
|
$env:OLLAMA_SKIP_GENERATE="1"
|
|
& .\scripts\build_windows.ps1
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: dist-windows
|
|
path: |
|
|
dist/OllamaSetup.exe
|
|
dist/ollama-windows-*.zip
|
|
|
|
# Linux x86 assets built using the container based build
|
|
build-linux-amd64:
|
|
environment: release
|
|
runs-on: linux
|
|
env:
|
|
BUILD_ARCH: amd64
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
- name: Set Version
|
|
shell: bash
|
|
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_ENV
|
|
- run: |
|
|
./scripts/build_linux.sh
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: dist-linux-amd64
|
|
path: |
|
|
dist/*linux*
|
|
!dist/*-cov
|
|
|
|
# Linux ARM assets built using the container based build
|
|
# (at present, docker isn't pre-installed on arm ubunutu images)
|
|
build-linux-arm64:
|
|
environment: release
|
|
runs-on: linux-arm64
|
|
env:
|
|
BUILD_ARCH: arm64
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
- name: Set Version
|
|
shell: bash
|
|
run: echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_ENV
|
|
- name: 'Install Docker'
|
|
run: |
|
|
# Add Docker's official GPG key:
|
|
env
|
|
uname -a
|
|
sudo apt-get update
|
|
sudo apt-get install -y ca-certificates curl
|
|
sudo install -m 0755 -d /etc/apt/keyrings
|
|
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
|
|
sudo chmod a+r /etc/apt/keyrings/docker.asc
|
|
|
|
# Add the repository to Apt sources:
|
|
echo \
|
|
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
|
|
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
|
|
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
|
sudo apt-get update
|
|
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
|
|
sudo usermod -aG docker $USER
|
|
sudo apt-get install acl
|
|
sudo setfacl --modify user:$USER:rw /var/run/docker.sock
|
|
- run: |
|
|
./scripts/build_linux.sh
|
|
- uses: actions/upload-artifact@v4
|
|
with:
|
|
name: dist-linux-arm64
|
|
path: |
|
|
dist/*linux*
|
|
!dist/*-cov
|
|
|
|
# Container image build
|
|
build-linux:
|
|
environment: release
|
|
strategy:
|
|
matrix:
|
|
runner:
|
|
- linux
|
|
- linux-arm64
|
|
runs-on: ${{ matrix.runner }}
|
|
env:
|
|
FINAL_IMAGE_REPO: ollama/ollama
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
- name: 'Install Docker'
|
|
if: ${{ startsWith(matrix.runner, 'linux-arm64') }}
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y ca-certificates curl
|
|
sudo install -m 0755 -d /etc/apt/keyrings
|
|
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
|
|
sudo chmod a+r /etc/apt/keyrings/docker.asc
|
|
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
|
|
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
|
|
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
|
sudo apt-get update
|
|
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
|
|
sudo usermod -aG docker $USER
|
|
sudo apt-get install acl
|
|
sudo setfacl --modify user:$USER:rw /var/run/docker.sock
|
|
- name: Docker meta
|
|
id: meta
|
|
uses: docker/metadata-action@v5
|
|
with:
|
|
images: ${{ env.FINAL_IMAGE_REPO }}
|
|
flavor: |
|
|
latest=false
|
|
tags: |
|
|
type=ref,event=tag
|
|
type=ref,enable=true,priority=600,prefix=0.0.0-pr,suffix=,event=pr
|
|
type=semver,pattern={{version}}
|
|
- name: Set Version
|
|
shell: bash
|
|
run: |
|
|
machine=$(uname -m)
|
|
case ${machine} in
|
|
x86_64) echo ARCH=amd64; echo PLATFORM_PAIR=linux-amd64 ;;
|
|
aarch64) echo ARCH=arm64; echo PLATFORM_PAIR=linux-arm64 ;;
|
|
esac >>$GITHUB_ENV
|
|
echo GOFLAGS="'-ldflags=-w -s \"-X=github.com/ollama/ollama/version.Version=${{ env.DOCKER_METADATA_OUTPUT_VERSION }}\" \"-X=github.com/ollama/ollama/server.mode=release\"'" >>$GITHUB_ENV
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
- name: Login to Docker Hub
|
|
uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ vars.DOCKER_USER }}
|
|
password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
|
|
- name: Build and push by digest
|
|
id: build
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
context: "."
|
|
platforms: linux/${{ env.ARCH }}
|
|
build-args: |
|
|
GOFLAGS
|
|
outputs: type=image,name=${{ env.FINAL_IMAGE_REPO }},push-by-digest=true,name-canonical=true,push=true
|
|
- name: Export digest
|
|
run: |
|
|
mkdir -p /tmp/digests
|
|
digest="${{ steps.build.outputs.digest }}"
|
|
touch "/tmp/digests/${digest#sha256:}"
|
|
- name: Upload digest
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: digests-${{ env.PLATFORM_PAIR }}
|
|
path: /tmp/digests/*
|
|
if-no-files-found: error
|
|
retention-days: 1
|
|
merge:
|
|
environment: release
|
|
runs-on: linux
|
|
needs:
|
|
- build-linux
|
|
env:
|
|
FINAL_IMAGE_REPO: ollama/ollama
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
- name: Download digests
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
path: /tmp/digests
|
|
pattern: digests-*
|
|
merge-multiple: true
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
- name: Docker meta
|
|
id: meta
|
|
uses: docker/metadata-action@v5
|
|
with:
|
|
images: ${{ env.FINAL_IMAGE_REPO }}
|
|
flavor: |
|
|
latest=false
|
|
tags: |
|
|
type=ref,event=tag
|
|
type=ref,enable=true,priority=600,prefix=0.0.0-pr,suffix=,event=pr
|
|
type=semver,pattern={{version}}
|
|
- name: Set Version
|
|
shell: bash
|
|
run: |
|
|
machine=$(uname -m)
|
|
case ${machine} in
|
|
x86_64) echo ARCH=amd64; echo PLATFORM_PAIR=linux-amd64 ;;
|
|
aarch64) echo ARCH=arm64; echo PLATFORM_PAIR=linux-arm64 ;;
|
|
esac >>$GITHUB_ENV
|
|
echo GOFLAGS="'-ldflags=-w -s \"-X=github.com/ollama/ollama/version.Version=${{ env.DOCKER_METADATA_OUTPUT_VERSION }}\" \"-X=github.com/ollama/ollama/server.mode=release\"'" >>$GITHUB_ENV
|
|
- name: Login to Docker Hub
|
|
uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ vars.DOCKER_USER }}
|
|
password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
|
|
- name: Create manifest list and push
|
|
working-directory: /tmp/digests
|
|
run: |
|
|
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
|
|
$(printf '${{ env.FINAL_IMAGE_REPO }}@sha256:%s ' *)
|
|
- name: Inspect image
|
|
run: |
|
|
docker buildx imagetools inspect ${{ env.FINAL_IMAGE_REPO }}:${{ steps.meta.outputs.version }}
|
|
build-linux-rocm:
|
|
environment: release
|
|
runs-on: linux
|
|
env:
|
|
FINAL_IMAGE_REPO: ollama/ollama
|
|
ARCH: amd64
|
|
PLATFORM_PAIR: linux-amd64
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
- name: Docker meta
|
|
id: meta
|
|
uses: docker/metadata-action@v5
|
|
with:
|
|
images: ${{ env.FINAL_IMAGE_REPO }}
|
|
flavor: |
|
|
latest=false
|
|
tags: |
|
|
type=ref,event=tag
|
|
type=ref,enable=true,priority=600,prefix=0.0.0-pr,suffix=,event=pr
|
|
type=semver,pattern={{version}}
|
|
- name: Set Version
|
|
shell: bash
|
|
run: |
|
|
echo GOFLAGS="'-ldflags=-w -s \"-X=github.com/ollama/ollama/version.Version=${{ env.DOCKER_METADATA_OUTPUT_VERSION }}\" \"-X=github.com/ollama/ollama/server.mode=release\"'" >>$GITHUB_ENV
|
|
- name: Set up Docker Buildx
|
|
uses: docker/setup-buildx-action@v3
|
|
- name: Login to Docker Hub
|
|
uses: docker/login-action@v3
|
|
with:
|
|
username: ${{ vars.DOCKER_USER }}
|
|
password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
|
|
- name: Build and push by digest
|
|
id: build
|
|
uses: docker/build-push-action@v6
|
|
with:
|
|
context: "."
|
|
target: runtime-rocm
|
|
build-args: |
|
|
GOFLAGS
|
|
tags: ${{ env.FINAL_IMAGE_REPO }}:${{ env.DOCKER_METADATA_OUTPUT_VERSION}}-rocm,${{ env.FINAL_IMAGE_REPO }}:rocm
|
|
push: true
|
|
|
|
# Aggregate all the assets and ship a release
|
|
release:
|
|
needs:
|
|
- build-darwin
|
|
- build-windows
|
|
- build-linux-amd64
|
|
- build-linux-arm64
|
|
runs-on: linux
|
|
environment: release
|
|
permissions:
|
|
contents: write
|
|
env:
|
|
GH_TOKEN: ${{ github.token }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: Set Version
|
|
shell: bash
|
|
run: |
|
|
echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_ENV
|
|
echo "RELEASE_VERSION=$(echo ${GITHUB_REF_NAME} | cut -f1 -d-)" >> $GITHUB_ENV
|
|
- name: Retrieve built artifact
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
path: dist
|
|
pattern: dist-*
|
|
merge-multiple: true
|
|
- run: |
|
|
ls -lh dist/
|
|
(cd dist; find . -type f | xargs sha256sum > ../sha256sum.txt)
|
|
mv sha256sum.txt dist/
|
|
mv dist/linux-???64 .
|
|
mv dist/linux-amd64-rocm .
|
|
cat dist/sha256sum.txt
|
|
- name: Create or update Release
|
|
run: |
|
|
echo "Looking for existing release for ${{ env.RELEASE_VERSION }}"
|
|
OLD_TAG=$(gh release ls --json name,tagName | jq -r ".[] | select(.name == \"${{ env.RELEASE_VERSION }}\") | .tagName")
|
|
if [ -n "$OLD_TAG" ]; then
|
|
echo "Updating release ${{ env.RELEASE_VERSION }} to point to new tag ${GITHUB_REF_NAME}"
|
|
gh release edit ${OLD_TAG} --tag ${GITHUB_REF_NAME}
|
|
else
|
|
echo "Creating new release ${{ env.RELEASE_VERSION }} pointing to tag ${GITHUB_REF_NAME}"
|
|
gh release create ${GITHUB_REF_NAME} \
|
|
--title ${{ env.RELEASE_VERSION }} \
|
|
--draft \
|
|
--generate-notes \
|
|
--prerelease
|
|
fi
|
|
echo "Uploading artifacts for tag ${GITHUB_REF_NAME}"
|
|
gh release upload ${GITHUB_REF_NAME} dist/* --clobber
|