概要
GitLab CIでVariablesに保存したPEM形式の鍵を展開し、プログラムの中でその鍵を読み込んで使用しようとしたが上手く動かなかった。
そのときの原因と解決方法について書く。
やりたいこと
以下のPEM形式(説明しやすいように内容はてきとうです)の鍵があるとする。
-----BEGIN RSA PRIVATE KEY----- 1行目です〜 2行目です〜 3行目です〜 4行目です〜 -----END RSA PRIVATE KEY-----
こいつをGitLab CI Variablesに登録して、GitLab CI上でファイルとして展開し、プログラムの中で使用したい。
問題発生までの手順
GitLab CI Variablesに鍵の内容を保存する
GitLab CI Variablesを開き、以下の内容を入力していく。
- Type: 「File」を選択する
- Key: 「YOUR_PRIVATE_KEY」と入力する
- Value: 上記の鍵をコピペする
画面的にはこんな感じ。
GitLab CI用の設定ファイルを書く
以下の内容で .gitlab-ci.yml
を作成する。
内容としては、GitLab CI Variablesに登録した環境変数を一度 .gitlab-ci.yml
のvariablesで受け取ってそれをファイルとして書き出しているだけ。
stages: - test set_privatekey: stage: test image: alpine:latest variables: PRIVATE_KEY: YOUR_PRIVATE_KEY script: - echo ${PRIVATE_KEY} > private.key
この状態でcommit & pushする。
プログラム中で使用...できない
上記と同様のことを実際のプロジェクトで行いデプロイまでしたのだが、デプロイ後にプログラムを動かしても動く気配なし。
ログを見ると、鍵の形式が不適切なため読み込めないとのこと。どういうこったい。
原因
ということで原因を特定するために .gitlab-ci.yml
を以下のようにしてみた。
stages: - test set_privatekey: stage: test image: alpine:latest variables: PRIVATE_KEY: YOUR_PRIVATE_KEY script: - echo ${PRIVATE_KEY} > private.key - cat private.key
そのときの出力結果がこちら。
$ echo ${PRIVATE_KEY} > private.key $ cat private.key -----BEGIN RSA PRIVATE KEY----- 1行目です〜 2行目です〜 3行目です〜 4行目です〜 -----END RSA PRIVATE KEY-----
ふぁ!?なぜにワンライナーで表示されるし??
改行まで含めてPEM形式のため、しっかりと改行されてる状態じゃないと読み込んでくれないらしく、こいつが原因だった模様。
こちら参考ページ。
解決
二通りの解決方法がありけり。
その1
.gitlab-ci.yml
を以下のようにする。
stages: - test set_privatekey: stage: test image: alpine:latest variables: PRIVATE_KEY: YOUR_PRIVATE_KEY script: - echo "${PRIVATE_KEY}" > private.key
何が違うかって?
- echo "${PRIVATE_KEY}" > private.key
この echo
で渡す引数をダブルクォーテーションで括ってる。
これで意図したようにファイルに展開される。
その2
.gitlab-ci.yml
を以下のようにする。
stages: - test set_privatekey: stage: test image: alpine:latest script: - cat ${YOUR_PRIVATE_KEY} > private.key
GitLab CI Variablesに登録した環境変数をそのまま cat
してあげてる。
ここで echo
を使ってない理由は、GitLab CI VariablesにFileとして登録した環境変数には値がそのまま入っているわけではないから。
もし echo
で実行すると、以下のように登録した値が格納されたファイルへのパスが出力される。
/builds/{ユーザID}/test-variables.tmp/YOUR_PRIVATE_KEY
なるほど、 cat
だと上記のパスにあるファイルの中身を出力してる感じになってるらしい。
おわりに
公式サイトにFileな値を出力する方法が載ってたので、まずはそれを見るべきだった気もする。
個人的に気になってるのが、GitLab CI Variablesで登録した値を使用する際は .gitlab-ci.yml
のvariablesを経由して使用する必要があるのか?といったところ。
いちいちGitLab CI Variablesのページにいかなくても、CI上で必要な環境変数を一覧できるという意味では割と有効かもしれんが、実際のところどうなのかは分からない。