【问题标题】:Circle CI 2.0 Rails Redis Resque - Rspec Redis Server Not Found ErrorCircle CI 2.0 Rails Redis Resque - Rspec Redis Server Not Found 错误
【发布时间】:2018-05-29 07:49:45
【问题描述】:

当我们的测试套件运行时,我们遇到以下关于 redis-server 的问题。无论我们尝试了什么,似乎都没有解决这个错误。我们已经通过 dockerize 验证容器通过等待如下所示处于活动状态,但仍然会发生此错误。

任何想法将不胜感激!

Resque 初始化器

require 'resque'
require 'redis'
require 'yaml'

# Resque Plugins
require 'resque/plugins/retry'
require 'resque-retry'
require 'resque-retry/server'
require 'resque-lock-timeout'
require 'resque-scheduler'
require 'resque/failure/multiple'
require 'resque/failure/redis'
require 'resque-job-stats/server'
require 'resque/rollbar'

if AppUnsecure.settings[:active_db_services].include?('redis')
  uri = URI.parse(ENV["REDIS_URL"])
  config = {
    host: uri.host,
    port: uri.port,
    password: uri.password
  }
  Resque::Failure::Multiple.classes = [ Resque::Failure::Redis, Resque::Failure::Rollbar ]
  Resque::Failure.backend = Resque::Failure::Multiple
  Resque.redis = Redis.new(config)
elsif AppUnsecure.settings[:active_db_services].include?('redis-continous-integration')
  Resque::Failure::MultipleWithRetrySuppression.classes = [Resque::Failure::Redis]
  Resque.redis = Redis.new(host: 'redis://localhost', port: 6391)
else
  Resque::Failure::MultipleWithRetrySuppression.classes = [Resque::Failure::Redis]
  Resque.redis = Redis.new
end

Resque.redis.namespace = 'resque:GathrlySmartforms'

# Ignores Resque when processing jobs if activated!
Resque.inline = true if AppUnsecure.settings[:process_redis_inline]

# Setup Scheduler
# https://github.com/resque/resque-scheduler/issues/118
# https://github.com/resque/resque-scheduler/issues/581
Resque::Scheduler.configure do |c|
  c.quiet = false
  c.verbose = false
  c.logfile = File.join(Rails.root, 'log', "#{Rails.env}_resque_scheduler.log")
  c.logformat = 'text'
end
Resque::Scheduler.dynamic = true

schedules = {}
global = YAML.load_file("#{Rails.root}/config/resque_schedule.yml")
schedules.merge!(global) if global
# http://stackoverflow.com/questions/12158226/how-do-i-skip-loading-of-rails-initializers-when-running-a-rake-task
unless defined?(is_running_migration?) && is_running_migration?
  Resque.schedule = schedules if schedules.present?
end

Resque::Server.class_eval do
  use Rack::Auth::Basic do |username, password|
    [username, password] == [Rails.application.secrets.my_resque_username, Rails.application.secrets.my_resque_password]
  end
end

圈子配置

version: 2
jobs:
  build:
    working_directory: ~/DIR_NAME
    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.6

    steps:
      - checkout

      - run:
          name: Dockerize v0.6.0
          command: |
            wget https://github.com/jwilder/dockerize/releases/download/v0.6.0/dockerize-linux-amd64-v0.6.0.tar.gz
            sudo rm -rf /usr/local/bin/dockerize
            sudo tar -C /usr/local/bin -xzvf dockerize-linux-amd64-v0.6.0.tar.gz
            rm dockerize-linux-amd64-v0.6.0.tar.gz

      - run:
          name: Wait for PG
          command: dockerize -wait tcp://localhost:5432 -timeout 2m

      - run:
          name: Wait for Redis
          command: |
            dockerize -wait tcp://localhost:6379 -timeout 2m

      - restore_cache:
          keys:
            - DIR_NAME-{{ checksum "Gemfile.lock" }}
            - DIR_NAME-

      - 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: Install Phantom Js
          command: |
            sudo curl --output /tmp/phantomjs https://s3.amazonaws.com/circle-downloads/phantomjs-2.1.1
            sudo chmod ugo+x /tmp/phantomjs
            sudo ln -sf /tmp/phantomjs /usr/local/bin/phantomjs

      - run:
          name: Install Postgres Tools
          command: |
            sudo apt-get update
            sudo apt-get install postgresql-client

      - run:
          name: Install Redis Tools
          command: |
            sudo apt-get install redis-tools ; while ! redis-cli ping 2>/dev/null ; do sleep 1 ; done

      - run:
          name: Build Rails Database Yaml
          command: |
            cp config/database_example.yml config/database.yml

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

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

      - run:
          name: Run Brakeman
          command: |
            brakeman -z

      - run:
          name: Run Rubocop
          command: |
            bundle exec rubocop --format fuubar --require rubocop-rspec --config .rubocop.yml

      - run:
          name: Run the SCSS Linter
          command: |
            bundle exec scss-lint --config=config/scsslint.yml

      - run:
          name: Run the Eslint Linter for JS
          command: |
            bundle exec rake eslint:run_all


      - store_test_results:
          path: /tmp/test-results

更新

在各种测试运行中,它可能偶尔会起作用......但是,错误仍然是一样的,这一定是原因......

【问题讨论】:

    标签: ruby-on-rails ruby docker redis circleci


    【解决方案1】:

    我不知道 Postgres 连接到 redis 精细 的确切含义。 postgres 用户喜欢通过 redis-cli 吗? Postgres 没有直接连接是吗? (外国数据包装器——刚刚阅读了这个......我什至不知道你能做到这一点,哇)。好吧,没关系,这有点切线......

    一些小的见解,我不能很容易地测试整个事情...... PID 文件不是这样可能是因为它正在死去。 kill: invalid argument Q 可能来自 kill -QUIT。这可能在 redis 的脚本或其他东西中。我敢打赌这个过程已经死了,而 kill 只是错误地出错了。我认为 kill 真的希望 PID 存在。尽管我刚刚对此进行了测试,但这不是它的工作原理。那么也许 Circle 安装了非 GNU coreutils 或其他什么?

    我认为POSTGRES_USER 不应该出现在 redis 映像中。请参阅此示例:https://discuss.circleci.com/t/circleci-bug-for-builds-with-redis/13124 2.0 似乎发生了一些变化。

    如果 gist 已更新为全新的配置,请同时更新错误消息和问题,除非它们相同。

    【讨论】:

    • 问题已经更新了更多数据,您对此有什么想法吗?
    • 看起来 resque 初始化器真的想要一个 REDIS_URL 集合。我在任何地方都没有看到。但这不会导致您的问题!我从 4.0.6 docker 映像中运行了 /bin/bash,是的,redis-server 在路径中。嘿,像把睡眠从 1 更改为 10 并查看不一致是否消失这样的真正懒惰的事情怎么样。
    【解决方案2】:

    根据我们从这里可以看出,您的配置似乎引用了一个在测试中不存在的 redis 进程。

    另外,您在未经测试的情况下进行捆绑。不知道为什么。

    您可以发布您的 Redis 配置文件吗?

    你需要为 docker 镜像配置 REDIS_URL。

    【讨论】:

    • 问题已经更新了更多数据,您对此有什么想法吗?
    • 正在启动的redis进程没有名为redis-test的pid。这是一个redis配置错误。它正在寻找在应用程序本地运行的 redis 实例,但没有。
    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 2014-07-04
    • 2022-08-19
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多