1

私は、git と Drupal を含む、ローカル ワンプとサーバー ランプの間の移行制御の優れたソリューションを見つけようとしています。

Migrationクラスのおかげで、CodeIgniter を使用した移行制御の優れたソリューションを既に見つけています。post-receive次に、フックを利用して実行php path/to/codeigniter/index.php migrate/indexするだけで、ファイルとともにデータベース設計を更新するだけです。

しかし、Drupal でこれまで見てきたことからすると、これは少しトリッキーです。現在、新しいモジュールなどを有効にするための Drush コマンドを何らかの方法で保存することを検討しています。アイデアは、単に実行する移行post-receiveに似たシステムを持つことであり、新しいモジュールはdrush en -y new_modulewhosコマンドを介して有効になり、どこかに保存されます。

ここに示す理想的なフロー:

理想の流れ

このフローを完了するために必要と思われるのは、bash スクリプトを で実行し、たとえばという名前のディレクトリ内にpost-receiveあるファイルをフェッチし、で説明したファイルに保存した変数に基づいて、番号を付けてファイルを実行することです。保存された値よりも大きい場合は、値を実行されたファイルの中で最大の数に設定します。001.txtdrush_commands.gitignore

質問

ただし、理想的にはbashスクリプトでこれを行う方法と可能かどうかはわかりません。このアプローチは理想的なものであり、bash スクリプトはどのように機能しますか? または、ローカルの wamp とサーバーの両方で同じモジュール (およびその他の drush のもの) を有効にするより良い方法を知っていますpushか?

おまけの質問:このアプローチを使用して、フィールド データやコンテンツ タイプなどの変更を処理できますか? ローカル バージョンとライブ バージョンの間で全体的な構造を同期する方法を正確に把握するのに苦労しています。

4

1 に答える 1

1

これは理論的にも実践的にも絶対に可能ですが、post-receive フックを使用して完全に完了することはできません。

理想的な解決策は、たとえば Jenkins ( http://jenkins-ci.org/ ) などの CI サーバーで、移行を処理するように構成されたジョブをリッスンし、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」などの名前のないファイルがある場合、ループはうまく機能しません。これらをフィルタリングして、最新のものを取得していることを確認する必要があります。

お役に立てれば。

于 2013-07-02T12:08:51.097 に答える