以 CI/CD 方式开发主题

你好,
你们有没有关于以 CI/CD 方式部署主题的建议?客户期望每两周发布一次新主题,我们希望通过自动化流程来发布主题。我们使用的是 Discourse Docker。

我们希望避免每次发布时进行手动安装。

附注:我不确定这是否是一个 bug,但似乎第一次安装主题时分支并未被保存。(需要再次确认以验证)

谢谢

2 个赞

该功能已经存在。如果您通过 Git 仓库安装主题,只需单击一次即可将主题更新到最新的提交版本。

我知道,但那不是我们想要的方式。

我们希望在不触碰 Discourse 管理员的情况下实现动态流程。我考虑使用 themes 命令:discourse/lib/tasks/themes.rake at main · discourse/discourse · GitHub

docker exec -it app rails themes:install -- # 主题数据

我不确定该命令是否能读取文件。例如,一个包含主题安装信息的 theme.yaml 文件。
该文件可以部署到共享文件夹中,docker 命令可以从中读取并安装主题或进行更新。

@markvanlan 最近做了一些工作,可能对您有用

https://github.com/discourse/discourse/commit/f07c4a781c6c054e5d2dc05ab6c0fd0b6cbb0645

此处注释中包含一些使用说明:

8 个赞

@david 谢谢,但我不太清楚是否可以将文件路径作为参数传递。这样行吗?

bin/rake themes:install -- theme.yaml

也许我可以试试。

我想你应该将其管道传递给 STDIN,类似这样:

cat theme_config.yml | bin/rake themes:install

但我尚未测试过。如果对你有效,请告诉我们 :slight_smile:

6 个赞

你的方法完全可行。谢谢!我的不行。:smiley:

我稍微尝试了一下修改 themes.rake,添加了

rake themes:install themeFile="theme.yml"

以及这段代码:

task "themes:install" => :environment do |task, args|
  if ENV['themeFile']
    theme_args = YAML.load_file(ENV['themeFile'])
  else
    theme_args = (STDIN.tty?) ? '' : STDIN.read
    use_json = theme_args == ''
    theme_args =
      begin
        use_json ? JSON.parse(ARGV.last.gsub('--', '')) : YAML::load(theme_args)
      rescue
        puts use_json ? "无效的 JSON 输入。\n#{ARGV.last}" : "无效的 YML:\n#{theme_args}"
        exit 1
      end
    end

  log, counts = ThemesInstallTask.install(theme_args)

  puts log

  puts
  puts "结果:"
  puts " 已安装:#{counts[:installed]}"
  puts " 已更新:#{counts[:updated]}"
  puts " 错误:#{counts[:errors]}"

  if counts[:errors] > 0
    exit 1
  end
end

运行正常。:sweat_smile:

如何为这个文件运行 spec 测试?

1 个赞

你应该能够执行以下操作:

bin/rake themes:install theme.yml

我添加了对传入 JSON 的支持,但此代码最初设计为接受 yml 文件作为参数。

2 个赞

它报错说这不是有效的 JSON

无效的 JSON 输入。
theme.yml

我的 theme.yml 文件内容如下

test:
  url: "https://github.com/discourse/discourse-faria-theme"
2 个赞

我相信这应该能行!我会去查一下为什么现在不工作了。

2 个赞

好的,正确的格式是 bin/rake themes:install < theme.yml。我会在代码中更好地记录这一点 :slight_smile:

15 个赞

太好了!谢谢!很高兴能帮上一点忙 :sweat_smile:

4 个赞