Piszę skrypt Expect, który będzie pobierał najnowszy kod z naszego serwera deweloperskiego za każdym razem, gdy w AWS pojawia się nowa instancja serwera. Pomysł polega na tym, że podczas tworzenia nowego serwera skrypt jest uruchamiany podczas rozruchu, zanim zostanie umieszczony za systemem równoważenia obciążenia. Działa idealnie, chyba że Git przerwie z powodu konfliktu. Oto kod do tej pory:

#!/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

Zasadniczo dzielę bufor wyjściowy i próbuję uruchomić git checkout -- <filename> dla każdego pliku, który ma konflikt. Następnie spróbuj ponownie wyciągnąć, aby miejmy nadzieję, że zakończy się pomyślnie.

Problem polega na linii:

open "| git checkout -- [string trim $line]"

Po prostu najwyraźniej nie wykonuje żadnej akcji i nie otrzymuję żadnego błędu. Skrypt próbuje ponownie pobrać z serwera deweloperskiego i przerywa, ponieważ nie doszło do kasy git, a konflikty pozostają. TCL jest dla mnie trochę obce, więc może jest to problem ze składnią? Próbowałem spawnu, jak również exec, ale wydaje się, że one też nie działają. Konflikty pozostają i git przerywa.

Jeśli jednak uruchomię git checkout -- <filename> za pomocą wiersza poleceń, ten konkretny plik nie jest już w konflikcie (ponieważ faktycznie nastąpiło wyewidencjonowanie). Tak więc problemem jest naprawdę uruchomienie polecenia git checkout ze skryptu Expect, którego jakoś nie udaje mi się zrobić.

Czy ktoś ma jakieś sugestie?

Jeśli to w ogóle pomaga, to jest to w CentOS 5, a skrypt „pullfromdev”, do którego odwołuje się kod, to po prostu:

#!/bin/bash
cd /var/www/html
ssh-agent bash -c 'ssh-add /xyz/<identity>; git pull'
2
emmzgtr 29 luty 2012, 22:07

2 odpowiedzi

Najlepsza odpowiedź

Podczas otwierania potoku wszystko poza pierwszym znakiem jest listą argumentów Tcl (pierwszy | jest specjalny). Oznacza to, że powinieneś użyć tego:

open |[list git checkout -- [string trim $line]]
1
Donal Fellows 1 marzec 2012, 19:52

Nie możesz używać == do porównywania ciągów w TCL. Wypróbuj porównanie ciągów lub regexp polecenia.

1
resmon6 29 luty 2012, 23:01