Автоматическое обновление Gitea
Привет, я бездарь.
Сегодня, как и вчера, я сделал опечатку, но оставлю как есть.
В основном, я не хочу особо возиться с Git-сервером и не хочу думать об операционных аспектах, поэтому я хочу, чтобы он обновлялся автоматически.
Более того, это одновременно и хорошая, и плохая сторона Gitea: Gitea представляет собой единый бинарный файл, который упрощает как фронтенд, так и бэкенд.
Поэтому достаточно просто получить бинарный файл.
Как стабильно сохранять бинарный файл
Итак, я хочу стабильно сохранять бинарный файл, и, похоже, его можно получить из Releases. Releases · go-gitea/gitea · GitHub
То есть, похоже, достаточно просто получить URL для сохранения отсюда.
Попробуем вызвать API
URL для скачивания можно получить следующим образом.
curl https://api.github.com/repos/go-gitea/gitea/releases/latest | jq -r '.assets[].browser_download_url'
В идеале, я бы хотел отфильтровать это дальше с помощью jq, но, глядя на key:value в json, это кажется невозможным, поэтому, похоже, остается только использовать grep для поиска нужного бинарного файла после этого. *1
*1 После того, как hymkor (HAYAMA_Kaoru) · GitHub сказал, что это не так, я вспомнил, как недавно использовал jq на работе, и смог извлечь только нужный объект следующим образом.
curl https://api.github.com/repos/go-gitea/gitea/releases/latest | jq -r '.assets[] | select(.name | match("linux-amd64$")) | .browser_download_url '
или
curl https://api.github.com/repos/go-gitea/gitea/releases/latest | jq -r '.assets[] | select(.browser_download_url | match("linux-amd64$")) | .browser_download_url '
Итак, я ошибся, сказав, что это невозможно (техеперо).
Остальное считайте моей болтовней.
Итак, я сделал так.
$ curl https://api.github.com/repos/go-gitea/gitea/releases/latest | jq -r '.assets[].browser_download_url' | grep linux-amd64$
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 171k 0 171k 0 0 291k 0 --:--:-- --:--:-- --:--:-- 291k
https://github.com/go-gitea/gitea/releases/download/v1.23.4/gitea-1.23.4-linux-amd64
Различия с текущей версией
Размещение нового бинарного файла каждый раз будет тратить трафик, поэтому необходимо определить это здесь.
Самый простой способ — проверить текущую версию Gitea и использовать grep -qi.
$ gitea -v | awk '{printf $3}'
1.22.4
Сохраним это в переменной.
Готово
Итак, получилось вот так.
#!/bin/bash
# give me root
BINARY_URL=$(curl https://api.github.com/repos/go-gitea/gitea/releases/latest |\
jq -r '.assets[].browser_download_url' |\
grep linux-amd64$ )
NOW_GITEA_V=$(gitea -v | awk '{printf $3}')
DAEMON_RESTART="service gitea restart"
if ! echo $BINARY_URL | grep -qi $NOW_GITEA_V ; then
wget -O gitea $BINARY_URL
chmod +x gitea || exit 2
mv gitea /usr/local/bin/gitea
$DAEMON_RESTART
else
exit 0
fi
Если поместить это в crontab пользователя root, оно будет выполняться как регулярный скрипт.
В любом случае, если chmod завершится неудачей, скрипт выйдет с exit 2, так что странного поведения быть не должно.
Я чувствую свою несостоятельность, говоря, что Gitea слишком богата функциями, но все равно использую ее.