J'essaye de déployer une application Next.js qui utilise un serveur Node.js personnalisé.
Je souhaite injecter des variables de construction personnalisées dans l'application:
env_variables: DOGE_ENV: production
Le fichier ci-dessus est exécuté au moment de la construction ( construction du fil ).
Le problème est que Google App Engine utilise Cloud Build en arrière-plan. Là, le NODE_ENV est toujours défini sur development . Comment puis-je remplacer le NODE_ENV ici; c'est-à-dire comment puis-je personnaliser le Cloud Build utilisé pour le gcloud app deploy de Google App Engine?
Je ne peux pas simplement utiliser Docker à cause de ce problème .
runtime: nodejs10
{
"name": "blah",
"version": "0.0.1",
"private": true,
"scripts": {
"dev": "NODE_ENV=staging node server.js",
"build": "rm -rf node_modules/ && yarn && rm -rf .next/ && next build",
"start": "node server.js",
"lint": "eslint . --ext .js",
"gcp-build": "yarn build"
},
"dependencies": {
"body-parser": "^1.18.3",
"dotenv": "^7.0.0",
"dotenv-webpack": "^1.7.0",
"express": "^4.16.4",
"express-session": "^1.16.1",
"firebase": "^5.10.0",
"firebase-admin": "^7.3.0",
"isomorphic-unfetch": "^3.0.0",
"lodash": "^4.17.11",
"next": "^8.1.0",
"now": "^15.0.6",
"react": "^16.8.6",
"react-dom": "^16.8.6",
"session-file-store": "^1.2.0",
"styled-components": "^4.2.0",
"yenv": "^2.1.0"
},
"devDependencies": {
"babel-eslint": "^10.0.1",
"eslint": "^5.16.0",
"eslint-config-airbnb": "^17.1.0",
"eslint-plugin-import": "^2.17.2",
"eslint-plugin-jsx-a11y": "^6.2.1",
"eslint-plugin-react": "^7.12.4"
},
"engines": {
"node": "10.x.x"
}
}
Vous trouverez ci-dessous la sortie de la transmission d'une variable DOGE_ENV depuis app.yaml . Comme vous pouvez le voir, il est indéfini . Cependant, NODE_ENV est un développement .
Autrement dit, l'ajout de ce qui suit à app.yaml ne fonctionne pas.
const NODE_ENV = process.env.NODE_ENV;
const envType = NODE_ENV === `production` ? `production` : `staging`;
const envPath = `./config/${envType}`;
const { env } = require(envPath);
module.exports = {
env: { ...env },
};
3 Réponses :
N'utilisez pas NODE_ENV, créez votre propre variable d'environnement et utilisez-la:
App.yaml
const environment = process.env.ST_ENV;
const envType = environment === `production` ? `production` : `staging`;
const envPath = `./config/${envType}`;
const { env } = require(envPath);
module.exports = {
env: { ...env },
};
suivant .config.js
env_variables: ST_ENV: Production
Merci pour la réponse, mais cela ne fonctionne pas, car l'environnement Cloud Build est l'environnement de compilation et les env_variables spécifiées dans app.yaml sont des variables d'exécution. Ainsi, process.env.ST_ENV sera indéfini lorsque next.config.js s'exécutera réellement.
J'ai ajouté une image de la sortie Cloud Build qui illustre ce problème.
J'ai eu le même problème, à la fin j'ai résolu le paramètre NODE_ENV = production dans le script package.json, donc dans votre cas, utilisez simplement:
{
"gcp-build": "NODE_ENV=production yarn build"
}
sinon vous pouvez créer un fichier de configuration Cloud Build, vérifiez le docs , il prend en charge une section env dans laquelle vous pouvez définir des variables d'environnement
J'ai eu le même problème et j'ai fini par utiliser une approche similaire à la réponse de Luca , mais avec un mécanisme pour remplacer le corriger la variable dans package.json avant le déploiement (à l'aide de microsoft / variable-substitution action GitHub dans mon cas).
Utilisez-vous Google Cloud Build pour compiler vos ressources de fil avant que votre application ne s'exécute dans Cloud Run / AppEngine? Ou s'agit-il d'un processus en cours d'exécution qui est généré dans l'instance Cloud Run / AppEngine en cours d'exécution?
Cloud build exécute
yarn buildqui construit l'application qui est servie parnode server.js. Je n'utilise pas directement Cloud Build, mais tous lesgcloud app deploysont associés à un Cloud Build utilisant leruntimedéclaré dansapp.yaml(dans ce cas,runtime: nodejs10).