Spaces:
Running
Running
copilot-swe-agent[bot] dboa9 commited on
Commit ·
6392599
1
Parent(s): 439ff1f
Add CI workflow and test script as evidence the Ollama .tar.zst fix works
Browse files
.github/workflows/test-ollama-download.yml
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: Test Ollama Download Fix
|
| 2 |
+
|
| 3 |
+
on:
|
| 4 |
+
push:
|
| 5 |
+
branches: ["main", "copilot/**"]
|
| 6 |
+
paths:
|
| 7 |
+
- "Dockerfile"
|
| 8 |
+
- "scripts/test_ollama_download.sh"
|
| 9 |
+
- ".github/workflows/test-ollama-download.yml"
|
| 10 |
+
pull_request:
|
| 11 |
+
branches: ["main"]
|
| 12 |
+
paths:
|
| 13 |
+
- "Dockerfile"
|
| 14 |
+
- "scripts/test_ollama_download.sh"
|
| 15 |
+
workflow_dispatch:
|
| 16 |
+
|
| 17 |
+
jobs:
|
| 18 |
+
verify-ollama-url:
|
| 19 |
+
name: Verify Ollama v0.17.5 download URL and extraction
|
| 20 |
+
runs-on: ubuntu-latest
|
| 21 |
+
steps:
|
| 22 |
+
- name: Checkout
|
| 23 |
+
uses: actions/checkout@v4
|
| 24 |
+
|
| 25 |
+
- name: Install zstd
|
| 26 |
+
run: sudo apt-get install -y zstd
|
| 27 |
+
|
| 28 |
+
- name: Confirm broken URL returns 404
|
| 29 |
+
run: |
|
| 30 |
+
STATUS=$(curl -o /dev/null -s -w "%{http_code}" \
|
| 31 |
+
"https://github.com/ollama/ollama/releases/download/v0.17.5/ollama-linux-amd64")
|
| 32 |
+
echo "Old bare-binary URL returned: HTTP $STATUS"
|
| 33 |
+
if [ "$STATUS" = "404" ]; then
|
| 34 |
+
echo "PASS: old URL is confirmed broken (HTTP 404) — this was the root cause"
|
| 35 |
+
else
|
| 36 |
+
echo "WARNING: old URL returned HTTP $STATUS (expected 404)"
|
| 37 |
+
fi
|
| 38 |
+
|
| 39 |
+
- name: Confirm fixed URL resolves
|
| 40 |
+
run: |
|
| 41 |
+
STATUS=$(curl -o /dev/null -s -w "%{http_code}" --location \
|
| 42 |
+
"https://github.com/ollama/ollama/releases/download/v0.17.5/ollama-linux-amd64.tar.zst")
|
| 43 |
+
echo "New .tar.zst URL returned: HTTP $STATUS"
|
| 44 |
+
if [ "$STATUS" != "200" ]; then
|
| 45 |
+
echo "FAIL: new URL returned HTTP $STATUS (expected 200)"
|
| 46 |
+
exit 1
|
| 47 |
+
fi
|
| 48 |
+
echo "PASS: new URL resolves (HTTP $STATUS)"
|
| 49 |
+
|
| 50 |
+
- name: Dockerfile uses .tar.zst URL (not bare binary)
|
| 51 |
+
run: |
|
| 52 |
+
if grep -q "ollama-linux-amd64.tar.zst" Dockerfile; then
|
| 53 |
+
echo "PASS: Dockerfile uses .tar.zst URL"
|
| 54 |
+
grep "ollama-linux-amd64" Dockerfile
|
| 55 |
+
else
|
| 56 |
+
echo "FAIL: Dockerfile does NOT use .tar.zst URL"
|
| 57 |
+
grep "ollama-linux-amd64" Dockerfile || true
|
| 58 |
+
exit 1
|
| 59 |
+
fi
|
| 60 |
+
|
| 61 |
+
- name: Dockerfile does NOT use the broken bare-binary URL
|
| 62 |
+
run: |
|
| 63 |
+
# The bare binary URL ends exactly with "ollama-linux-amd64" (no extension)
|
| 64 |
+
if grep -P "ollama-linux-amd64\"" Dockerfile; then
|
| 65 |
+
echo "FAIL: Dockerfile still references the broken bare-binary URL"
|
| 66 |
+
exit 1
|
| 67 |
+
fi
|
| 68 |
+
echo "PASS: Dockerfile does not contain broken bare-binary URL"
|
| 69 |
+
|
| 70 |
+
- name: Dockerfile has zstd in apt packages
|
| 71 |
+
run: |
|
| 72 |
+
if grep -q "zstd" Dockerfile; then
|
| 73 |
+
echo "PASS: zstd is installed in Dockerfile"
|
| 74 |
+
else
|
| 75 |
+
echo "FAIL: zstd is missing from Dockerfile apt packages"
|
| 76 |
+
exit 1
|
| 77 |
+
fi
|
| 78 |
+
|
| 79 |
+
- name: Dockerfile uses tar extraction
|
| 80 |
+
run: |
|
| 81 |
+
if grep -q "tar -I zstd -xf" Dockerfile; then
|
| 82 |
+
echo "PASS: Dockerfile extracts archive with 'tar -I zstd -xf'"
|
| 83 |
+
else
|
| 84 |
+
echo "FAIL: Dockerfile is missing tar extraction step"
|
| 85 |
+
exit 1
|
| 86 |
+
fi
|
| 87 |
+
|
| 88 |
+
- name: Run full download and extraction test
|
| 89 |
+
run: |
|
| 90 |
+
chmod +x scripts/test_ollama_download.sh
|
| 91 |
+
scripts/test_ollama_download.sh
|
scripts/test_ollama_download.sh
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env bash
|
| 2 |
+
# test_ollama_download.sh
|
| 3 |
+
# Evidence script: proves the Ollama v0.17.5 .tar.zst download and extraction works.
|
| 4 |
+
# Run this script to verify the fix before/after any Dockerfile change.
|
| 5 |
+
# Exit 0 = PASS, Exit 1 = FAIL.
|
| 6 |
+
|
| 7 |
+
set -euo pipefail
|
| 8 |
+
|
| 9 |
+
OLLAMA_VERSION="v0.17.5"
|
| 10 |
+
OLLAMA_URL="https://github.com/ollama/ollama/releases/download/${OLLAMA_VERSION}/ollama-linux-amd64.tar.zst"
|
| 11 |
+
OLD_URL="https://github.com/ollama/ollama/releases/download/${OLLAMA_VERSION}/ollama-linux-amd64"
|
| 12 |
+
WORK_DIR="$(mktemp -d)"
|
| 13 |
+
ARCHIVE="${WORK_DIR}/ollama-linux-amd64.tar.zst"
|
| 14 |
+
EXTRACT_DIR="${WORK_DIR}/extracted"
|
| 15 |
+
|
| 16 |
+
cleanup() { rm -rf "${WORK_DIR}"; }
|
| 17 |
+
trap cleanup EXIT
|
| 18 |
+
|
| 19 |
+
echo "========================================================"
|
| 20 |
+
echo " Ollama ${OLLAMA_VERSION} download/extraction evidence"
|
| 21 |
+
echo "========================================================"
|
| 22 |
+
|
| 23 |
+
# --- Test 1: old bare-binary URL must return 404 ---
|
| 24 |
+
echo ""
|
| 25 |
+
echo "TEST 1: Old bare-binary URL returns 404 (root cause confirmed)"
|
| 26 |
+
HTTP_STATUS=$(curl -o /dev/null -s -w "%{http_code}" \
|
| 27 |
+
--max-time 15 \
|
| 28 |
+
"${OLD_URL}")
|
| 29 |
+
if [ "${HTTP_STATUS}" = "404" ]; then
|
| 30 |
+
echo " PASS: ${OLD_URL}"
|
| 31 |
+
echo " → HTTP ${HTTP_STATUS} (confirms old URL is broken)"
|
| 32 |
+
else
|
| 33 |
+
echo " UNEXPECTED: old URL returned HTTP ${HTTP_STATUS} (expected 404)"
|
| 34 |
+
fi
|
| 35 |
+
|
| 36 |
+
# --- Test 2: new .tar.zst URL must resolve (not 404) ---
|
| 37 |
+
echo ""
|
| 38 |
+
echo "TEST 2: New .tar.zst URL resolves"
|
| 39 |
+
HTTP_STATUS=$(curl -o /dev/null -s -w "%{http_code}" \
|
| 40 |
+
--max-time 15 --location \
|
| 41 |
+
"${OLLAMA_URL}")
|
| 42 |
+
if [ "${HTTP_STATUS}" = "200" ]; then
|
| 43 |
+
echo " PASS: ${OLLAMA_URL}"
|
| 44 |
+
echo " → HTTP ${HTTP_STATUS}"
|
| 45 |
+
else
|
| 46 |
+
echo " FAIL: ${OLLAMA_URL}"
|
| 47 |
+
echo " → HTTP ${HTTP_STATUS} (expected 200)"
|
| 48 |
+
exit 1
|
| 49 |
+
fi
|
| 50 |
+
|
| 51 |
+
# --- Test 3: download the archive ---
|
| 52 |
+
echo ""
|
| 53 |
+
echo "TEST 3: Downloading archive (this may take a while)..."
|
| 54 |
+
curl -fSL --retry 3 --retry-delay 5 --max-time 600 \
|
| 55 |
+
"${OLLAMA_URL}" -o "${ARCHIVE}"
|
| 56 |
+
ARCHIVE_SIZE=$(stat -c%s "${ARCHIVE}")
|
| 57 |
+
echo " PASS: Downloaded ${ARCHIVE_SIZE} bytes"
|
| 58 |
+
if [ "${ARCHIVE_SIZE}" -lt 1000000 ]; then
|
| 59 |
+
echo " FAIL: Archive too small — expected >1MB"
|
| 60 |
+
exit 1
|
| 61 |
+
fi
|
| 62 |
+
|
| 63 |
+
# --- Test 4: extract with zstd ---
|
| 64 |
+
echo ""
|
| 65 |
+
echo "TEST 4: Extracting .tar.zst with zstd..."
|
| 66 |
+
mkdir -p "${EXTRACT_DIR}"
|
| 67 |
+
tar -I zstd -xf "${ARCHIVE}" -C "${EXTRACT_DIR}"
|
| 68 |
+
echo " PASS: Extraction succeeded"
|
| 69 |
+
|
| 70 |
+
# --- Test 5: binary exists at expected path ---
|
| 71 |
+
echo ""
|
| 72 |
+
echo "TEST 5: Binary exists at bin/ollama after extraction"
|
| 73 |
+
BINARY="${EXTRACT_DIR}/bin/ollama"
|
| 74 |
+
if [ ! -f "${BINARY}" ]; then
|
| 75 |
+
echo " FAIL: ${BINARY} not found after extraction"
|
| 76 |
+
echo " Files extracted:"
|
| 77 |
+
find "${EXTRACT_DIR}" -type f | head -20
|
| 78 |
+
exit 1
|
| 79 |
+
fi
|
| 80 |
+
echo " PASS: ${BINARY} exists"
|
| 81 |
+
|
| 82 |
+
# --- Test 6: binary is ELF ---
|
| 83 |
+
echo ""
|
| 84 |
+
echo "TEST 6: Binary is an ELF executable"
|
| 85 |
+
FILE_OUTPUT=$(file "${BINARY}")
|
| 86 |
+
echo " file output: ${FILE_OUTPUT}"
|
| 87 |
+
if echo "${FILE_OUTPUT}" | grep -q "ELF"; then
|
| 88 |
+
echo " PASS: ELF confirmed"
|
| 89 |
+
else
|
| 90 |
+
echo " FAIL: Not an ELF binary"
|
| 91 |
+
exit 1
|
| 92 |
+
fi
|
| 93 |
+
|
| 94 |
+
# --- Test 7: binary size sanity check ---
|
| 95 |
+
echo ""
|
| 96 |
+
echo "TEST 7: Binary size > 1MB"
|
| 97 |
+
BINARY_SIZE=$(stat -c%s "${BINARY}")
|
| 98 |
+
echo " Size: ${BINARY_SIZE} bytes"
|
| 99 |
+
if [ "${BINARY_SIZE}" -gt 1000000 ]; then
|
| 100 |
+
echo " PASS: ${BINARY_SIZE} bytes (> 1MB)"
|
| 101 |
+
else
|
| 102 |
+
echo " FAIL: Binary too small (${BINARY_SIZE} bytes)"
|
| 103 |
+
exit 1
|
| 104 |
+
fi
|
| 105 |
+
|
| 106 |
+
echo ""
|
| 107 |
+
echo "========================================================"
|
| 108 |
+
echo " ALL TESTS PASSED - fix is verified"
|
| 109 |
+
echo "========================================================"
|