リポジトリ保存 Rakeタスク

GitLab が Git データを整理するために使う新しいハッシュストレージに、既存のプロジェクトとその添付ファイルをリストアップしてマイグレーションするための Rake タスク集です。

プロジェクトと添付ファイルをリストアップ

以下の Rake タスクは、レガシーおよびハッシュ化されたストレージで利用可能なプロジェクトと添付ファイルを一覧表示します。

レガシーストレージ

レガシーストレージを使用しているプロジェクトとその添付ファイルの概要と一覧を表示します:

  • Linux パッケージのインストール:

     # Projects
     sudo gitlab-rake gitlab:storage:legacy_projects
     sudo gitlab-rake gitlab:storage:list_legacy_projects
       
     # Attachments
     sudo gitlab-rake gitlab:storage:legacy_attachments
     sudo gitlab-rake gitlab:storage:list_legacy_attachments
    
  • セルフコンパイルによるインストール:

     # Projects
     sudo -u git -H bundle exec rake gitlab:storage:legacy_projects RAILS_ENV=production
     sudo -u git -H bundle exec rake gitlab:storage:list_legacy_projects RAILS_ENV=production
       
     # Attachments
     sudo -u git -H bundle exec rake gitlab:storage:legacy_attachments RAILS_ENV=production
     sudo -u git -H bundle exec rake gitlab:storage:list_legacy_attachments RAILS_ENV=production
    

ハッシュ化されたストレージ

ハッシュストレージを使用して、プロジェクトとその添付ファイルの概要と一覧を表示します:

  • Linux パッケージのインストール:

     # Projects
     sudo gitlab-rake gitlab:storage:hashed_projects
     sudo gitlab-rake gitlab:storage:list_hashed_projects
       
     # Attachments
     sudo gitlab-rake gitlab:storage:hashed_attachments
     sudo gitlab-rake gitlab:storage:list_hashed_attachments
    
  • セルフコンパイルによるインストール:

     # Projects
     sudo -u git -H bundle exec rake gitlab:storage:hashed_projects RAILS_ENV=production
     sudo -u git -H bundle exec rake gitlab:storage:list_hashed_projects RAILS_ENV=production
       
     # Attachments
     sudo -u git -H bundle exec rake gitlab:storage:hashed_attachments RAILS_ENV=production
     sudo -u git -H bundle exec rake gitlab:storage:list_hashed_attachments RAILS_ENV=production
    

ハッシュ化されたストレージへのマイグレーション

caution
GitLab 13.0ではハッシュストレージがデフォルトで有効になっており、レガシストレージは非推奨となっています。GitLab 14.0ではレガシーステレージのサポートが廃止されました。GitLab 13.0以降をお使いの場合、新しいプロジェクトをレガシーステレージに切り替えることはできません。管理エリアでハッシュストレージとレガシストレージを選択するオプションが無効になりました。

このタスクは、Rails/Sidekiqが設定されているマシン上で実行する必要があり、タスクは、既存のプロジェクトとそれに関連する添付ファイルをすべてハッシュドストレージタイプにマイグレーションするようスケジュールします:

  • Linux パッケージのインストール:

     sudo gitlab-rake gitlab:storage:migrate_to_hashed
    
  • セルフコンパイルによるインストール:

     sudo -u git -H bundle exec rake gitlab:storage:migrate_to_hashed RAILS_ENV=production
    

既存のインテグレーションがある場合、検証のために、まず小規模なロールアウトを行いたいと思うかもしれません。この場合、環境変数ID_FROMID_TO を使用して、オペレーションで ID 範囲を指定します。例えば、Linuxパッケージのインストールで、ロールアウトをプロジェクトID50から100に限定する場合です:

sudo gitlab-rake gitlab:storage:migrate_to_hashed ID_FROM=50 ID_TO=100

GitLab で進行状況を監視するには:

  1. 左のサイドバーで、Search を選択するか、次のページに進んでください。
  2. Admin Areaを選択します。
  3. 左サイドバーで、[監視] > [バックグラウンドジョブ]を選択します。
  4. hashed_storage:hashed_storage_project_migrate キューが終了するまでの時間を確認します。ゼロになった後、上記のコマンドを実行することで、すべてのプロジェクトがマイグレーションされたことを確認できます。

必要であれば、以前のマイグレーションスクリプトを再度実行して、不足しているプロジェクトをスケジュールすることができます。

エラーや警告はSidekiqのログファイルに記録されます。

Geoが有効な場合、マイグレーションに成功した各プロジェクトは、セカンダリノードに変更をレプリケートするイベントを生成します。

リポジトリのマイグレーションに必要なのはgitlab:storage:migrate_to_hashed Rake タスクだけですが、レガシーとハッシュ化ストレージの両方でプロジェクトと添付ファイルを検査するのに役立つ追加コマンドがあります。

ハッシュストレージからレガシストレージへのロールバック

caution
GitLab 13.0ではハッシュストレージがデフォルトで有効になっており、レガシストレージは非推奨となっています。GitLab 14.0ではレガシーステレージのサポートが廃止されました。GitLab 13.0以降をお使いの場合、新しいプロジェクトをレガシーステレージに切り替えることはできません。管理エリアでハッシュストレージとレガシストレージを選択するオプションが無効になりました。

