ruby-on-rails - CircleCI 连接上的 Rails Fake-S3 被拒绝

标签 ruby-on-rails ruby amazon-web-services paperclip circleci

我正在尝试按照 this gist 使用 Paperclip 配置 Fake-S3 。在开发机器上一切正常,但是当我尝试在 CircleCI 上运行它时出现错误

Errno::ECONNREFUSED: Connection refused - connect(2) for "local-bucket.local.s3.endpoint" port 4567

我有下一个 config/environments/test.rb:

config.paperclip_defaults = {
  storage: :s3,
  s3_credentials: {
    access_key_id: 'anything',
    secret_access_key: 'anything'
  },
  bucket: 'local-bucket',
  s3_host_name: 'local.s3.endpoint',
  s3_protocol: 'http',
  url: ':s3_alias_url',
  s3_host_alias: 'local-bucket.local.s3.endpoint:4567',
  path: '/test/:class/:attachment/:id_partition/:style/:filename',
  s3_options: {
    use_ssl: false,
    s3_port: 4567
  }
}

在 CircleCI 上,我将该行添加到/etc/hosts:

127.0.0.1 local-bucket.local.s3.endpoint

并运行下一个命令:

fakes3 -r ./fakes3 -p 4567 >log/fakes3.log 2>&1 &

所以,当我尝试使用下一个代码创建新存储桶时:

  s3 = AWS::S3.new(
    access_key_id:     'anything',
    secret_access_key: 'anything',
    s3_endpoint:       'local.s3.endpoint',
    s3_port:           4567,
    use_ssl:           false
)
s3.buckets.create('local-bucket')

我遇到下一个错误:

rake aborted!
Errno::ECONNREFUSED: Connection refused - connect(2) for "local-bucket.local.s3.endpoint" port 4567
/home/ubuntu/***/vendor/bundle/ruby/2.2.0/gems/aws-sdk-v1-1.64.0/lib/aws/core/http/connection_pool.rb:327:in `start_session'
/home/ubuntu/***/vendor/bundle/ruby/2.2.0/gems/aws-sdk-v1-1.64.0/lib/aws/core/http/connection_pool.rb:127:in `session_for'
/home/ubuntu/***/vendor/bundle/ruby/2.2.0/gems/aws-sdk-v1-1.64.0/lib/aws/core/http/net_http_handler.rb:56:in `handle'
/home/ubuntu/***/vendor/bundle/ruby/2.2.0/gems/aws-sdk-v1-1.64.0/lib/aws/core/client.rb:253:in `block in make_sync_request'
/home/ubuntu/***/vendor/bundle/ruby/2.2.0/gems/aws-sdk-v1-1.64.0/lib/aws/core/client.rb:282:in `retry_server_errors'
/home/ubuntu/***/vendor/bundle/ruby/2.2.0/gems/aws-sdk-v1-1.64.0/lib/aws/s3/region_detection.rb:11:in `retry_server_errors'
/home/ubuntu/***/vendor/bundle/ruby/2.2.0/gems/aws-sdk-v1-1.64.0/lib/aws/core/client.rb:249:in `make_sync_request'
/home/ubuntu/***/vendor/bundle/ruby/2.2.0/gems/aws-sdk-v1-1.64.0/lib/aws/core/client.rb:511:in `block (2 levels) in client_request'
/home/ubuntu/***/vendor/bundle/ruby/2.2.0/gems/aws-sdk-v1-1.64.0/lib/aws/core/client.rb:391:in `log_client_request'
/home/ubuntu/***/vendor/bundle/ruby/2.2.0/gems/aws-sdk-v1-1.64.0/lib/aws/core/client.rb:477:in `block in client_request'
/home/ubuntu/***/vendor/bundle/ruby/2.2.0/gems/aws-sdk-v1-1.64.0/lib/aws/core/client.rb:373:in `return_or_raise'
/home/ubuntu/***/vendor/bundle/ruby/2.2.0/gems/aws-sdk-v1-1.64.0/lib/aws/core/client.rb:476:in `client_request'
(eval):3:in `create_bucket'
/home/ubuntu/***/vendor/bundle/ruby/2.2.0/gems/aws-sdk-v1-1.64.0/lib/aws/s3/bucket_collection.rb:109:in `create'
/home/ubuntu/***/lib/tasks/fakes3.rake:11:in `block (2 levels) in <top (required)>'
Tasks: TOP => fakes3:create_bucket
(See full trace by running task with --trace)

请帮我找出问题所在?

更新(1):

我意识到,如果我通过 SSH 连接到 CircleCI 构建并运行

fakes3 -r ./fakes3 -p 4567 >log/fakes3.log 2>&1 &

从 Rails 应用程序文件夹中,一切都按需要运行并且所有测试都通过。

更新(2):

circle.yml 文件的一部分:

test:
  pre:
    - bundle exec fakes3 -r ./fakes3 -p 4567 >./log/fakes3.log 2>&1 &
    - bundle exec rake fakes3:create_bucket

最佳答案

经过几天的寻找决定,我找到了。 问题出在使用 & 符号在后台运行 FakeS3

fakes3 -r ./fakes3 -p 4567 >log/fakes3.log 2>&1 &

关注来自 CircleCI 的 this docs:

Starting a background process from circle.yml is entirely possible, but it is not done by adding & to the end of your command line. Instead, you set the background flag on the command.

所以,我重写了 FakeS3 的启动方式:

test:
  pre:
    - bundle exec fakes3 -r ./fakes3 -p 4567 >./log/fakes3.log 2>&1:
        background: true
    - bundle exec rake fakes3:create_bucket

并得到了结果。

关于ruby-on-rails - CircleCI 连接上的 Rails Fake-S3 被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33878618/

相关文章:

javascript - 为 jasmine(-headless-webkit) 运行的文档样式规范

ruby-on-rails - 防止 FloatDomainError NaN

php - 有没有一种简单的方法可以像使用 NGINX 的 PHP 文件一样直接使用 erb 文件?

amazon-web-services - AWS - HA NFS - 最佳实践

amazon-web-services - 如何在 SQS 队列下添加超过 20 个策略语句 - 权限

amazon-web-services - 如何在 EC2 上的 CoreOS 上使用 cloud-config.yml 中的 "Instance ID"?

ruby-on-rails - ruby (Rails) gsub : pass the captured string into a method

ruby-on-rails - 我应该为我的 Rails 应用程序使用 Apache 还是 Nginx &Passenger 或 Mongrel

ruby-on-rails - ActiveRecord::Base.store 自动类型转换

ruby - 在 mongodb 中存储文件系统树并作为 json 提供给 flex 应用程序