如何将GitLab中的变量加载到VueJS的.env文件中

3
我想将Gitlab的变量加载到VueJS应用程序中的.env.production文件中,以便可以使用process.env.VUE_APP_VARIABLE_NAME。
我所做的事情:
1. 在GitLab CI / CD设置中创建一些变量。 2. 创建一个.env.production文件:
VUE_APP_EMAILJS_USER_ID=*
VUE_APP_EMAILJS_SERVICE_ID=*
VUE_APP_EMAILJS_TEMPLATE_ID=*

VUE_APP_FIREBASE_API_KEY=*
VUE_APP_FIREBASE_AUTH_DOMAIN=*
VUE_APP_FIREBASE_PROJECT_ID=*
VUE_APP_FIREBASE_STORAGE_BUCKET=*
VUE_APP_FIREBASE_MESSAGING_SENDER_ID=*
VUE_APP_FIREBASE_APP_ID=*
VUE_APP_FIREBASE_MEASUREMENT_ID=*

我的 .gitlab-ci.yml 文件
build-docker-image:
  stage: build
  before_script:
    # $CI_JOB_TOKEN is variable automatically added by Gitlab: see https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#variables-reference
    - echo $CI_JOB_TOKEN | docker login -u gitlab-ci-token registry.gitlab.com --password-stdin
  script:
    # build and push docker image to gitlab registry
    - docker pull $GITLAB_IMAGE || true # Allows us to use --cache-from
    - docker build 
      --build-arg VUE_APP_EMAILJS_USER_ID=$VUE_APP_EMAILJS_USER_ID
      --build-arg VUE_APP_EMAILJS_SERVICE_ID=$VUE_APP_EMAILJS_SERVICE_ID
      --build-arg VUE_APP_EMAILJS_TEMPLATE_ID=$VUE_APP_EMAILJS_TEMPLATE_ID
      --build-arg VUE_APP_FIREBASE_API_KEY=$VUE_APP_FIREBASE_API_KEY
      --build-arg VUE_APP_FIREBASE_AUTH_DOMAIN=$VUE_APP_FIREBASE_AUTH_DOMAIN
      --build-arg VUE_APP_FIREBASE_PROJECT_ID=$VUE_APP_FIREBASE_PROJECT_ID
      --build-arg VUE_APP_FIREBASE_STORAGE_BUCKET=$VUE_APP_FIREBASE_STORAGE_BUCKET
      --build-arg VUE_APP_FIREBASE_MESSAGING_SENDER_ID=$VUE_APP_FIREBASE_MESSAGING_SENDER_ID
      --build-arg VUE_APP_FIREBASE_APP_ID=$VUE_APP_FIREBASE_APP_ID
      --build-arg VUE_APP_FIREBASE_MEASUREMENT_ID=$VUE_APP_FIREBASE_MEASUREMENT_ID
      --cache-from $GITLAB_IMAGE -t $GITLAB_IMAGE:$CI_COMMIT_SHA .
    - docker push $GITLAB_IMAGE:$CI_COMMIT_SHA

4. 配置 Dockerfile 文件。
FROM node:14.18 as build-stage
WORKDIR /app
COPY package*.json ./
COPY yarn.lock ./
RUN yarn install
COPY . .

# pass Docker varibales to VueJS environment varibales
ARG VUE_APP_EMAILJS_USER_ID
ENV VUE_APP_EMAILJS_USER_ID $VUE_APP_EMAILJS_USER_ID
ARG VUE_APP_EMAILJS_SERVICE_ID
ENV VUE_APP_EMAILJS_SERVICE_ID $VUE_APP_EMAILJS_SERVICE_ID
ARG VUE_APP_EMAILJS_TEMPLATE_ID
ENV VUE_APP_EMAILJS_TEMPLATE_ID $VUE_APP_EMAILJS_TEMPLATE_ID

ARG VUE_APP_FIREBASE_API_KEY
ENV VUE_APP_FIREBASE_API_KEY $VUE_APP_FIREBASE_API_KEY
ARG VUE_APP_FIREBASE_AUTH_DOMAIN
ENV VUE_APP_FIREBASE_AUTH_DOMAIN $VUE_APP_FIREBASE_AUTH_DOMAIN
ARG VUE_APP_FIREBASE_PROJECT_ID
ENV VUE_APP_FIREBASE_PROJECT_ID $VUE_APP_FIREBASE_PROJECT_ID
ARG VUE_APP_FIREBASE_STORAGE_BUCKET
ENV VUE_APP_FIREBASE_STORAGE_BUCKET $VUE_APP_FIREBASE_STORAGE_BUCKET
ARG VUE_APP_FIREBASE_MESSAGING_SENDER_ID
ENV VUE_APP_FIREBASE_MESSAGING_SENDER_ID $VUE_APP_FIREBASE_MESSAGING_SENDER_ID
ARG VUE_APP_FIREBASE_APP_ID
ENV VUE_APP_FIREBASE_APP_ID $VUE_APP_FIREBASE_APP_ID
ARG VUE_APP_FIREBASE_MEASUREMENT_ID
ENV VUE_APP_FIREBASE_MEASUREMENT_ID $VUE_APP_FIREBASE_MEASUREMENT_ID

