MoriKen's Journal

MoriKen's Journal

アラサー社会人博士による徒然日記。技術についてつらつら。だけだとコンテンツが貧弱なので、会社公認で大学院博士課程に進学した経緯や、独学でTOEICを475→910にしたノウハウを共有します。

GitLab CI を使って GitHub の Private Repository を無料で CI ③SSH 編

Sponsored Link

はじめに

さて、前回まででミラーリングの設定が完了しました。

www.moriken254.com

ここからは、SSH の設定に入っていきます。外部の Private Repository に依存している場合には、SSH 認証によってクローンするしか術がないからです。

f:id:MoriKen254:20190601192608p:plain


GitLab CI はそんなこともあろうかと言わんばかりに、WEBシステムから環境変数を設定できるような仕様になっています。(さもないと、.gitlab-ci.ymlに秘密鍵を直書きしなければならなくなり、いくらPrivateリポジトリとは言え、さすがにそれは品位を欠くわけでして汗。)

てなわけで、その辺の設定方法を含めて、ノウハウを共有します。

今回は、GitLab CI 側から、GitHub の Private Repository をクローンするという構成を取ります。

よって、GitLab CI に秘密鍵を、GitHub の Private Repository に公開鍵を渡すように設定を行っていきます。

SSH 鍵ペアの作成

まずは、秘密鍵と公開鍵のペアを作成します。

f:id:MoriKen254:20190601225508p:plain


GitLab の公式ドキュメントを参照します。

docs.gitlab.com

ローカルで以下のコマンドを実行します。当方では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 に登録します。

f:id:MoriKen254:20190601232317p:plain


まず、秘密鍵をクリップボードに格納します。

 xclip -sel clip < ~/.ssh/id_rsa

次に、GitLab CI の環境変数登録画面に遷移します。

「インポートした Private Repository」→「Settings」→「CI/CD」を選択し、「Variables」を展開します。

f:id:MoriKen254:20190601193444p:plain


SSH 秘密鍵について、以下のように入力します。

  • Type: Variable
  • Key: SSH_PRIVATE_KEY
  • Value: 先程クリップボードに入れた変数をペースト
    • -----BEGIN/END RSA PRIVATE KEY----- から始まるもの。
  • State: Protected を解除
  • Maked: Masked を解除
f:id:MoriKen254:20190601193648p:plain


次に、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 を解除
f:id:MoriKen254:20190601212246p:plain


そして、「Save variables」をクリックし、環境変数を保存します。

実は、この変数は ROS の industrial_ci を利用する際の環境変数に準拠しているので、同分野で GitLab CI を利用する人にとっては、この設定を踏襲する方が移行がスムーズになります。

github.com

GitHub への公開鍵の登録

続いて、GitHub 側に公開鍵を登録します。

f:id:MoriKen254:20190601212838p:plain


まず、公開鍵をクリップボードに格納しておきます。

 xclip -sel clip < ~/.ssh/id_rsa.pub

GitHub のページから、クローン対象の Private Repository を開きます。「Settings」→「Deploy keys」→「Add deploy key」を選択します。

f:id:MoriKen254:20190601214621p:plain


「Title」に鍵の名称(例えば、SSH_PUBLIC_KEY_FOR_GITLAB_CI とか)を入力し、「Key」に先程コピーした公開鍵をペーストします。

f:id:MoriKen254:20190601214907p:plain


「Add key」を押下し、鍵を登録します。

f:id:MoriKen254:20190601215527p:plain


.gitlab-ci.yml へ SSH 認証コマンドを追加

まだ続きます。これまでに登録した SSH の設定を、CI 空間で有効にするために、.gitlab-ci.ymlbefore_script: に然るべきコマンドを追加します。

f:id:MoriKen254:20190601215952p:plain


ここでは、.gitlab-ci.ymlbefore_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 デバッグをしている身としては、これはきついです涙。

f:id:MoriKen254:20190601221701p:plain


というわけで、GitHub 側でプッシュした後に、ミラーリング先の GitLab からユーザ操作でミラーリングする方法を共有します。少々面倒ですが、ポーリングで時間を食うよりマシです。

「インポートした Repository」のページから、「Settings」→「Repository」を選択し、「Mirror a repository」を展開します。先程のミラーリングの設定画面です。

下の方にある「Mirrored repositories」で右側にある更新を彷彿とさせるロゴを有したミラーリングボタンを押下します。Last update の時間が更新されれば、手動ミラーリングの完了です!

f:id:MoriKen254:20190601171624p:plain


GitLab CI Job にて SSH 認証の確認

以上の設定でちゃんと GitLab ⇔ GitHub 間で SSH 認証ができているか、確認してみましょう。

「インポートした Private Repository」→「CI/CD」を展開→「Piplelines」を選択→「Job ステータス」を選択、と操作します。ここでは既に成功している Job を選択するので、「passed」と表示されている部分を選択します。(実際にデバッグする時は failed を表示された赤いアイコンをクリックすることになるのですが笑。)

f:id:MoriKen254:20190601222650p:plain


展開したページから「Pipeline 名」を選択します。当方のケースではたまたま「kinetic」という名前をつけていているので、これを選択します。

f:id:MoriKen254:20190601223059p:plain


展開先のページで、最新の Job の実際の出力を確認できます。

f:id:MoriKen254:20190601223157p:plain


このうち、冒頭の before_scripts 部分を見に行けば、SSH 認証時のメッセージが見られます。

f:id:MoriKen254:20190601223257p:plain


ここで、下記のようなメッセージが表示されていれば、SSH 認証は成功しています。

Agent pid hoge
Identity added: /dev/hoge/hoge (メールアドレス)

ここまでできて晴れて、依存する Private Repository を巻き込んだ上で、Private Repository の CI を通すことができるようになります。

長かったー汗。

おわりに

GitHub x Travis CI で Private Repository を CI しようとしたらお金がかかってしまう問題を、GitLab CI で解決する方法を記述しました。

きっと、同じような状況で困っているエンジニアがいるはず!

そんなエンジニアにとって、この記事が少しでもお役に立てることを願っています。

前回:② ミラーリング編

www.moriken254.com