GitLab CI/CD部署失败:dpl命令未找到问题求助
嘿,我帮你捋捋这个问题:明明日志里显示gem install dpl已经成功装好了dpl-1.9.6,但一执行dpl命令就提示找不到,这核心原因就是dpl的可执行文件所在的路径没被加到当前Shell的PATH环境变量里,系统找不到它。
从你给的日志和.gitlab-ci.yml来看,之前能正常运行现在突然出问题,大概率是ruby:latest镜像更新了,导致gem默认的安装路径不在系统默认PATH里了。下面给你几个靠谱的解决方案:
方案1:安装后手动把gem的bin路径加入PATH
这是最灵活的方法,不管镜像怎么变,都能自动找到正确的路径。修改production阶段的script部分:
production: type: deploy stage: production image: ruby:latest script: - apt-get update -qy - apt-get install -y ruby-dev - gem install dpl # 把gem的bin目录加到PATH里 - export PATH=$(gem environment gemdir)/bin:$PATH - dpl --provider=heroku --app=quailapp --api-key=$HEROKU_PRODUCTION_API_KEY only: - master
gem environment gemdir会自动输出当前gem的安装根目录,拼上/bin就是dpl所在的位置,把它加到PATH最前面,系统就能找到这个命令了。
方案2:直接用dpl的完整路径执行
如果你不想改PATH,也可以直接指定dpl的完整路径。根据日志里的Ruby版本(2.3.3),路径大概是/root/.gem/ruby/2.3.0/bin/dpl,修改后的script:
production: type: deploy stage: production image: ruby:latest script: - apt-get update -qy - apt-get install -y ruby-dev - gem install dpl - /root/.gem/ruby/2.3.0/bin/dpl --provider=heroku --app=quailapp --api-key=$HEROKU_PRODUCTION_API_KEY only: - master
不过这个方法有点死板,如果以后镜像里的Ruby版本变了,路径也要跟着改,不如方案1省心。
方案3:用bundler来管理,更规范还能固定版本
如果想长期稳定,推荐用bundler来管理dpl的安装和执行,还能固定版本避免意外更新出问题。
首先在你的项目根目录创建一个Gemfile文件:
source 'https://rubygems.org' gem 'dpl', '1.9.6' # 固定你之前用的版本
然后修改.gitlab-ci.yml的production阶段:
production: type: deploy stage: production image: ruby:latest script: - apt-get update -qy - apt-get install -y ruby-dev - gem install bundler - bundle install - bundle exec dpl --provider=heroku --app=quailapp --api-key=$HEROKU_PRODUCTION_API_KEY only: - master
bundle exec会自动找到bundler安装的dpl路径,不用操心PATH的问题,还能保证每次用的都是你指定的版本,稳定性更高。
至于为什么之前正常现在突然出错,大概率是ruby:latest镜像更新了,默认的PATH配置或者gem安装路径变了,导致原来的环境找不到命令了。
内容的提问来源于stack exchange,提问作者Jees K Denny

