binárka / linux (pull_request) Successful in 10s
image / image (pull_request) Successful in 14s
testy / pytest (3.11) (pull_request) Successful in 2s
testy / pytest (3.12) (pull_request) Successful in 1s
testy / pytest (3.13) (pull_request) Successful in 0s
testy / pytest (3.14) (pull_request) Successful in 1s
Krok padl na `test -f /tmp/zkouska/dice-counter/dice.db`. Runner si /tmp mezi běhy drží, takže tam po dřívějších stavbách zůstalo /tmp/zkouska/kostky/dice.db — a binárka po něm nově sáhne, dokud nová databáze neexistuje. Zkouška tedy hledala soubor, který se schválně nezaložil. Chová se to správně, jen se to nedá zkoušet na adresáři, do kterého si sype každý běh. Nově dostane každý svůj vlastní přes mktemp a po sobě ho uklidí. Reprodukováno lokálně: se zbytkem po staru krok padne, s vlastním adresářem projde.
133 lines
5.2 KiB
YAML
133 lines
5.2 KiB
YAML
# Postaví binárku a pověsí ji na release.
|
|
#
|
|
# Runner běží v host módu, takže tu není kontejner ani hotové akce
|
|
# z marketplace — nic se nespoléhá na to, co má hostitel nainstalováno.
|
|
# O starou glibc se stará build.sh přes samostatný CPython od uv.
|
|
name: binárka
|
|
|
|
on:
|
|
push:
|
|
tags: ["v*"]
|
|
pull_request:
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
linux:
|
|
runs-on: homelab
|
|
|
|
steps:
|
|
- name: objdump
|
|
run: |
|
|
# Jediné, co musí být na hostiteli — PyInstaller jím hledá, na
|
|
# kterých knihovnách binárka visí. Zbytek si obstará uv.
|
|
command -v objdump >/dev/null && exit 0
|
|
sudo=""; [ "$(id -u)" -ne 0 ] && sudo=sudo
|
|
if command -v apt-get >/dev/null; then
|
|
$sudo apt-get update -qq
|
|
$sudo apt-get install -y -qq binutils
|
|
elif command -v dnf >/dev/null; then
|
|
$sudo dnf install -y -q binutils
|
|
else
|
|
echo "Nainstaluj binutils, PyInstaller bez objdumpu nestaví." >&2
|
|
exit 1
|
|
fi
|
|
|
|
- name: Zdrojáky
|
|
env:
|
|
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
run: |
|
|
git init -q .
|
|
git remote remove origin 2>/dev/null || true
|
|
git remote add origin "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git"
|
|
git config http.extraheader "Authorization: token ${TOKEN}"
|
|
git fetch -q --depth 1 origin "${GITHUB_REF}"
|
|
git config --unset http.extraheader
|
|
git checkout -qf FETCH_HEAD
|
|
git clean -qfd
|
|
|
|
- name: uv
|
|
run: |
|
|
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
|
export PATH="$HOME/.local/bin:$PATH"
|
|
command -v uv >/dev/null || curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
uv --version
|
|
|
|
- name: Testy
|
|
run: uv run --with-requirements requirements-dev.txt --no-project pytest -q
|
|
|
|
- name: Binárka
|
|
run: |
|
|
# Runner klonuje jeden commit bez značek, takže si git describe
|
|
# nemá o co opřít — na tagu mu verzi řekneme rovnou.
|
|
if [ "$GITHUB_REF_TYPE" = tag ]; then
|
|
export VERSION="$GITHUB_REF_NAME"
|
|
fi
|
|
./build.sh
|
|
|
|
- name: Zkouška
|
|
run: |
|
|
# Vlastní adresář pro každý běh. Runner si /tmp mezi běhy drží
|
|
# a binárka umí sáhnout po databázi ve starém umístění, takže
|
|
# zbytek po dřívější zkoušce by tuhle poslal vedle.
|
|
XDG=$(mktemp -d)
|
|
|
|
XDG_DATA_HOME="$XDG" DICE_PORT=8321 DICE_HOST=127.0.0.1 \
|
|
./dist/dice-counter > /tmp/server.log 2>&1 &
|
|
server=$!
|
|
trap 'kill $server 2>/dev/null || true; rm -rf "$XDG"' EXIT
|
|
|
|
for _ in $(seq 30); do
|
|
curl -sf -o /dev/null http://127.0.0.1:8321/ && break
|
|
sleep 1
|
|
done
|
|
|
|
curl -sf -o /dev/null http://127.0.0.1:8321/
|
|
curl -sf -o /dev/null http://127.0.0.1:8321/static/style.css
|
|
curl -sf -o /dev/null http://127.0.0.1:8321/board
|
|
test -f "$XDG/dice-counter/dice.db"
|
|
./dist/dice-counter --version
|
|
cat /tmp/server.log
|
|
|
|
- name: Na release
|
|
if: startsWith(github.ref, 'refs/tags/')
|
|
env:
|
|
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
ASSET: dice-counter-linux-x86_64
|
|
# Instalátory z dřívějška si chodí pro staré jméno. Až budou
|
|
# přemigrované, přestane se pod ním věšet.
|
|
STARY_ASSET: kostky-linux-x86_64
|
|
run: |
|
|
api="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}"
|
|
auth="Authorization: token ${TOKEN}"
|
|
|
|
# Release u tagu být může, ale nemusí — dá se založit i ručně.
|
|
id=$(curl -s -H "$auth" "$api/releases/tags/${GITHUB_REF_NAME}" \
|
|
| python3 -c 'import json,sys; print(json.load(sys.stdin).get("id",""))' || true)
|
|
|
|
if [ -z "$id" ]; then
|
|
id=$(curl -sf -X POST -H "$auth" -H "Content-Type: application/json" \
|
|
-d "{\"tag_name\":\"${GITHUB_REF_NAME}\",\"name\":\"${GITHUB_REF_NAME}\"}" \
|
|
"$api/releases" \
|
|
| python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])')
|
|
fi
|
|
|
|
# Součet se počítá nad jménem, pod kterým se soubor stahuje, aby
|
|
# šel ověřit rovnou: sha256sum -c dice-counter-linux-x86_64.sha256
|
|
for jmeno in "$ASSET" "$STARY_ASSET"; do
|
|
cp dist/dice-counter "$jmeno"
|
|
sha256sum "$jmeno" | tee "$jmeno.sha256"
|
|
done
|
|
|
|
for file in "$ASSET" "$ASSET.sha256" "$STARY_ASSET" "$STARY_ASSET.sha256"; do
|
|
# Aby se dal build zopakovat, stará příloha stejného jména jde pryč.
|
|
curl -s -H "$auth" "$api/releases/$id/assets" \
|
|
| python3 -c 'import json,sys; [print(a["id"]) for a in json.load(sys.stdin) if a["name"] == sys.argv[1]]' "$file" \
|
|
| while read -r old; do
|
|
curl -sf -X DELETE -H "$auth" "$api/releases/$id/assets/$old"
|
|
done
|
|
|
|
curl -sf -o /dev/null -X POST -H "$auth" -F "attachment=@$file" \
|
|
"$api/releases/$id/assets?name=$file"
|
|
echo "$file pověšen na ${GITHUB_REF_NAME}"
|
|
done
|