【问题标题】:Herkoku Node Deployment with Subfolder带有子文件夹的 Heroku 节点部署
【发布时间】:2017-05-16 19:04:48
【问题描述】:

我现在尝试了几个小时,但不知道剩下的...也许你有一些:-)

我使用 react-starter-kit 作为我的 react-app 和 gitlab 作为我的存储库。我已启用 gitlab-ci 来部署我的应用并将其发送到 heroku。

好的,gitlab-ci 工作... 是的

但是 react-starter-kit 使用 /build 文件夹来提供所有资产和缩小的 etc 应用程序。

我如何能够通过 gitlab-ci 在 heroku 上获得可运行的应用程序? 我添加了具有以下内容的 Procfile: web: node ./build/server.js

heroku日志输出如下:

2017-01-02T16:57:54.655686+00:00 heroku[web.1]: State changed from crashed to starting
2017-01-02T16:57:58.721166+00:00 heroku[web.1]: Starting process with command `node ./build/server.js`
2017-01-02T16:58:00.987643+00:00 heroku[web.1]: Process exited with status 1
2017-01-02T16:58:00.995852+00:00 heroku[web.1]: State changed from starting to crashed
2017-01-02T16:58:00.997060+00:00 heroku[web.1]: State changed from crashed to starting
2017-01-02T16:58:00.833548+00:00 app[web.1]: module.js:471
2017-01-02T16:58:00.833561+00:00 app[web.1]:     throw err;
2017-01-02T16:58:00.833562+00:00 app[web.1]:     ^
2017-01-02T16:58:00.833563+00:00 app[web.1]:
2017-01-02T16:58:00.833564+00:00 app[web.1]: Error: Cannot find module '/app/build/server.js'
2017-01-02T16:58:00.833565+00:00 app[web.1]:     at Function.Module._resolveFilename (module.js:469:15)
2017-01-02T16:58:00.833566+00:00 app[web.1]:     at Function.Module._load (module.js:417:25)
2017-01-02T16:58:00.833567+00:00 app[web.1]:     at Module.runMain (module.js:604:10)
2017-01-02T16:58:00.833567+00:00 app[web.1]:     at run (bootstrap_node.js:394:7)
2017-01-02T16:58:00.833568+00:00 app[web.1]:     at startup (bootstrap_node.js:149:9)
2017-01-02T16:58:00.833569+00:00 app[web.1]:     at bootstrap_node.js:509:3
2017-01-02T16:58:07.230342+00:00 heroku[web.1]: Starting process with command `node ./build/server.js`
2017-01-02T16:58:10.416437+00:00 heroku[web.1]: State changed from starting to crashed
2017-01-02T16:58:10.398239+00:00 heroku[web.1]: Process exited with status 1
2017-01-02T16:58:10.271567+00:00 app[web.1]: module.js:471
2017-01-02T16:58:10.271583+00:00 app[web.1]:     throw err;
2017-01-02T16:58:10.271584+00:00 app[web.1]:     ^
2017-01-02T16:58:10.271584+00:00 app[web.1]:
2017-01-02T16:58:10.271585+00:00 app[web.1]: Error: Cannot find module '/app/build/server.js'
2017-01-02T16:58:10.271586+00:00 app[web.1]:     at Function.Module._resolveFilename (module.js:469:15)
2017-01-02T16:58:10.271586+00:00 app[web.1]:     at Function.Module._load (module.js:417:25)
2017-01-02T16:58:10.271587+00:00 app[web.1]:     at Module.runMain (module.js:604:10)
2017-01-02T16:58:10.271588+00:00 app[web.1]:     at run (bootstrap_node.js:394:7)
2017-01-02T16:58:10.271588+00:00 app[web.1]:     at startup (bootstrap_node.js:149:9)
2017-01-02T16:58:10.271588+00:00 app[web.1]:     at bootstrap_node.js:509:3

完成所有信息,我的gitlab-ci内容:

image: node:latest

stages:
  - deploy

before_script:
  - npm install

deploy:
  stage: deploy
  only:
    - master
  script:
    - npm run build -- --release
    - apt-get update -yq
    - apt-get install ruby-dev rubygems -y
    - gem install dpl
    - dpl --provider=heroku --app=nice-app --api-key=$HEROKU_API_KEY

请帮帮我!谢谢!

更新:

我的文件夹结构如下所示:

