Giteaを自動アップデートしたい

3 min read

こんにてゃ、無能です。
今日も今日とてタイポしましたがこのままいきます。

基本的に、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で更に絞り込みたいのだが、jsonkey:value見ていると出来なさそうなのでひたすらこのあとに目的のバイナリを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

これを、rootのcrontabに入れておけば定期スクリプトとして実行されるだろう。
そもそも、chmodで失敗すればexit 2して抜けるのでまあ変な挙動になることも無さそうである。

なんやかんやGiteaがリッチすぎると言いながら、使ってしまっているという至らなさが自分で感じる。

PGP --- Contact --- Machines