Repository navigation
Publish Release #13
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Publish Release | |
| on: | |
| workflow_run: | |
| workflows: | |
| - Release | |
| types: | |
| - completed | |
| branches: | |
| - master | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| BRANCH_NAME: master | |
| jobs: | |
| publish: | |
| # Fine-grant 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-${{ needs.ubuntu-24-openvino.outputs.openvino_version }}-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 x64 (OpenVINO)](https://github.com/ggml-org/llama.cpp/releases/download/${{ steps.tag.outputs.name }}/llama-${{ steps.tag.outputs.name }}-bin-win-openvino-${{ needs.windows-openvino.outputs.openvino_version }}-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 }} |