将Elixir应用程序添加到CircleCI时找不到Postgres用户名

时间:2018-01-04 10:59:24

标签: elixir phoenix-framework circleci

我在尝试在CircleCI上获取我的Elixir / Phoenix应用程序时遇到了麻烦。 我已经添加了他们的配置文件,尝试搞乱它,似乎没有任何工作......它说

** (KeyError) key :username not found in: [types: Postgrex.DefaultTypes, backoff_type: :stop, pool: DBConnection.Connection, database: "postgres", otp_app: :todo_with_auth, repo: TodoWithAuth.Repo, timeout: 15000, pool_timeout: 5000, adapter: Ecto.Adapters.Postgres, hostname: "localhost", pool_size: 10]
    (elixir) lib/keyword.ex:343: Keyword.fetch!/2
    (postgrex) lib/postgrex/protocol.ex:548: Postgrex.Protocol.startup/2
    (postgrex) lib/postgrex/protocol.ex:475: Postgrex.Protocol.handshake/2
    (db_connection) lib/db_connection/connection.ex:134: DBConnection.Connection.connect/2
    (connection) lib/connection.ex:622: Connection.enter_connect/5
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3

这是配置文件

# Elixir CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-elixir/ for more details
version: 2
jobs:
  build:
    docker:
      # specify the version here
      - image: circleci/elixir:1.4

      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
      - image: circleci/postgres:9.4

    working_directory: ~/repo
    steps:
      - checkout

      # specify any bash command here prefixed with `run: `
      - run: mix local.hex --force
      - run: mix local.rebar
      - run: mix deps.get
      - run: mix ecto.create
      - run: mix test

我的测试环境(test.exs)

config :todo_with_auth, TodoWithAuth.Repo,
  adapter: Ecto.Adapters.Postgres,
  username: "postgres",
  password: "postgres",
  database: "todo_with_auth_test",
  hostname: "localhost",
  pool: Ecto.Adapters.SQL.Sandbox

dev.exs与此类似,但用户名/密码行在那里注释

如果您需要更多信息:

CircleCI Failling

Github Repo

如果您需要更多信息来帮助我,请告诉我:)

1 个答案:

答案 0 :(得分:1)

为了保持构建的一致性,CircleCI不会添加任何环境变量。此外,mix本身(一些mix任务要准确)执行此操作。例如,如果你看看生成的mix.exs文件的最后一部分,你会看到类似的东西:

defp aliases do
  [
    "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
    "ecto.reset": ["ecto.drop", "ecto.setup"],
    "test": ["ecto.drop", "ecto.create --quiet", "ecto.migrate", "test"]
  ]
end

Test任务将MIX_ENV=test添加到环境中。另一方面,Ecto.Create任务,因为它要在所有环境中运行。这使得您可以在默认(dev)环境中尝试创建数据库。

尽管如此,在适用的地方添加MIX_ENV=test可以解决问题:

# - run: mix ecto.create
- run: MIX_ENV=test mix ecto.create

或者更好的是,您应该删除上面的行,因为test的别名(请参阅mix.exs别名)隐含 drop并以静默方式重新创建数据库本身mix ecto.create是一个noop,因为您之后从未致电ecto.migratetest别名为您做了。)