シェル(bash)を使用して、ファイルから値のキーを決定する


1

いくつかのアプリケーション展開のスクリプトを作成し、bash(シェル)を使用してプロモーションプロセスを展開しています。これらのスクリプトは、CIプラットフォームが(最近のように)再び失敗する場合に備えて、フェイルセーフとして記述されています。

このプロセスでは、各アプリケーションにキーと値のペアを含むテキストファイルがあり、キーは展開領域の名前(dev、qa、prod)…であり、値は展開可能なファイルに関連付けられたハッシュです。

ファイルをソースするだけで値を収集するのではなく、キーを認識する最良の方法を決定するのに苦労しています...しかし、ファイルをソースして、各展開領域の値を手動で比較するのは長い道のりのように思えます。

RECAP 1.値(sha1sum)はありますが、それが属するキーが必要です2.ファイルからキー値ペアのキーを決定します3.関連する値を持つ最高のデプロイメント領域を決定します(複数の領域が潜在的に同じ値がリストされている場合、チェーンを登るにつれて可能性が高くなります。)

助言がありますか?

編集1 必要なコードが存在する場所は次のとおりです。

###################################################################################################
# IS THIS HASH CURRENTLY DEPLOYED SOMEWHERE ELSE? IF SO, WHERE?
###################################################################################################
grep "${deployHash}" "${deployHashHome}/${deployAppName}/${deployAppName}.manifest"
if [[ "$?" -eq 0 ]]
then
    source ${deployHashHome}/${deployAppName}/${deployAppName}.manifest


    previousDeployRegion=""
    # logThis is a custom logging function which formats logs exactly how we want, we have a Splunk parser for the format
    logThis "${scriptLogDir}/${deployLogFile}" "The hash: ${deployHash}, has been previously deployed to ${previousDeployRegion}." "INFO"
fi

Key-Valueファイルは次のようになります。

mylocal=ca9c244aa1b40f39fd06318f2be9fbc1a82c5c5c
dev=986b747d846555f8c5e393a5cfbbd061ee9d68a7
int=53b8fa87f2241a17623ead2f94032b1d2045069e
reg=53b8fa87f2241a17623ead2f94032b1d2045069e
stage=
prod=
dr=

編集2 追加のサンプルsha1sum値をサンプルのキー値ファイルに追加して、複数のキーに同じ値がどのように存在するかを示しました。


私は理解していると思いますが、いくつかのサンプルが良い手始めになるでしょう。おそらくそれはawkの別の1つです。
ゴンバイサンドル

ありがとう。コードが存在する場所の例と、すでに持っている値のキーを見つける必要があるファイルの例を追加しました。
クリス・ギディングズ

ああ、入力サンプルもここにあります...はい、私はこれを期待していました。
ゴンバイサンドール

回答:


2

実際、作業するファイルの例をいくつか見たいと思っていましたが、コード自体が私の仮定を強化しました。

hash="blablabla"
awk -F' *= *' -v hash="$hash" '$2 == hash { print $1 }' your.manifest | sort ...

ここでは、ハッシュをawkに渡し、等号で行を分割するように要求します。符号に続く値がハッシュの場合、符号の前の値、できれば領域を出力します。次に、必要に応じてこれらの値をソートする場合としない場合があります。

ハッシュのすべてのキーを表示する場合、これを使用できます。

awk -F' *= *' -v hash="$hash" '$2 == hash { keys=(keys ? keys "," $1 : $1)}; END { print keys}' your.manifest

ファイル内のハッシュの最後のキーだけが興味深い場合、このコードが勝ちます:

awk -F' *= *' -v hash="$hash" '$2 == hash { key=$1}; END { print key}' your.manifest

これがあなたの解決策をどのように試みたかです。しかしそれは私には動作しません。previousDeployRegion = awk -F'*=*' -v hash=$deployHash '$2 == hash { echo $1 }' $tfDeployHashHome/$deployAppName/$deployAppName.manifest logThis "$ {tfAdminLogDir} / $ {tfDeployLogFile}" "ハッシュ:$ {deployHash}は、以前に$ {previousDeployRegion}にデプロイされています。" 「INFO」の出力は次のとおりです。2016-02-1319:26:35-05:00:INFO:ハッシュ:53b8fa87f2241a17623ead2f94032b1d2045069eは、以前に展開されました。提案?
クリスギディングズ

スクリプト全体を一瞬捨てて、書いたものだけを使用すると、どのように動作するかがわかります。もちろん、blablablaとyour.manifestを実際のデータで置き換えることは必須です。
ゴンバイサンドル

nvm、私はawkを壊したものに変更' *= *'しまし'*=*'た。キーと値のペアからキーを収集するように変更しました。ありがとうございました!一致する値を持つ最後のキーのみを取得するためのサポートを追加します!
クリスギディングズ

それは良かったです。順序の最後のキーが検索したいキーであることが確実な場合は、もう1行削除するだけで、その部分もコードに追加します。
ゴンバイサンドル

私が求めているのは、複数のキーに同じ値が存在する可能性のサポートです。たとえば、コードがDEVにデプロイされ、INTとREGの両方に昇格され、新しいビルドがDEVにのみ配置されたとします。この時点で、INTとREGの値は同じですが、DEVの値は同じではありません。そして、ビルドを次の環境「アップ」に「昇格」すると、STAGEにプッシュする必要があると推測されます。はい?OPのマニフェストの例を更新します。
クリス・ギディングズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.