GitLabの外部リポジトリへの同期機能を使ってクラウドのGitリポジトリと同期する

GitLab CE 10.8の新機能として、外部リポジトリへのプッシュ機能が無償版でも使えるようになりました

用途としては、GitLabのリポジトリのバックアップとしてパブリッククラウドのGitを使う、クラウド側のCIサービスとの中継点として使用する等が挙げられます。

GitLabの設定

プロジェクトの管理権限を持つユーザで、 SettingsRepository を開きます。

f:id:translucens:20200326012801p:plain
GitLab: Push to a remote repository

  • Remote mirror repository - チェックを入れる
  • Git repository URL - プッシュする先のリモートリポジトリのURLを入れる。認証情報は https://USERNAME:PASSWORD@git.example.com/remote.git(GitLab 11.1まで)、https://USERNAME@git.example.com/remote.git(GitLab 11.2以降)のように入力する。
  • (GitLab 11.2以降) Authentication MethodPassword を選択すると、パスワード入力欄が出るのでそこにパスワードを入力する。
  • Only protected branches - チェックを入れると保護されたブランチの更新時のみ同期する。masterブランチを保護し、個々のフィーチャーブランチは保護しない場合に使用すると、masterへのMerge Requestが承認された場合のみ同期されるような使い方ができる。またチェックを入れることでプッシュの頻度が5分に一度から毎分一度へ上がるらしい。

この状態でGitLabへgit pushすると、自動的にリモートへプッシュされるようになります。また、Update Nowボタンを押すと、強制的にプッシュすることができます。

Google Cloud Source Repositoriesの場合

Google Cloud BuildのトリガーはCloud Source Repositories, GitHub.com, Bitbucketのみ対応しています。GitLabからCloud Source Repositoriesへプッシュすれば、Google Cloud Buildのビルドを始めることができます。

以前はGit用のユーザ名・パスワードを取得できたようですが、現在はbash/zshスクリプトを実行してcookieを保存する手順が表示されます。実は表示されるシェルスクリプト内の文字列の一部がユーザ名・パスワードとして利用できることが分かりました。

  1. 新しいパスワードの生成を開く
  2. Googleアカウントでログイン
  3. Google Cloud Development が Google アカウントへのアクセスをリクエストしています」の画面が出るので許可
  4. Configure Git画面が表示される

f:id:translucens:20200326012808p:plain
Google: Configure Git

紫色のテキストボックスの8行目の最後にユーザ名とパスワードがgit-account.example.com=PasswordIsShownHereのように=でつながった形式で表示されます。 この例の場合、ユーザ名はgit-account.example.com、パスワードはPasswordIsShownHere です(実際のパスワードは数十桁の英数字記号)。

生成されたパスワードは記号を含む場合があるので、URLエンコードしておく必要があります。GitLabに設定するURLは下記のようになります。

https://git-account.example.com:URLEncodedPassword@source.developers.google.com/p/PROJECT-NAME/r/REPOSITORY-NAME

認証情報の無効化

パスワードを無効にするには、Revoke cookiesのリンクをクリックし、Google Cloud Developmentの「アクセス権を削除」ボタンをクリックします。

無効化した状態でリポジトリにアクセスしようとすると下記のような認証エラーが出ます。

Invalid authentication credentials.

Please generate a new identifier:
  https://source.developers.google.com/new-password

(参考)gcloudコマンド(現在は一時的なパスワードしか取れない)

GitLabのIssueには、下記のようにgcloudコマンドでパスワードを取得する方法が紹介されていますが、現在は発行されるパスワードは一時的に有効なもので、一時間で無効になるようです。

echo $'protocol=https\nhost=source.developers.google.com\n' | gcloud auth git-helper get

AWS CodeCommitの場合

IAMユーザに対してCodeCommit専用のユーザ名とパスワードを生成することができます。

  1. https://console.aws.amazon.com/iam/home?region=ap-southeast-1#/users/IAM-USERNAME?section=security_credentials を開く ※IAM-USERNAMEはユーザ名に置換
  2. HTTPS Git credentials for AWS CodeCommitという項目の中にある Generate ボタンを押すとユーザ名(IAM-USERNAME-at-123456789012のようにIAMユーザ名とAWSアカウント番号から生成される)とパスワードが生成される

なおユーザ名・パスワードは2組まで生成することができます。

GitLabに設定するURLは下記のようになります。

https://IAM-USERNAME-at-123456789012:GeneratedPassword@git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/REPOSITORY-NAME