プッシュミラーリング

GitLab 13.5で導入:HTTPSでのLFSをサポート。

プッシュミラーは、アップストリームリポジトリへのコミットをミラーするダウンストリームリポジトリです。プッシュミラーは、アップストリームリポジトリへのコミットのコピーを受動的に受け取ります。ミラーがアップストリームリポジトリから分岐するのを防ぐために、コミットをダウンストリームミラーに直接プッシュしないでください。代わりにアップストリームリポジトリにコミットをプッシュしてください。

プルミラーリングは定期的にアップストリームリポジトリから更新を取得しますが、プッシュミラーは以下の場合にのみ変更を受け取ります:

  • コミットがアップストリームの GitLab リポジトリにプッシュされたとき。
  • 管理者がミラーを強制更新します。

アップストリームリポジトリに変更をプッシュすると、プッシュミラーはそれを受け取ります:

  • 5分以内
  • 保護されたブランチのみミラーリングを有効にした場合は、1分以内。

ブランチがデフォルトブランチにマージされ、ソースプロジェクトで削除されると、次のプッシュ時にリモートミラーから削除されます。マージされていない変更のあるブランチは保持されます。ブランチが分岐すると、リポジトリのミラーセクションにエラーが表示されます。

GitLab サイレントモードはリモートミラーへのプッシュとリモートミラーからのプルを無効にします。

プッシュミラーの設定

既存のプロジェクトにプッシュミラーリングを設定するには:

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定] > [リポジトリ]を選択します。
  3. リポジトリをミラーリング]を展開します。
  4. リポジトリのURLを入力します。
  5. Mirror directionドロップダウンリストで、Push を選択します。
  6. 認証方法を選択します。詳細については、ミラーの認証方法を参照してください。
  7. 必要に応じて、保護されたブランチのみをミラーするを選択します。
  8. 必要であれば、分岐参照を保持するを選択してください。
  9. 設定を保存するには、リポジトリをミラーするを選択してください。

API によるプッシュミラーの設定

リモートミラー API を使ってプロジェクトのプッシュミラーを作成したり変更したりすることもできます。

分岐した参照を保持

GitLab 13.0から導入されました

デフォルトでは、リモート(ダウンストリーム)ミラーの参照(ブランチやタグ)がローカルリポジトリから分岐した場合、アップストリームリポジトリがリモート上の変更を上書きします:

  1. リポジトリはmaindevelop ブランチをリモートにミラーします。
  2. リモートミラーのdevelop に新しいコミットが追加されます。
  3. 次のプッシュでは、リモートミラーがアップストリームリポジトリと一致するように更新されます。
  4. リモートミラーのdevelop に追加された新しいコミットは失われます。

Keep divergent refsが選択されている場合、変更の扱いは異なります:

  1. リモートミラーのdevelop ブランチへの更新はスキップされます。
  2. リモートミラーのdevelop ブランチは、アップストリームリポジトリに存在しないコミットを保持します。リモートミラーには存在するがアップストリームには存在しない参照は、そのまま残されます。
  3. 更新は失敗とマークされます。

ミラーの作成後、Keep divergent refsの値を変更できるのはリモートミラー API のみです。

GitLab から GitHub へのプッシュミラーの設定

GitLabからGitHubへのミラーを設定します:

  1. GitHub のきめ細かな個人アクセストークンを作成し、少なくともリポジトリコンテンツの読み取りと書き込み権限を付与します。リポジトリに.github/workflows ディレクトリが含まれている場合は、ワークフローの読み取りと書き込みのアクセス権も付与する必要があります。よりきめ細かいアクセスを行うには、特定のリポジトリにのみ適用されるようにアクセストークンを設定します。
  2. Git リポジトリの URL をこの形式で入力し、必要に応じて変数を変更してください:

    https://USERNAME@github.com/GROUP/PROJECT.git
    
    • USERNAME:個人アクセストークンのオーナーのユーザー名。
    • GROUP:GitHub上のグループ。
    • PROJECT:GitHub上のプロジェクト。
  3. PasswordにはGitHubの個人アクセストークンを入力してください。
  4. リポジトリのミラー化を選択します。

ミラーされたリポジトリが一覧表示されます。例えば

https://*****:*****@github.com/<your_github_group>/<your_github_project>.git

リポジトリはその直後にプッシュします。強制的にプッシュするには、Update now({retry})を選択してください。

GitLab から AWS CodeCommit へのプッシュミラーの設定

AWS CodeCommitプッシュミラーリングは、GitLabリポジトリをAWS CodePipelineに接続する最良の方法です。GitLab はソースコード管理(SCM) プロバイダの一つとしてまだサポートされていません。それぞれの新しいAWS CodePipelineは、重要なAWSインフラストラクチャのセットアップを必要とします。また、ブランチごとに個別のパイプラインが必要です。