# build the application
RUN yarn build

FROM nginx:1.19 as production-stage
RUN mkdir /app
COPY --from=build-stage /app/dist /app
COPY nginx.conf /etc/nginx/nginx.conf

但是我只收到所有变量的空值。

enter image description here

有人知道我的解决方案出了什么问题吗?或者您有其他的解决方案来实现我想做的事情吗?

请确保在Gitlab中,如果您的变量受到保护,那么您的分支也应该受到保护。或者,如果您不想保护您的分支,那么请确保这些变量也没有被保护。我的设置有点不同,我只是将.env文件的副本作为Gitlab变量(设置为“文件”类型)拥有。 - Arno van Oordt
@ArnovanOordt 我认为这不是原因。所有变量都没有受到保护。我已经成功地将Gitlab变量加载到docker中,但问题是我无法将docker变量设置为VueJS环境。 - Quyết
以下是日志:步骤 7/35:ARG VUE_APP_EMAILJS_USER_ID ---> 运行中的 cddaa65f0fec 删除中间容器 cddaa65f0fec ---> b890c2d70cb2 步骤 8/35:ENV VUE_APP_EMAILJS_USER_ID $VUE_APP_EMAILJS_USER_ID ---> 运行中的 5063533c101c 删除中间容器 5063533c101c ---> e556035d46b6 步骤 9/35:RUN echo VUE_APP_EMAILJS_USER_ID ---> 运行中的 aa6b29cfebcf VUE_APP_EMAILJS_USER_ID 删除中间容器 aa6b29cfebcf ---> b5b6c1897d30 步骤 10/35:RUN echo $VUE_APP_EMAILJS_USER_ID ---> 运行中的 09f024ccd0ab [MASKED] - Quyết
然后,我也有点不知所措,恐怕无法提供帮助。 - Arno van Oordt
也许你可以使用 envsubst 脚本在构建 Dockerfile 之前将环境变量替换为正确的值。 - Neeraj Jain
1个回答

0

我认为你做得很好,但是忘记在Dockerfile中传递环境变量了。 我有相同的配置,但是使用=符号来传递它们,例如:

FROM node:14.18 as build-stage
WORKDIR /app
COPY package*.json yarn.lock ./
RUN yarn install
COPY . .

# pass Docker varibales to VueJS environment varibales
ARG VUE_APP_FIREBASE_APP_ID \
    VUE_APP_EMAILJS_USER_ID  \
    VUE_APP_FIREBASE_API_KEY \
    VUE_APP_EMAILJS_SERVICE_ID \
    VUE_APP_EMAILJS_TEMPLATE_ID \
    VUE_APP_FIREBASE_PROJECT_ID \
    VUE_APP_FIREBASE_AUTH_DOMAIN \
    VUE_APP_FIREBASE_STORAGE_BUCKET \
    VUE_APP_FIREBASE_MEASUREMENT_ID \
    VUE_APP_FIREBASE_MESSAGING_SENDER_ID

ENV VUE_APP_FIREBASE_APP_ID=$VUE_APP_FIREBASE_APP_ID \
    VUE_APP_EMAILJS_USER_ID=$VUE_APP_EMAILJS_USER_ID \
    VUE_APP_FIREBASE_API_KEY=$VUE_APP_FIREBASE_API_KEY \
    VUE_APP_EMAILJS_SERVICE_ID=$VUE_APP_EMAILJS_SERVICE_ID \
    VUE_APP_EMAILJS_TEMPLATE_ID=$VUE_APP_EMAILJS_TEMPLATE_ID \
    VUE_APP_FIREBASE_PROJECT_ID=$VUE_APP_FIREBASE_PROJECT_ID \
    VUE_APP_FIREBASE_AUTH_DOMAIN=$VUE_APP_FIREBASE_AUTH_DOMAIN \
    VUE_APP_FIREBASE_STORAGE_BUCKET=$VUE_APP_FIREBASE_STORAGE_BUCKET \
    VUE_APP_FIREBASE_MEASUREMENT_ID=$VUE_APP_FIREBASE_MEASUREMENT_ID \
    VUE_APP_FIREBASE_MESSAGING_SENDER_ID=$VUE_APP_FIREBASE_MESSAGING_SENDER_ID

# build the application
RUN yarn build

