シンプルな展開スクリプト

この投稿の目的は、サーバーにコードを展開するタスクに普遍的なソリューションを提供することではなく、 そのような問題を解決するためのオプションの1つを示すことです。 このソリューションがあなたのケースに適しているかどうかはあなた次第です



したがって、コードをサーバーにアップロードするタスクは、プログラマーの仕事の中で最も一般的なルーチンタスクの1つです。 この問題は非常によくここで認可されます 。 しかし、これまでのところ、多くの人がFTPを介して選択したファイルを無差別にコピーすることで解決しており、概念的に混乱とエラーを引き起こしています。 以下に、タスクを自動化する多かれ少なかれ普遍的なbashのスクリプトを提案します。



スクリプトはニーズに合わせて作成されたものであり、おそらくあなたのものとは異なるため、既成のソリューションとしてではなく、例として使用し、タスク用のファイルとともにファイルする準備をしてください。



サーバーにコードをアップロードするには、最初にすべての変更をsvnにコミットする必要があります。 その後、スクリプトを実行できます。 スクリプトはこれを行います:

1. SVNからプロジェクトコードをアンロードします

2.コードをアーカイブにパックします

3. scpを使用して、アーカイブをサーバーにアップロードします

4.サーバーで解凍する



注:

ssh, . ssh-keygen, public key/private key. , , google , .







deploy.shには多くのパラメーターがあり、-hスイッチを指定してプログラムを実行することで取得できる情報



# sh deploy.sh -h

Code deployer: version 1.2

: sh deploy.sh [-y 0 | -y 1] [-d path/to/source] [-H your.server.ru] [-u username]

: sh deploy.sh -y 0 -H your.server.ru -d /tmp -u progger



SVN_PATH, , SVN .

SVN: your.svnserver.ru/svn/repos/ypurproject/trunk



:

y - envos: 0 - , 1 - () ( : 0)

u - SSH ( : )

d - ( : /opt/hosting/your.server.ru)

H - SSH ( : your.server.ru)

h -








デフォルトでは、アンロードプログラムはすでに設定されています。これを使用する最も簡単な方法は、パラメータなしで単純に起動することです。 envosコードもアンロードする必要がある場合は、-yスイッチを使用します

#sh deploy.sh -y 1



この場合、アンロードはもう少し長く続きます。 コードのアップロード中に、deploy.shは現在何をしているかを通知します。



スクリプトコード:



#!/bin/bash



#

HOST= 'your.server.ru'

SVN_PATH= 'https://your.svnserver.ru/svn/repos/yourptoject/trunk/'

DOC_ROOT= "/opt/hosting/$HOST"

UPLOAD_ENVOS=0; # envos: 0 - , 1 - ()

USER= ''



bold= '\E[1m'

ebold= '\E[0m'



while getopts ":y:u:d:H:h" optname

do

case $optname in

"y" )

UPLOAD_ENVOS= "$OPTARG"

;;

"d" )

DOC_ROOT= "$OPTARG"

;;

"u" )

USER= "$OPTARG"

;;

"H" )

HOST= "$OPTARG"

;;

"h" )

echo -e "${bold}Yourproject code deployer: version 1.2 $ebold"

echo ": sh deploy.sh [-y 0 | -y 1] [-d path/to/source] [-H your.server.ru] [-u username]"

echo -e "${bold}: sh deploy.sh -y 0 -H your.server.ru -d /tmp -u progger $ebold"

echo ""

echo " SVN_PATH, , SVN .

SVN: $SVN_PATH"


echo ""

echo -e "${bold}: $ebold"

echo " y - envos: 0 - , 1 - () ( : $UPLOAD_ENVOS)"

echo " u - SSH ( : $USER)"

echo " d - ( : $DOC_ROOT)"

echo " H - SSH ( : $HOST)"

echo " h - "

echo ""

exit 0;

;;

*)

echo "Unknown parameter or option error with option - $OPTARG"

exit 1;

;;

esac

done



if [ $USER ]

then

SSH_HOST= "$USER@$HOST"

else

SSH_HOST=$HOST

fi



#rm -rf ./yourproject-tmp

echo "* $SSH_HOST"



echo '* SVN...'

svn export --force $SVN_PATH ./yourproject-tmp > /dev/ null

if [ $? -ne 0 ]

then

exit 1;

fi;



echo '* ...'

tar -czf yourproject.tar.gz yourproject-tmp

if [ $? -ne 0 ]

then

exit 1;

fi;



echo '* ...'



scp ./yourproject.tar.gz $SSH_HOST:$DOC_ROOT

if [ $? -ne 0 ]

then

exit 1;

fi;



echo '* e...'

ssh $SSH_HOST "cd $DOC_ROOT; tar -xzf yourproject.tar.gz 2> /dev/null && rm -rf $DOC_ROOT/op && mv $DOC_ROOT/yourproject-tmp $DOC_ROOT/op && chmod -R a+w $DOC_ROOT/op"

if [ $? -ne 0 ]

then

exit 1;

fi;



# envos ( )

if [ $UPLOAD_ENVOS -eq 1 ]

then

echo '* envos ( )...'

echo '* envos...'

tar -czf envos.tar.gz envos

if [ $? -ne 0 ]

then

exit 1;

fi;



echo ' * envos ...'

scp ./envos.tar.gz $SSH_HOST:$DOC_ROOT

if [ $? -ne 0 ]

then

exit 1;

fi;



echo ' * envos ...'

ssh $SSH_HOST "rm -rf $DOC_ROOT/envos && cd $DOC_ROOT/; tar -xzf envos.tar.gz 2> /dev/null"

if [ $? -ne 0 ]

then

exit 1;

fi;

fi



#

echo '* ...'

rm -rf ./yourproject-tmp

echo '* !'



* This source code was highlighted with Source Code Highlighter .








出力例:



#sh deploy.sh

*コードはyour.server.ruサーバーにアップロードされます

* SVNからコードをアンロードします...

*アーカイブを作成する...

*アーカイブをサーバーにコピー...

yourproject.tar.gz 100%269KB 89.6KB / s 00:03

*サーバーでアーカイブを解凍します...

*クリーン...

*完了!



いずれかの段階でエラーが発生した場合、コマンドは中断されます。



Envos.Frameworkのアンロードを管理する-yパラメーターに注目してください。 このコードを削除するかどうかは長い間考えていました。 私は去ることにした。 あなたの多くは、お気に入りのアプリケーションフレームワークを使用している可能性があり、そのコードは常にダウンロードする必要はありません。 多くの場合、これらのフレームワークは小さくなく、アンロードには余分な時間がかかります。 スクリプトはこれを考慮しますが、別のフレームワークを使用する場合は、コードを少し書き直す必要があります。



結論として、私はbashの第一人者ではないことを伝えたいと思います。スクリプトコードを改善するためのアドバイスに感謝します。 一方で、私は自分で最適化のパスをいくつか見ることができますが、そのような大量のコードでは、たとえば、関数に対する前の操作をチェックするためのコードを取得するのはノミ狩りだと思います。 しかし、もちろん、スクリプトが開発されてより複雑になると、そのようなリファクタリングは不要になります。



まだFTPを使用してコードをアップロードしている場合は、考えてみましょう:)



All Articles