このタスクは、すべての既存プロジェクトと関連する添付ファイルをレガシーステレージタイプにロールバックするようスケジュールします。

  • Linux パッケージのインストール:

     sudo gitlab-rake gitlab:storage:rollback_to_legacy
    
  • セルフコンパイルによるインストール:

     sudo -u git -H bundle exec rake gitlab:storage:rollback_to_legacy RAILS_ENV=production
    

既存のインテグレーションがある場合、検証のために最初に小さなロールバックを行いたい かもしれません。この場合、環境変数ID_FROMID_TO を使用して、オペレーションで ID 範囲を指定します。例えば、Linuxパッケージのインストールで、ロールアウトをプロジェクトID50から100に制限する場合です:

sudo gitlab-rake gitlab:storage:rollback_to_legacy ID_FROM=50 ID_TO=100

管理エリア > 監視 > バックグラウンドジョブページで進行状況を監視できます。キュー]タブで、hashed_storage:hashed_storage_project_rollback キューを監視して、処理が終了するまでの時間を確認できます。

キューがゼロになった後、上記のコマンドを実行することで、すべてのプロジェクトがロールバックされたことを確認できます。ロールバックされなかったプロジェクトがある場合は、このロールバックスクリプトを再度実行して、さらなるロールバックをスケジュールできます。エラーや警告はSidekiqのログファイルに記録されます。

Geoをセットアップしている場合、ロールバックはセカンダリノードには自動的に反映されません。バックフィルオペレーションが開始されるのを待ち、特別な@hashed/ フォルダから残りのリポジトリを手動で削除する必要があるかもしれません。

トラブルシューティング

Rakeタスクがハッシュ化されたストレージへのマイグレーションを完了できない可能性があります。インスタンスのチェックはレガシーデータがあることを報告し続けます:

* Found 1 projects using Legacy Storage
- janedoe/testproject (id: 1234)

サブスクリプションをお持ちの場合、ほとんどの修正はRailsコンソール上でコードを実行する比較的リスクの高いものなので、GitLabサポートにチケットを提出してください。

読み取り専用プロジェクト

プロジェクトを読み取り専用に設定している場合、マイグレーションに失敗することがあります。

  1. Railsコンソールを起動します。

  2. プロジェクトが読み取り専用かどうかを確認します:

    project = Project.find_by_full_path('janedoe/testproject')
    project.repository_read_only
    
  3. true を返したら(nilfalseではなく)、書き込み可能に設定します:

    project.update!(repository_read_only: false)
    
  4. マイグレーションRakeタスクを再実行します。

  5. プロジェクトを再び読み取り専用に設定します:

    project.update!(repository_read_only: true)
    

削除待ちのプロジェクト

管理エリアでプロジェクトの詳細を確認してください。プロジェクトの削除に失敗した場合、Marked For Deletion At ..Scheduled Deletion At ..pending removalと表示されますが、日付は最近のものではありません。

Railsコンソールを使ってプロジェクトを削除します:

  1. Railsコンソールを起動します。

  2. 以下のコードで、削除するプロジェクトとアクションを実行するアカウントを選択します:

    project = Project.find_by_full_path('janedoe/testproject')
    user = User.find_by_username('admin_handle')
    puts "\nproject selected for deletion is:\nID: #{project.id}\nPATH: #{project.full_path}\nNAME: #{project.name}\n\n"
    
    • janedoe/testproject を Rake の出力、または管理エリアからプロジェクトのパスに置き換えてください。
    • admin_handle をインスタンス管理者のハンドル、またはroot に置き換えてください。
    • 先に進む前に出力を確認してください。他のチェックは実行されません。
  3. プロジェクトを直ちに破棄してください:

    Projects::DestroyService.new(project, user).execute
    

プロジェクトを破棄すると、暗号化に関連するスタックトレースやエラーOpenSSL::Cipher::CipherError が発生する場合:

  1. GitLab シークレットを確認してください。

  2. 影響を受けるプロジェクトに復号化できないシークレットがある場合は、その特定のシークレットを削除する必要があります。シークレットの紛失に対処するための私たちのドキュメントは、すべてのシークレットが失われた場合のものですが、特定のプロジェクトが影響を受ける可能性はあります。例えば、特定のプロジェクトIDの特定のランナー登録トークンをリセットする場合などです:

    UPDATE projects SET runners_token = null, runners_token_encrypted = null where id = 1234;
    

Repository cannot be moved from Sidekiqログのエラー

Sidekiqログにエラーが表示され、プロジェクトのマイグレーションに失敗する場合があります:

# grep 'Repository cannot be moved' /var/log/gitlab/sidekiq/current
{"severity":"ERROR","time":"2021-02-29T02:29:02.021Z","message":"Repository cannot be moved from 'janedoe/testproject' to '@hashed<value>' (PROJECT_ID=1234)"}

これは、ハッシュ化ストレージマイグレーション用のオリジナルコードのバグが原因である可能性があります。

このイシューの影響を受けるプロジェクトには回避策があります。