当我将它推送到 GitLab 时,如何通过 searchkick gem 为依赖于 PosgreSQL 和 Elasticsearch 的 Rails 应用程序配置 .gitlab-ci.yml
文件以运行我的测试?
最佳答案
我想发布这个问题,因为我花了太长时间才找到答案并且不想让别人感受到我的痛苦。下面的示例不仅构建了我的应用程序,还运行了我的所有规范。
设置
- Rails 5+
- PostreSQL 9.6
- Rspec gem
- Searchkick gem(处理 Elasticsearch 查询和配置)
配置
使用列出的配置将以下文件添加到您的 Rails 应用。
config/gitlab-database.yml
test:
adapter: postgresql
encoding: unicode
pool: 5
timeout: 5000
host: postgres
database: test_db
user: runner
password: ""
.gitlab-ci.yml
image: ruby:2.4.1
services:
- postgres:latest
- elasticsearch:latest
variables:
POSTGRES_DB: test_db
POSTGRES_USER: runner
POSTGRES_PASSWORD: ""
ELASTICSEARCH_URL: "http://elasticsearch:9200"
stages:
- test
before_script:
- bundle install --without postgres production --jobs $(nproc) "${FLAGS[@]}"
- cp config/gitlab-ci/gitlab-database.yml config/database.yml
- RAILS_ENV=test bundle exec rails db:create db:schema:load
test:
stage: test
script:
- bundle exec rspec
就是这样!您现在已配置为在每次推送时在 gitlab 上自动运行您的规范。
进一步说明
让我们从 PostgreSQL 开始。当我们启动新的运行器时,我们正在复制的应用程序将不知道如何正确连接到 Postgres。因此,我们创建了一个新的 database.yml
文件,我们以 gitlab-
为前缀,这样它就不会与我们的实际配置冲突,并将该文件复制到运行器的配置目录中。 cp
命令不仅复制文件,而且会替换当前存在的文件。
我们通过 GitLab 连接的项目是 database:
、user:
和 password:
。我们通过在我们的环境变量
中指定相同的名称来做到这一点,确保一切都正确连接。
好的,连接到 PostgreSQL 在 GitLab 的网站上有很好的解释和记录。那么我是如何让 Elasticsearch 工作的,这在任何地方都没有得到很好的解释?
魔术再次发生在变量
中。我们需要设置 ELASTICSEARCH_URL
环境变量,它通过 Searchkick gem 提供给我们,因为 Elasticsearch 默认查找 http://localhost:9200
。但是由于我们通过服务使用 Elasticsearch,我们需要明确告诉它不要使用默认值并使用我们服务的主机名。因此,我们随后将 http://localhost:9200
替换为 http://elasticsearch:9200
,它确实正确映射到我们的服务。
关于ruby-on-rails - GitLab CI for Rails App 使用 Postgres 和 Elasticsearch (searchkick gem),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46242902/