├── /build/
│   ├── /content/
│   ├── /public/
│   ├── /assets.js
│   ├── /package.json
│   ├── /server.js
├── /docs/
├── /node_modules/
├── /public/
├── /src/
│   ├── /components/
│   ├── /core/
│   ├── /data/
│   ├── /routes/
│   ├── /client.js
│   ├── /config.js
│   └── /server.js
├── /test/
├── /tools/
└── package.json

根 package.json 的内容如下所示:

{
  "private": true,
  "engines": {
    "node": ">=6.5",
    "npm": ">=3.10"
  },
  "dependencies": {
    ...
  },
  "devDependencies": {
    ...
  },
  "babel": {
    "presets": [
      "react",
      "node5",
      "stage-0"
    ],
    "env": {
      "test": {
        "plugins": [
          "rewire"
        ]
      }
    }
  },
  "eslintConfig": {
    "parser": "babel-eslint",
    "extends": "airbnb",
    "globals": {
      "__DEV__": true
    },
    "env": {
      "browser": true
    },
    "rules": {
      "arrow-parens": "off",
      "generator-star-spacing": "off",
      "import/extensions": "off",
      "import/no-extraneous-dependencies": "off",
      "react/forbid-prop-types": "off",
      "react/jsx-filename-extension": "off",
      "react/no-danger": "off",
      "react/no-unused-prop-types": "off"
    }
  },
  "stylelint": {
    "extends": "stylelint-config-standard",
    "rules": {
      "string-quotes": "single",
      "property-no-unknown": [
        true,
        {
          "ignoreProperties": [
            "composes"
          ]
        }
      ],
      "selector-pseudo-class-no-unknown": [
        true,
        {
          "ignorePseudoClasses": [
            "global",
            "local"
          ]
        }
      ]
    }
  },
  "scripts": {
    "lint:js": "eslint src tools",
    "lint:css": "stylelint \"src/**/*.{css,less,scss,sss}\"",
    "lint": "npm run lint:js && npm run lint:css",
    "test": "mocha \"src/**/*.test.js\" --require test/setup.js --compilers js:babel-register",
    "test:watch": "npm run test -- --reporter min --watch",
    "clean": "babel-node tools/run clean",
    "copy": "babel-node tools/run copy",
    "bundle": "babel-node tools/run bundle",
    "build": "babel-node tools/run build",
    "deploy": "babel-node tools/run deploy",
    "render": "babel-node tools/run render",
    "start": "babel-node tools/run start"
  }
}

构建文件夹中的 package.json 如下所示:

{
  "private": true,
  "engines": {
    "node": ">=6.5",
    "npm": ">=3.10"
  },
  "dependencies": {
    ...
  },
  "scripts": {
    "start": "node server.js"
  }
}

【问题讨论】:

  • 你能分享你的文件夹结构和你的 package.json 吗?
  • 我已经用您要求的数据更新了我的帖子。希望对您有所帮助并提前致谢。

标签: node.js reactjs heroku deployment gitlab-ci


【解决方案1】:

因此您可以在 gitlab YAML 文件中定义工件。这允许您将构建的文件从一个阶段传递到另一个阶段。

artifacts:
    paths:
    - node_modules/
    - build/

像这样。但是,当您将它传递给 heroku 的 dpl 库时,我发现它不会推动工件(仍然值得一提,因为您可以将构建阶段工件传递到测试阶段等)。

我对节点应用程序所做的是将"postinstall" 脚本添加到package.json npm 在npm install 完成后运行此脚本。

我不确定为什么你的 build 文件夹中有两个 package.json 文件,其中一个文件。您可以只使用项目根目录中的一个并添加这些脚本

"scripts": {
    "start": "node build/server.js",
    "postinstall": "npm run build"
    "dev": "babel-node tools/run start",
    "build": "babel-node tools/run build"
  }

Heroku 将在运行 npm install 后自动运行 npm run build,如果您愿意,您也可以在安装后将多个链接在一起。

"postinstall": "npm run lint && npm run build" 不知道如果 linter 返回问题,您是否要放弃构建,但希望您能理解。

我目前正在为将工件传递到 heroku 角度而苦苦挣扎。如果我解决了这个问题,我会回来发表评论

【讨论】:

  • 我让它工作了,结果你可以在每个阶段添加多个图像。因此,例如,您可以在部署阶段使用 ruby​​ 映像。我从构建阶段部署工件的方法是删除 .gitignore 然后添加所有工件,提交然后推送到heroku,就像gist.github.com/maxmckenzie/7b838d2acb4188d3129f4578bdf36a32
猜你喜欢
  • 2018-02-09
  • 2017-01-04
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2016-10-12
  • 2020-11-22
相关资源
最近更新 更多