36

テスト環境と本番環境にjenkinsでデプロイしたいです。そのためには、必要な環境のサーバー (ssh/scp など) に接続する必要があります。

最善の方法が何か知りたいです。

Jenkins-Deploy-Plug-in や Jenkins Publish over SSH Plugin など、これを行うためのプラグインをいくつか見つけました。1 つ目は多くの問題を抱えており、本番環境にデプロイするのはあまり信頼できません。2 つ目はグローバル構成を変更する必要があり、デプロイごとに手動で行う必要があります。

これを解決する方法はありますか?多分いくつかのスクリプトやプラグインで?

私が持っている唯一の現在のアイデアは、jenkinsでサーバーに接続し(おそらくSSHプラグインを使用して)、目的の環境に接続するスクリプトをそこで実行することです。しかし、それは2つの接続です。それは本当に必要ですか?このためのより簡単な方法を願っています。

ヒントをありがとう。

4

3 に答える 3

21

次の手順をお勧めします。

1 つのシェル スクリプト (jenkins サーバーのどこかに保存されている) がすべてを実行します。基本的に、スクリプトはビルド アーティファクトの scp を実行し、サーバー (ssh) に接続して、デプロイに必要なすべてのタスクを実行します (メンテナンス ページのセットアップ、現在のアプリのバックアップ、新しいアプリのデプロイなど)。

jenkins サーバーには、少なくとも 2 つのジョブがあります。

  • 最初のものは単にビルドを行います(maven、またはその他のビルドスクリプトを使用)
  • 2 番目のジョブは deploy を実行します。したがって、このジョブはシェル スクリプトのみを実行します。(ターゲット環境ごとに 1 つのデプロイ ジョブをお勧めします: テスト、運用など)

この「ワンクリック展開」を実現するために、「特別な」jenkins プラグインは必要ありません。jenkins ユーザーがターゲット サーバーに ssh アクセスできることだけが必要です。

編集

これが私の投稿を説明するためのサンプルシェルスクリプトです

#This script will copy the last artifact build by the job "MyApp" to test.myserver.com
#and remotely execute the deployment script.

#copy the war to the server
#(the job "MyApp" is using maven, that's why the war can be found at this location)
scp -i <HOME_DIR>/.ssh/id_dsa $HUDSON_HOME/jobs/MyApp_Build/workspace/myapp/target/myapp.war     deployeruser@test.myserver.com:/tmp/

#connect to the server and execute the deployment script
ssh -i <HOME_DIR>/.ssh/id_dsa deployeruser@test.myserver.com 
#The following is just an example of what a deployment script can be.
#of course you must adapt it to your needs and environment
"cd <TOMCAT_DIR>;
#first copy the current war to a backup directory (additionaly, I have a cron task deleting old undeployed apps)
cp -rf myapp-apps/myapp* undeployed/myapp-apps/; 
#execute a script (stored on the server) to properly stop the app
sh bin/myapp.sh stop; 
#delete current app
rm -rf myapp-apps/myapp; 
rm -rf myapp-apps/myapp.war;
#copy the uploaded war in tomcat app directory 
cp /tmp/myapp.war myapp-apps/; 
#execute a script (stored on the server) to start the app
sh bin/myapp.sh start"
于 2012-12-20T16:45:30.363 に答える
8

SSHを使用する
と、環境のセキュリティが危険にさらされ、トラブルシューティングが非常に困難になります。

リモートマシンにJenkins-Slaveをインストール
し、スレーブでジョブを実行してそこでテストを実行することをお勧めします。


スレーブはサーバーによって監視されるため、接続の管理にかかる手間が大幅に軽減されます。

ビルドが成功したときにリモートジョブをトリガーして
、そのビルドのアーティファクトを渡すことができます。
(最初のジョブでアーティファクトを共有ドライブに保存し、
それらのアーティファクトの場所を次のジョブに渡すこともできます)。

ここを参照してください:

于 2012-12-21T15:46:37.813 に答える
3

理想的には、展開にFabricCapistranoなどを使用し、それらのスクリプトを Jenkins から呼び出す必要があります。私は、Ruby On Rails と非 Ruby アプリケーションの両方で Capistrano を広範囲に使用してきました。私が考える最大の利点は次のとおりです。

  • デプロイ中にエラーが発生した場合にデプロイをロールバックするためのインテリジェンスが組み込まれています。
  • DB 移行、サービスの再起動などの一連のスクリプトを実行するために提供されるフック。
  • 必要に応じて手動でロールバックします。
于 2014-12-14T17:20:29.630 に答える