リポジトリのミラーリングのトラブルシューティング

ミラーリングに失敗すると、プロジェクトのメンテナーにはのようなリンクが表示されます。Pull mirroring failed 1 hour ago.といったリンクがプロジェクトの詳細ページに表示されます。このリンクを選択すると、ミラーリング設定に直接移動し、GitLab はミラーリングされたリポジトリのエラーバッジを表示します。バッジの上にマウスカーソルを置くと、エラーの内容が表示されます:

Error message shown on hover

GitHub でエラーコード 2 の RST_STREAM を受信しました。

GitHub リポジトリへのミラーリング中にこのメッセージが表示された場合:

13:Received RST_STREAM with error code 2

このようなイシューが発生している可能性があります:

  1. GitHub の設定で、コミットで使用したメールアドレスを公開するプッシュをブロックしている可能性があります。この問題を解決するには
  2. リポジトリが GitHub のファイルサイズ制限である 100 MB を超えています。この問題を解決するには、GitHub で設定されているファイルサイズの上限を確認し、Git Large File Storageを使って大きなファイルを管理することを検討してください。

期限を超えました

GitLab をアップグレードすると、ユーザー名の表現方法が変更されるため、ミラーリングのユーザー名とパスワードを更新して、%40 文字が@に置き換えられるようにする必要があります。

サーバーが公開鍵認証しか許可していないため、接続がブロックされました。

GitLabとリモートリポジトリ間の接続がブロックされています。TCPチェックが成功した場合でも、GitLabからリモートサーバーへの経路にあるネットワークコンポーネントがブロックされていないかチェックする必要があります。

このエラーは、ファイアウォールが送信パケットに対してDeep SSH Inspection を実行した場合に発生する可能性があります。

ユーザー名を読み取れません: ターミナルプロンプトは無効です

GitLab CI/CD for external repositoriesを使って新しいプロジェクトを作成した後にこのエラーが表示された場合:

  • Bitbucket Cloudの場合:

     "2:fetch remote: "fatal: could not read Username for 'https://bitbucket.org':
     terminal prompts disabled\n": exit status 128."
    
  • Bitbucket Server (自己管理) の場合:

     "2:fetch remote: "fatal: could not read Username for 'https://lab.example.com':
     terminal prompts disabled\n": exit status 128.
    

ミラーリングしたリポジトリの URL にリポジトリオーナーが指定されているか確認してください:

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定] > [リポジトリ]を選択します。
  3. リポジトリをミラーリング]を展開します。
  4. リポジトリのオーナーが指定されていない場合は、この形式で URL を削除し、OWNERACCOUNTNAMEPATH_TO_REPOREPONAME をあなたの値に置き換えて、再度追加します:

    • Bitbucket Cloudの場合:

       https://OWNER@bitbucket.org/ACCOUNTNAME/REPONAME.git
      
    • Bitbucket Server (自己管理) の場合:

       https://OWNER@lab.example.com/PATH_TO_REPO/REPONAME.git
      

ミラーリングのためにクラウドまたは自己管理の Bitbucket リポジトリに接続する場合、文字列にはリポジトリオーナーが必要です。

プルミラーに LFS ファイルがありません

プルミラーリングで LFS ファイルが転送されない場合があります。このイシューは以下の場合に発生します:

  • SSH リポジトリ URL を使用している場合。回避策としては、代わりに HTTPS リポジトリ URL を使用します。SSH URL に対してこの問題を修正するイシューが存在します。
  • GitLab 14.0 以前を使用していて、ソースリポジトリが公開 Bitbucket URL です。GitLab 14.0.6 で修正されました。
  • オブジェクトストレージを使用して外部リポジトリをミラーリングしています。この問題を修正するイシューが存在します。

プルミラーリングがパイプラインをトリガーしない

パイプラインが実行されない理由は複数あります:

The repository is being updatedしかし、失敗も成功も目に見えません

