web-dev-qa-db-ja.com

JenkinsでSpring Boot Mavenアプリケーションをデプロイする方法は?

埋め込みTomcatサーブレットコンテナで実行されるSpring Bootアプリケーションがありますmvn spring-boot:run。また、プロジェクトを独立したTomcatとして独立した戦争として展開したくありません。

コードをBitBucket/Githubにプッシュするたびに、フックが実行され、Jenkinsジョブ(Amazon EC2で実行)がトリガーされてアプリケーションがデプロイされます。

Jenkinsジョブにはビルド後のアクションがあります:mvn spring-boot:run、問題は、ビルド後のアクションが終了するとジョブがハングすることです。

これを行う別の方法があるはずです。任意の助けをいただければ幸いです。

20
azizunsal

問題は、Jenkins ビルドからの子プロセスの生成をうまく処理しない です。 @Steveがコメント(Nohuping)で提案した回避策は私の場合の動作を変更しませんでしたが、簡単な回避策はscheduleat unixコマンドを使用したアプリの起動:

> echo "mvn spring-boot:run" | at now + 1 minutes

このようにして、ジェンキンスはタイムアウトすることなくジョブを正常に完了します。


.jar経由でJava -jar app.jarファイルからアプリケーションを実行することになった場合、 。jarファイルが上書きされるとブートが中断する に注意し、アプリケーションを確認する必要があります。アーティファクトをコピーする前に停止します。 ApplicationPidListenerを使用している場合、次のコマンドの実行を追加することにより、アプリケーションが実行されていることを確認できます(実行されている場合は停止します)。

> test -f application.pid && xargs kill < application.pid || echo 'App was not running, nothing to stop'
19
kryger

展開されたアーティファクトを追跡し、jenkinsジョブフォルダーからアプリを起動しないために、最初にサーバー上の指定された領域にアーティファクトをコピーすると非常に便利です。次に、サーバーログファイルを作成して、サーバーが起動するまでjenkinsウィンドウでそのファイルのリッスンを開始します。

それを行うために、私はあなたが見つけることができる小さなシェルスクリプトを開発しました here

Jenkinsでプロジェクトを構成する方法を説明する小さな記事もあります。

あなたのために働いたかどうか私に知らせてください。スナクス

5
Rogerio Coli

サーバーにJenkins-userがあり、このユーザーがJenkins-serviceの所有者であると仮定します。

  1. サーバーにrootとしてログインします。
  2. 実行Sudo visudo
  3. 末尾に「jenkins ALL =(ALL)NOPASSWD:ALL」を追加します(jenkins = your Jenkins-user)
  4. Jenkinsにサインインしてジョブを選択し、クリックして構成します
  5. 「ビルド後の手順」で「シェルを実行」を選択します
  6. これをコピーして貼り付けます:
   service=myapp
   if ps ax | grep -v grep | grep -v $0 | grep $service > /dev/null
   then
       Sudo service myapp stop
       Sudo unlink /etc/init.d/myapp
       Sudo chmod +x /path/to/your/myapp.jar
       Sudo ln -s /path/to/your/myapp.jar /etc/init.d/myapp
       Sudo service myapp start 
    else
       Sudo chmod +x  /path/to/your/myapp.jar
       Sudo ln -s  /path/to/your/myapp.jar /etc/init.d/myapp
       Sudo service myapp start 
    fi

ジョブを保存して実行すると、サービスが自動的に開始されます。

2
Anatole Nkwadjo

Nohupat now + 1 minutesがうまくいきませんでした。 Jenkinsはバックグラウンドでスピンされたプロセスを強制終了したため、そのJenkinsタスクに偽のBUILD_IDを設定することで、プロセスが強制終了されないようにしました。これは、Jenkins実行シェルタスクのようです。

BUILD_ID=do_not_kill_me
Java -jar -Dserver.port=8053 /root/Deployments/my_application.war &
exit

前述のとおり、 ここ

1
Sujay Anjankar

これはLinuxマシンのジェンキンスで私のために働いた

kill -9 $(lsof -t -i:8080) || echo "Process was not running."
mvn clean compile
echo "mvn spring-boot:run" | at now + 1 minutes

8080にプロセスがない場合は、メッセージを出力して続行します。

atがLinuxマシンにインストールされていることを確認してください。使用できます

Sudo apt-get install at

atをインストールする

0
muasif80