Search code examples
pythonruby-on-railsnpmwebpacker

rails deployment fails on asset precompilation due to npm/pyton issue


In the process of deploying to a Ubuntu 20.04 server

      01 $HOME/.rbenv/bin/rbenv exec bundle exec rake assets:precompile
      01 yarn install v1.22.19
      01 [1/4] Resolving packages...
      01 [2/4] Fetching packages...
      01 [3/4] Linking dependencies...
      01 warning " > [email protected]" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
      01 warning "webpack-dev-server > [email protected]" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
      01 [4/4] Building fresh packages...
      01 error /home/deploy/mainapp/releases/20230403051422/node_modules/node-sass: Command failed.
[...]
      01 gyp verb clean removing "build" directory
      01 gyp verb command configure []
      01 gyp verb check python checking for Python executable "python2" in the PATH
      01 gyp verb `which` failed Error: not found: python2
      01 gyp verb `which` failed     at getNotFoundError (/home/deploy/mainapp/shared/node_modules/which/which.js:13:12)
...
      01 gyp verb check python checking for Python executable "python" in the PATH
      01 gyp verb `which` failed Error: not found: python
      01 gyp verb `which` failed     at getNotFoundError (/home/deploy/mainapp/shared/node_modules/which/which.js:13:12)
[...]
     01 gyp ERR! stack Error: Can't find Python executable "python", you can set the PYTHON env variable.
      01 gyp ERR! stack     at PythonFinder.failNoPython (/home/deploy/mainapp/shared/node_modules/node-gyp/lib/configure.js:484:19)
[... concluding with]
    01 gyp ERR! command "/usr/bin/node" "/home/deploy/mainapp/shared/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="
      01 gyp ERR! cwd /home/deploy/mainapp/shared/node_modules/node-sass
      01 gyp ERR! node -v v18.15.0
      01 gyp ERR! node-gyp -v v3.8.0
      01 gyp ERR! not ok

Investigating: /usr/bin has two directories python3 and python3.8. Yet, the deploy seems to hunt for python or python2...

This did not occur on another deployment for the same app on a different machine, still with Ubuntu 20.04.

The intricacies of npm, python and webpack are confounding.

What needs to be done to get the asset precompilation to complete?


Solution

  • As per @Alex comments, node-gyp 3.8.0 is the offending party. why?

    Using yarn tool why

    yarn why node-gyp
    yarn why node-sass
    

    allows one to climb up the dependencies structure. In this case it was @rails#webpacker requiring these elements.

    Along the way, a number of banana peels are laid out for one's pleasure, convenience and forced learning:
    • a pre-set rails application may have the gem version cast. It may be old.
    • that gem may, in fact, not be in synch with the content of the package.json settings.
    • even then, updating the gem will not percolate to the yarn eco-system
    • one can run yarn install subsequently on the origin machine & attempt deploy. Odds are development will succeed.
    • oddly, development and production will not have identical behaviours, at least with respect to CSS (I really never understood why CSS had to be handled like JS - as if they were conceived by the same minds)
    • a final cherry on the bananas: production would still not deploy, even though one could successfully execute yarn install or RAILS_EN=production bundle exec rake assets:precompile on the latest release of the production server
    • the previous iteration (either or both of yarn install and asset precompilation) was required to finally allow a successful production deployment.