如何从 gitlab 管道(gitlab.yml 文件)将环境变量传递给 NestJS 应用程序?

How to pass environment variables to NestJS application from gitlab pipeline (gitlab.yml file)?

我是 gitlab 的新手 CI/CD,我正在寻找一种方法将环境变量传递到部署到 Heroku 的 NestJs 应用程序。

这是我的 .gitlab.yml 文件

...


image: node:latest

before_script:
  - apt-get update -qy
  - apt-get install -y ruby-dev
  - gem install dpl

stages:
  - testing
  - staging

testing:
  stage: testing
  image: salesforce/salesforcedx:latest-slim
  script:
    - accessToken=accessToken

    - echo TEST_ACCESS_TOKEN=${accessToken} > .env.test
    - echo dummmy=test >> .env
    - echo dummmyWithQuotes=test >> ".env"

  only:
    - staging
    - main

staging:
  stage: staging
  image: ruby:latest
  script:
    - dpl --provider=heroku --app=$HEROKU_APP_STAGING --api-key=$HEROKU_API_KEY
  only:
    - staging

这是我的应用程序控制器,用于测试部署结果

@Get()
  getHello() {
    const temoin = this.configService.get('PROD_LOGIN_URL');
    const tested = this.configService.get('TEST_ACCESS_TOKEN');
    const tested2 = this.configService.get('dummmy');
    const tested3 = this.configService.get('dummmyWithQuotes');
    return {
      temoin,
      tested,
      tested2,
      tested3,
    };
  }

当然我在app模块中有以下内容

ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: ['.env', '.env.test'],
    }),

我从已部署应用程序的响应中得到的是以下内容

{"temoin":"https://login.salesforce.com"}

我认为这与 docker 图片有关。我能想到的是,文件是在 docker 容器中创建的,并保留在 gitlab 作业上下文中(也许我不知道)

编辑:

我在暂存作业的脚本中添加了 ls -a,但没有 .env.test 文件

编辑 2:

我将 .env.test 和 .env 文件添加到作业的工件中,并且它可用于暂存作业。但是当使用 dpl 命令部署应用程序时,Heoku 应用程序文件中不存在 .env.test。

PS:我忘了说 .env.test 不在 Git 项目中,它是在管道中创建的。

我不完全清楚你想要完成什么,但我想你希望 .env 文件在暂存作业中可用。

通过将其添加为工作神器来传递

testing:
  stage: testing
  image: salesforce/salesforcedx:latest-slim
  script:
    - accessToken=accessToken
    - echo TEST_ACCESS_TOKEN=${accessToken} > .env.test
    - echo dummmy=test >> .env
    - echo dummmyWithQuotes=test >> ".env"
  artifacts:
    paths:
      - .env
  only:
    - staging
    - main

如果您希望动态生成的变量可用于后续作业,另一种选择是使用 built-in dotenv 报告。

artifacts:
    reports:
      dotenv: .env

这将使 .env 文件中的任何变量在后续作业的环境中可用,因为 dotenv 报告会自动加载到环境中。

在添加工件以使 .env 和 .env.test 文件可用于测试作业后,正如本杰明所说,我发现这些文件没有部署到应用程序中。 原因是 dpl 在部署之前执行清理(全部存储)。 我发现这个 issue 将 --skip_cleanup 标志添加到 dpl 以避免清理。

很有魅力。