248 lines
14 KiB
YAML
248 lines
14 KiB
YAML
name: Publish Release
|
|
|
|
on:
|
|
workflow_run:
|
|
workflows:
|
|
- Release
|
|
types:
|
|
- completed
|
|
branches:
|
|
- master
|
|
|
|
run-name: "Publish ${{ github.event.workflow_run.display_title }}"
|
|
|
|
cache-mode: none
|
|
permissions:
|
|
actions: read
|
|
contents: read
|
|
|
|
env:
|
|
GH_TOKEN: ${{ github.token }}
|
|
BRANCH_NAME: master
|
|
|
|
jobs:
|
|
publish:
|
|
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
|
|
|
# Fine-grained permission
|
|
# https://docs.github.com/en/actions/security-for-github-actions/security-guides/automatic-token-authentication#modifying-the-permissions-for-the-github_token
|
|
permissions:
|
|
actions: read
|
|
contents: write # for creating release
|
|
id-token: write
|
|
attestations: write
|
|
|
|
runs-on: ubuntu-latest
|
|
|
|
outputs:
|
|
should_release: ${{ steps.check.outputs.should_release }}
|
|
tag_name: ${{ steps.tag.outputs.name }}
|
|
|
|
steps:
|
|
- id: check
|
|
env:
|
|
COMMIT_MESSAGE: ${{ github.event.workflow_run.head_commit.message }}
|
|
run: |
|
|
if echo "$COMMIT_MESSAGE" | grep -q '\[no release\]'; then
|
|
echo "should_release=false" >> $GITHUB_OUTPUT
|
|
else
|
|
echo "should_release=true" >> $GITHUB_OUTPUT
|
|
fi
|
|
|
|
- name: Clone
|
|
if: ${{ steps.check.outputs.should_release == 'true' }}
|
|
id: checkout
|
|
uses: actions/checkout@v6
|
|
with:
|
|
ref: ${{ github.event.workflow_run.head_sha }}
|
|
fetch-depth: 0
|
|
ssh-key: ${{ secrets.DEPLOY_KEY_RELEASE }}
|
|
|
|
- name: Determine tag name
|
|
if: ${{ steps.check.outputs.should_release == 'true' }}
|
|
id: tag
|
|
uses: ./.github/actions/get-tag-name
|
|
|
|
- name: Download artifacts
|
|
if: ${{ steps.check.outputs.should_release == 'true' }}
|
|
id: download-artifact
|
|
uses: actions/download-artifact@v8
|
|
with:
|
|
path: ./artifact
|
|
run-id: ${{ github.event.workflow_run.id }}
|
|
github-token: ${{ github.token }}
|
|
merge-multiple: true
|
|
skip-decompress: true
|
|
|
|
- name: Merge artifacts
|
|
if: ${{ steps.check.outputs.should_release == 'true' }}
|
|
id: move_artifacts
|
|
run: |
|
|
mkdir -p release
|
|
|
|
# the windows-cpu zip contains the full toolset (llama-server with the embedded
|
|
# UI, ggml-cpu) - inject it into the other windows zips so that every archive
|
|
# ships the same binaries, only with a different backend library on top
|
|
echo "Injecting windows-cpu binaries (llama-server + CPU backend) into the backend zips..."
|
|
for arch in x64 arm64; do
|
|
cpu_zip="artifact/llama-bin-win-cpu-${arch}.zip"
|
|
temp_dir=$(mktemp -d)
|
|
echo "Extracting windows-cpu-${arch} package..."
|
|
unzip "$cpu_zip" -d "$temp_dir"
|
|
|
|
echo "Merging into $arch zips..."
|
|
for target_zip in artifact/llama-bin-win-*-${arch}.zip; do
|
|
if [[ "$target_zip" == "$cpu_zip" ]]; then
|
|
continue
|
|
fi
|
|
echo "Injecting into $(basename "$target_zip")"
|
|
realpath_target_zip=$(realpath "$target_zip")
|
|
(cd "$temp_dir" && zip -r "$realpath_target_zip" .)
|
|
done
|
|
|
|
rm -rf "$temp_dir"
|
|
done
|
|
|
|
echo "Renaming and moving zips to release..."
|
|
for zip_file in artifact/llama-bin-win-*.zip; do
|
|
base_name=$(basename "$zip_file" .zip)
|
|
zip_name="llama-${{ steps.tag.outputs.name }}-${base_name#llama-}.zip"
|
|
echo "Moving $zip_file to release/$zip_name"
|
|
mv "$zip_file" "release/$zip_name"
|
|
done
|
|
|
|
echo "Moving other artifacts..."
|
|
rm -f artifact/llama-ui.zip
|
|
mv -v artifact/*.zip release
|
|
mv -v artifact/*.tar.gz release
|
|
|
|
- name: Download UI build
|
|
if: ${{ steps.check.outputs.should_release == 'true' }}
|
|
id: download_ui
|
|
uses: actions/download-artifact@v8
|
|
with:
|
|
name: llama-ui.zip
|
|
path: ./ui-dist
|
|
run-id: ${{ github.event.workflow_run.id }}
|
|
github-token: ${{ github.token }}
|
|
|
|
- name: Package UI
|
|
if: ${{ steps.check.outputs.should_release == 'true' }}
|
|
id: package_ui
|
|
run: |
|
|
tar -czvf release/llama-${{ steps.tag.outputs.name }}-ui.tar.gz --transform "s,^\.,llama-${{ steps.tag.outputs.name }}," -C ./ui-dist .
|
|
|
|
- name: Attest release artifacts
|
|
if: ${{ steps.check.outputs.should_release == 'true' }}
|
|
id: attest
|
|
uses: actions/attest@v4
|
|
with:
|
|
subject-path: 'release/*'
|
|
|
|
- name: Create release
|
|
if: ${{ steps.check.outputs.should_release == 'true' }}
|
|
id: create_release
|
|
uses: ggml-org/action-create-release@v1
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
with:
|
|
tag_name: ${{ steps.tag.outputs.name }}
|
|
commitish: ${{ github.event.workflow_run.head_sha }}
|
|
prerelease: true
|
|
body: |
|
|
<details open>
|
|
|
|
${{ github.event.workflow_run.head_commit.message }}
|
|
|
|
</details>
|
|
|
|
**Website:**
|
|
- <https://llama.app>
|
|
|
|
**Attestations:**
|
|
- <${{ steps.attest.outputs.attestation-url }}>
|
|
|
|
**macOS/iOS:**
|
|
- [macOS Apple Silicon (arm64)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-macos-arm64.tar.gz)
|
|
- macOS Apple Silicon (arm64, KleidiAI enabled) [DISABLED](https://github.com/ggml-org/llama.cpp/pull/23780)
|
|
- [macOS Intel (x64)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-macos-x64.tar.gz)
|
|
- [iOS XCFramework](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-xcframework.zip)
|
|
|
|
**Linux:**
|
|
- [Ubuntu x64 (CPU)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-x64.tar.gz)
|
|
- [Ubuntu arm64 (CPU)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-arm64.tar.gz)
|
|
- [Ubuntu s390x (CPU)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-s390x.tar.gz)
|
|
- [Ubuntu x64 (Vulkan)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-vulkan-x64.tar.gz)
|
|
- [Ubuntu arm64 (Vulkan)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-vulkan-arm64.tar.gz)
|
|
- [Ubuntu x64 (CUDA 12)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-cuda-12.8-x64.tar.gz) - [CUDA 12.8 libraries](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/cudart-llama-${{ steps.tag.outputs.name }}-bin-ubuntu-cuda-12.8-x64.tar.gz)
|
|
- [Ubuntu x64 (CUDA 13)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-cuda-13.4-x64.tar.gz) - [CUDA 13.4 libraries](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/cudart-llama-${{ steps.tag.outputs.name }}-bin-ubuntu-cuda-13.4-x64.tar.gz)
|
|
- [Ubuntu arm64 (CUDA 13)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-cuda-13.4-arm64.tar.gz) - [CUDA 13.4 libraries](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/cudart-llama-${{ steps.tag.outputs.name }}-bin-ubuntu-cuda-13.4-arm64.tar.gz)
|
|
- [Ubuntu x64 (ROCm 10.0)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-rocm-10.0-x64.tar.gz)
|
|
- [Ubuntu x64 (OpenVINO)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-openvino-2026.4.1-x64.tar.gz)
|
|
- [Ubuntu x64 (SYCL FP32)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-sycl-fp32-x64.tar.gz)
|
|
- [Ubuntu x64 (SYCL FP16)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-ubuntu-sycl-fp16-x64.tar.gz)
|
|
- [Linux arm64 (Snapdragon: CPU, Adreno GPU, Hexagon NPU)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-linux-arm64-snapdragon.tar.gz) - [setup guide](https://github.com/ggml-org/llama.cpp/blob/master/docs/backend/snapdragon/linux.md)
|
|
|
|
**Android:**
|
|
- [Android arm64 (CPU)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-android-arm64.tar.gz)
|
|
- [Android arm64 (Snapdragon: CPU, Adreno GPU, Hexagon NPU)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-android-arm64-snapdragon.tar.gz) - [setup guide](https://github.com/ggml-org/llama.cpp/blob/master/docs/backend/snapdragon/README.md)
|
|
|
|
**Windows:**
|
|
- [Windows x64 (CPU)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-cpu-x64.zip)
|
|
- [Windows arm64 (CPU)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-cpu-arm64.zip)
|
|
- [Windows arm64 (OpenCL Adreno)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-opencl-adreno-arm64.zip)
|
|
- [Windows x64 (CUDA 12)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-cuda-12.4-x64.zip) - [CUDA 12.4 DLLs](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/cudart-llama-bin-win-cuda-12.4-x64.zip)
|
|
- [Windows x64 (CUDA 13)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-cuda-13.4-x64.zip) - [CUDA 13.4 DLLs](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/cudart-llama-bin-win-cuda-13.4-x64.zip)
|
|
- [Windows arm64 (CUDA 13)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-cuda-13.4-arm64.zip) - [CUDA 13.4 DLLs](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/cudart-llama-bin-win-cuda-13.4-arm64.zip)
|
|
- [Windows x64 (Vulkan)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-vulkan-x64.zip)
|
|
- [Windows arm64 (Vulkan)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-vulkan-arm64.zip)
|
|
- [Windows x64 (OpenVINO)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-openvino-2026.4.1-x64.zip)
|
|
- [Windows x64 (SYCL)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-sycl-x64.zip)
|
|
- [Windows x64 (ROCm 10.0)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-rocm-10.0-x64.zip)
|
|
|
|
**openEuler:**
|
|
- [DISABLED](https://github.com/ggml-org/llama.cpp/pull/23705)
|
|
- openEuler x86 (310p)
|
|
- openEuler x86 (910b, ACL Graph)
|
|
- openEuler aarch64 (310p)
|
|
- openEuler aarch64 (910b, ACL Graph)
|
|
|
|
**UI:**
|
|
- [UI](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-ui.tar.gz)
|
|
|
|
- name: Upload release
|
|
if: ${{ steps.check.outputs.should_release == 'true' }}
|
|
id: upload_release
|
|
uses: actions/github-script@v8
|
|
with:
|
|
github-token: ${{secrets.GITHUB_TOKEN}}
|
|
script: |
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
const release_id = '${{ steps.create_release.outputs.id }}';
|
|
for (let file of await fs.readdirSync('./release')) {
|
|
if (path.extname(file) === '.zip' || file.endsWith('.tar.gz')) {
|
|
console.log('uploadReleaseAsset', file);
|
|
await github.rest.repos.uploadReleaseAsset({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
release_id: release_id,
|
|
name: file,
|
|
data: await fs.readFileSync(`./release/${file}`)
|
|
});
|
|
}
|
|
}
|
|
|
|
ui-publish:
|
|
if: ${{ needs.publish.outputs.should_release == 'true' }}
|
|
|
|
needs:
|
|
- publish
|
|
|
|
uses: ./.github/workflows/ui-publish.yml
|
|
with:
|
|
version_tag: ${{ needs.publish.outputs.tag_name }}
|
|
run_id: ${{ github.event.workflow_run.id }}
|
|
secrets:
|
|
hf_token: ${{ secrets.HF_TOKEN_UI_STATIC_OUTPUT }}
|