我在尝试在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与此类似,但用户名/密码行在那里注释
如果您需要更多信息:
如果您需要更多信息来帮助我,请告诉我:)
答案 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.migrate
(test
别名为您做了。)