%20%D0%B4%D0%BB%D1%8F%20%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B8%D0%B7%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0.png)
Я пишу скрипты для развертывания некоторых приложений и процессов продвижения с использованием bash (shell). Эти скрипты пишутся как отказоустойчивые на случай, если наша платформа CI когда-нибудь снова выйдет из строя (как это недавно произошло).
В этом процессе каждое приложение имеет текстовый файл с парами ключ-значение, где ключ — это имя региона развертывания (dev, qa, prod)… а значение — это хэш, связанный с развертываемым файлом(ами).
Я изо всех сил пытаюсь определить, как лучше всего подойти к распознаванию ключа, а не извлекать значение, просто извлекая файл... но извлечение файла и затем ручное сравнение значений для каждого региона развертывания, похоже, должно быть долгим обходным путем.
РЕЗЮМЕ 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
Вот как выглядит файл «ключ-значение»:
mylocal=ca9c244aa1b40f39fd06318f2be9fbc1a82c5c5c
dev=986b747d846555f8c5e393a5cfbbd061ee9d68a7
int=53b8fa87f2241a17623ead2f94032b1d2045069e
reg=53b8fa87f2241a17623ead2f94032b1d2045069e
stage=
prod=
dr=
ПРАВКА 2 Добавлены дополнительные примеры значений sha1sum в пример файла «ключ-значение», чтобы показать, как одно и то же значение может существовать для нескольких ключей.
решение1
На самом деле мне бы хотелось увидеть какой-нибудь пример файла, над которым можно было бы поработать, но сам код укрепил мое предположение.
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