如何在暂存的环境中正确删除模块? -- nodes 领域 和 deployment 领域 drupal 相关 的问题

How to correctly remove a module in a staged environment?


16
vote

问题

中文

一些模块有Deïnstallation例程。这通常删除该模块的DatabaseTables,该模块引入的变量表和语厅的变量。这些例程生活在该模块的 .install 中。

因此,在没有该模块的情况下,它们就不能跑。所以这是我们目前的步骤。我的问题是:这可以更简单,更有效吗?说我删除foo_bar模块。

  1. 在RCS中,准备一个新版本,其中:
    • 所有CSS和主题 - 覆盖在-FO_BAR上使用或构建的覆盖。
    • 根据foo_bar的模块的所有css和主题覆盖都被删除。
  2. 推动释放以接受。使用最新的生产数据库副本测试deïlation(从管理/模块)。
  3. 如果一切顺利,将新的codebase部署到生产,以及deïnstallfoo_bar及其依赖关系。这将在各种模块中调用卸载,清理数据库。
  4. 在RCS(GIT)中,准备一个新的释放,其中实际删除了代码。
  5. 部署它以接受我们测试的地方,如果没有意外地依赖于此(一些丑陋的模块或主题函数,则直接来自其他模块的文件。最值得注意的是CSS,JS或图像文件)。
  6. 如果已接受,请将新版本部署到生产。 制作现在有一个干净的数据库和干净的码比

我看不到如何解决的问题,这始终需要两个版本。由于在Drupal中,释放要求网站脱机,这意味着两次停机时间只是为了删除一个模块。它还需要两个释放程序,在专业的托管环境中,可以非常昂贵,耗时或令人沮丧。

如果我们在第一次迭代中从CodeBase中删除模块,我们无法运行卸载挂钩,请在数据库中保持许多LINT;不仅仅是一些表,而且大多是变量和地狱。 如果我们未从CodeBase删除模块,这意味着代码库将随着陈旧而未使用的代码而增长;这不提供性能超过性能,但确实使得代码更难和更难。

你如何处理这个?

[编辑:添加了关于部署的注意事项是一个艰难的过程,通常]

英文原文

Some modules have dexc3xafnstallation routines. Which typically remove databasetables for that module, variables from the variable table and locales introduced by that module. These routines live in the .install of that module.

Therefore, they cannot be ran without that module being present. So here are our current steps. My question is: can this be done simpler and more effectively? Say I remove foo_bar module.

  1. In the RCS, prepare a new release, where:
    • All css and theme-overrides that use or build on top of- foo_bar are removed.
    • All css and theme-overrides for modules depending on foo_bar are removed.
  2. Push that release to acceptance. Test the dexc3xafnstallation (from admin/modules) with a very recent copy of the production database.
  3. If all goes well, deploy the new codebase to production, and dexc3xafnstall foo_bar and its dependencies there. This will invoke the uninstall in the various modules, cleaning up the database.
  4. In the RCS (git), prepare a new release where the code is actually removed.
  5. Deploy that to acceptance where we test if nothing accidentally depended on this (some ugly modules or theme functions include files directly from other modules. Most notably CSS, JS or image-files).
  6. If accepted, deploy new release to production. production now has a clean database and a clean codebase.

Problem that I can't see how to solve, is that this always needs two releases. Since in Drupal a release requires the site to be offline, this means two times downtime just to remove one module. It also requires two release procedures, which, in professional hosting environments can be very expensive, time-consuming or frustrating.

If we remove the module from codebase in the first iteration, we cannot run the uninstall hooks, keeping many lint in the database; not just a few tables, but mostly variables and locales. If we don't remove the module from codebase, that means the codebase will grow with stale, unused code; this gives no performance overhead, but does make maintaining the code harder and harder.

How do you deal with this?

[edit: added note about deployment being a tough procedure, often]

     
       
       

回答列表

7
 
vote

非常小心地保持数据库和代码同步;在您提到的问题时,要卸载的模块需要留在代码库中,直到在实时数据库上运行它们的卸载钩子。这是对Drupal的限制,即单独的Git拉动工作流程不会解决。

