【问题标题】:ENV_VARS "undefined" when deploying Next JS app through Gitlab CI/CD to a Kubernetes cluster:通过 Gitlab CI/CD 将 Next JS 应用程序部署到 Kubernetes 集群时,ENV_VARS “未定义”:
【发布时间】:2021-08-05 13:12:59
【问题描述】:

我在这个问题上坚持了很久:

我有一个标准的 NextJS 应用程序,它使用环境变量(客户端 NEXT_PUBLIC_MY_VAR 以及服务器端 MY_OTHER_VAR)。

我将 Gitlab CI-CD AutoDevOps 与一个很小的自定义 .gitlab-ci.yml 文件一起使用(见下文)。

我已使用 Gitlab 成功连接到我的 Kubernetes 集群,并且我的 NextJS 应用程序也已成功部署。 (也清理了 Gitlab/K8s 缓存)

我唯一挣扎的就是让process.env.ENV_VARS 运行。 无论我尝试什么,它们都是undefined

我手动将我的应用程序部署到集群中,并将 configMap 安装到我的部署中(因此.env.local-文件存在于/app/.env.local 只有 ENV_VARS 设置正确。

那么在通过 Gitlab Auto DevOps 部署我的 NextJS 应用程序时如何设置ENV_VARS

到目前为止我已经尝试过:

  • 在 Gitlab 中设置 ENV_VARS -> 设置 -> CI/CD -> 变量

  • 我在我的 Dockerfile 中添加了一个 ARG,它应该在构建 Docker 映像时获取 Gitlab CI vars:
FROM node:alpine AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci 
# ...
# ..

# docker build --build-arg API_URL=http://myApiEndpoint
ARG API_URL
ENV API_URL=$API_URL
RUN npm run build

FROM node:alpine AS runner
WORKDIR /app

ENV NODE_ENV production

# COPY --from=builder /app/next.config.js ./ # TRIED WITH AND WITHOUT
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json

RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
RUN chown -R nextjs:nodejs /app/.next

USER nextjs

EXPOSE 5000

CMD ["npm", "run", "start"]
  • 我还在我的next.config.js 中添加了 ENV_VARS

module.exports = withSvgr({
    serverRuntimeConfig: {},
    publicRuntimeConfig: {
        NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,
        API_URL: process.env.API_URL,
    },
});

  • 我还添加了一个自定义.gitlab-ci.yml 文件(此处为完整文件):

yaml 包括: - 模板:Auto-DevOps.gitlab-ci.yml

# added vars for build
build:
  stage: build
  variables:
    API_URL: $API_URL

这是我的 POD 中的错误消息

> metashop-frontend.react@1.8.0 start
> next start -p 5000
ready - started server on 0.0.0.0:5000, url: http://localhost:5000
ApiURL alias: undefined #### <<<---- 
API_URL: undefined      #### <<<---- 
TypeError: Only absolute URLs are supported
    at getNodeRequestOptions (/app/node_modules/node-fetch/lib/index.js:1305:9)
    at /app/node_modules/node-fetch/lib/index.js:1410:19
    at new Promise (<anonymous>)
    at fetch (/app/node_modules/node-fetch/lib/index.js:1407:9)
    at Object.getItems (/app/.next/server/pages/_app.js:1194:12)
    at getServerSideProps (/app/.next/server/pages/index.js:2952:55)
    at renderToHTML (/app/node_modules/next/dist/next-server/server/render.js:40:221)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async /app/node_modules/next/dist/next-server/server/next-server.js:109:97
    at async /app/node_modules/next/dist/next-server/server/next-server.js:102:142

并且是错误所指的代码:

const ApiUrl = process.env.API_URL;

console.log("ApiURL alias:", ApiUrl);
console.log("API_URL:", process.env.API_URL);
console.log("NEXT_PUBLIC_API_URL:", process.env.NEXT_PUBLIC_API_URL);
return fetch(`${ApiUrl}/items.json?${qs.stringify(options)}`).then(
    (response) => response.json()
);

为了完整性(但大多无用)失败作业的尾部(这似乎是 K8s 没有响应时的正常错误):

Error: release production failed, and has been uninstalled due to atomic being set: timed out waiting for the condition
Uploading artifacts for failed job
00:01
Uploading artifacts...
WARNING: environment_url.txt: no matching files    
WARNING: tiller.log: no matching files             
ERROR: No files to upload                          
Cleaning up file based variables
00:01
ERROR: Job failed: exit code 1

.env.local 是在 Kubernetes 中使用 NextJS ENV_VARS 的唯一方法吗?

我是否必须为此特定(和常见)应用部署自定义 Gilab AutoDevOps?

提前谢谢你,任何帮助将不胜感激

【问题讨论】:

  • 嘿,@Jan 希望你没事!你找到解决方案了吗?因为我的 nextjs 应用程序的部署遇到了同样的问题
  • @Valensto 如果您坚持使用 GITLAB 上的 Auto Devops,那么您必须将此 Gitlab ENV 变量 AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS 设置为 --build-arg=NEXT_PUBLIC_API_URL=http://your.domain.com/api docs.gitlab.com/ee/topics/autodevops/…

标签: kubernetes environment-variables next.js gitlab-ci


【解决方案1】:

如果你坚持使用 GITLAB 上的 Auto Devops,那么你必须设置这个 Gitlab ENV 变量 AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS 并将其设置为

--build-arg=NEXT_PUBLIC_API_URL=http://your.domain.com/api

在您的 Dockerfile 中,您可以通过以下方式分配它

    ARG NEXT_PUBLIC_API_URL
    ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL

更多信息在这里:

https://docs.gitlab.com/ee/topics/autodevops/customize.html#passing-arguments-to-docker-build

【讨论】:

    猜你喜欢
    • 2018-11-19
    • 2017-07-29
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多