Gitlab CI 设置错误 - 找不到 JavaScript 运行时

Posted

技术标签:

【中文标题】Gitlab CI 设置错误 - 找不到 JavaScript 运行时【英文标题】:Gitlab CI setup error - Could not find a JavaScript runtime 【发布时间】:2016-11-22 01:53:39 【问题描述】:

我正在尝试为我的 Ruby on Rails 项目设置 Gitlab CI,但遇到了一个我不知道如何修复的错误。

应用程序在 Ruby 2.3.1、Rails 5.0 上运行,并使用 postgreSQL 数据库。

我当前的 .gitlab.ci.yml 文件如下所示:

# https://hub.docker.com/r/library/ruby/tags/
image: "ruby:2.3.0"

# Pick zero or more services to be used on all builds.
# Only needed when using a docker container to run your tests in.
# Check out: http://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-service
services:
  - redis:latest
  - postgres:latest
  - node:latest

# This is a basic example for a gem or script which doesn't use
# services such as redis or postgres
before_script:
  - gem install bundler         # Bundler is not installed with the image
  - bundle install -j $(nproc)  # Install dependencies

rubocop:
  script:
  - rubocop

rspec:
  script:
  - rspec spec

rails:
  script:
  - rails db:migrate
  - rspec spec

所以它应该使用 NodeJS 作为运行时。但是,我收到以下错误:

$ rails db:migrate
rails aborted!
Bundler::GemRequireError: There was an error while trying to load the gem 'uglifier'.
Gem Load Error is: Could not find a javascript runtime. See https://github.com/rails/execjs for a list of available runtimes.
Backtrace for gem load error is:
/usr/local/bundle/gems/execjs-2.7.0/lib/execjs/runtimes.rb:58:in `autodetect'
/usr/local/bundle/gems/execjs-2.7.0/lib/execjs.rb:5:in `<module:ExecJS>'
/usr/local/bundle/gems/execjs-2.7.0/lib/execjs.rb:4:in `<top (required)>'
/usr/local/bundle/gems/activesupport-5.0.0.rc2/lib/active_support/dependencies.rb:293:in `require'
/usr/local/bundle/gems/activesupport-5.0.0.rc2/lib/active_support/dependencies.rb:293:in `block in require'
/usr/local/bundle/gems/activesupport-5.0.0.rc2/lib/active_support/dependencies.rb:259:in `load_dependency'
/usr/local/bundle/gems/activesupport-5.0.0.rc2/lib/active_support/dependencies.rb:293:in `require'
/usr/local/bundle/gems/uglifier-3.0.0/lib/uglifier.rb:5:in `<top (required)>'

【问题讨论】:

你有没有在你的系统上安装过 NodeJS?这是在什么系统上的? @miccet 这是系统:about.gitlab.com/gitlab-ci 【参考方案1】:

在这种情况下,Gitlab-CI 可以使用文件.gitlab-ci.yml 进行配置:

before_script:
- apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs

可用于在设置阶段安装nodejs (source)。

带有 jekyll 的完整 before_script 可能类似于以下代码(例如,这是 jekyll-minifier 所必需的):

image: ruby:latest

variables:
  JEKYLL_ENV: production
  LC_ALL: C.UTF-8

before_script:
  - apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs
  - ruby -v
  - which ruby
  - gem install bundler
  - bundle install

test:
  stage: test
  script:
  - bundle exec jekyll build -d test
  artifacts:
    paths:
    - test
  except:
  - master

pages:
  stage: deploy
  script:
  - bundle exec jekyll build -d public
  artifacts:
    paths:
    - public
  only:
  - master

【讨论】:

【参考方案2】:

您需要有一个 javascript 运行时(例如 nodejs)。您可以使用以下命令安装它:

对于 Ubuntu 用户

sudo apt-get install nodejs

CentOS / RedHat 用户

sudo yum install nodejs

如果您无法安装nodejs,您可以安装然后使用therubyracer gem。

来自存储库的描述:

将 V8 JavaScript 解释器嵌入到 Ruby 中。

将此行添加到您的Gemfile

gem 'therubyracer', platforms: :ruby

【讨论】:

必须在此文件中定义所有内容。如您所见,它使用 docker 包来设置环境。以上对于您可以真正访问的系统是有效的,但对于此 CI 服务器 (about.gitlab.com/gitlab-ci),情况并非如此。 @Severin 据我所知 docker services 它是一个独立的实例,但您需要 nodejs 在带有导轨的实例上 是的。但问题是,您无法在 Gitlab CI 上运行这些设置命令,如上所示。所以简单地将它添加到before_script 部分会给你一个错误。你认为它可以在这种环境下如何设置? @Severin hm,我看到两种方法:1)将gem 'therubyracer', platforms: :ruby 添加到gemfile 2)编辑dockerfile 添加 gem 'therubyracer', platforms: :ruby 为我解决了这个特殊问题。

以上是关于Gitlab CI 设置错误 - 找不到 JavaScript 运行时的主要内容,如果未能解决你的问题,请参考以下文章

Gitlab CI:找不到构建阶段的输出

gitlab-runner 找不到 git

Latexmk:在 Gitlab CI 中找不到命令

在 kotlin 中找不到我的 GitLab CI 测试

为啥 GitLab Ci 找不到我的缓存文件夹?

如何设置动态 gitlab-ci 文件