- はじめに
- SSH 鍵ペアの作成
- GitLab CI への秘密鍵の登録
- GitHub への公開鍵の登録
- .gitlab-ci.yml へ SSH 認証コマンドを追加
- ユーザ操作によるミラーリング
- GitLab CI Job にて SSH 認証の確認
- おわりに
はじめに
さて、前回まででミラーリングの設定が完了しました。
ここからは、SSH の設定に入っていきます。外部の Private Repository に依存している場合には、SSH 認証によってクローンするしか術がないからです。
GitLab CI はそんなこともあろうかと言わんばかりに、WEBシステムから環境変数を設定できるような仕様になっています。(さもないと、.gitlab-ci.yml
に秘密鍵を直書きしなければならなくなり、いくらPrivateリポジトリとは言え、さすがにそれは品位を欠くわけでして汗。)
てなわけで、その辺の設定方法を含めて、ノウハウを共有します。
今回は、GitLab CI 側から、GitHub の Private Repository をクローンするという構成を取ります。
よって、GitLab CI に秘密鍵を、GitHub の Private Repository に公開鍵を渡すように設定を行っていきます。
SSH 鍵ペアの作成
まずは、秘密鍵と公開鍵のペアを作成します。
GitLab の公式ドキュメントを参照します。
ローカルで以下のコマンドを実行します。当方ではRSAでの実績があります。
メアドはなくてもいけるみたいですが、公式に従って入れておきます。GitHubに登録しているメールアドレスを入力します。
パスフレーズは無しで。
$ ssh-keygen -o -t rsa -b 4096 -C "email@example.com" Generating public/private rsa key pair. Enter file in which to save the key (/home/karuma/.ssh/id_rsa): ← Enter Created directory '/home/yourname/.ssh'. Enter passphrase (empty for no passphrase): ← Enter Enter same passphrase again: ← Enter Your identification has been saved in /home/yourname/.ssh/id_rsa. Your public key has been saved in /home/yourname/.ssh/id_rsa.pub.
これで、以下のように鍵が生成されました。
- 秘密鍵:
~/.ssh/id_rsa
- 公開鍵:
~/.ssh/id_rsa.pub
GitLab CI への秘密鍵の登録
作成した秘密鍵を GitLab CI に登録します。
まず、秘密鍵をクリップボードに格納します。
xclip -sel clip < ~/.ssh/id_rsa
次に、GitLab CI の環境変数登録画面に遷移します。
「インポートした Private Repository」→「Settings」→「CI/CD」を選択し、「Variables」を展開します。
SSH 秘密鍵について、以下のように入力します。
- Type: Variable
- Key: SSH_PRIVATE_KEY
- Value: 先程クリップボードに入れた変数をペースト
-----BEGIN/END RSA PRIVATE KEY-----
から始まるもの。
- State: Protected を解除
- Maked: Masked を解除
次に、known hosts の情報を設定します。対象は GitHub です。
$ ssh-keyscan github.com # github.com:22 SSH-2.0-babeld-80573d3e github.com ssh-rsa ここに HOST KEY の文字列が入る # github.com:22 SSH-2.0-babeld-80573d3e # github.com:22 SSH-2.0-babeld-80573d3e
出力のうち、 # がついていない 2 行目のgithub.com ssh-rsa ここ文字列が入る
の部分を、以下のように GitHub の取りうるIP アドレス(192.30.252.*,192.30.253.*,192.30.254.*,192.30.255.*
)を挿入した形に置き換えます。
github.com,192.30.252.*,192.30.253.*,192.30.254.*,192.30.255.* ssh-rsa ここ文字列が入る
そして、下記のようにブラウザから入力します。
- Type: Variable
- Key: SSH_SERVER_HOSTKEYS
- Value:
github.com,192.30.252.*,192.30.253.*,192.30.254.*,192.30.255.* ssh-rsa ここに HOST KEY の文字列が入る
をペースト - State: Protected を解除
- Maked: Masked を解除
そして、「Save variables」をクリックし、環境変数を保存します。
実は、この変数は ROS の industrial_ci
を利用する際の環境変数に準拠しているので、同分野で GitLab CI を利用する人にとっては、この設定を踏襲する方が移行がスムーズになります。
GitHub への公開鍵の登録
続いて、GitHub 側に公開鍵を登録します。
まず、公開鍵をクリップボードに格納しておきます。
xclip -sel clip < ~/.ssh/id_rsa.pub
GitHub のページから、クローン対象の Private Repository を開きます。「Settings」→「Deploy keys」→「Add deploy key」を選択します。
「Title」に鍵の名称(例えば、SSH_PUBLIC_KEY_FOR_GITLAB_CI とか)を入力し、「Key」に先程コピーした公開鍵をペーストします。
「Add key」を押下し、鍵を登録します。
.gitlab-ci.yml へ SSH 認証コマンドを追加
まだ続きます。これまでに登録した SSH の設定を、CI 空間で有効にするために、.gitlab-ci.yml
の before_script:
に然るべきコマンドを追加します。
ここでは、.gitlab-ci.yml
の before_script
部分の、しかも SSH 認証で必要となる部分だけ抜粋して記載します。対象の依存 Repository をクローンする前に以下のコマンドを挿入すれば、SSH 認証は通るはずです。
before_script: - mkdir -p ~/.ssh - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa # 秘密鍵作成 - chmod 600 ~/.ssh/id_rsa # 秘密鍵の権限編集 - ssh-add ~/.ssh/id_rsa # SSH 登録 - echo "$SSH_SERVER_HOSTKEYS" > ~/.ssh/known_hosts # ホスト登録 - これ以降はプロジェクト次第
このコマンドを GitHub 側から追加しておきます。あとは、Push 後に GitLab CI が動くのを待つのみです。
ユーザ操作によるミラーリング
実は、GitHub 側で Push しても、GitLab 側で即それを検知してくれるわけではありません。
そう、ミラーリングのタイミングは、コールバックではなくポーリングなのです。長いと30分くらい待つこともあります。いやいや、いくら無料とは言え、CI デバッグをしている身としては、これはきついです涙。
というわけで、GitHub 側でプッシュした後に、ミラーリング先の GitLab からユーザ操作でミラーリングする方法を共有します。少々面倒ですが、ポーリングで時間を食うよりマシです。
「インポートした Repository」のページから、「Settings」→「Repository」を選択し、「Mirror a repository」を展開します。先程のミラーリングの設定画面です。
下の方にある「Mirrored repositories」で右側にある更新を彷彿とさせるロゴを有したミラーリングボタンを押下します。Last update の時間が更新されれば、手動ミラーリングの完了です!
GitLab CI Job にて SSH 認証の確認
以上の設定でちゃんと GitLab ⇔ GitHub 間で SSH 認証ができているか、確認してみましょう。
「インポートした Private Repository」→「CI/CD」を展開→「Piplelines」を選択→「Job ステータス」を選択、と操作します。ここでは既に成功している Job を選択するので、「passed」と表示されている部分を選択します。(実際にデバッグする時は failed を表示された赤いアイコンをクリックすることになるのですが笑。)
展開したページから「Pipeline 名」を選択します。当方のケースではたまたま「kinetic」という名前をつけていているので、これを選択します。
展開先のページで、最新の Job の実際の出力を確認できます。
このうち、冒頭の before_scripts
部分を見に行けば、SSH 認証時のメッセージが見られます。
ここで、下記のようなメッセージが表示されていれば、SSH 認証は成功しています。
Agent pid hoge Identity added: /dev/hoge/hoge (メールアドレス)
ここまでできて晴れて、依存する Private Repository を巻き込んだ上で、Private Repository の CI を通すことができるようになります。
長かったー汗。
おわりに
GitHub x Travis CI で Private Repository を CI しようとしたらお金がかかってしまう問題を、GitLab CI で解決する方法を記述しました。
きっと、同じような状況で困っているエンジニアがいるはず!
そんなエンジニアにとって、この記事が少しでもお役に立てることを願っています。
前回:② ミラーリング編