我建议,而不是尝试调整你的过程,而是寻找减少处理更新所需的停机时间的方法。我建议设置一个 ying / yang multisite暂存环境解决这个问题。 N.B.我没有使用上述链接中包含的脚本;您可能希望以不同的想法在部署期间 Swap Swap Swap Swap 。

继续遵循您在问题中概述的相同程序,以下调整:

a。像往常一样与Dev到舞台(杨)同步。通过执行要删除的模块进行测试,然后进行代码删除。GIT工作流音符:创建标签或注意代码的不同状态的Hashid:所有模块到卸载之前,代码模块已删除,您的代码模块覆盖& C。删除等等。也许只需要两个参考文献。

b。测试完成并接受测试时,将阶段(yang)的代码恢复到Live(Ying)的状态。

c。通过禁用任何用户在系统上更改内容的能力来准备Live(Ying)站点进行更新。对权限表的SQL更新通常会在此进行。此时,用户仍然能够在实时站点上读取内容,但如果尝试更新内容,则会获得权限拒绝错误。 (如果您很酷,也许您可​​以更改权限拒绝处理程序打印函数暂时不可用的适当通知)。

d。现在将Live(Ying)数据库推回舞台(yang)数据库,从更新中排除权限表。

e。重复步骤a。再次。如果您有Histhtags Handy,则应易于恢复存在要删除的模块的状态,在数据库上运行卸载挂钩,然后将其在步骤1中的项目合并的代码的状态回到。

f。你现在准备好换了英和杨。通过调整Apache配置指令来执行此操作。请注意,如果您执行 /etc/init.d/apache restart ,则可能会删除某些连接,但 /etc/init.d/apache reload 将允许干净的交换。

g。生活现在是"杨" ;在此处未修改权限表,因此用户可以创建内容。如果您自动执行步骤e。和f。,时间不可用应非常低。

h。将Live(yang)推回舞台(ying),代码和数据库 - 或根据需要从DEV推送。您现在已经为您的下一次迭代准备了一个干净的环境。

 

Be very careful about keeping your database and code in sync; as you mention in your question, the modules to be uninstalled need to stay in the code base until their uninstall hooks are run on the live database. This is a limitation of Drupal that a git pull workflow alone is not going to solve.

I would recommend that instead of attempting to adjust your process, you instead look for ways to reduce the downtime required to process your updates. I would recommend setting up a ying / yang multisite staging environment to solve this problem. n.b. I have not used the scripts contained in the preceding link; you may wish to set things up differently, following the same idea that you can swap your live and stage sites during deployment.

Continue to follow the same procedure you outlined in your question with the following adjustments:

a. Sync from dev to stage (yang) as usual. Test by doing an uninstall of the modules to be removed followed by code removal, etc. Git workflow notes: create a tag or note the hashid of the different states of your code: all modules in place prior to uninstall, code modules removed, your overrides & c. removed, etc. as needed. Perhaps only two references are needed.

b. When testing is complete and accepted, restore the code on stage (yang) to the state of live (ying).

c. Prepare the live (ying) site for update by disabling any user's ability to change content on the system. An sql update to the permission table will usually do here. At this point, users will still be able to read content on the live site, but will get a permission denied error if they try to update content. (If you are cool, perhaps you could change the permission denied handler to print an appropriate notice that the function is temporarily unavailable).

d. Now push the live (ying) database back to stage (yang) database, excluding the permissions table from the update.

e. Repeat step a. again. If you have your hashtags handy, it should be easy to restore to the state where the modules to be removed exist, run the uninstall hooks on the database, and then advance back to the state of the code where your items from step 1 are merged back in.

f. You are now ready to swap ying and yang. Do this by adjusting your Apache configuration directives. Note that if you do an /etc/init.d/apache restart, some connections may be dropped, but /etc/init.d/apache reload will allow for a clean swap.

g. Live is now 'yang'; the permissions table is unmodified here, so users can create content. If you automate steps e. and f., the time unavailable should be very low.

