在部署阶段,如何在gitlab ci中添加.env文件?

Lui*_*off 10 google-app-engine gitlab google-cloud-platform gitlab-ci

所以我在我的仓库中有一个我正在处理的react / typescript应用程序,在我的仓库中有一个.env文件,我忽略了它,这样我的秘密就不会暴露了。重要的.env-example文件环境变量进行配置。我的问题是,由于我没有将.env文件推送到我的存储库中,因此当我通过Google App引擎部署应用程序时(这是在gitlab-ci.yml文件的部署阶段完成的),这些环境变量会在生产环境中不存在,我需要它们才能使我的应用程序正常工作,因为我在webpack.config.js文件中执行了类似的操作。

const dotenv = require('dotenv').config({ path: __dirname + '/.env' });
Run Code Online (Sandbox Code Playgroud)

然后

new webpack.DefinePlugin({
  'process.env': dotenv.parsed
})
Run Code Online (Sandbox Code Playgroud)

这是我的.gitlab-ci文件,以防万一有人在这里看到。

cache:
  paths:
    - node_modules/

stages:
  - build
  - test
  - deploy

Build_Site:
  image: node:8-alpine
  stage: build
  script:
    - npm install --progress=false
    - npm run-script build
  artifacts:
    expire_in: 1 week
    paths:
      - build

Run_Tests:
  image: node:8-alpine
  stage: test
  script:
    - npm install --progress=false
    - npm run-script test

Deploy_Production:
  image: google/cloud-sdk:latest
  stage: deploy
  environment: Production
  only:
    - master
  script:
    - echo $DEPLOY_KEY_FILE_PRODUCTION > /tmp/$CI_PIPELINE_ID.json
    - gcloud auth activate-service-account --key-file /tmp/$CI_PIPELINE_ID.json
    - gcloud config set project $PROJECT_ID_PRODUCTION
    - gcloud info
    - gcloud --quiet app deploy
  after_script:
    - rm /tmp/$CI_PIPELINE_ID.json
Run Code Online (Sandbox Code Playgroud)

另外,请随时批评我的gitlab-ci.yml文件,以便我做得更好。

Mig*_*uel 30

Gitlab 现在允许你拥有文件类型变量,这是我的使用方式。

仅供参考:在本例中是一个 Vuejs 应用程序。

在此输入图像描述

然后在我的.gitlab-ci文件上:

...
before_script:
    ...
    - cp ${PRODUCTION_ENV_FILE} .env.production
script:
    ...
    - npm ci
    - npm run build
...
Run Code Online (Sandbox Code Playgroud)


Mic*_*ota 9

我不知道您是否仍然需要此功能,但这是我实现的目标。

  1. 在gitlab存储库配置中创建环境变量

  2. 创建setup_env.sh

#!/bin/bash

echo $API_URL >> .env
echo $NODE_ENV >> .env
Run Code Online (Sandbox Code Playgroud)
  1. 修改您的.gitlab-ci.yml。在下面更新您的before_script:部分
  - chmod +x ./setup_env.sh
  - ./setup_env.sh
Run Code Online (Sandbox Code Playgroud)
  1. webpack.config.js化妆用https://www.npmjs.com/package/dotenv
require('dotenv').config();
Run Code Online (Sandbox Code Playgroud)

这将传递文件中.env可用的变量webpack.config.js

将此添加到您的plugins数组(添加所需的那些变量):

    new webpack.DefinePlugin({
      'process.env.API_URL': JSON.stringify(process.env.API_URL),
      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
      ...
    })
Run Code Online (Sandbox Code Playgroud)

现在,您的部署应使用gitlab设置中指定的环境变量。

  • @FrancisManojFernnado 是的。这就是为什么有这样的程序 (8认同)
  • 将 .env 文件提交到存储库是一种不好的做法 (2认同)
  • @MichałCzarnota,您是否会考虑将所有 .env 内容复制到 giltab CI 环境变量中作为一种不好的做法?正如这里所建议的,我们需要设置与 .dotenv 文件中定义的条目一样多的变量(至少在最坏的情况下)。然后我们在 prescript 指令中重建 .env 文件。对我来说似乎太过分了。让我们将整个 .env 内容放入 Gitlab CI 环境变量中。 (2认同)
  • @chaiyachaiya 我认为你是对的。在下一个项目中我省略了这个开销。但是,不幸的是,我没有找到一种方法来避免在 gitlab repo 配置中设置环境变量。 (2认同)

Max*_*rie 6

如果您不向其中推送任何敏感信息,则提交 .env 文件并不是一个坏习惯:

# App Configuration
PORT=3000
NODE_ENV=production
APP_ENV=APP_ENV
TZ=utc
COMMIT_SHA=COMMIT_SHA

# Rabbitmq configuration
RABBITMQ_HOST=RABBITMQ_HOST
RABBITMQ_USER=RABBITMQ_USER
RABBITMQ_PASS=RABBITMQ_PASS
RABBITMQ_PORT=RABBITMQ_PORT
...
Run Code Online (Sandbox Code Playgroud)

(假设像这样的变量RABBITMQ_HOST已在 GitLab CI 环境变量中安全设置)

因此,在.gitlab-ci.yml作业中,您只需复制所需的 .env 文件,它将自动被解释:

# App Configuration
PORT=3000
NODE_ENV=production
APP_ENV=APP_ENV
TZ=utc
COMMIT_SHA=COMMIT_SHA

# Rabbitmq configuration
RABBITMQ_HOST=RABBITMQ_HOST
RABBITMQ_USER=RABBITMQ_USER
RABBITMQ_PASS=RABBITMQ_PASS
RABBITMQ_PORT=RABBITMQ_PORT
...
Run Code Online (Sandbox Code Playgroud)

不需要任何棘手的东西。