【问题标题】:Running Postgres in GitHub Actions to test my Go API在 GitHub Actions 中运行 Postgres 以测试我的 Go API
【发布时间】:2021-05-14 00:15:32
【问题描述】:

我已经设置了一个 GitHub 工作流来在 docker 容器中启动一个 Postgres 实例。然后我执行我的 Web API 来简单地证明它已连接。这满足了工作流程。

我的工作流程

name: Build

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:

  build:
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres:10.8
        env:
          POSTGRES_USER: test
          POSTGRES_PASSWORD: test
          POSTGRES_DB: test
          POSTGRES_PORT: 5432
        ports:
          - 5432/tcp
        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5

    steps:
      - uses: actions/checkout@v2

      - name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.15

      - name: Run
        env:
          # These are the expected envs in my code
          DB_HOST: localhost
          DB_USER: test
          DB_PASSWORD: test
          DB_NAME: test
          DB_PORT: 5432
          DB_DIALECT: postgres
          PORT: 8080
        run: make run

为简洁起见,我删除了无关紧要的代码,这是我的数据库包:

// Config Model
type Config struct {
    Host     string
    Name     string
    User     string
    Password string
    Port     string
    Dialect  string
}

// Open a new connection to a database
func Open(c Config) (*gorm.DB, error) {

    dsn := fmt.Sprintf("host=%s port=%s dbname=%s password=%s user=%s sslmode=disable",
        c.Host,
        c.Port,
        c.Name,
        c.Password,
        c.User,
    )

    db, err := gorm.Open(postgres.New(postgres.Config{
        DriverName: c.Dialect,
        DSN:        dsn,
    }), &gorm.Config{})

    if err != nil {
        return nil, fmt.Errorf("sql.Open: %v", err)
    }

    return db, nil
}

这是从我的主包中调用的

func main() {
    // Create Database Configuration
    dbConfig := database.Config{
        Host:     os.Getenv("DB_HOST"),
        Name:     os.Getenv("DB_NAME"),
        User:     os.Getenv("DB_USER"),
        Port:     os.Getenv("DB_PORT"),
        Password: os.Getenv("DB_PASSWORD"),
        Dialect:  os.Getenv("DB_DIALECT"),
    }

    // Connect to database
    db, err := database.Open(dbConfig)
    if err != nil {
        log.Fatalf("failed to connect to database: %s", err)
    }
}

代码在工作流期间无法连接并出现给定错误:

go run -ldflags "-X main.Version=afc0042" cmd/api/main.go
2021/02/10 09:55:12 Running Version: afc0042
2021/02/10 09:55:12 failed to connect to database: sql.Open: dial tcp [::1]:5432: connect: connection refused

2021/02/10 09:55:12 /home/runner/work/database/database.go:32
[error] failed to initialize database, got error dial tcp [::1]:5432: connect: connection refused

【问题讨论】:

    标签: postgresql docker go github-actions


    【解决方案1】:

    当您尝试在本地连接服务器时可以使用 localhost,但由于 docker 在您的机器中不是本地的,因此您不能使用 localhost,除非您在 docker 容器内。

    试试port forward

    ports:
      - 5432:5432 //update this one
    

    【讨论】:

    • 它在那里,代码在本地运行良好。我可以使用 Postgres 启动一个 docker 容器并进行连接。我似乎无法在 github 上连接它。
    • 您是从 docker 内部还是从 docker 外部尝试?
    • 我相信外面。所以我想在容器中使用 Postgres,然后我想在容器之外运行我的 go 文件,它将尝试使用上面的代码连接到数据库。
    • 首先你需要做端口转发。当您从 localhost 连接到 docker 时。你这样做了吗?
    • 啊,是的。 - 5432:5432 我已经更新了它,现在它似乎可以工作了。如果您想发布答案,我可以接受它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2020-05-13
    • 2021-06-25
    • 2021-01-29
    • 2021-11-15
    • 2021-03-20
    • 2021-04-23
    相关资源
    最近更新 更多