Запуск команды Git из сценария Expect завершился неудачно - PullRequest
2 голосов
/ 29 февраля 2012

Я пишу сценарий 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'

Ответы [ 2 ]

1 голос
/ 01 марта 2012

При открытии конвейера все, кроме первого символа, представляет собой список аргументов Tcl (первый | является специальным).Это означает, что вы должны использовать это:

open |[list git checkout -- [string trim $line]]
1 голос
/ 29 февраля 2012

Вы не можете использовать == для сравнения строк в TCL.Попробуйте сравнение строк или regexp команды.

...