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 odpowiedzi
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]]
Nie możesz używać == do porównywania ciągów w TCL. Wypróbuj porównanie ciągów lub regexp polecenia.
Podobne pytania
Nowe pytania
git
Git to rozproszony system kontroli wersji typu open source (DVCS). Użyj tego tagu w przypadku pytań związanych z używaniem i przepływami pracy Git. NIE UŻYWAJ tagu [github] w przypadku problemów związanych z Git tylko dlatego, że repozytorium jest hostowane na GitHub. Nie używaj również tego tagu w przypadku ogólnych pytań programistycznych, które dotyczą repozytorium Git.