svnmanager とか使って svn リポジトリとか管理してたけど os の入れ替えとかなんだとかで 新しい php(8.0とか8.2とか)では動作しないので別の管理ツールを使おうとしてバックアップ体制を構築できずはまってしまう。
scm-manager が ui もそれなりに行けてるしインストールも簡単そうなので使ってはみたが、gitlab のようにまとめてバックアップする手段が提供されていないので自力でスクリプトを書くとかしなければならないが。
$ ls /var/lib/scm/repositories/
27TsGaLhaD 9lTsGaDSvA
こんな感じで「つけた名前とは違う名前のディレクトリ」に配置されてしまい、foo リポジトリって名前を付けたはずなのにバックアップが foo/back.gz とかにできない。
幸い REST API が提供されているので
import os
import requests
from requests.auth import HTTPBasicAuth
import subprocess
import json
url = "http://scm-server/scm/api/v2/repositories" # 取得したいJSONデータのURLに置き換える
username = "scmadmin"
password = "xxxxxxxx"
backup_directory_root = "/home/vagrant/backup"
backup_cmd='/usr/local/bin/svn-backup-dumps.py'
try:
response = requests.get(url, auth=HTTPBasicAuth(username, password))
# ステータスコードが200 (OK) であるか確認
if response.status_code == 200:
# JSONデータを辞書に変換
data = response.json()
repositories = data["_embedded"]["repositories"]
for repo in repositories:
repo_name = repo["name"]
repo_url = repo["_links"]["protocol"][0]["href"]
backup_directory = f"{backup_directory_root}/{repo_name}"
if not os.path.exists(backup_directory):
os.mkdir(backup_directory)
subprocess.run([backup_cmd, "-i", "-z", "-q", repo_url, backup_directory], shell=True)
print(f"{repo_name} {repo_url}");
else:
print(f"HTTPエラー {response.status_code}: リクエストに失敗しました")
except requests.exceptions.RequestException as e:
print(f"リクエストエラー: {e}")
こんな感じで ChatGPT に提案されたので使ってみたが、href は当然 http:// なので svn-backup-dumps.py の引数として使えない。
結局 https://qiita.com/okadabasso/items/20ea792ca82f0ba9bafb のように metadata.xml を解析する羽目になった。