新功能工作流存在Bug

我的更新中出现了错误

api_key = "a quick brown fox"
fetch("https://api.example.com/data", headers: { 'Authorization' => api_key })

请帮我修复它。

看起来你已经安装了插件,但还没有运行迁移来创建它所需的表。

你能向我们展示一下你在容器定义中安装它的部分吗?

谢谢,但 discourse-workflows 不是我安装的插件;它是一个内置的核心插件(位于 plugins/ 目录中,由 Discourse 开发,通过 enable_discourse_workflows 启用),因此我的 app.yml 文件中没有相关配置。

该表在 db/migrate/20260312000000_create_workflow_tables.rb 的第 212 行有一条迁移语句,用于创建 discourse_workflows_webhooks 表,但该迁移从未在我的数据库上执行。

我发帖主要是建议是否值得在该定时任务(PurgeExpiredWebhookTestListeners)中添加一个保护检查,以便在表缺失时能够静默降级,而不是每次运行时都报错。

1 个赞

discourse_workflows_webhooks 确实有一个创建它的迁移(create_workflow_tables,版本 20260312000000create_table 位于该文件底部附近)。

在我的数据库中,该迁移已在 schema_migrations 中记录为已运行,但 webhooks 表本身从未被创建。

执行干净的 db:migrate 确认了这一点:它运行时没有任何输出,因此没有待处理的迁移,但该表仍然不存在。Rails 根据版本号进行判断,看到迁移已完成,便不再再次运行,导致表始终缺失,而模型和计划中的清理作业却继续加载并执行。这就是为什么相同的作业异常不断堆积的原因。

我应用的修复方法: 由于迁移已被记录,再次运行它不是一个选项,因为它会尝试重新创建其他已存在的工作流表并失败。

因此,我直接创建了缺失的表,使其与迁移完全匹配(相同的列,相同的五个索引,包括唯一索引):

conn = ActiveRecord::Base.connection
unless conn.table_exists?(:discourse_workflows_webhooks)
conn.create_table :discourse_workflows_webhooks do |t|
t.bigint :workflow_id, null: false
t.string :workflow_version_id, limit: 36
t.string :node_name, null: false, limit: 100
t.string :webhook_path, null: false, limit: 500
t.string :http_method, null: false, limit: 10
t.string :webhook_id, limit: 36
t.integer :path_length
t.boolean :test_webhook, null: false, default: false
t.integer :user_id
t.jsonb :workflow_snapshot
t.datetime :expires_at
t.datetime :created_at, null: false, default: -> { "CURRENT_TIMESTAMP" }
end
conn.add_index :discourse_workflows_webhooks, %i[http_method webhook_path test_webhook], unique: true, name: "idx_dwf_webhooks_on_method_path_test"
conn.add_index :discourse_workflows_webhooks, %i[webhook_id http_method test_webhook], name: "idx_dwf_webhooks_on_webhook_id_method_test", where: "webhook_id IS NOT NULL"
conn.add_index :discourse_workflows_webhooks, :workflow_id, name: "idx_dwf_webhooks_on_workflow_id"
conn.add_index :discourse_workflows_webhooks, :workflow_version_id, name: "idx_dwf_webhooks_on_workflow_version_id"
conn.add_index :discourse_workflows_webhooks, :expires_at, name: "idx_dwf_webhooks_on_expires_at", where: "expires_at IS NOT NULL"
end

之后,table_exists? 返回 true,PurgeExpiredWebhookTestListeners 作业在下一次运行时停止报错。

由于这是由发布后编辑的迁移引起的,后续添加正确迁移的核心更新可能会尝试再次创建该表,并因“已存在”而失败。

如果在更新后出现这种情况,解决方案是让新迁移生效:先删除我手动创建的表,或者将其版本插入 schema_migrations 以跳过它。

在此标记一下,以防其他使用最新分支的人遇到相同的作业异常。

3 个赞