Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 67 additions & 16 deletions .github/workflows/auto_llama_cpp_update.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ name: Auto-update llama.cpp Pin

on:
schedule:
# Weekday morning UTC, after upstream llama.cpp usually publishes release tags.
- cron: '17 10 * * 1-5'
# Daily UTC, aligned with llamadart-native auto_native_release.yml.
- cron: '23 3 * * *'
workflow_dispatch:

permissions:
Expand All @@ -13,7 +13,7 @@ permissions:

concurrency:
group: llama-cpp-auto-update
cancel-in-progress: true
cancel-in-progress: false

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
Expand Down Expand Up @@ -42,40 +42,48 @@ jobs:
exit 1
fi

LATEST_TAG="$(gh release list --repo ggml-org/llama.cpp --limit 1 --json tagName --jq '.[0].tagName')"
LATEST_TAG="$(gh release list --repo ggml-org/llama.cpp --limit 1 --json tagName --jq ".[0].tagName")"
if [ -z "$LATEST_TAG" ] || [ "$LATEST_TAG" = "null" ]; then
echo "error: could not resolve latest ggml-org/llama.cpp release tag"
exit 1
fi

echo "current_tag=$CURRENT_TAG" >> "$GITHUB_OUTPUT"
echo "latest_tag=$LATEST_TAG" >> "$GITHUB_OUTPUT"
{
echo "current_tag=$CURRENT_TAG"
echo "latest_tag=$LATEST_TAG"
} >> "$GITHUB_OUTPUT"

if [ "$CURRENT_TAG" = "$LATEST_TAG" ]; then
echo "update_needed=false" >> "$GITHUB_OUTPUT"
echo "skip_reason=$VERSION_FILE already points at $LATEST_TAG" >> "$GITHUB_OUTPUT"
{
echo "update_needed=false"
echo "skip_reason=$VERSION_FILE already points at $LATEST_TAG"
} >> "$GITHUB_OUTPUT"
exit 0
fi

for pr in $(gh pr list --repo "$GITHUB_REPOSITORY" --state open --json number,headRefName --jq ".[] | select(.headRefName != \"$UPDATE_BRANCH\") | .number"); do
if gh pr diff "$pr" --repo "$GITHUB_REPOSITORY" --name-only | grep -qx "$VERSION_FILE"; then
echo "update_needed=false" >> "$GITHUB_OUTPUT"
echo "skip_reason=PR #$pr already changes $VERSION_FILE; not racing a non-automation PR" >> "$GITHUB_OUTPUT"
{
echo "update_needed=false"
echo "skip_reason=PR #$pr already changes $VERSION_FILE; not racing a non-automation PR"
} >> "$GITHUB_OUTPUT"
exit 0
fi
done

printf '%s\n' "$LATEST_TAG" > "$VERSION_FILE"

RELEASE_URL="$(gh release view "$LATEST_TAG" --repo ggml-org/llama.cpp --json url --jq '.url')"
RELEASE_URL="$(gh release view "$LATEST_TAG" --repo ggml-org/llama.cpp --json url --jq ".url")"
COMPARE_URL="https://github.com/ggml-org/llama.cpp/compare/${CURRENT_TAG}...${LATEST_TAG}"
echo "release_url=$RELEASE_URL" >> "$GITHUB_OUTPUT"
echo "compare_url=$COMPARE_URL" >> "$GITHUB_OUTPUT"
echo "update_needed=true" >> "$GITHUB_OUTPUT"
{
echo "release_url=$RELEASE_URL"
echo "compare_url=$COMPARE_URL"
echo "update_needed=true"
} >> "$GITHUB_OUTPUT"

gh release view "$LATEST_TAG" --repo ggml-org/llama.cpp --json body --jq '.body // ""' > /tmp/llama_cpp_release_notes.md
gh release view "$LATEST_TAG" --repo ggml-org/llama.cpp --json body --jq ".body // \"\"" > /tmp/llama_cpp_release_notes.md
gh api "repos/ggml-org/llama.cpp/compare/${CURRENT_TAG}...${LATEST_TAG}" \
--jq '.commits[:80][] | "- " + (.commit.message | split("\n")[0]) + " (`" + (.sha[0:7]) + "`)"' \
--jq ".commits[:80][] | \"- \" + (.commit.message | split(\"\\n\")[0]) + \" (\`\" + (.sha[0:7]) + \"\`)\"" \
> /tmp/llama_cpp_commits.md || true

{
Expand Down Expand Up @@ -170,3 +178,46 @@ jobs:
sleep $((attempt * 5))
done
echo "Dispatched CI for #${{ steps.create-pr.outputs.pull-request-number }} on $UPDATE_BRANCH."

- name: Wait for automation PR CI
if: steps.create-pr.outputs.pull-request-number != ''
timeout-minutes: 45
env:
GH_TOKEN: ${{ github.token }}
PR_NUMBER: ${{ steps.create-pr.outputs.pull-request-number }}
PR_HEAD_SHA: ${{ steps.create-pr.outputs.pull-request-head-sha }}
run: |
set -euo pipefail

if [ -z "$PR_HEAD_SHA" ] || [ "$PR_HEAD_SHA" = "null" ]; then
PR_HEAD_SHA="$(gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json headRefOid --jq ".headRefOid")"
fi
if [ -z "$PR_HEAD_SHA" ] || [ "$PR_HEAD_SHA" = "null" ]; then
echo "error: could not resolve head SHA for automation PR #$PR_NUMBER"
exit 1
fi

run_id=""
for attempt in $(seq 1 30); do
run_id="$(gh run list \
--repo "$GITHUB_REPOSITORY" \
--workflow ci.yml \
--branch "$UPDATE_BRANCH" \
--commit "$PR_HEAD_SHA" \
--event workflow_dispatch \
--json databaseId \
--jq ".[0].databaseId // \"\"")"
if [ -n "$run_id" ]; then
break
fi
echo "Waiting for CI workflow_dispatch run for $PR_HEAD_SHA (attempt $attempt/30)."
sleep 10
done

if [ -z "$run_id" ]; then
echo "error: dispatched CI workflow_dispatch run for $PR_HEAD_SHA was not found"
exit 1
fi

echo "Watching CI run $run_id for automation PR #$PR_NUMBER at $PR_HEAD_SHA."
gh run watch "$run_id" --repo "$GITHUB_REPOSITORY" --exit-status --interval 30
Loading