带钩子,迁移和bash的版本控制

时间:2013-07-02 08:49:13

标签: php git drupal-7 drush

我试图在本地wamp和服务器灯之间找到一个很好的迁移控制解决方案,包括git和Drupal。

由于Migration类,我已经通过CodeIgniter找到了一个很好的迁移控制解决方案。然后我可以使用post-receive钩子并运行php path/to/codeigniter/index.php migrate/index,它只是更新数据库设计和文件。

然而,从我迄今为止与Drupal看到的情况来看,这有点棘手。我目前正在考虑以某种方式存储Drush命令以启用新模块等。那么我们的想法就是拥有一个与Migration类似的系统,我只需使用post-receive运行,并通过drush en -y new_module启用新模块whos命令保存在某处。

这里说明的理想流程:

Ideal flow

我想我需要完成这个流程是让post-receive执行bash脚本,在名为001.txt的directoy中获取一个名为drush_commands的文件,并且基于对于我保存在.gitignore中提到的文件中的变量,执行的数字高于保存的值,然后将值设置为执行文件中的最大数字。

问题

但是,我不确定如何以及是否有可能在理想情况下使用bash脚本执行此操作。这种方法是理想的方法吗?bash脚本如何工作,或者你知道在push之后在我的本地wamp和服务器上启用相同模块(以及其他匆忙的东西)的更好方法吗? / p>

加分问题:我可以使用这种方法来处理对字段数据,内容类型等的更改吗?我很难掌握如何在本地版和实时版之间同步整体结构。

1 个答案:

答案 0 :(得分:1)

这在理论和实践中都是绝对可行的,尽管我不会尝试使用post-receive hook完全完成它。

理想的解决方案是让一个CI服务器,例如Jenkins(http://jenkins-ci.org/)正在监听一个配置为处理迁移的作业,并使用post-receive挂钩通过CLI界面触发此作业或cURL请求。这需要将构建的责任从Git(不属于它)转移到CI(它所在的位置)。

有许多不错的CI解决方案,包括免费和专有解决方案,它们将通过一些基本配置为您处理所有这些。

触发时配置的作业,将您的仓库(基于您指定的分支)签出到其自己的工作空间目录中,然后可以调用脚本将其构建为应用程序。

# post-receive hook
curl http://my.ci-server.local/job/drush_command/buildWithParameters?&GITBRANCH=$GIT_BRANCH&delay=0
  • my.ci-server.local您本地安装的CI服务器安装
  • drush_command将是您工作的名称
  • GIT_BRANCH是要构建的分支的名称(默认开发???)

在CI作业中,您将拥有一个执行类似于以下步骤的脚本:

# GitIgnore file
savedValue:0001

# bash script
savedValue=$(cat $WORKSPACE/.gitignore | grep 'savedValue' | cut -d: -f2);
newValue=$(savedValue);
for file in $(ls $WORKSPACE/drush_commands); do

    currentValue=$(echo $file | cut -d. -f1);
    if [ $currentValue -gt $savedValue ] ; then

        drush en -y "${currentValue}.txt}";
        if [ $currentValue > $newValue ] ; then
            newValue=$currentValue;
        fi
    fi
done

sed -i '' "s/savedValue.*/savedValue:$newValue/" $WORKSPACE/.gitignore;

你可以进一步扩展它来处理数据的更改,方法是在循环之后调用一个单独的脚本来查找要执行的其他脚本然后从单独的目录中获取更改吗?

几点:

  • 我不会将保存的值添加到.gitignore文件中 - 这实际上不是它的地方。使用单独的配置文件(例如conf/last_enabled)来获取此类信息。
  • 如果您的drush_commands目录中的文件未命名为'001.txt 002.txt'等,则循环效果不会很好。您必须对这些文件进行过滤以确保你得到的是最新的。

希望这有帮助。