2016-11-24 7 views
5

背景ファイルが削除またはGitのリビジョン間で変更を自動的インスタンス

から削除得ている私は、次のとジェンキンスによってトリガーセットアップを持っている - デプロイする

  • ファイルはPhingのことにより調製され、 gitサーバと通信し、必要なgitリビジョンの間に別のビルドサーバでgit diffを入れて、AWSコードデプロイメントを使わずに(私が思う限り)。 phingビルドはJenkinsによってトリガーされます。
  • appspec.ymlファイルに動的に(リビジョンのgitの違いに基づいて)追加/変更されるファイルのみを追加します。私は追加するファイルのみを準備します。/home/jenkins/deployment/cd_deploy/codebase/にファイルを追加し、私はパスを指定しました.Jenkinsプロジェクトの "Advanced Project Options"の下にある "Use custom workspace"オプションのパスは/home/jenkins/deployment/cd_deploy/です。 S3バケットにアップロードされます。 2つのgitリビジョン間で削除されたインスタンスからファイルを削除する必要があることに注意してください。
  • Jenkinsは、アプリケーション名、設定したコード配布のデプロイメントグループに関する情報を使用してAWS Codedeployを起動します。

問題

私は動的に私が期待するように、しかし、妙に、あるファイルが削除されるように、EC2インスタンスに追加/修正なっているappspec.ymlファイルに追加したファイルをも削除されています。私は私のappspecファイルのbeforeInstallフックで書かれたファイルを削除するロジックがないことを確認しました。 beforeInstallフックにはbeforeInstall.shファイルしかありません。他のフックはありません。 appspecファイルからそのフックを削除すると、削除が停止します。

version: 0.0 
os: linux 
files: 
{Pair of files dynamically generated} 
    - source: config/deployment_config.json 
    destination: /var/cake_1.2.0.6311-beta/deployment 
permissions: 
    - object: . 
    pattern: "**" 
    owner: sandeepan 
    group: sandeepan 
    mode: 777 
    type: 
     - file 
hooks: 
    BeforeInstall: 
    - location: beforeInstall.sh 

が何らかの形で(私はgitlabともないgithubのを使用しています)と何とか削除するファイルに関する情報を取得し、私のGitのホスティングに話しAWS Codedeployです - ここに私のappspecファイルです。

更新

私は、後に観察されたものであっても、中央ビルドから.SH対応するファイル、すなわちbeforeInstall.sh、afterInstall.shなどをappspec.ymlファイルから完全にフック部分を除去し、削除した後サーバー(S3バンドルが準備されています)は、私のロジックとそれへの参照がインスタンスに送られないので、削除されるファイルは自動的に削除されます。

アップデート2

今日、私はGitのリビジョン間で変更されているファイルも自動的に削除得ていることがわかりました。 私は、appspec.ymlファイルを動的に準備するロジックを持っていました。私はいくつかのファイルを追加しないように修正しました。そこで、git diffにはいくつかのファイルがありましたが、appspecファイルにはありませんでした。その結果、彼らは削除されていますが、再出現しません。 デプロイメントの前にコードデプロイメントが自動的にクリーンアップを行っています。それをどうやって止めるの?カスタムクリーンアップロジックを追加したいと思います。beforeInstall.shの

アップデート3

コンテンツ -

OUTPUT="$(w | grep -Po '(?<=load average:)[^,]*')" 
rm -f /var/cake_1.2.0.6311-beta/deployment/deployment_config.json 
path="$PWD" 
php $path"/deployment-root/"$DEPLOYMENT_GROUP_ID"/"$DEPLOYMENT_ID"/deployment-archive/beforeInstall.php" ${OUTPUT} 

/usr/local/nagios/libexec/check_logwarn -d /tmp/logwarn_hiphop_error /mnt/log/hiphop/error_`(date +'%Y%m%d')`.log #Just run a nagios check, so that counter corresponds to the line in the log corresponding to current timestamp/instant. Do not care about output. Note that we are not even looking for error hinting keywords (and hence not using -p because it needs to be used alongwith), because all we need to care about here is incrementing the nginx counter. 

/usr/local/nagios/libexec/check_logwarn -d /tmp/logwarn_nginx_access /mnt/log/nginx/access_`(date +'%Y%m%d')`_`(date +'%H')`.log #Just run a nagios check, so that counter corresponds to the line in the log corresponding to current timestamp/instant. Acceptable http codes are also not being read from deployment_config.json. 
printf "\n `date +%Y-%m-%d:%H:%M:%S` End of beforeInstall.sh" >> /var/cake_1.2.0.6311-beta/deployment/deployment.log 
exit 0 

そしてbeforeInstall.phpのコンテンツの上から呼び出される - CodeDeployが展開するように設計されて

