ENV_VARS «не определено» при развертывании следующего приложения JS через Gitlab CI/CD в кластере Kubernetes:

# #kubernetes #environment-variables #next.js #gitlab-ci

Вопрос:

Я занимаюсь этой проблемой уже довольно долго:

У меня есть стандартное приложение NextJS, которое использует переменные среды (как на стороне клиента NEXT_PUBLIC_MY_VAR , так и на стороне сервера MY_OTHER_VAR ).

Я использую автозаводы Gitlab CI-CD с крошечным пользовательским .gitlab-ci.yml файлом (см. Ниже).

У меня есть успешное подключение к кластеру Kubernetes с помощью Gitlab, и мое приложение NextJS также успешно развертывается. (Кэш Gitlab/K8s тоже очищен)

Единственное, с чем я борюсь process.env.ENV_VARS , — это бежать. Что бы я ни пробовал, они есть undefined .

Я развернул свое приложение вручную в кластере и смонтировал карту конфигурации для своего развертывания ( так .env.local что файл присутствует /app/.env.local
ТОЛЬКО ТОГДА ENV_VARS , когда они установлены правильно.

Итак, как настроить ENV_VARS при развертывании моего приложения NextJS с помощью Gitlab Auto DevOps?

Я пытался до сих пор:

  • настройка ENV_VARS в Gitlab -> Настройки ->> CI/CD ->>> Переменные

Gitlab ENV Vars

  • Я добавил ARG в свой файл Dockerfile, который должен использовать параметры Gitlab CI при создании образа Docker:
 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"]
 
  • I have also added the ENV_VARS also in my next.config.js
 
module.exports = withSvgr({
    serverRuntimeConfig: {},
    publicRuntimeConfig: {
        NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,
        API_URL: process.env.API_URL,
    },
});

 
  • I also added a custom .gitlab-ci.yml file (complete file here):

yaml
include:
— template: Auto-DevOps.gitlab-ci.yml

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

This is the error message in my 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
 

And is the code that the error refers to:

 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()
);
 

and for completeness (but mostly useless) the tail of the failing job (which seems the normal error when K8s not responding):

 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
 

is .env.local the only way to use NextJS ENV_VARS in Kubernetes?

Do I have to customize the Gilab AutoDevOps for this particular (and common) app deployment?

Thank you in advance, any help would be appreciated