在CircleCI中设置Elasticsearch和Ruby on Rails

时间:2021-05-13 23:31:47

I am trying to setup CircleCI with Elasticsearch in my Rails application. I think have the image configured, but how do I connect to it in CI?

我试图在我的Rails应用程序中使用Elasticsearch设置CircleCI。我认为配置了图像,但如何在CI中连接它?

So far I have tried...

到目前为止我试过......

https://github.com/elastic/elasticsearch/issues/23866

https://github.com/elastic/elasticsearch/issues/23866

Error Message

错误信息

Elasticsearch::Transport::Transport::Errors::Unauthorized: [401]

Circle YAML Config

Circle YAML配置

version: 2
jobs:
  build:
    working_directory: ~/gathrly-smartforms
    docker:
      - image: circleci/ruby:2.4.1-node
        environment:
          RAILS_ENV: continous_integration
          PGHOST: 127.0.0.1
          PGUSER: rails_test_user

      - image: circleci/postgres:9.6.3-alpine
        environment:
          POSTGRES_USER: rails_test_user
          POSTGRES_PASSWORD: ""
          POSTGRES_DB: continous_integration

      - image: redis:4.0.2
      - image: docker.elastic.co/elasticsearch/elasticsearch:5.4.2

    steps:
      - checkout

      - restore_cache:
          keys:
            - my-application-{{ checksum "Gemfile.lock" }}
            - my-application-

      - save_cache:
          key: rails-demo-{{ checksum "Gemfile.lock" }}
          paths:
            - vendor/bundle

      - run:
          name: Setup Bundler and Gems
          command: |
            gem install bundler
            gem update bundler
            gem install brakeman
            gem install rubocop
            gem install rubocop-rspec
            gem install scss_lint
            gem install eslint-rails
            gem install execjs
            bundle config without development:test
            bundle check --path=vendor/bundle || bundle install --without development test --path=vendor/bundle --jobs 4 --retry 3

      - run:
          name: Setup Postgres
          command: |
            sudo apt-get install postgresql-client

      - run:
          name: Setup Rails Database
          command: |
            RAILS_ENV=continous_integration bundle exec rake db:drop
            RAILS_ENV=continous_integration bundle exec rake db:setup

      - run:
          name: Run Rspec
          command: |
            RAILS_ENV=continous_integration bundle exec rspec --format RspecJunitFormatter -o /tmp/test-results/rspec.xml

      - store_test_results:
          path: /tmp/test-results

Elastic Search Initializer

弹性搜索初始化程序

require 'faraday_middleware/aws_signers_v4'

if Rails.env.production? || Rails.env.staging?
  Elasticsearch::Model.client = Elasticsearch::Client.new(url: ENV["AWS_ELASTICSEARCH_HOST"]) do |f|
    f.request :aws_signers_v4,
      credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY'], ENV['AWS_ACCESS_SECRET_KEY']),
      service_name: 'es',
      region: ENV['AWS_REGION']

    f.adapter Faraday.default_adapter
  end
else
  config = {
    host: "http://127.0.0.1:9200",
    transport_options: {
      request: { timeout: 5 }
    }
  }
  if File.exists?("config/elasticsearch.yml")
    config.merge!(YAML.load_file("config/elasticsearch.yml"))
  end

  Elasticsearch::Model.client = Elasticsearch::Client.new(config)
end

2 个解决方案

#1


1  

The official docker images from elastic come with x-pack preinstalled.

弹性的官方码头图像预装了x-pack。

https://www.elastic.co/guide/en/elasticsearch/reference/5.4/docker.html

https://www.elastic.co/guide/en/elasticsearch/reference/5.4/docker.html

That means that your elasticsearch instance is running with security enabled, but you do not appear to be providing any security credentials to your elasticsearch client, and so you get an unauthorised (401) error when you try to connect.

这意味着您的elasticsearch实例在启用安全性的情况下运行,但您似乎没有向elasticsearch客户端提供任何安全凭据,因此当您尝试连接时会出现未经授权的(401)错误。

You should either turn off security in your ES instance by adding xpack.security.enabled: false to your elasticsearch.yml, or provide valid credentials in your request.

您应该通过向elasticsearch.yml添加xpack.security.enabled:false来关闭ES实例中的安全性,或者在请求中提供有效的凭据。

#2


0  

(Posted on behalf of the question author).

(代表作者提问)。

From the other answer provided:

从另一个答案提供:

development: &default
  host: 'http://localhost:9200/'
  transport_options:
    request:
      timeout: !!integer 300

test:
  <<: *default

staging:
  <<: *default

continous_integration:
  <<: *default
  xpack.security.enabled: false

#1


1  

The official docker images from elastic come with x-pack preinstalled.

弹性的官方码头图像预装了x-pack。

https://www.elastic.co/guide/en/elasticsearch/reference/5.4/docker.html

https://www.elastic.co/guide/en/elasticsearch/reference/5.4/docker.html

That means that your elasticsearch instance is running with security enabled, but you do not appear to be providing any security credentials to your elasticsearch client, and so you get an unauthorised (401) error when you try to connect.

这意味着您的elasticsearch实例在启用安全性的情况下运行,但您似乎没有向elasticsearch客户端提供任何安全凭据,因此当您尝试连接时会出现未经授权的(401)错误。

You should either turn off security in your ES instance by adding xpack.security.enabled: false to your elasticsearch.yml, or provide valid credentials in your request.

您应该通过向elasticsearch.yml添加xpack.security.enabled:false来关闭ES实例中的安全性,或者在请求中提供有效的凭据。

#2


0  

(Posted on behalf of the question author).

(代表作者提问)。

From the other answer provided:

从另一个答案提供:

development: &default
  host: 'http://localhost:9200/'
  transport_options:
    request:
      timeout: !!integer 300

test:
  <<: *default

staging:
  <<: *default

continous_integration:
  <<: *default
  xpack.security.enabled: false