Я пишу сценарий Expect для получения последнего кода с нашего сервера dev каждый раз, когда в AWS создается новый экземпляр сервера. Идея заключается в том, что когда создается новый сервер, сценарий запускается при загрузке, а затем размещается за балансировщиком нагрузки. Это работает отлично, если Git не прерывается из-за конфликта. Вот код на данный момент:
#!/usr/bin/expect -f
set timeout 240
spawn /xyz/pullfromdev
expect "*?assphrase*"
send -- "<mypass>\r"
expect {
"Aborting" {
set response $expect_out(buffer)
set format [split $response "\n"]
cd /var/www/html
foreach line $format {
if { !([string range $line 0 8] == "Identity " || [string range $line 0 8] == "Updating " || [string range $line 0 5] == "error:" || [string range $line 0 6] == "Please," || [string range $line 0 7] == "Aborting" || [string length $line] == 1 ) } {
open "| git checkout -- [string trim $line]"
}
}
spawn /xyz/pullfromdev
expect "*?assphrase*"
send -- "<mypass>\r"
}
}
expect eof
В основном я разбиваю выходной буфер и пытаюсь запустить git checkout -- <filename>
для каждого файла, который имеет конфликт. Затем попытаться снова потянуть, чтобы, надеюсь, завершить успешно.
Проблема с линией:
open "| git checkout -- [string trim $line]"
Он просто не выполняет никаких действий, и я не получаю никакой ошибки. Сценарий снова пытается получить данные с сервера dev и прерывает работу, поскольку проверка git не произошла и конфликты сохраняются. TCL немного чужд для меня, так что, возможно, это проблема синтаксиса? Я пробовал spawn, а также exec, но они тоже не работают. Конфликты остаются и git прерывается.
Однако, если я запускаю git checkout -- <filename>
через командную строку, этот конкретный файл больше не конфликтует (потому что проверка действительно произошла). Так что проблема на самом деле заключается в том, чтобы заставить команду git checkout запускаться из сценария Expect, что я так или иначе не могу сделать.
У кого-нибудь есть предложения?
Если это вообще помогает, то это на CentOS 5, а скрипт «pullfromdev», на который ссылается код, просто:
#!/bin/bash
cd /var/www/html
ssh-agent bash -c 'ssh-add /xyz/<identity>; git pull'