GitLabのself-manegedでディスク容量を圧迫する原因を解決する
はじめに
GitLabでGlaphQL対応していることがあまり記事がなく
Self-managedのGitLabのみ対応な機能となっていたので、残したいと思っていました。
ディスク容量を圧迫する要素
リポジトリが肥大化し、逃がす場合はgitコマンドでの対応があります。
Issue本体についてはCSVでの出力があります。
やり取りが活発なGitLabプロジェクトでは、知らず知らず増えていくものがあります。
Issuesにアップロードされたファイルの対応
画像に、PDF、パワーポイントの資料など
gitに入れにくいものがIssueに追加されます。
これが、GitLab15.3以上でGitLab上からやっと対応が可能になりました。
GraphQLで、です。
OpenAPIでは対応していないものがGraphQLにある
いろんなものを消せる。しかし慣れていない。
GraphQLを練習する
いきなり更新系から実行より取得、参照する系で練習することを強く勧めます。
GraphiQL Explorerを使いましょう。
https://<your-gitlab-site.com>/-/graphql-explorer
削除系はGUIからはまとめて消せないことがわかります。
なにを削除するかを確認する
アップロードしたファイルを確認する方法のひとつはGitLabプロジェクトのexportです。
exportしたGitLabプロジェクトの圧縮ファイルに、アップロードされたファイルが
uploadsフォルダに見つけられます。
削除するファイルのリストを作成
[secret],[filename]
例)xxxxxxxxxxxx,消すファイル.png
実行する前に
いきなり削除対象で実行するのでなく
- 確認用のGitLabプロジェクト作成
- Issueを登録
- 画像などをアップする
- Issueの中の画像のパスを元に用意して準備
これをやってから実行することをお勧めします。
まとめて実行するスクリプト
ACCESS_TOKENは下記を参照して取得します。
pythonで作成しました。
[server-domain]、[groupName]、[projectName]は適宜書き換えて確認してください。
サーバへのアクセスは1秒と待機させています。利用する環境によって待機時間は調整してください。
import requests
import csv
import time
GITLAB_PROJECTS_URL = 'https:[server-domain]/api/graphql'
ACCESS_TOKEN = '[ACCESS_TOKEN]'
def main():
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {ACCESS_TOKEN}'
}
with open ( 'data/deleteFiles.csv' , 'r' ) as f :
reader = csv.reader( f )
for line in reader :
if line is None:
continue
body = """
mutation {
uploadDelete(
input: {
filename: "%s", projectPath: "[groupName]/[projectName]", secret: "%s"
}) {
upload {
id path size
}
}
}
""" % (line[1],line[0])
time.sleep(1)
# リクエスト
res = requests.post(GITLAB_PROJECTS_URL, json={"query": body},headers=headers)
print(res.status_code)
print(res.json())
if __name__== '__main__':
main()
さいごに
削除系の作業は慎重に。
GitLabのself-managedでのみの機能とあるので利用する方は少ないかもしれません。
サーバを直接覗くことなく作業ができる方法ができたのは良かったです。
参照
Discussion