はじめに
GitLabのCI機能を使ってrspecを動かしたら、なぜかテストが落ちるという現象に見舞われました。
現象と対処法について書きたいと思います。
現象
gitlab-ci.ymlに以下を記載して、GitLabにpushするとrspecが実行されるのだが、実行されたrspecのテストが17個ぐらい落ちる。
.gitlab-ci.yml
rspec:
stage: test
script:
- apt-get update -qq && apt-get install -y mysql-server mysql-client default-libmysqlclient-dev
- service mysql start
- echo "CREATE USER 'user'@'%' IDENTIFIED BY '$PASS';" | mysql -u root
- echo "GRANT ALL PRIVILEGES ON *.* TO 'user'@'%';" | mysql -u root
- rake db:create db:migrate db:seed RAILS_ENV=test
- rspec
artifacts:
paths:
- coverage
expire_in: 1 week
ローカルでrspecを実行するとちゃんと通るのだが。
原因
色々と原因を調査してみると、以下の部分がnilになっていてテストが落ちていた。
Rails.application.credentials.dig(:develop, :aws)
なぜかcredentials.digができていないことが原因だった。
そして、なぜcredentials.digができていなかったのかは、config/master.keyが.gitignoreに入っていてpushされていなかったから。
master.keyはcredentials.yml.encの内容を暗号化・復号化するための鍵。リポジトリに入らないように配慮されている。
対処法
master.keyをscriptの中に記載すればできた。
scriptの部分に以下を記載した。
.gitlab-ci.yml
- echo "config/master.keyの中身" > config/master.key
ハードコーディングはよろしくないので、環境変数を設定して、以下のように記載する。
.gitlab-ci.yml
- echo "$MASTER_KEY" > config/master.key
環境変数はGitLabのSetting→CI/CD→Environment variablesから設定できる。
おわりに
ymlを記載するだけでテストなどを実行してくれて非常に便利な半面、結構予想外なことが起こったりします。
まだまだ、CI/CDを実装するには壁が多そうです。