Cloud Foundry(IBM Cloud)에서 Node.js의 최신 버전 사용

IBM Cloud의 Cloud Foundry, Node.js의 새 버전을 사용할 때 약간의 궁리가 필요했습니다.
ibmcloud cf push 에서 배포했을 때의 로그에서 추적하면 IBM Cloud측의 대응 상황과 Cloud Foundry측의 문서의 대응 상황이 약간 다른 것 같습니다.

Cloud Foundry는 원래 독립적이었지만 IBM에 흡수되었다는 것이었습니다 ...

우선 Node.js의 버전 지정이없는 경우



특히 버전을 지정하지 않고 배포하면 다음과 같은 경고가 발생했습니다.

디폴트가 Node.js v10계인 것 같습니다. 유석에 낡아서 경고가 나옵니다.
   Downloading app package...
   Downloaded app package (635.9K)
   -----> IBM SDK for Node.js Buildpack v4.6-20210305-2036
          Based on Cloud Foundry Node.js Buildpack 1.7.44
   -----> Installing binaries
          engines.node (package.json): unspecified
          engines.npm (package.json): unspecified (use default)
          **WARNING** Node version not specified in package.json or .nvmrc. See: http://docs.cloudfoundry.org/buildpacks/node/node-tips.html
          Attempting to install: 10.24.0
   -----> Installing node 10.24.0
          Copy [/tmp/buildpacks/73dd77c5b9dcb13eb662490e81ac9cf2/nodejs/dependencies/aaf73e55b7db4c30b2da7af326e10a54/node_10.24.0_linux_x64_cflinuxfs3_db472e29.tgz]
          **WARNING** node 10.x.x will no longer be available in new buildpacks released after 2021-04-01.
          See: https://github.com/nodejs/Release
          Using default npm version: 6.14.11
   -----> Installing yarn 1.22.10

package.json에 추가하여 Node.js 버전 지정


**WARNING** Node version not specified in package.json or .nvmrc.**WARNING** node 10.x.x will no longer be available in new buildpacks released after 2021-04-01. 라는 것이므로, 버전을 올려 보겠습니다.

package.json에 engines를 추가합니다.

package.json
省略

  "engines": {
    "node": "14.x"
  },

省略

덧붙여서, v15로 하려고 하면 화났습니다. 아직 대응하지 않은 모양입니다.
**ERROR** Unable to install node: no match found for 15.x in [10.23.3 10.24.0 12.20.2 12.21.0 14.15.5 14.16.0]

manifest.yml에 buildpacks를 지정하면 비교적 새 버전을 사용할 수 있습니다.



쓰기 시점이라면 Node.js v15.12.0이 최신입니다만, engines에 15.x를 지정하면 ↑로 쓴 에러가 되었습니다.

다만, Cloud Foundry의 nodejs-buildpack을 지정하는 것으로 최신을 이용할 수 있을 것 같습니다.

cloudfoundry/nodejs-buildpack

여기를 보면, 집필 시점에서 Node.js v15.11.0까지 대응해 그랬습니다.
(약간 최신은 아니지만 거의 최신에 추종하는 것처럼)

방금전까지는 manifest.yml 에 buildpacks의 지정을 하지 않고 배포하고 있었습니다만, 이하와 같이 지정하면 buildpacks에 https://github.com/cloudfoundry/nodejs-buildpack 를 지정하면 최신 버젼의 이용할 수 있습니다. (현상이라면 Node.js v15.11.0까지 대응)

manifest.yml
---
applications:
 - name: n0bisuke-testapp
   random-route: true
   memory: 64M
   buildpacks:
    - https://github.com/cloudfoundry/nodejs-buildpack

이제 v15 시스템을 사용할 수 있으므로 package.json에서도 지정합니다.

package.json
省略

  "engines": {
    "node": "15.x"
  },

省略

덧붙여서, process.versions 로 버젼 정보를 확인할 수 있으므로, 이하와 같은 코드를 썼습니다.

server.js
const express = require('express')
const app = express()

app.get('/', function (req, res) {
  res.send(JSON.stringify(process.versions))
})
const port = process.env.PORT || 3000

app.listen(port)

배포하고 확인하면 이런 느낌이었습니다.



v15.11.0입니다.

보충: 다른 명세 방법



IBM Cloud측의 문서에 있는 지정의 방법이라고 이하와 같이 기술할 수 있습니다만, 이쪽을 이용했을 경우 적용된 것이 v15.7. 0과 약간입니다만 낡은 것 같습니다.

h tps : // c ぉ d. 이 bm. 이 m/도 cs/cぉ우 d후응 dry? 토피 c = c ぉ u ぉ 응 dry - p ぉ y_ 아 ps & ぉ ぇ = 그럼

manifest.yml
---
applications:
 - name: n0bisuke-testapp
   random-route: true
   memory: 64M
   buildpack: nodejs_buildpack

방금전은 buildpacks 로 URL 지정이었습니다만, 이쪽은 buildpack 그리고 이름 지정이라고 하는 차이군요.

참고 : 배포 시간이 길 수 있습니다.



체감적으로, buildpacks를 지정한 배포는 배포 시간이 길다고 생각합니다.

v15계에서도 v14계에서도 괜찮다면 buildpacks를 지정하지 않고 14계를 사용하는 것이 배포는 빠를지도 모릅니다.

지정하지 않으면 Swift의 빌드 팩 등 관계없는 것도 다운로드하고 그러한 로그가 표시됩니다만, 이쪽이 배포 시간이 짧은 생각이 있다는 수수께끼 상태 (체감이므로 제대로 조사해 없음)

요약



현시점의 버전입니다만 이하와 같은 대응 상황이었습니다.
  • 전혀 지정 없음
  • v10

  • engines로 지정
  • v14 시스템까지 사용 가능

  • manifest.json에서 빌드 팩 지정
  • buildpacks에서 URL 지정 : v15.11.0까지 사용 가능
  • buildpack에서 명명 : v15.7.0까지 사용 가능

  • 좋은 웹페이지 즐겨찾기