🧹

GitLabのself-manegedでディスク容量を圧迫する原因を解決する

2022/12/17に公開

はじめに

GitLabでGlaphQL対応していることがあまり記事がなく
Self-managedのGitLabのみ対応な機能となっていたので、残したいと思っていました。

ディスク容量を圧迫する要素

リポジトリが肥大化し、逃がす場合はgitコマンドでの対応があります。
Issue本体についてはCSVでの出力があります。
やり取りが活発なGitLabプロジェクトでは、知らず知らず増えていくものがあります。

Issuesにアップロードされたファイルの対応

画像に、PDF、パワーポイントの資料など
gitに入れにくいものがIssueに追加されます。
これが、GitLab15.3以上でGitLab上からやっと対応が可能になりました。
GraphQLで、です。

OpenAPIでは対応していないものがGraphQLにある

いろんなものを消せる。しかし慣れていない。

https://docs.gitlab.com/ee/api/graphql/getting_started.html

GraphQLを練習する

いきなり更新系から実行より取得、参照する系で練習することを強く勧めます。
GraphiQL Explorerを使いましょう。

https://<your-gitlab-site.com>/-/graphql-explorer

削除系はGUIからはまとめて消せないことがわかります。

なにを削除するかを確認する

アップロードしたファイルを確認する方法のひとつはGitLabプロジェクトのexportです。
exportしたGitLabプロジェクトの圧縮ファイルに、アップロードされたファイルが
uploadsフォルダに見つけられます。

削除するファイルのリストを作成

deleteFiles.csv
[secret],[filename]
例)xxxxxxxxxxxx,消すファイル.png

実行する前に

いきなり削除対象で実行するのでなく

  • 確認用のGitLabプロジェクト作成
  • Issueを登録
  • 画像などをアップする
  • Issueの中の画像のパスを元に用意して準備
    これをやってから実行することをお勧めします。

まとめて実行するスクリプト

ACCESS_TOKENは下記を参照して取得します。

https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token

pythonで作成しました。

[server-domain]、[groupName]、[projectName]は適宜書き換えて確認してください。

サーバへのアクセスは1秒と待機させています。利用する環境によって待機時間は調整してください。

test.py
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でのみの機能とあるので利用する方は少ないかもしれません。
サーバを直接覗くことなく作業ができる方法ができたのは良かったです。

参照

https://docs.gitlab.com/ee/api/graphql/reference/

https://docs.gitlab.com/ee/api/graphql/reference/#mutationuploaddelete

https://docs.gitlab.com/ee/api/graphql/index.html#graphiql

https://docs.gitlab.com/ee/api/graphql/getting_started.html

https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token

Discussion