diff --git a/.github/workflows/make-release.yml b/.github/workflows/make-release.yml index 357fc2cfa7..e00e19d5be 100644 --- a/.github/workflows/make-release.yml +++ b/.github/workflows/make-release.yml @@ -26,28 +26,17 @@ jobs: steps: - name: Checkout uses: actions/checkout@v6 - with: - fetch-depth: 0 - - name: Determine version - id: version - run: bash scripts/release-determine-version.sh "${{ github.event.inputs.version }}" - - - name: Check tag does not already exist - run: bash scripts/release-check-tag.sh "${{ steps.version.outputs.version }}" - - - name: Check release.yml completed successfully for HEAD - run: bash scripts/release-check-ci.sh ${{ github.event.inputs.dry_run == 'true' && '--dry-run' || '' }} + - name: Run release checks + id: checks + run: bash scripts/make-release-checks.sh "${{ github.event.inputs.version }}" ${{ github.event.inputs.dry_run == 'true' && '--dry-run' || '' }} env: GITHUB_REPOSITORY: ${{ github.repository }} - - name: Check local ggml matches upstream - run: bash scripts/release-check-ggml.sh ${{ github.event.inputs.dry_run == 'true' && '--dry-run' || '' }} - - name: Create release tag if: ${{ github.event.inputs.dry_run == 'false' }} run: | - VERSION="${{ steps.version.outputs.version }}" + VERSION="${{ steps.checks.outputs.version }}" git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git tag -a "${VERSION}" -m "Release ${VERSION}" @@ -58,4 +47,4 @@ jobs: if: ${{ github.event.inputs.dry_run == 'true' }} run: | echo "Dry run complete - all checks passed." - echo "Would have created tag: ${{ steps.version.outputs.version }}" + echo "Would have created tag: ${{ steps.checks.outputs.version }}" diff --git a/scripts/make-release-checks.sh b/scripts/make-release-checks.sh new file mode 100755 index 0000000000..9541f94c6a --- /dev/null +++ b/scripts/make-release-checks.sh @@ -0,0 +1,90 @@ +#!/bin/bash +# Run all pre-release checks and determine the release version. +# +# Usage: make-release-checks.sh [version] [--dry-run] +# version: optional explicit version (e.g. v0.1.0); reads CMakeLists.txt if omitted +# --dry-run: warn on failures instead of aborting +# +# Env (when running in GitHub Actions): GH_TOKEN, GITHUB_REPOSITORY, GITHUB_OUTPUT +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" + +VERSION_ARG="" +DRY_RUN=false +for arg in "$@"; do + case "$arg" in + --dry-run) DRY_RUN=true ;; + -*) echo "Unknown argument: $arg"; exit 1 ;; + *) VERSION_ARG="$arg" ;; + esac +done + +if [[ -n "$VERSION_ARG" ]]; then + VERSION="$VERSION_ARG" +else + MAJOR=$(grep "set(LLAMA_VERSION_MAJOR" "$REPO_ROOT/CMakeLists.txt" | grep -oP '\d+') + MINOR=$(grep "set(LLAMA_VERSION_MINOR" "$REPO_ROOT/CMakeLists.txt" | grep -oP '\d+') + PATCH=$(grep "set(LLAMA_VERSION_PATCH" "$REPO_ROOT/CMakeLists.txt" | grep -oP '\d+') + VERSION="v${MAJOR}.${MINOR}.${PATCH}" +fi +echo "Determined version: ${VERSION}" +if [[ -n "${GITHUB_OUTPUT:-}" ]]; then + echo "version=${VERSION}" >> "$GITHUB_OUTPUT" +fi + +echo "Checking that tag ${VERSION} does not already exist..." +if git ls-remote --tags origin "${VERSION}" | grep -q "${VERSION}"; then + echo "Error: tag ${VERSION} already exists on remote" + exit 1 +fi +echo "Tag ${VERSION} does not exist on remote - OK" + +SHA=$(git rev-parse HEAD) +echo "Checking release.yml status for commit ${SHA}..." +if [[ -z "${GITHUB_REPOSITORY:-}" ]]; then + echo "Warning: GITHUB_REPOSITORY not set - skipping CI check (local run)" +else + RUNS=$(gh api "repos/${GITHUB_REPOSITORY}/actions/workflows/release.yml/runs" \ + --jq "[.workflow_runs[] | select(.head_sha == \"${SHA}\" and .conclusion == \"success\")] | length") + if [[ "$RUNS" -eq 0 ]]; then + if [[ "$DRY_RUN" == "true" ]]; then + echo "Warning: no successful release.yml run found for HEAD (${SHA}) (dry run, continuing)." + else + echo "Error: no successful release.yml run found for HEAD (${SHA})" + echo "The nightly build must complete successfully before making a release." + exit 1 + fi + else + echo "Found successful release.yml run for HEAD." + fi +fi + +MAJOR=$(grep "set(GGML_VERSION_MAJOR" "$REPO_ROOT/ggml/CMakeLists.txt" | grep -oP '\d+') +MINOR=$(grep "set(GGML_VERSION_MINOR" "$REPO_ROOT/ggml/CMakeLists.txt" | grep -oP '\d+') +PATCH=$(grep "set(GGML_VERSION_PATCH" "$REPO_ROOT/ggml/CMakeLists.txt" | grep -oP '\d+') +GGML_VERSION="v${MAJOR}.${MINOR}.${PATCH}" +echo "Local ggml version: ${GGML_VERSION}" + +if ! git clone --depth 1 --branch "${GGML_VERSION}" https://github.com/ggml-org/ggml.git upstream-ggml 2>/dev/null; then + echo "Warning: tag ${GGML_VERSION} not found in upstream ggml - skipping comparison" +else + echo "Comparing local ggml/ src and include with upstream ${GGML_VERSION}..." + DIFF=$(diff -rq "$REPO_ROOT/ggml/src" upstream-ggml/src 2>&1 || true) + DIFF+=$(diff -rq "$REPO_ROOT/ggml/include" upstream-ggml/include 2>&1 || true) + DIFF+=$(diff "$REPO_ROOT/ggml/CMakeLists.txt" upstream-ggml/CMakeLists.txt 2>&1 || true) + rm -rf upstream-ggml + if [[ -n "$DIFF" ]]; then + echo "local ggml/ differs from upstream ${GGML_VERSION}:" + echo "$DIFF" + if [[ "$DRY_RUN" == "true" ]]; then + echo "Warning: would abort release due to ggml mismatch (dry run, continuing)." + else + echo "Error: ggml must match upstream before making a release." + exit 1 + fi + else + echo "local ggml/ matches upstream ${GGML_VERSION}" + fi +fi diff --git a/scripts/release-check-ci.sh b/scripts/release-check-ci.sh deleted file mode 100755 index 9037d57c25..0000000000 --- a/scripts/release-check-ci.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# Check that release.yml completed successfully for the current HEAD commit. -# Usage: release-check-ci.sh [--dry-run] -# Env: GH_TOKEN, GITHUB_REPOSITORY -set -euo pipefail - -DRY_RUN=false -for arg in "$@"; do - case "$arg" in - --dry-run) DRY_RUN=true ;; - *) echo "Unknown argument: $arg"; exit 1 ;; - esac -done - -SHA=$(git rev-parse HEAD) -echo "Checking release.yml status for commit ${SHA}..." - -RUNS=$(gh api "repos/${GITHUB_REPOSITORY}/actions/workflows/release.yml/runs" \ - --jq "[.workflow_runs[] | select(.head_sha == \"${SHA}\" and .conclusion == \"success\")] | length") - -if [[ "$RUNS" -eq 0 ]]; then - if [[ "$DRY_RUN" == "true" ]]; then - echo "Warning: no successful release.yml run found for HEAD (${SHA}) (dry run, continuing)." - else - echo "Error: no successful release.yml run found for HEAD (${SHA})" - echo "The nightly build must complete successfully before making a release." - exit 1 - fi -else - echo "Found successful release.yml run for HEAD." -fi diff --git a/scripts/release-check-ggml.sh b/scripts/release-check-ggml.sh deleted file mode 100755 index e2c8541333..0000000000 --- a/scripts/release-check-ggml.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -# Check that the vendored ggml/ matches the corresponding upstream ggml release tag. -# Usage: release-check-ggml.sh [--dry-run] -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" - -DRY_RUN=false -for arg in "$@"; do - case "$arg" in - --dry-run) DRY_RUN=true ;; - *) echo "Unknown argument: $arg"; exit 1 ;; - esac -done - -MAJOR=$(grep "set(GGML_VERSION_MAJOR" "$REPO_ROOT/ggml/CMakeLists.txt" | grep -oP '\d+') -MINOR=$(grep "set(GGML_VERSION_MINOR" "$REPO_ROOT/ggml/CMakeLists.txt" | grep -oP '\d+') -PATCH=$(grep "set(GGML_VERSION_PATCH" "$REPO_ROOT/ggml/CMakeLists.txt" | grep -oP '\d+') -GGML_VERSION="v${MAJOR}.${MINOR}.${PATCH}" -echo "Local ggml version: ${GGML_VERSION}" - -if ! git clone --depth 1 --branch "${GGML_VERSION}" https://github.com/ggml-org/ggml.git upstream-ggml 2>/dev/null; then - echo "Warning: tag ${GGML_VERSION} not found in upstream ggml - skipping comparison" - exit 0 -fi - -echo "Comparing local ggml/ src and include with upstream ${GGML_VERSION}..." -DIFF=$(diff -rq \ - "$REPO_ROOT/ggml/src" upstream-ggml/src \ - 2>&1 || true) -DIFF+=$(diff -rq \ - "$REPO_ROOT/ggml/include" upstream-ggml/include \ - 2>&1 || true) -DIFF+=$(diff \ - "$REPO_ROOT/ggml/CMakeLists.txt" upstream-ggml/CMakeLists.txt \ - 2>&1 || true) - -rm -rf upstream-ggml - -if [[ -n "$DIFF" ]]; then - echo "local ggml/ differs from upstream ${GGML_VERSION}:" - echo "$DIFF" - if [[ "$DRY_RUN" == "true" ]]; then - echo "Warning: would abort release due to ggml mismatch (dry run, continuing)." - else - echo "Error: ggml must match upstream before making a release." - exit 1 - fi -else - echo "local ggml/ matches upstream ${GGML_VERSION}" -fi diff --git a/scripts/release-check-tag.sh b/scripts/release-check-tag.sh deleted file mode 100755 index 8a3c4b6dbc..0000000000 --- a/scripts/release-check-tag.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# Check that a release tag does not already exist on the remote. -# Usage: release-check-tag.sh -# version: the tag to check (e.g. v0.1.0) -set -euo pipefail - -if [[ -z "${1:-}" ]]; then - echo "Error: version argument is required" - exit 1 -fi - -VERSION="$1" - -echo "Checking that tag ${VERSION} does not already exist..." -if git ls-remote --tags origin "${VERSION}" | grep -q "${VERSION}"; then - echo "Error: tag ${VERSION} already exists on remote" - exit 1 -fi - -echo "Tag ${VERSION} does not exist on remote - OK" diff --git a/scripts/release-determine-version.sh b/scripts/release-determine-version.sh deleted file mode 100755 index 980e071263..0000000000 --- a/scripts/release-determine-version.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -# Determine the release version for llama.cpp. -# Usage: release-determine-version.sh [version] -# version: optional explicit version (e.g. v0.1.0); reads CMakeLists.txt if omitted -# Writes "version=" to $GITHUB_OUTPUT when running in GitHub Actions. -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" - -if [[ -n "${1:-}" ]]; then - VERSION="$1" -else - MAJOR=$(grep "set(LLAMA_VERSION_MAJOR" "$REPO_ROOT/CMakeLists.txt" | grep -oP '\d+') - MINOR=$(grep "set(LLAMA_VERSION_MINOR" "$REPO_ROOT/CMakeLists.txt" | grep -oP '\d+') - PATCH=$(grep "set(LLAMA_VERSION_PATCH" "$REPO_ROOT/CMakeLists.txt" | grep -oP '\d+') - VERSION="v${MAJOR}.${MINOR}.${PATCH}" -fi - -echo "Determined version: ${VERSION}" - -if [[ -n "${GITHUB_OUTPUT:-}" ]]; then - echo "version=${VERSION}" >> "$GITHUB_OUTPUT" -fi