I am using Travis to run CI tests for our electrum packages.
Two weeks ago, my tests started to fail with a mysterious error
and I was unable to reproduce the problem on my machine:
No such file or directory
Running Travis CI in a local docker container
I decided to troubleshoot Travis locally in a Docker image as
explained on the Travis site.
For this, I first insalled the latest version of Docker for Windows
on my Windows 10 laptop.
Then, I got down to the command line in order to pull a pre-configured
Travis docker image and make sure that it was using the expected node
and npm versions:
docker run --name travis -dit quay.io/travisci/travis-ruby /sbin/initdocker exec -it travis bash -lnvm install 5.10nvm use 5.10node --version→v5.10.1npm --version→3.8.3
After that, I cloned and tried to install my project:
git clone https://github.com/epsitec-sa/electrum.gitcd electrumnpm install
At that point, I had the same error message on my machine than what I was getting from Travis:
No such file or directory
Great.
Investigating locally, just like a Unix guru
I searched the web and found several mentions of people
having trouble to get node to work properly when sudo was used
in an nvm environment.
In my case, doing the nvm install and nvm use would not allow
me to do sudo node --version either. So I suspected that I would
have to solve that issue
in order to get my Travis CI scripts to complete the tests.
My hash-bang fails!
In my case, the package electrum-require-components could not be
executed. The definition of its package.json file pointed to a *.js
file as its binary:
1{
2 ...
3 "main": "lib/index.js",
4 "bin": {
5 "electrum-require-components": "./bin/bin.js"
6 },
7 ...
8}
and bin.js was a very simple file starting with a hash-bang:
1#!/usr/bin/env node
2
3require ('../lib/index.js');
By applying the nvm hack found on
stack overflow,
I was able to get my tests to run. But I did not find this solution to be
really satisfying, as I have other packages which also rely on JavaScript
node scripts, and which work without the hack.
When following the naming conventions helps
I finally solved my problem by renaming bin.js
to electrum-require-components.
So, did I trip on some weird behaviour
in npm? Probably, but this no longer matters, since I have a functional
CI again, and a lot of real work to do.