<?php 
file_put_contents('/var/cake_1.2.0.6311-beta/deployment/deployment.log', "\n ".date("Y-m-d H:i:s")." - Load print ".$argv[1], FILE_APPEND); 
$loadData = json_encode(array("load" => intval($argv[1]), "access_error_check_day" => date("Ymd"), "access_error_check_hour" => date("H"))); //error_check_day -> day when nagios error check was last run. We will accordingly check log files of days in between this day and the day of afterinstall (practically this can include a span of 2 days). 

file_put_contents("/var/cake_1.2.0.6311-beta/deployment/serverLoad.json",$loadData); //separate from deployment_config.json. serverLoad.json is not copied from build server. 
file_put_contents('/var/cake_1.2.0.6311-beta/deployment/deployment.log', "\n ".date("Y-m-d H:i:s")." loadData to config ".$loadData, FILE_APPEND); 
?> 
+0

あなたのインストールスクリプトを投稿してください。私はあなたがそれらを削除していると思います。 – mttdbrd

+0

@mttdbrd質問の更新3のセクションを確認してください。 –

+0

私はそこにすべてのファイルを削除するロジックがありません。私はafterInstallのステップでいくつか持っていましたが、削除するファイルを削除するだけでした(git diffのように)。フックセクションのafterInstallステップを削除すると、無効になるはずです。私が書いたように、フックセクションを完全に削除しても、ファイルはまだ削除されています。 –

答えて

2

特定のファイルと常に異なるファイルのセットをコピーするだけではありません。

このように、それぞれのリビジョンを展開する前に、CodeDeployは先にのリビジョンで展開されたファイルをすべてクリーンアップします。私に説明させてください。

File A 
File B 
File C 

そして、次の展開にのみ含まれ、これらのファイル:

File A 
File C 

コード展開する最初のクリーンアップ 3つのファイル

それでは、前回アプリの展開は3つのファイルをアップロードしましょう最初のリビジョン(A、B、C)にデプロイして新しいリビジョンをデプロイします。単にファイルをアップロードするだけではなく、古いファイルを最初にクリーンアップします(以前の 'revision'を参照)。 。これは重要なことです。なぜなら、あなたのケースでは神秘的な行動のように見えるものをいくつか明らかにするからです。 、展開された後、当然の結果:手動をしたがCodeDeployの外ミックスにファイルを追加した場合

File A 
File C 

は今、それが面白いです。このクリーンアップフェーズで削除されない場合は、現在のリビジョンのファイルを上書きしません。これは、人がアプリケーションを手動でインストールしてから同じフォルダにCodeDeployを実行しようとしたときによく見られます。以前のリビジョンがないので、クリーンアップする必要はありません。そして、既存のファイルの上にコピーしようとします。エラーが発生します。通常は、ターゲットフォルダを「裸」にして、改訂履歴を正しく開始できるようにします。あなたが持っていた場合例えば

は、その前のシナリオでは、以前にそれをクリーンアップするか分からないでしょうので、[ファイルA & Bの展開が失敗しただろう、手動でファイルA、BおよびC をアップロードし、 BとCを最初に入力すると、ファイルAとファイルBを上書きしようとするとエラーが発生します。

外部にあるの配備...どちらも改訂の一部ではなく、ファイルD ...は手を触れずに、配備の前後で苦情なしで幸せにとどまるでしょう。これは、デプロイメントに固有のデータファイルなどを配置するのに便利ですが、必ずしもコードベースの一部ではなく、常に再デプロイする必要はありません。

今、フックを使用して興味深いことをたくさんすることができますが、当面の間違ったツールのように感じます。フックは、CodeDeployがあなたのためにやるべきことの中心にあるファイルコピー管理を管理しないように、サービスの停止/開始などを行うためのものです。

アプリスペックからすべてのファイルを除外します(つまり、ファイルが指定されていない)、単純にBeforeInstallおよび/またはAfterInstallステップを使用してコピーロジックを実行することは、いくつかのシナリオでは有効なアプローチです。

いずれにしても、CodeDeployの動作をよりよく理解すれば、ソリューションを手助けすることができます。私はそれが特によく書かれているとは思わない。私の理解は、自分自身でそれを観察し、苦労することから来ます。

+0

はい、コード展開の設計方法です。 AWSのサポートチームに連絡した後、私は最終的にインストール手順をバイパスしました。つまり、appspecファイルのファイルセクションで追加/変更するファイルに言及する代わりに、独自のロジックを追加してafterInstallステップでファイルを追加/変更しました。コード展開ではファイルセクションにファイルが見つかりませんでしたので、クリーンアップはこれ以上行われませんでした。 beforeInstallの手順で自分のクリーンアップロジックも追加しました。物事は今うまくいきます。これらを答えに加えると、私は答えを受け入れます。 –

+1

答えにそのアプローチを追加しました...フィードバックに感謝します。 –

+0

偉大な答え!明確な説明。 – mttdbrd

関連する問題