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

この投稿の目的は、サーバーにコードを展開するタスクに普遍的なソリューションを提供することではなく、 そのような問題を解決するためのオプションの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を使用してコードをアップロードしている場合は、考えてみましょう:)

Source: https://habr.com/ru/post/J76558/


All Articles