今年もやってきました、こちらは、CircleCI Advent Calendar 2021 ゆかちゃんの誕生日。12月23日です!! 毎年お世話になります、しょっさんです。
今年の CircleCI ネタは、Herokuでございます。今年もかよ。
Heroku Postgres の自動テストがうまくいかない
1年放置していた、とある Typescript + Sequelize のアプリが、CircleCI で何をどうやってもエラーをはき続けてしまう現象に巡り会いました。
エラーの内容はこうです。
> webapp@1.0.2 migrate /home/circleci/project
> sequelize db:migrate
Sequelize CLI [Node: 12.17.0, CLI: 6.3.0, ORM: 6.11.0]
Loaded configuration file "src/config/config.json".
Using environment "development".
ERROR: The server does not support SSL connections
ははーん?
Heroku Postgres が SSL 必須になるの巻
本年 2021/2/23 の changelog です。All Heroku Postgres client connections require SSL にあるとおり、Common Runtime 環境下でも PostgreSQL への接続に SSL が必須となりました。
これには二つの対処が必要です。
- Sequelize の SSL 化
- CircleCI 側の PostgreSQL の SSL化
1. Sequelize の SSL 化
こちらについては、既にちょうど良い記事があるので、こちら参考に。
heroku-postgresをSSLエラーが阻む問題の解決
ちな、Sequelize の config.json
をこんな風に書けば十分です。
"production": {
"use_env_variable": "DATABASE_URL",
"dialectOptions": {
"ssl": {
"require": true,
"rejectUnauthorized": false
}
}
}
2. CircleCI 側の PostgreSQL の SSL化
そして二つ目、これが厄介で厄介で仕方ない。
結果としてはこれ。openssl
で作成したオレオレ証明書をベースに、起動shell に無理矢理それを食わして起動させるパターンです。
ポイントは、local Postgres用の Docker Image で、バージョン指定しておくこと。これ -> image: circleci/postgres:13.0
。他のバージョンだとちょっとまた手はずが変わってくると思われ。
version: 2
jobs:
build:
docker:
# specify the version you desire here
- image: cimg/node:16.13.1
environment:
DATABASE_URL: postgres://testing:password@localhost:5432/sample
# local postgresql server
- image: circleci/postgres:13.0
environment:
POSTGRES_USER: testing
POSTGRES_PASSWORD: password
POSTGRES_DB: sample
entrypoint: bash
command: >
-c '
openssl req -nodes -new -x509 -subj "/CN=localhost" -keyout server.key -out server.crt &&
chown postgres server.key &&
chmod 600 /server.key &&
exec /docker-entrypoint.sh -c ssl=on -c ssl_cert_file=/server.crt -c ssl_key_file=/server.key
'
ということで、れっつえんじょい CircleCI + Heroku ライフ。