You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

GitLab Shell Runner执行Node.js命令提示not found问题求助

解决GitLab Shell Runner找不到Node.js和Docker命令的问题

我来帮你搞定这个问题!Shell Runner执行时找不到nodenpm或者docker命令,本质是Runner的执行环境和你主机登录后的环境变量不一样——默认情况下,Shell Runner用非登录shell启动,不会加载.bashrc.profile这类配置文件,所以nvm的Node.js路径和Docker的路径可能没被包含进去。

一、明确问题根源

你主机的$PATH包含了/root/.nvm/versions/node/v10.16.3/bin/usr/bin(Docker所在路径),但Runner执行时的$PATH是独立的,大概率没包含这些路径,所以才会提示“命令找不到”。

二、具体解决方案

1. 让Runner加载Node.js(nvm)环境

nvm的配置放在用户的~/.nvm/nvm.sh里,Runner默认不会加载它,所以需要在before_script里手动加载:

before_script:
  # 加载nvm环境配置,让node和npm命令可用
  - source /root/.nvm/nvm.sh
  # 可选:验证加载效果,输出node版本
  - node -v

如果不想依赖nvm,也可以直接用Node.js的绝对路径,比如/root/.nvm/versions/node/v10.16.3/bin/node -v,不过加载nvm更灵活,后续Node版本更新不用改路径。

2. 确保Docker命令能被找到

虽然你主机的$PATH包含/usr/bin,但Runner环境可能没同步,所以可以直接把Docker路径加到Runner的$PATH中:

before_script:
  - source /root/.nvm/nvm.sh
  # 将Docker所在路径加入Runner的环境变量
  - export PATH=$PATH:/usr/bin

也可以直接用Docker的绝对路径(比如/usr/bin/docker ps),修改PATH则更方便后续所有Docker命令的使用。

3. 修改后的完整gitlab-ci.yml示例

stages:
  - build-vf
  - deploy-vf

build-min-code-vf:
  stage: build-vf
  tags:
    - branch/angular8/VF
  only:
    - branch/angular8/VF
  artifacts:
    paths:
      - dist/testprofilefrontend-app/
  before_script:
    - source /root/.nvm/nvm.sh
    - export PATH=$PATH:/usr/bin
  script:
    - node -v
    - npm install
    - ng build --prod

deploy-production:
  stage: deploy-vf
  tags:
    - branch/angular8/VF
  only:
    - migration/angular8/VF
  before_script:
    - source /root/.nvm/nvm.sh
    - export PATH=$PATH:/usr/bin
  script:
    - dockerAll=$(/usr/bin/docker ps -a --filter="name=VF-FRONTEND" -q | xargs)
    - dockerImage=$(/usr/bin/docker images | grep "<image_name>")
    - if [ ! -z "$dockerAll" ]; then 
        /usr/bin/docker rm $dockerAll -f && 
        /usr/bin/docker image build -t <image_name> . && 
        /usr/bin/docker container run -d -v <dir_name> -p 8082:8080 --name <name> <image_name> && 
        /usr/bin/docker push <image>; 
      else 
        /usr/bin/docker image build -t <image_name> . && 
        /usr/bin/docker container run -d -v <dir_name> -p 8082:8080 --name <name> <image_name> && 
        /usr/bin/docker push <image_name>; 
      fi;

(注:这里把Docker命令改成绝对路径是双重保险,避免PATH修改不生效的情况)

三、额外排查技巧

如果还是有问题,可以在script开头加一行echo $PATH,查看Runner执行环境的$PATH包含哪些路径,确认Node.js和Docker路径是否在其中;也可以用which nodewhich docker检查命令是否能被找到,方便快速定位问题。

内容的提问来源于stack exchange,提问作者sd1517

火山引擎 最新活动