Rails/PostgreSQL - PG::ConnectionBad:致命:用户密码验证失败(CI/CD)

Rails/PostgreSQL - PG::ConnectionBad: FATAL: password authentication failed for user (for CI/CD)

首先,我知道这个问题是有答案的:

  1. Rails: FATAL - Peer authentication failed for user (PG::Error)

但在任何情况下,您都必须手动完成,我想找到一个可以在我的 CI/CD 管道上自动完成以部署到生产中的答案。

我得到的错误是这样的:

FATAL:  password authentication failed for user "Jenkins_project"
Couldn't create 'Jenkins_project_production' database. Please check your configuration.
rake aborted!
PG::ConnectionBad: FATAL:  password authentication failed for user "Jenkins_project"

当我尝试创建和迁移数据库时发生这种情况:

docker-compose -f docker-compose.override.yml --env-file .env run web rake db:create db:migrate

我使用 -f docker-compose.override.yml 因为我试图将它部署在 AWS EC2 服务器中。 docker-compose.override.yml 看起来像这样:

version: "3"

services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-default}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-default}
      JENKINS_PROJECT_DATABASE_PASSWORD: ${JENKINS_PROJECT_DATABASE_PASSWORD:-default}
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-default}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-default}
      POSTGRES_HOST: ${POSTGRES_HOST:-default}
      JENKINS_PROJECT_DATABASE_PASSWORD: ${JENKINS_PROJECT_DATABASE_PASSWORD:-default}

并且它连接到 .env 文件,所以这就是我在 docker-compose 命令上调用 --env-file .env 的原因。

.env 看起来像这样:

POSTGRES_USER=user
POSTGRES_PASSWORD=password
POSTGRES_HOST=host
JENKINS_PROJECT_DATABASE_PASSWORD=jenkins_password

我的 database.yml 看起来像这样:

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: user
  password: password
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: Jenkins_project_development

production:
  <<: *default
  database: Jenkins_project_production
  username: Jenkins_project
  password: <%= ENV['JENKINS_PROJECT_DATABASE_PASSWORD'] %>

我想做的是在 运行 命令时将 .env 文件“秘密”传递给 docker-compose.override.yml 上的每个服务,然后从那里填充 <%= ENV['JENKINS_PROJECT_DATABASE_PASSWORD'] %>database.yml.

看来我做错了什么,但我不知道是什么。 同样,我知道我可以手动执行此操作,但我想让它自动部署 CI/CD 管道。

如果有人有任何想法,请分享。谢谢!

通过从生产中删除 usernamepassword 并保留默认值来解决此问题:

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: user
  password: password
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: Jenkins_project_development

production:
  <<: *default
  database: Jenkins_project_production