FROM nginx:1.19 as production-stage
RUN mkdir /app
COPY --from=build-stage /app/dist /app
COPY nginx.conf /etc/nginx/nginx.conf
CMD ["nginx", "-g", "daemon off;"]

为了区分开发和生产环境,您可以在Gitlab CI/CD envs和.gitlab-ci.yml文件中,在环境名称之前添加DEV_MAIN_,例如:

build-docker-image-develop:
  stage: build
  before_script:
    # $CI_JOB_TOKEN is variable automatically added by Gitlab: see https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#variables-reference
    - echo $CI_JOB_TOKEN | docker login -u gitlab-ci-token registry.gitlab.com --password-stdin
  script:
    # build and push docker image to gitlab registry
    - docker pull $GITLAB_IMAGE || true # Allows us to use --cache-from
    - docker build 
      --build-arg VUE_APP_EMAILJS_USER_ID=$DEV_VUE_APP_EMAILJS_USER_ID
      --build-arg VUE_APP_FIREBASE_APP_ID=$DEV_VUE_APP_FIREBASE_APP_ID
      --build-arg VUE_APP_FIREBASE_API_KEY=$DEV_VUE_APP_FIREBASE_API_KEY
      --build-arg VUE_APP_EMAILJS_SERVICE_ID=$DEV_VUE_APP_EMAILJS_SERVICE_ID
      --build-arg VUE_APP_EMAILJS_TEMPLATE_ID=$DEV_VUE_APP_EMAILJS_TEMPLATE_ID
      --build-arg VUE_APP_FIREBASE_PROJECT_ID=$DEV_VUE_APP_FIREBASE_PROJECT_ID
      --build-arg VUE_APP_FIREBASE_AUTH_DOMAIN=$DEV_VUE_APP_FIREBASE_AUTH_DOMAIN
      --build-arg VUE_APP_FIREBASE_MEASUREMENT_ID=$DEV_VUE_APP_FIREBASE_MEASUREMENT_ID
      --build-arg VUE_APP_FIREBASE_STORAGE_BUCKET=$DEV_VUE_APP_FIREBASE_STORAGE_BUCKET
      --build-arg VUE_APP_FIREBASE_MESSAGING_SENDER_ID=$DEV_VUE_APP_FIREBASE_MESSAGING_SENDER_ID
      --cache-from $GITLAB_IMAGE -t $GITLAB_IMAGE:$CI_COMMIT_SHA .
    - docker push $GITLAB_IMAGE:$CI_COMMIT_SHA
  only:
    - develop
  tags:
    - docker-build

#### production

build-docker-image-main:
  stage: build
  before_script:
    # $CI_JOB_TOKEN is variable automatically added by Gitlab: see https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#variables-reference
    - echo $CI_JOB_TOKEN | docker login -u gitlab-ci-token registry.gitlab.com --password-stdin
  script:
    # build and push docker image to gitlab registry
    - docker pull $GITLAB_IMAGE || true # Allows us to use --cache-from
    - docker build 
      --build-arg VUE_APP_EMAILJS_USER_ID=$MAIN_VUE_APP_EMAILJS_USER_ID
      --build-arg VUE_APP_FIREBASE_APP_ID=$MAIN_VUE_APP_FIREBASE_APP_ID
      --build-arg VUE_APP_FIREBASE_API_KEY=$MAIN_VUE_APP_FIREBASE_API_KEY
      --build-arg VUE_APP_EMAILJS_SERVICE_ID=$MAIN_VUE_APP_EMAILJS_SERVICE_ID
      --build-arg VUE_APP_EMAILJS_TEMPLATE_ID=$MAIN_VUE_APP_EMAILJS_TEMPLATE_ID
      --build-arg VUE_APP_FIREBASE_PROJECT_ID=$MAIN_VUE_APP_FIREBASE_PROJECT_ID
      --build-arg VUE_APP_FIREBASE_AUTH_DOMAIN=$MAIN_VUE_APP_FIREBASE_AUTH_DOMAIN
      --build-arg VUE_APP_FIREBASE_MEASUREMENT_ID=$MAIN_VUE_APP_FIREBASE_MEASUREMENT_ID
      --build-arg VUE_APP_FIREBASE_STORAGE_BUCKET=$MAIN_VUE_APP_FIREBASE_STORAGE_BUCKET
      --build-arg VUE_APP_FIREBASE_MESSAGING_SENDER_ID=$MAIN_VUE_APP_FIREBASE_MESSAGING_SENDER_ID
      --cache-from $GITLAB_IMAGE -t $GITLAB_IMAGE:$CI_COMMIT_SHA .
    - docker push $GITLAB_IMAGE:$CI_COMMIT_SHA
  only:
    - main
  tags:
    - docker-build

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接