当脚本通过Launchd运行时,Git Push不起作用

时间:2014-06-23 20:08:49

标签: git mysqldump bitbucket launchd

我创建了一个脚本来创建一个mysqldump,将这个转储提交给我的本地Git,然后将这个Git推送到我的bitbucket帐户。当我通过终端(sh script.sh)运行脚本时,脚本运行正常。我制作了一个Plist文件并添加了它,因此Launchd运行它。

Launchd按照计划每天凌晨3点迅速运行它,并且执行所有命令,除了将本地Git提交推送到bitbucket。我究竟做错了什么?

正如您从我的脚本中看到的,我尝试添加大量日志记录,但我得到的日志记录仍然没有告诉我为什么推送不起作用,只是它不起作用。

所以我的问题是双重的:

  1. 如何在运行launchd的脚本中将本地Git推送到bitbucket?
  2. 我可以添加到我的脚本(或其他地方),以便我可以从launchd或此脚本进行日志记录,以便我可以诊断出现了什么问题?
  3. 我的剧本:

    #!/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的身份验证,我在我的钥匙串中使用我的用户名/ pw组合来推送https。

    我使用Bitbucket instructions设置了SSH。我创建了一个看起来像这样的ssh.sh脚本(和chmod +x'它):

    #!/bin/sh
    exec ssh -i "Users/sara/.ssh" "$@"
    

    我已使用export GIT_SSH = /Library/WebServer/Documents/scripts/ssh.sh将此脚本添加为变量。

    当我测试此设置以推送到Bitbucket(使用终端)时,它可以工作,但是出现错误,我的SSH目录或文件不存在。我假设它现在只能运行,因为ssh-agent已经在运行,并且因为在运行launchd时出现“不存在”错误而失败。我尝试用“〜/ .ssh”引用该位置,并包含文件名,所有选项都会出现同样的错误。

    接下来我该怎么办?如何查询我的关键位置以便找到它?

    解决方案: 最后我没有使用环境变量。

    让它为我工作的解决方案是启用SSH(之前我使用的是HTTPS)。最后我添加了

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

    到我的〜/ .ssh / config文件,因为它一直在问我的密码。我不想完全删除我的密码,但这使脚本能够正常工作。清除Launchd中的双重条目后(我的plist位于系统和用户文件夹中),它终于在昨晚正确运行。

1 个答案:

答案 0 :(得分:0)

您可以设置环境变量GIT_TRACE=1以使git显示正在执行的命令以及出错的位置。

那就是说,这个脚本没有认证,所以我要继续猜测这就是问题所在。最有可能的是,当您从shell运行脚本时,您的ssh-agent运行时会包含您的密钥。运行launchd时,代理未设置,密钥不在其中一个默认文件中(或受密码保护)。

您可以通过将环境变量GIT_SSH指向包含以下内容的shell脚本包装来解决此问题:

#!/bin/sh
exec ssh -i "path/to/my/unencrypted/ssh/key" "$@"

不要忘记chmod +x