CI 阶段把最新的代码 build 成为 image,并且 push 到 极狐 GitLab container registry。在部署的时候通过 docker-compose 拉取最新的 image,并且运行即可。
在 build image 阶段,有一个步骤就是需要 precompile,但是 precompile 依赖master.key
,给我带来了一些困扰:
RAILS_ENV=production rails assets:precompile
=> Missing encryption key to decrypt file with. Ask your team for your master key and write it to /Users/hiveerli/works/jihu-partner-portal/config/master.key or put it in the ENV['RAILS_MASTER_KEY'].
当遇到这个问题的时候,首先我觉得不太合理,precompile 处理的都是前端的资源,为啥需要依赖 master.key。所以我想是不是这个不是必须的,可以通过什么方式规避。但是经过一番调查,发现这个依赖是必须。
最终采用的方式是生成一个假的 master.key.sample 和 credentials.yml.enc.sample 并且提交到代码仓库。在 build 的时候,首先隐藏真的 credentials.yml.enc,然后使用假的 master.key.sample 和 credentials.yml.enc.sample。具体代码如下:
RUN if [ "$RAILS_ENV" == "production" ]; then \
mv config/credentials.yml.enc config/credentials.yml.enc.backup; \
mv config/credentials.yml.enc.sample config/credentials.yml.enc; \
mv config/master.key.sample config/master.key; \
bundle exec rails assets:precompile; \
mv config/credentials.yml.enc.backup config/credentials.yml.enc; \
rm config/master.key; \
fi
经过验证这个方法可以很好的工作,但是看起来不美观,不仅有代码上的冗余,还有逻辑上的误导性,但是至少确保了安全性。