まれに、メモリ不足(OoM)イベントによりSidekiqワーカーが刈り取られたために、Redis上のミラーリングスロットが枯渇することがあります。これが発生すると、ミラーリングジョブはすぐに開始し完了しますが、失敗も成功もしません。また、クリアログも残りません。この問題を確認するには

  1. Railsコンソールに入り、Redisのミラーリング容量を確認します:

    current = Gitlab::Redis::SharedState.with { |redis| redis.scard('MIRROR_PULL_CAPACITY') }.to_i
    maximum = Gitlab::CurrentSettings.mirror_max_capacity
    available = maximum - current
    
  2. ミラーリング容量が0 、または非常に少ない場合は、スタックしているジョブをすべて排出することができます:

    Gitlab::Redis::SharedState.with { |redis| redis.smembers('MIRROR_PULL_CAPACITY') }.each do |pid|
      Gitlab::Redis::SharedState.with { |redis| redis.srem('MIRROR_PULL_CAPACITY', pid) }
    end
    
  3. コマンドを実行した後、バックグラウンドジョブページには、特に手動でトリガーされた場合、スケジュールされている新しいミラーリングジョブが表示されるはずです。

無効なURL

SSH 経由でミラーリングを設定しているときにこのエラーが表示された場合は、 URL が有効な形式であることを確認してください。

ミラーリングは SSH クローン URL のショートバージョン (git@gitlab.com:gitlab-org/gitlab.git) をサポートしておらず、プロトコルを含むフルバージョン (ssh://git@gitlab.com/gitlab-org/gitlab.git) が必要です。

ホストとプロジェクトのパスが:ではなく/ で区切られていることを確認してください。

ホスト鍵の検証に失敗しました。

このエラーは、ターゲットホストの公開SSHキーが変更された場合に返されます。公開SSHキーが変更されることはほとんどありません。ホスト鍵の検証に失敗したが、その鍵がまだ有効だと思われる場合は、鍵の情報を更新してください。

前提条件:

  • 少なくともプロジェクトのメンテナーのロールを持っている必要があります。

イシューを解決するには

  1. ホスト・キーを確認します。
  2. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  3. 設定] > [リポジトリ]を選択します。
  4. リポジトリをミラーリング]を展開します。
  5. キーを更新するには

    • Detect host keysfor GitLab を選択してサーバーからホスト鍵を取得し、フィンガープリントを表示します。
    • Input host keys manuallyを選択し、SSHホストキーフィールドにホストキーを入力します。
  • リポジトリのミラー化を選択します。

Railsコンソールでミラーユーザーとトークンを単一のサービスアカウントに転送します。

これにはGitLab Rails コンソールへのアクセスが必要です。

使用例複数のユーザーがそれぞれの GitHub 認証情報を使ってリポジトリのミラーリングを設定している場合、退職するとミラーリングが壊れてしまいます。このスクリプトを使って、バラバラのミラーリングユーザーとトークンを単一のサービスアカウントにマイグレーションしましょう:

caution
データを変更するコマンドは、正しく実行しなかったり適切な条件下で実行しなかったりすると、ダメージを与える可能性があります。必ず最初にテスト環境でコマンドを実行し、リストアできるようにバックアップインスタンスを用意してください。
svc_user = User.find_by(username: 'ourServiceUser')
token = 'githubAccessToken'

Project.where(mirror: true).each do |project|
  import_url = project.import_url

  # The url we want is https://token@project/path.git
  repo_url = if import_url.include?('@')
               # Case 1: The url is something like https://23423432@project/path.git
               import_url.split('@').last
             elsif import_url.include?('//')
               # Case 2: The url is something like https://project/path.git
               import_url.split('//').last
             end

  next unless repo_url

  final_url = "https://#{token}@#{repo_url}"

  project.mirror_user = svc_user
  project.import_url = final_url
  project.username_only_import_url = final_url
  project.save
end