AWS CodeDeployがCodePipelineの最終ステップである場合、代わりにデプロイを作成するためにこれらのツールを組み合わせることができます:

  • GitLab CI/CD パイプライン。
  • AWS CLIは.gitlab-ci.yml 、CodeDeployにデプロイするための最後のジョブです。
note
GitLabのイシュー 34014が解決されるまで、GitLab-to-AWS-CodeCommit のプッシュミラーリングでは SSH 認証を使用できません。

GitLab から AWS CodeCommit へのミラーを設定するには:

  1. AWS IAMコンソールで、IAMユーザーを作成します。
  2. インラインポリシーとして、リポジトリミラーリングのための以下の最小権限権限を追加します。

    Amazon リソース名 (ARN) には、リージョンとアカウントを明示的に含める必要があります。この IAM ポリシーは、2 つのサンプルリポジトリへのミラーリングアクセスに権限を付与します。これらの権限は、ミラーリングに必要な最小(最小権限)であることがテストされています:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "MinimumGitLabPushMirroringPermissions",
                "Effect": "Allow",
                "Action": [
                    "codecommit:GitPull",
                    "codecommit:GitPush"
                ],
                "Resource": [
                  "arn:aws:codecommit:us-east-1:111111111111:MyDestinationRepo",
                  "arn:aws:codecommit:us-east-1:111111111111:MyDemo*"
                ]
            }
        ]
    }
    
  3. ユーザーを作成した後、AWS IAM ユーザー名を選択します。
  4. Security credentialsタブを選択します。
  5. HTTPS Git credentials for AWS CodeCommit] で、[Generate credentials] を選択します。

    note
    この Git ユーザー ID とパスワードは、CodeCommit と通信するためのものです。このユーザーの IAM ユーザー ID や AWS キーと混同しないでください。
  6. Git HTTPS専用のユーザーIDとパスワードをコピーまたはダウンロードしてください。
  7. AWS CodeCommitコンソールで、GitLabリポジトリからミラーする新しいリポジトリを作成します。
  8. 新しいリポジトリを開き、Clone URL > Clone HTTPS(Clone HTTPS(GRC) ではない) を選択します。
  9. GitLab で、プッシュミラーするリポジトリを開きます。
  10. Settings > Repository を選択し、Mirroring repositories を展開します。
  11. Git リポジトリの URLフィールドに次の形式で入力します:

    https://<your_aws_git_userid>@git-codecommit.<aws-region>.amazonaws.com/v1/repos/<your_codecommit_repo>
    

    <your_aws_git_userid> は、先ほど作成した IAM Git 認証情報の AWSspecial HTTPS Git ユーザー IDに置き換えてください。<your_codecommit_repo> を CodeCommit のリポジトリ名に置き換えてください。

  12. Mirror の方向は Push を選択します。
  13. Authentication methodは Passwordを選択します。Password]ボックスには、先ほどAWSで作成したIAM Git cloneユーザーID専用のパスワードを入力します。
  14. Only mirror protected branchesfor CodeCommitのオプションはそのままにしておきます。プッシュの頻度が高くなります(5分ごとから1分ごとへ)。

    CodePipeline では、AWS CI を設定したい名前のブランチに対して個別にパイプラインを設定する必要があります。動的な名前を持つフィーチャーブランチはサポートされていないため、ミラー保護されたブランチのみを設定しても、CodePipelineインテグレーションで柔軟性の問題は発生しません。また、CodePipelineを構築したい名前付きブランチをすべて保護する必要があります。

  15. リポジトリをミラーするを選択します。ミラーされたリポジトリが表示されるはずです:

    https://*****:*****@git-codecommit.<aws-region>.amazonaws.com/v1/repos/<your_codecommit_repo>
    

強制的にプッシュしてミラーリングをテストするには、今すぐ更新(半円の矢印)を選択します。Last successful updateに日付が表示されていれば、ミラーリングは正しく設定されています。正しく動作していない場合は、赤いerror タグが表示され、エラーメッセージがホバーテキストで表示されます。

2FAが有効になっている別のGitLabインスタンスにプッシュミラーを設定します。

  1. 移動先のGitLabインスタンスで、write_repository スコープを持つ個人アクセストークンを作成します。
  2. 送信元の GitLab インスタンスで:
    1. Git リポジトリの URL を次のフォーマットで入力します:https://oauth2@<destination host>/<your_gitlab_group_or_name>/<your_gitlab_project>.git.
    2. パスワードを入力します。インストール先の GitLab インスタンスで作成した GitLab パーソナルアクセストークンを使用します。
    3. リポジトリのミラー化を選択します。