h. Push live (yang) back to stage (ying), both code and database -- or push from dev, as needed. You now have a clean environment ready for your next iteration.

 
 
         
         

相关问题

1  如何在D6中添加CCK字段到我自己的模块提供的内容类型?  ( How to add cck fields to my own content type provided by my own module in d6 ) 
我正在创建一个模块,它提供了一个新的节点内容类型。我可以用自己的默认节点创建字段扩展,但我想添加一些cck字段 too(如 cck imagefield ) 在通过Drupal的内容类型编辑器的通常的管理界面启用我的模块后,不手动 。 所以这里是我自己的表单,它提供了新的内容类型; 这就是我想用CCK Image...

1  如果没有参考,如何制作一个节点参考字段,也可以表现为文本字段  ( How to make a node reference field that can also behave as a text field if no re ) 
我正在寻找灵活的方法来允许用户输入一个字段,而且还要在节点引用已经存在的情况下,该字段是节点参考。换句话说,让我们说我有一个名为Dog的内容类型,每只小狗都有一个收藏玩具的节点参考,如果玩具存在,这个字段应该是节点参考,否则应该允许用户填写。 概念上我可以想到两种方法来做到这一点。一种方式,只是为了使它成为...

6  有没有办法在没有网页中以网址在网址中以编程方式设置寻呼机的页码?  ( Is there a way to set the pagers page number programmatically without the page ) 
我想要一个先前留下了节点的评论的用户,最初看到新的用户的最后一页,而新用户(该节点)最初会看到注释的第一页。 我知道该页面由寻呼机控制,并由URL中的"页面" 变量设置( 99887661 )。有没有办法可以以方便地设置这件事? (只是为了澄清,我不使用这个项目上的视图模块。) ...

1  用户的论坛CMS? [关闭]  ( Forum cms for user ) 
此问题似乎在帮助中心中定义的范围内涉及Drupal。。 想要改进这个问题?更新问题,所以它是关于drupal答案的主题。 ...

2  尊重父节点访问级别(书)  ( Respect parents node access level book ) 
我想知道是否有办法(例如,使用一些钩子)所以书中的子页面尊重他们的父母访问级别,这意味着如果用户没有访问父节点,则不会也能查看子节点? 我使用drupal 6 ...

1  RTF与内联图像+字限制的模块?  ( Modules for rtf with inline images word limits ) 
我想允许我的所有网站的用户添加自己的博客文章,具有某些约束。 这是我想要给它们的表格: Title : Contents (RTF, max 700 characters) : Submit (or Login/Register then Submit) : 所有帖子的强制性: 在注释上启用读/写权限 ...

0  如何为内容添加类别  ( How to add categories to content ) 
我仍然是德鲁佩尔7.我读过一些关于Drupal的工作的几件事,但我不太好了。 如何为不同类别创建文章?我想制作可以在图形,绘画或3D等下列出的文章。如何将它们分类在主菜单中?博客模块或书本模块如何不同? 我知道这可能已经在这里发布了同样的地方,但我只想在长章中找不到一个简单的解释。谢谢家伙。 ...

1  如何将复杂字段与另一个节点联系起来  ( How to relate a complex field to another node ) 
我正在构建一个用于录制结果(高尔夫)的业余爱好网站。一轮高尔夫将有任何数量的玩家,可从已知的玩家列表中选择。 我希望能够创建一个新的回合并向它添加玩家,为每个人输入一个分数。我的第一个想法是为玩家和循环创建内容类型,以及一个与节点引用类似的复杂字段。 在我下去之前,我想看看是否有更聪明的方式做到这一点。我所拥有的一个...

0  模板没有被拿起?  ( Template not being picked up ) 
我将node-product.tpl.php文件添加到我的主题上,它完全忽略了。 我重置缓存,多次,并使用devel + devel_themer测试,以查看名称是否正确且它是。它说它搜索: node-product.tpl.php node-product.tpl.php node.tpl.php ...

2  显示最新编辑的日期,而不是节点发布日期  ( Showing the date of the latest edit instead of nodes posting date ) 
我有一些我经常更新一些节点,但在内容窗格中,我可以看到节点的发布日期。 如何使Drupal 7显示最新编辑的日期,而不是发布日期? ...

