PHP アプリケーションに使用するリビジョン番号をラベル付けしたいのですが、 CruiseControlを使用したり、ファイルを更新して毎回アップロードしたりしたくありません。どうすればいいですか?
13 に答える
SVN キーワードは適切な解決策ではありません。他の人が指摘したように、ファイルに $Revision$ を追加すると、特定のファイルにのみ影響し、長期間変更されない可能性があります。
すべてのコミットの前に (空白行を追加または削除して) ファイルを「編集」することを忘れないでください。リビジョンを手で入力することもできます。
それを行う良い方法の 1 つ (私が知っている) は、自動化されたデプロイ プロセス (これは常に良いことです) を使用し、コマンド svnversion を使用することです。これが私がすることです:
リビジョンが必要な場合はいつでも include: を行います<?php include 'version.php'; ?>
。この「version.php」ファイルにはリビジョン番号しかありません。さらに、それはリポジトリの一部ではありません (無視されるように設定されています)。作成方法は次のとおりです。
1) SVN がサーバーにインストールされているプロジェクトでは、デプロイにも使用します。サーバーに最新バージョンを取得する とりわけ次のことを行うスクリプトがあります (サーバー上で実行されます)。
cd /var/www/project
svn update
rm version.php
svnversion > version.php
2) SVN がインストールされていないプロジェクトでは、デプロイ スクリプトはより複雑です。ローカルで version.php ファイルを作成し、コードを圧縮し、アップロードして抽出します。
Webroot が Subversion ツリーのチェックアウトされたコピーであると仮定すると、/.svn/entries ファイルを解析してリビジョン番号 (ここでは 4 行目) を取り出すことができます...
PHP の場合:
$svn = File('.svn/entries');
$svnrev = $svn[3];
unset($svn);
これが私がそれを機能させる方法です。サーバーがshell_execを許可するように設定されていて、SVNがインストールされている場合は、次を実行してください:
$revision = `svnversion`;
また
$revision = shell_exec('svnversion');
今は少し遅れていますが、Subversionのコミット後フックを使用してください。リポジトリのhooksフォルダーに、次のようなシェルスクリプトを作成します。
#!/bin/bash
REPOS="$1"
REV="$2"
cd /web/root
rm -f /web/root/templates/base.html
/usr/bin/svn update
/bin/sed -i s/REVISION/$REV/ /web/root/templates/base.html
この特定の例では、ライブサイトが/ web / rootにあり、開発コードが別の場所に保持されていることを前提としています。開発者の変更をコミットすると、スクリプトは以前のライブテンプレートを削除し(競合メッセージを回避するため)、更新を実行し、テンプレート内のREVISIONの出現箇所を実際のリビジョン番号に置き換えます。
フックの詳細はこちら
次のようにすることもできます。
$status = @shell_exec('svnversion '.realpath(__FILE__));
if ( preg_match('/\d+/', $status, $match) ) {
echo 'Revision: '.$match[0];
}
SVN Keywordsに近づくことができます。リビジョンを表示する場所に $Revision$ を追加しますが、それは特定のファイルが変更された最後のリビジョンのみを表示するため、毎回ファイルを変更する必要があります。グローバル リビジョン番号を取得することは、ある種の外部スクリプトまたはコミット後のフックなしでは不可能です。
ほとんどの場合、サーバー上のコードには実際にはチェックアウトではなくコードの「エクスポート」が含まれているため、.svn フォルダーは含まれていません。少なくとも、私が最も頻繁に目にする設定です。他の人は実際に自分のコードを Web サーバーにチェックアウトしますか?
最も簡単な方法は、Subversion の「キーワード置換」を使用することです。SVN book ( Version Control with Subversion ) にガイドがあります。
基本的に、ファイルのどこかにテキスト $Rev$ を追加するだけです。次に、リポジトリでキーワードを有効にします。チェックアウト時に、SVN はリビジョン番号をファイルに置き換えます。
同様の質問"Mark" svn export with Revisionに対する私の回答を参照してください。
エクスポート時にリビジョン番号を取得すると、次を使用できます。
svn export /path/to/repository | grep ^Exported > revision.txt
リビジョン番号以外のすべてを削除するには、次の sed コマンドを使用してパイプできます。
svn export /path/to/repository | grep ^Exported | sed 's/^[^0-9]\+\([0-9]\+\).*/\1/' > revision.txt
これを行う別の可能性は、「デプロイプロセス」で説明されているステップを実行するcronを実行することです(* nix / FreeBSDサーバーであると想定しています)。
パフォーマンスが問題になる場合は、次のことができます。
exec('svn info /path/to/repository', $output);
$svn_ver = (int) trim(substr($output[4], strpos($output[4], ':')));
これはもちろん、チェックアウトを行ったことと、svn コマンドの存在に依存します。