118 lines
4.8 KiB
Bash
118 lines
4.8 KiB
Bash
#!/usr/bin/env bash
|
|
# 真实下载与共享缓存验收;准备完成后由调用方关闭本 Job 的外网再跑通用开发验收。
|
|
set -euo pipefail
|
|
cd /work
|
|
export SHELL=/bin/bash
|
|
for certificate in root.pem server.pem server-key.pem; do
|
|
test -f "/work/tls/$certificate" || { echo "Missing TLS fixture: $certificate" >&2; exit 1; }
|
|
done
|
|
for tool in rustc cargo rustup gcc cc ld; do
|
|
if command -v "$tool"; then
|
|
echo "unexpected preinstalled compiler: $tool" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
python3 /work/server.py > server.log 2>&1 &
|
|
server=$!
|
|
finish() {
|
|
local code=$?
|
|
if (( code )); then
|
|
echo "ONLINE_VALIDATION_FAILED: $code" >&2
|
|
for log in retry.log first-run.err first-test.err wait.log http/server-False.log http/server-True.log server.log; do
|
|
if [[ -f $log ]]; then printf '\n%s\n' "$log"; tail -n 20 "$log"; fi
|
|
done
|
|
fi
|
|
kill "$server"
|
|
wait "$server" || true
|
|
}
|
|
trap finish EXIT
|
|
python3 - <<'PY'
|
|
import socket
|
|
import time
|
|
for attempt in range(100):
|
|
try:
|
|
with socket.create_connection(('127.0.0.1', 18080), timeout=1):
|
|
break
|
|
except ConnectionRefusedError:
|
|
time.sleep(0.1)
|
|
else:
|
|
raise RuntimeError('local release server did not start')
|
|
PY
|
|
url=http://127.0.0.1:18080
|
|
prefix='/work/install/dever tools'
|
|
export RUSTUP_DIST_SERVER=$url
|
|
touch /work/reject-environment
|
|
curl -fsSL "$url/install" | timeout 30 bash -s -- --prefix "$prefix" --release-url "$url" > install.log 2>&1
|
|
cat install.log
|
|
if grep -Ei 'rustc|cargo|private Rust' install.log; then exit 1; fi
|
|
test "$("$prefix/bin/dever" --version)" = 'dever 0.0.1'
|
|
"$prefix/bin/dever" new editing
|
|
"$prefix/bin/dever" check editing
|
|
"$prefix/bin/dever" fmt editing --check
|
|
test ! -e "$prefix/versions/0.0.1/toolchain/ready"
|
|
# 安装已返回且编辑命令可用;首次编译须报告真实下载失败,不能假成功。
|
|
if "$prefix/bin/dever" build editing --output /work/rejected-app > failed-build.log 2>&1; then
|
|
echo 'build unexpectedly succeeded without an environment' >&2
|
|
exit 1
|
|
fi
|
|
grep -F 'Dever environment preparation failed' failed-build.log
|
|
grep -F '404' "$prefix/versions/0.0.1/toolchain/prepare.log"
|
|
test ! -e /work/rejected-app
|
|
rm /work/reject-environment
|
|
touch /work/hold-environment
|
|
# 用真实归档前缀模拟上次断线已下载的内容,服务端记录并验证 Range 恢复。
|
|
native=$(basename /work/assets/dever-native-*.tar.xz)
|
|
head -c 65536 "/work/assets/$native" > "$prefix/cache/downloads/$native.part"
|
|
curl -fsSL "$url/install" | timeout 30 bash -s -- --prefix "$prefix" --release-url "$url" > retry.log 2>&1
|
|
"$prefix/bin/dever" run editing -- hello.greeting.greet '{"name":"background"}' > first-run.log 2> first-run.err &
|
|
running=$!
|
|
"$prefix/bin/dever" test editing > first-test.log 2> first-test.err &
|
|
testing=$!
|
|
bash assets/install --prefix "$prefix" --release-url "$url" --wait > wait.log 2>&1 &
|
|
waiting=$!
|
|
for attempt in {1..100}; do
|
|
if [[ -f /work/parallel-downloads ]]; then break; fi
|
|
sleep 0.1
|
|
done
|
|
test -f /work/parallel-downloads
|
|
kill -0 "$running" "$testing" "$waiting"
|
|
test ! -e "$prefix/versions/0.0.1/toolchain/ready"
|
|
if flock -n "$prefix/.prepare.lock" true; then
|
|
echo 'preparation lock was not held' >&2
|
|
exit 1
|
|
fi
|
|
echo BACKGROUND_EDITING_AND_PARALLEL_DOWNLOAD_PASS
|
|
rm /work/hold-environment
|
|
wait "$running"
|
|
wait "$testing"
|
|
wait "$waiting"
|
|
cat first-run.log first-run.err first-test.log
|
|
grep -F '"data":"Hello, background"' first-run.log
|
|
test "$(cat /work/resumed-offset)" = 65536
|
|
test -f "$prefix/versions/0.0.1/toolchain/ready"
|
|
if grep -Ei 'rustc|cargo|rust-std' first-run.err first-test.err wait.log; then exit 1; fi
|
|
echo RESUME_AND_CONCURRENT_BUILD_PASS
|
|
test "$(grep -c 'dever.*env' "$HOME/.bashrc")" -eq 1
|
|
first=$(find "$prefix/toolchains" -type f -printf '%P %s %T@\n' | sort | sha256sum)
|
|
curl -fsSL "$url/install" | bash -s -- --prefix "$prefix" --release-url "$url" --wait
|
|
second=$(find "$prefix/toolchains" -type f -printf '%P %s %T@\n' | sort | sha256sum)
|
|
test "$first" = "$second"
|
|
test "$(grep -c 'dever.*env' "$HOME/.bashrc")" -eq 1
|
|
# 校验失败不能切换现有命令,下载错误不得伪报成功。
|
|
active=$(readlink "$prefix/bin/dever")
|
|
cp assets/dever-0.0.1-linux-x86_64.tar.xz assets/dever-0.0.2-linux-x86_64.tar.xz
|
|
printf '%064d dever-0.0.2-linux-x86_64.tar.xz\n' 0 > assets/dever-0.0.2-linux-x86_64.tar.xz.sha256
|
|
if bash assets/install --prefix "$prefix" --release-url "$url" --version 0.0.2 > rejected.log 2>&1; then
|
|
echo 'corrupt release unexpectedly installed' >&2
|
|
exit 1
|
|
fi
|
|
grep -F FAILED rejected.log
|
|
test "$(readlink "$prefix/bin/dever")" = "$active"
|
|
test ! -e "$prefix/versions/0.0.2"
|
|
test -z "$(find "$prefix" -maxdepth 1 -name '.install.*' -type d -print)"
|
|
du -sk "$prefix" "$prefix/cache/cargo" "$prefix/toolchains"
|
|
echo ONLINE_INSTALL_PASS
|
|
touch /work/online-ready
|
|
while [ ! -f /work/offline-start ]; do sleep 1; done
|
|
bash /work/check.sh --installed "$prefix"
|