如何从 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 以避免清理。
很有魅力。
我是 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 以避免清理。
很有魅力。