从 v2.7.0.beta1 升级到 v2.7.0.beta2 失败

请查看此 gist gist:86508bebb133a06f79fadaeba345e3d6 · GitHub

这是一个标准的独立 Discourse 安装,正尝试从 v2.7.0.beta1 升级到 v2.7.0.beta2

失败信息如下:

uglifyjs '/var/www/discourse/public/assets/_vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js' -m -c -o '/var/www/discourse/public/assets/vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js' --source-map "base='/var/www/discourse/public/assets',root='/assets',url='/assets/vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js.map'"
Parse error at _vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js:1850,34
        return Handlebars.compile(...arguments);
                                  ^
ERROR: Unexpected token: punc «.»
    at JS_Parse_Error.get (eval at <anonymous> (/usr/lib/node_modules/uglify-js/tools/node.js:18:1), <anonymous>:71:23)
    at fatal (/usr/lib/node_modules/uglify-js/bin/uglifyjs:394:27)
    at run (/usr/lib/node_modules/uglify-js/bin/uglifyjs:343:9)
    at Object.<anonymous> (/usr/lib/node_modules/uglify-js/bin/uglifyjs:259:5)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
rake aborted!
Errno::ENOENT: No such file or directory @ rb_file_s_size - /var/www/discourse/public/assets/vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js
/var/www/discourse/lib/tasks/assets.rake:287:in `size'
/var/www/discourse/lib/tasks/assets.rake:287:in `block (4 levels) in <main>'
/var/www/discourse/lib/tasks/assets.rake:178:in `block in concurrent?'
/var/www/discourse/lib/tasks/assets.rake:278:in `block (3 levels) in <main>'
/var/www/discourse/lib/tasks/assets.rake:269:in `each'
/var/www/discourse/lib/tasks/assets.rake:269:in `block (2 levels) in <main>'
/var/www/discourse/lib/tasks/assets.rake:178:in `concurrent?'
/var/www/discourse/lib/tasks/assets.rake:266:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.3/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => assets:precompile
(See full trace by running task with --trace)
Docker Manager: FAILED TO UPGRADE

有任何建议吗?因此网站已离线。谢谢。

这有点令人不安。你的磁盘空间是否已满,或者有其他类似的问题?

嗨,不是的——在宿主机上,还有 70GB 的可用空间。Inode 的使用率仅为 1%。

我原本以为“没有这样的文件或目录”错误只是由以下情况引起的副作用:

Parse error at _vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js:1850,34
        return Handlebars.compile(...arguments);
                                  ^
ERROR: Unexpected token: punc «.»

该文件确实存在:

root@redmine:/var/discourse# ./launcher enter app
ls -al ls -al root@xxxxx-app:/var/www/discourse# ls -al /var/www/discourse/public/assets/vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js
-rw-r--r-- 1 discourse www-data 659907 Jan 22 04:55 /var/www/discourse/public/assets/vendor-b631d4ab0775fdbe453aa2158e18dc41826d0ba619e5f2731e5b9fa4c458af99.js

我不太确定。我自己升级了两个自托管实例,一切都很顺利。

是否有不寻常的插件、第三方插件,或大量的自定义配置?

谢谢……完全没有使用任何插件或进行重度定制……这基本上是在 2020 年底进行的全新安装,只是通过管理界面微调了一些设置,例如版主权限等。非常奇怪。

遗憾的是,我在执行升级前没有进行备份,不过我有几天前的一些自动备份。我想目前我只能靠这个来解决了……由于我不熟悉 Ruby,完全不知道该如何排查这个错误。

啊,看来运行 ./launcher restart app 至少让它重新上线了,尽管已经执行了数据库架构更新。在此之前,它一直返回 500 错误。呼,好险。

这是插件目录中的内容,我推测它们是随核心安装自带的,因为我并未手动添加任何插件。

root@redmine-app:/var/www/discourse# ls -al plugins/
total 12
drwxr-xr-x 22 discourse discourse 4096 Nov  4 04:54 .
drwxr-xr-x 56 discourse discourse 4096 Jan 22 04:55 ..
drwxr-xr-x 13 discourse discourse   43 Nov  4 04:54 discourse-details
drwxr-xr-x 16 discourse discourse   54 Nov  4 04:54 discourse-local-dates
drwxr-xr-x 20 discourse discourse   69 Jan 22 04:55 discourse-narrative-bot
drwxr-xr-x 11 discourse discourse   59 Nov  4 04:54 discourse-presence
drwxr-xr-x 19 discourse root      4096 Jan 22 04:43 docker_manager
drwxr-xr-x  4 discourse discourse   51 Sep 28 05:11 lazy-yt
drwxr-xr-x 25 discourse discourse   99 Nov  4 04:54 poll
drwxr-xr-x  8 discourse www-data   129 Nov  4 04:54 styleguide

重启后站点主题有些损坏,我猜是因为资源尚未完成编译。不知道是否有办法手动将其完成。

这是供应商 JS 文件中报错的部分:

// allow us to import this as a module
if (typeof define !== "undefined") {
  define("handlebars", ["exports"], function (__exports__) {
    // It might not be defined server side, which is OK for pretty-text
    if (typeof Handlebars !== "undefined") {
      // eslint-disable-next-line
      __exports__.default = Handlebars;
      __exports__.compile = function () {
        // eslint-disable-next-line
        return Handlebars.compile(...arguments);
      };
    }
  });

  define("handlebars-compiler", ["exports"], function (__exports__) {
    // eslint-disable-next-line
    __exports__.default = Handlebars.compile;
  });
}
;

第 1850 行(报错所在行)是这一段:

        return Handlebars.compile(...arguments);

有什么临时的变通方法可以绕过这个问题吗?还是说每次尝试升级时这个文件都会重新生成?(顺便一提,重启后系统认为我已经完成升级,但主题已经失效……我在想是否有什么办法能跳过这一步,或者我是不是必须从备份恢复,基本上就是……)

代码中的整个这部分内容来自以下文件:

app/assets/javascripts/handlebars-shim.js

我猜 uglify-js 将 return Handlebars.compile(...arguments); 视为语法错误。

我不理解的是,这怎么会是我安装环境独有的问题,毕竟这一切都在 Docker 容器内部。

我想这应该是从这个提交中来的吧?DEV: Sync up more Ember CLI features (#11790) · discourse/discourse@83347ac · GitHub

好的——我不太清楚原因,但我执行了手动升级流程(git pull; ./launcher rebuild app),结果成功了。

许多其他操作(如 PostgreSQL 升级等)也作为该手动升级的一部分完成了。

我的猜测是:上述提交中的某些内容与原容器中的 uglify-js 或 Rails 版本(或其他依赖)不兼容。这本质上是一次需要执行“手动”升级流程的更新。

由于 Web 管理界面允许我先升级 docker_manager,然后再升级 Discourse 应用本身,我原本以为不需要手动操作(我知道有时 Web 管理界面会提示无法通过网页执行升级,必须手动进行……但这次并没有出现这种情况,而按理说应该会出现的……)

无论如何,感谢你的帮助。

我也遇到了同样的问题——网页升级因“Unexpected token: punc”错误而失败,但手动拉取和重新构建成功了。

运行此更新(Web 升级)时也遇到了问题::disappointed_face:
执行以下命令后:
cd /var/discourse
git pull
./launcher rebuild app
Discourse 可以正常运行,但无法进入管理面板(/admin)。

Ubuntu 更新帮助恢复了功能。

公告称您需要通过命令行重新构建。我不确定为何 Web 界面未意识到应强制执行此操作。

有趣的是,我刚才在开发环境中尝试使用这个功能,但它对我不起作用……Handlebars 对象只有 create(),没有 compile(),尽管我可能找错了方向……我已在以下链接提出:Adding a bespoke raw template