web-dev-qa-db-ja.com

cronjobを使用したGit自動プル

実稼働サイトをマスターブランチと同期させるために、毎分git pullを実行するタスクを含むcronjobを作成しようとしました。

パーミッションの問題のため、gitプルはシステムユーザーnobodyが行う必要があります。ただし、nobodyアカウントはコマンドの実行を許可されていないようです。そのため、rootユーザーとしてタスクを作成する必要があります。

私が試したcrontabエントリ:

*/1 * * * * su -s /bin/sh nobody -c 'cd ~heilee/www && git pull -q Origin master' >> ~/git.log

動作せず、デバッグ方法もわかりません。

誰も助けてもらえますか?

更新1:git pullコマンド自体は正しいです。エラーなしで実行できます。

52
kayue

溶液:

*/1 * * * * su -s /bin/sh nobody -c 'cd ~dstrt/www && /usr/local/bin/git pull -q Origin master' 
29
kayue

そもそもアップデートを機能させる方法を理解する必要がありますが、アップストリームからフックを使用してそれを実行する方がはるかに良いでしょう。これは、post-commitフック、またはgithubを使用している場合は、単に受信側のフックを使用します。

11
Dustin
*/1 * * * * su -s /bin/sh nobody -c 'cd /home/heilee/src/project && /usr/bin/git pull Origin master'

これにより、受け入れられた回答がシステム(Ubuntu> 10.04サーバー)で機能しなくなるいくつかのエラーが修正されます。重要な変更点は、pullの前ではなく-qの後です。 /var/log/syslogファイルを末尾に置くか、更新されていない実稼働コードを実行しようとするまで、プルが機能しないことに気付かないでしょう。

5
hobs
#!/bin/bash
cd /home/your_folder/your_folder && /usr/bin/git pull [email protected]:your_user/your_file.git

それは私が使っていて働いていた

3
Syarif Alamoudi

それに対処する小さなスクリプトを作成します。それから、コマンドcrontabを使用できます

crontab -e
0 2 * * * cd /root && ./gitpull.sh > /root/log/cron.log  2>&1 &

gitpull.sh

#!/bin/bash

source /etc/profile
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
export TERM=${TERM:-dumb}

#----------------------------------------
# Please set the following variable section
# Please set up working directories, use','split
# eg:path="/root/test/path1,/root/test/path2"
path=""
#----------------------------------------

# Do not edit the following section

# Check if user is root
[ $(id -u) != "0" ] && { echo "${CFAILURE}Error: You must run this script as root.${CEND}"; exit 1; } 2>&1

# Check if directory path exists
if [[ "${path}" = "" ]]; then 
    echo "${CFAILURE}Error: You must set the correct directory path.Exit.${CEND}" 2>&1
    exit 1
fi

# Check if command git exists
if ! [ -x "$(command -v git)" ]; then
    echo "${CFAILURE}Error: You may not install the git.Exit.${CEND}" 2>&1
    exit 1
fi

# Check where is command git
git_path=`which git`

# Start to deal the set dir
OLD_IFS="$IFS" 
IFS="," 
dir=($path) 
IFS="$OLD_IFS" 

echo "Start to execute this script." 2>&1

for every_dir in ${dir[@]} 
do 
    cd ${every_dir}
    work_dir=`pwd`
    echo "---------------------------------" 2>&1
    echo "Start to deal" ${work_dir} 2>&1
    ${git_path} pull
    echo "---------------------------------" 2>&1
done

echo "All done,thanks for your use." 2>&1

作業ディレクトリを設定する必要があります

1
xiazhanjian