帮助部署旧版本的 Discourse

这里应该有一个错误,我尝试通过标签拉取v3.6.0.beta2,结果遇到下面的错误:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && sudo -H -E -u discourse bash -c '
  set -o errexit
  git fetch --tags --prune-tags --prune --force origin
  if [[ $(git symbolic-ref --short HEAD) == v3.6.0.beta2 ]] ; then
      git pull
  else
      git -c advice.detachedHead=false checkout v3.6.0.beta2
  fi
' failed with return #<Process::Status: pid 146 exit 128>
Location of failure: /usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups/exec_command.rb:138:in 'Pups::ExecCommand#spawn'
exec failed with the params {"cd" => "$home", "hook" => "code", "cmd" => ["sudo -H -E -u discourse git clean -f", "sudo -H -E -u discourse bash -c '\n  set -o errexit\n  git fetch --tags --prune-tags --prune --force origin\n  if [[ $(git symbolic-ref --short HEAD) == $version ]] ; then\n      git pull\n  else\n      git -c advice.detachedHead=false checkout $version\n  fi\n'", "sudo -H -E -u discourse git config user.discourse-version $version", "mkdir -p tmp", "chown discourse:www-data tmp", "mkdir -p tmp/pids", "mkdir -p tmp/sockets", "touch tmp/.gitkeep", "mkdir -p                    /shared/log/rails", "bash -c \"touch -a           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log\"", "bash -c \"ln    -s           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log $home/log\"", "bash -c \"mkdir -p           /shared/{uploads,backups}\"", "bash -c \"ln    -s           /shared/{uploads,backups} $home/public\"", "bash -c \"mkdir -p           /shared/tmp/{backups,restores}\"", "bash -c \"ln    -s           /shared/tmp/{backups,restores} $home/tmp\"", "chown -R discourse:www-data /shared/log/rails /shared/uploads /shared/backups /shared/tmp", "[ ! -d public/plugins ] || find public/plugins/ -maxdepth 1 -xtype l -delete"]}
bootstrap failed with exit code 128
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
adc8ef45e9ae880827c9294dbbf73dfe9ab413a050c83fe3f4722c2911876ce2

version只支持分支,不支持标签!

正确的应该是

params:
  version: release/2025.11

根本原因是git symbolic-ref --short HEAD命令只能返回分支名称。如果需要支持标签或者hash需要改成下面的命令

git describe --exact-match --tags 2>/dev/null || git rev-parse --short HEAD

但是,不建议这么改,过多的自定义将导致潜在的技术债。除非官方自己修改。

至于我为什么要拉取release/2025.11因为现在生产环境是这个接近的版本,然后我想升级,但是怕出现问题,而且审核流程不允许我直接操作升级,必须先在测试环境验证升级过程(release/2025.11=>release/2026.1)没问题才能在生产环境操作。虽然这有些啰嗦,但是确实是流程正确的最佳选择。于是,我不得不在这里寻找拉取特定分支或标签的方法。

抱歉说了这么多废话。幸运的是,现在找到了还算过得去的解决方法。感谢大家。

我继续更新这个修改造成的其他影响:

安装特定分支实现了,但是想从这个分支验证升级失败了。因为在更新页面,检测不到最新的更新,导致无法在页面上操作更新。

1 个赞

继续之前的话题,现在发现了新的问题。当本地代码库比较旧时,将导致前端编译失败或者其他错误。所以,在开始所有修改之前,必须把本地代码库更新为最新版本。

# 如果之前修改了本地代码库的,请先暂存一下
# git stash

# 更新到最新
git pull

# 重新应用暂存的代码,或者重新编辑对应的配置文件
# git stash pop

当本地库更新为最新版之后,才能安装之前的步骤顺利完成指定分支的构建。

这里指的本地代码库是:https://github.com/discourse/discourse_docker.git

即标准安装后的代码库。

最后来一个总结。

我们的需求是:安装指定版本

  1. 更新本地代码库https://github.com/discourse/discourse_docker.git
# 进入项目根目录
cd /var/discourse
# 更新到最新版
git pull
  1. 修改要指定的版本

修改 templates/web.template.yml

params:
  version: release/2026.1
  1. 重新构建
./launcher rebuild app

这样修改后,后面要更新升级的步骤是先更新本地代码库,但是因为我们修改了本地代码,可能会修改失败,所以大概率需要暂存本地代码 git stash,或者放弃本地修改 git restore templates/web.template.yml ,然后 git pull,确保本地代码库是最新的。然后指定要部署的分支,最后重新构建。这个说明适用于想从release/2026.1 升级到 release/2026.7的场景。

如果你只是想升级已经安装好的release/2026.1,那么应该直接在管理后台点击升级就行了。这适用于release/2026.1有更新(尤其是漏洞修复)的场景。

我认为配置特定版本(而非口味/流/标签,如 latest 或 stable)会非常不寻常。实际上,我目前也不确定在此系统中哪些标签是正常、可用且有用的。

您是否查看过 https://meta.discourse.org/t/configure-a-supported-tracking-branch-to-get-discourse-software-updates/17014/1?这可能有助于了解哪些标签是有用的。

是的,普通用户使用默认的latest就足够了。但是对应我这种场景来说,不得不研究如何使用特定版本。我总不能对boss说:“哦,很遗憾,Discourse暂时不支持检出特定版本,我们只能更新到最新版。”

这个帖子非常有用,我将仔细看一下。感谢。

我之前没注意到这个——谢谢。看来我们现在应该使用 latest/release/esr。我看到我自己的(旧的)app.yml 通过被注释掉而采用了默认设置:

  ## 此容器应使用哪个 Git 修订版本?(默认:tests-passed)
  #version: tests-passed

version 目前不支持标签,如果要支持,需要修改构建的脚本。本来最佳实践是:

params:
  version: esr

但是目前,不得不修改成

params:
  version: release/2026.1
1 个赞

有趣。即使在新的版本策略之前,beta 就已经作为标签而非分支存在相当长一段时间了:Upcoming changes to the beta branch of Discourse

是我,我也很困惑,但是目前的构建代码确实无法使用标签。这本不应该如此。

1 个赞

version: release/2026.1 应该可以正常工作。如果您想利用版本的新重叠支持期,那么这是正确的做法。(但当然,您必须记得在 2026.1 达到其生命周期结束之前手动更新)

version: esr 也应该可以工作。该系统设计为支持标签。其实现方式类似于 git checkout $version

您不应在 web.template.yml 中进行此更改。您应在您站点特定的 containers/app.yml 中进行更改。

4 个赞