2  面板仍在添加侧栏  ( Panels is still adding sidebars ) 
这是我们正在做的事情: 我们正在努力为我们正在努力的网站建立一个新的主题。 我们使用的主题和上下文来利用我们正在使用新主题而不是面板的新给定内容类型/ drupal路径的区域。 面板以前拥有我们正在建设的页面。 出于某种原因,侧栏/块(来自前一个面板)仍然仍然打印到新主题的$ Content标记。 任何想法?...

2  分类菜单和层次结构树[关闭]  ( Taxonomy menu hierarchy trees ) 
关闭。这个问题需要详细信息或清晰度。它目前不接受答案。 想要改进这个问题?添加详细信息并阐明编辑此帖的问题。 closed 4年前。 ...

1  过滤具有来自两种不同内容类型的内容的视图  ( Filter a view with content from two different content types ) 
我正在创建一个RSS Feed,输出来自两个视图的所有帖子:一个是男士博客,另一个是女性。我发现了,当我指定我的过滤器时,我需要选择两个自定义内容类型,让我没有结果,就好像一个取消另一个结果一样。如何将这两个添加在一起,所以我在饲料中获得所有帖子? 我在上下文过滤器中注意到有"月+年" 。我需要这样的内容类型。 ...

1  在书籍导航中显示每个页面后的子计数  ( Display child count after each page in book navigation ) 
我正在构建一个分层网站。而且我正在使用书模块。书籍导航中每个列出节点的所需输出为"第1页(节点计数)(最后的评论日期)。" 问题在Drupal.org询问了2006年,它没有答案。我的客户在每个节点旁边显示自定义数据的严格要求(例如,评论数量,最近评论的日期)。如果我可以从节点计数开始,我越来越近一步。 词汇索...

3  通过ajax / ahah返回主题节点  ( Return themed node via ajax ahah ) 
有没有办法获得给定节点ID或路径别名的完全主题节点,以便我可以通过AJAX / AHAH渲染它? ...

11  如何打印节点的主体? [关闭]  ( How do i print the body of a node ) 
关闭。这个问题需要更多聚焦。它目前不接受答案。 想要改进这个问题?更新问题,因此它仅拍摄了一个问题,只有编辑此帖。 关闭 5年前。 ...

3  将元数据添加到内容类型  ( Adding metadata to content types ) 
我正在尝试向我的内容类型添加更多字段。 我有一个名为 cars 的内容类型,另一个名为飞机;我希望它们属于一个名为"运输" 的类别。 如果我想获取所有运输内容类型的列表,它将返回 Cars 和飞机。 ...

2  检查是否存在满足;如果没有,请创建它  ( Check to see if content exists if not create it ) 
我有两个由节点引用相关的节点类型。本质上,内容类型A是容器,内容B类型是项目。为了说明,我将调用内容一个框和内容b项目。该项目有许多与框共享的分类术语。再次用于说明,唤醒让他们调用颜色和尺寸。我想做的是设置一个规则,执行以下内容: 在创建项目(实际在内容保存之前)检查以查看是否有一个框,这些框是分享了项目的颜色和大...

5  如何从分类节点上出现的节点摘要中剥离HTML列表页面?  ( How do you strip html from the node summary that appears on taxonomy node listin ) 
我在arg(0)=='分类'的if语句中使用hook_preprocess_node(),但对节点的更改并未通过显示。 在分类节点列表页面中列出时,使预告片在纯文本(剥离HTML)中出现的最佳方法是什么? ...

0  如何恢复作者和节点的发布信息?  ( How can i restore author and post information for nodes ) 
当我创建内容类型时,我禁用显示"作者名称" 和"发布日期" ;然后,我从该内容类型创建了近100个节点。 现在我想在节点内容中显示发布日期。 当我编辑节点时,并启用要显示的发布日期,一切正常;当我编辑内容类型时,并启用发布日期,我无法在节点页面中看到它。 很难编辑所有节点以显示发布日期。有更好的方法吗? ...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.