2014-06-23 130 views
2

我做了一個腳本來創建一個mysqldump,將這個轉儲提交給我的本地Git,然後將這個Git推送到我的bitbucket帳戶。當我通過終端運行腳本時,腳本運行良好(sh script.sh)。我做了一個Plist文件並添加它,以便Launchd運行它。當腳本運行Launchd時,Git Push不起作用

Launchd按計劃每天凌晨3點立即運行它,並執行所有命令,除了將本地Git提交到bitbucket。我究竟做錯了什麼?

正如你可以從我的腳本中看到的,我嘗試添加大量的日誌記錄,但是我得到的日誌記錄仍然沒有告訴我爲什麼這個推送不起作用,只是它沒有工作。

所以我的問題是雙重的:

  1. 我怎樣才能把我的本地GIT中通過的launchd運行的腳本到位桶?
  2. 我可以添加到我的腳本(或其他地方),所以我可以從launchd或此腳本進行日誌記錄,以便我可以診斷出現了什麼問題?

我的腳本:

#!/bin/sh 

exec 1> /Library/WebServer/Documents/backup/fulllog 

# echo start message 
echo $(date) "- Backup Script Processing" >> /Library/WebServer/Documents/backup/log 

# navigate to backup dir 
if 
    cd /Library/WebServer/Documents/backup/ 
then 
    echo $(date) "- Successfully navigated to backup dir" >> /Library/WebServer/Documents/backup/log 
else 
    echo $(date) "- Could not locate backup directory" >>  /Library/WebServer/Documents/backup/log 
    exit 0 
fi 

# echo message 
echo $(date) "- Exporting SQL dump" >> /Library/WebServer/Documents/backup/log 

if 
    #dump the db into a .sql file 
    /usr/local/mysql/bin/mysqldump --user=root --password=password --skip-extended-insert library > /Library/WebServer/Documents/backup/library.sql; 
then 
    #echo success message 
    echo $(date) "- SQL dump successful" >> /Library/WebServer/Documents/backup/log 
else 
    #echo error message 
    echo $(date) "- Mysqldump error" >> /Library/WebServer/Documents/backup/log 
    exit 0 
fi 

#add just created mysqldump to git 
if 
    /usr/local/git/bin/git add library.sql 
then 
    echo $(date) "- Backup successfully added to local Git staging" >> /Library/WebServer/Documents/backup/log 
else 
    echo $(date) "- Error adding backup to local Git staging" >> /Library/WebServer/Documents/backup/log 
    exit 0 
fi 

if 
    /usr/local/git/bin/git add log 
then 
    echo $(date) "- Log successfully added to local Git staging" >> /Library/WebServer/Documents/backup/log 
else 
    echo $(date) "- Error adding log to local Git staging" >> /Library/WebServer/Documents/backup/log 
    exit 0 
fi 

if 
    /usr/local/git/bin/git commit -m 'Nightly SQL dump' 
then 
    echo $(date) "- Backup successfully committed to local Git" >> /Library/WebServer/Documents/backup/log 
else 
    echo $(date) "- Error committing backup to local Git" >> /Library/WebServer/Documents/backup/log 
    exit 0 
fi 

if 
    /usr/local/git/bin/git push origin master 
then 
    echo $(date) "- Backup Git Commit successfully pushed to origin master" >> /Library/WebServer/Documents/backup/log 
else 
    echo $(date) "- Backup Git Commit not pushed to origin master" >> /Library/WebServer/Documents/backup/log 
fi 

編輯補充: 謝謝您的回答。我添加了環境變量GIT_TRACE=1

你說得對,在腳本中沒有對Bitbucket進行身份驗證,我在我的鑰匙串中使用我的用戶名/密碼組合來推送https。

我已經使用Bitbucket instructions設置了SSH。我做了一個ssh.sh腳本,看起來像這樣(和chmod +x倒是它):

#!/bin/sh 
exec ssh -i "Users/sara/.ssh" "[email protected]" 

我加入這個腳本使用export GIT_SSH = /Library/WebServer/Documents/scripts/ssh.sh的變量。

當我測試此設立推向到位桶(使用終端)它的工作原理,但有錯誤,我的SSH目錄或文件不存在。我假設它只是現在的工作,因爲SSH代理已在運行,而且它會通過的launchd運行的時候,因爲「不存在」的錯誤而失敗。我試着用「〜/ .ssh」來引用位置,並且包括文件名,所有的選項都給出了相同的錯誤。

接下來我該做什麼?我如何參考我的關鍵位置以便找到它?

解決方案: 最後我沒有使用環境變量。

解決辦法得到它的工作對我來說是讓SSH(我使用HTTPS之前)。最後,我加入

Host bitbucket.org 
StrictHostKeyChecking no 
IdentityFile /Users/sara/.ssh/id_rsa 

在我的〜/ .ssh/config文件,因爲它一直在問我要我的密碼。我不想完全刪除我的密碼,但是這使腳本能夠工作。清理中的launchd雙項後(我的plist是在系統和用戶文件夾兩者)終於正確昨晚跑了。

回答

0

您可以設置環境變量GIT_TRACE=1使混帳顯示什麼命令,它的執行,並在那裏出了問題。

也就是說,在這個腳本中沒有驗證,所以我會繼續前進,猜測是這個問題。最有可能當你從你的shell運行腳本時,你的ssh-agent運行包含你的密鑰。在運行launchd時,代理未安裝,並且密鑰不在默認文件之一中(或者受密碼保護)。

您可以通過將環境變量GIT_SSH指向包含這樣的一個shell腳本包裝解決這個問題:

#!/bin/sh 
exec ssh -i "path/to/my/unencrypted/ssh/key" "[email protected]" 

不要忘記chmod +x它。

+0

感謝您的回答。我已經嘗試過,但還沒有完成。看到我原來的問題,我現在在哪裏。我非常接近... –

+0

它應該指向文件名,而不是目錄。如果它在默認的'〜/ .ssh/id_rsa'或者'〜/ .ssh/id_dsa'中,它應該使用特殊的包裝器。 –

+0

抱歉沒有讀你是全部評論。我認爲你只是缺少路徑中的初始斜槓,它應該是'/ Users/sara/.ssh/id_rsa'或類似的。 –

相關問題