Jenkins+tomcat の自動ホットデプロイメント/再起動と発生した問題の解決策 (推奨)

Jenkins+tomcat の自動ホットデプロイメント/再起動と発生した問題の解決策 (推奨)

1. 背景

同社のプロジェクトは、これまでは手動で Maven でパッケージ化し、サーバーにアップロードして、Tomcat を閉じたり開いたりしていました。このプロセス全体は時間がかかり、労力がかかります。シェル スクリプトを使用してすべてのプロセスを一度に解決することもできますが、アイデアの Jenkins プラグインを使用して 1 回のクリックで自動的に展開できれば、さらに時間と労力を節約できます。

以下は、Tomcat を公開するための簡単なシェル スクリプトです。次のスクリプトを実行するための前提条件は、サーバーに git と maven をインストールすることです。

# まず tomcat プロセスをシャットダウンします kill -9 `ps aux|grep tomcat|grep -v 'grep'| awk 'NR==1{print $2}'`
# プロジェクトの保存場所に切り替える cd nxyyProjectSource/NXYY
# git 最新のコードをプルする git pull xxxx
# プロジェクトの下のコード保存場所に切り替えます cd nxyy
# Maven パッケージング mvn clean
mvn インストール -DskipTests
# tomcat cdにwarパッケージを入れる
cp nxyyProjectSource/NXYY/nxyy/target/nxyy.war /home/tomcat/webapps
# Tomcatを起動する
cd /home/tomcat/bin
./スタートアップ.sh
# ログを表示する tail -f ../logs/catalina.out

Git をプルするたびにパスワードが必要になります。次の設定を行うと、パスワードは最初に入力するだけで、サーバーに永続的に保存されます。次回 Git をコピー/プルするときにはパスワードを入力する必要はありません。

git config --global credential.helper ストア

アカウントとパスワードを消去する場合は、次を入力します。

git config --global credential.helper をリセットする

一時保存(デフォルトは 15 分)が必要な場合は、次のように入力します。

git config --global credential.helper キャッシュ

プロジェクトをパスワードから免除するには、https リンクにusername:passwordを追加します。

git リモート追加 origin https://username:[email protected]

上記の設定は.git/configに保存されます。

2. Jenkinsのインストール/設定/ホットデプロイメント/スクリプトTomcatの再起動

インストール パッケージ jenkins.war をダウンロードし、インストール パッケージのルート パスで、コマンドjava -jar jenkins.war --httpPort=8080(linux環境、Windows環境都一樣),運行后有一個密碼,需要登錄時使用:

ブラウザを開き、リンク http://ip:8080 に移動し、プラグインのインストール選択に入ります。 よく使用される基本的な機能を使用できるように、推奨プラグインを選択することをお勧めします。 選択後、プラグインのインストールページに入ります。 一部のプラグインのインストールに失敗した場合は、クリックして再度インストールできます。

次回のログイン時の初期ユーザー名とパスワードを設定します。

システムに入るとインストールが完了します。

注: それでもシステムに入ることができない場合は、しばらく待つか、ページを更新する必要があります。 それでも入ることができない場合は、Jenkins サーバーを再起動する必要があります。 起動ホームページ URL の後に restart を追加するだけです [Restart: http://ip:8080/restart ]。 デフォルトのパスワードを入力してもスタックし続ける場合:

$JENKINS_HOME/hudson.model.UpdateCenter.xml ファイルのデフォルトの内容は次のとおりです。

<?xml バージョン = '1.0' エンコーディング = 'UTF-8'?>
 <サイト>
 <サイト>
 <id>デフォルト</id>
 <url>http://updates.jenkins-ci.org/update-center.json</url>
 </サイト>
</サイト>

このアドレスは外部サーバ上にあります。ファイアウォールのせいで初期化インターフェースに必要なプラグインがダウンロードできず、待機状態になっています。URLをhttp://mirror.xmission.com/jenkins/updates/update-center.json就解決了、Jenkinsのアクセスパスが設定されます。もちろん、ユーザー名を作成した後はこのパスが表示されます。

プラグインのインストール元を設定します: プラグイン管理 -> 詳細、http://mirror.xmission.com/jenkins/updates/current/update-center.json

Maven、JDK、Git 構成を含むシステム管理用のグローバル ツール構成を実行します。

設定後、プロジェクトをビルドし、[新しいタスク] を選択します。

プロジェクト情報を設定する前に、gitのユーザー名とパスワード、tomcatユーザーのユーザー名とパスワードなどの資格情報が必要です: システム管理 -> 資格情報の管理

Jenkins が tomcat をリモートで公開するには、tomcat のユーザー名とパスワードが必要です。これらは、tomcat の conf の tomcat-users.xml で設定されます。tomcat リモート公開には、tomcat-users.xml、context.xml (次の構成で発生する落とし穴、ポイント 5)、および manager.xml (次の構成で発生する落とし穴、ポイント 6) を変更する必要があります。

<tomcat-users xmlns="http://tomcat.apache.org/xml"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"

    バージョン="1.0">

 <role rolename="マネージャー GUI"/>
 <role rolename="マネージャースクリプト"/>
 <ロール ロール名="マネージャー-jmx"/>
 <role rolename="マネージャーステータス"/>
 <ロール ロール名="admin-gui"/>
 <user username="ユーザー名" password="パスワード" roles="マネージャーGUI、マネージャースクリプト、マネージャーJMX、マネージャーステータス、管理者GUI"/>
</tomcat-ユーザー>

プロジェクト情報を設定し、設定後にビルドします。サーバーで Tomcat を起動する必要があります。

上記はTomcatのホットデプロイメントです。以下はTomcatの再起動実行プロジェクトです。まず、プラグインPublish Over SSHをインストールし、情報を設定します。システム管理 -> 情報設定 -> Publish over SSH

設定を構築する前に、Tomcatを再起動するスクリプトを作成する必要があります: vi tomcat.sh、次に実行権限を付与します chmod 777 tomcat.sh

#ここで JAVA_HOME 設定を追加する必要があります。ローカル環境変数で設定されていますが、リモートで呼び出すときにも設定する必要があります。そうしないと、スクリプトの実行が失敗します。
JAVA_HOME=/usr/java/jdk1.8.0_141-cloudera をエクスポートします。
# tomcat の場所
tomcat_home=/home/tomcat-dev
#【3.1】 tomcat変数を停止する
シャットダウン=$tomcat_home/bin/shutdown.sh
#【3.2】 tomcat変数を起動する
STARTTOMCAT=$tomcat_home/bin/startup.sh
#【3.3】 war パッケージと war 解凍ファイルを含むすべてのプロジェクトファイルを削除します。部分リリースの場合、この文は必要ありません。これは、Jenkins が war 全体を公開するためだけです。
rm -rf /home/tomcat-dev/webapps/TSISAPP*

#プロセス ID を取得します。省略することもできます。プロジェクト名を ps -ef|grep して PID を取得できる場合は、次のように直接記述できます。
#なぜずっと前に書かれたのでしょうか? Jenkins がスクリプトを呼び出すと、Jenkins がスクリプトを呼び出すプロセスも呼び出されるからです。したがって、kill -9 は Jenkins プロセスを強制終了し、最初の構築リリースを中断します。
#ここではconfフォルダディレクトリに書き込みます
#Jenkinsを使用する必要がない場合は、次の簡潔なバージョンを使用してPIDコマンドを取得できます。
#PID=`ps -ef |grep プロジェクト名 |grep -v grep | awk '{print $2}'`
#【3.4】 プロセスIDを取得する
PID=`ps -ef |grep /home/tomcat-dev/conf |grep -v grep | awk '{print $2}'`
if [ ! "$PID" ];then # ここでTOMCATプロセスが存在するかどうかを判断します
echo "プロセスが存在しません"
それ以外
echo "プロセスが存在し、プロセス PID を強制終了します: $PID"
キル -9 $PID
フィ

#【3.5】プロジェクトを開始する
$STARTTOMCAT
echo "プロジェクトを開始"

ビルド: ポストステップで「SSH 経由でファイルを送信するかコマンドを実行する」を選択します。次のビルド後の操作 -> コンテナーに war/ear をデプロイする必要はなくなりました。

3. 建設現場で遭遇する落とし穴

Mavenプロジェクトが構築されていない場合は、プラグインを検索してインストールしてください: Maven統合プラグイン

ビルド後にコンテナにwar/earをデプロイしない場合は、プラグインを検索してインストールします: コンテナにデプロイプラグイン

次のエラーが発生します:

[エラー] このビルドには目標が指定されていません。有効なライフサイクル フェーズまたは目標を、<plugin-prefix>:<goal> または <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal> の形式で指定する必要があります。使用可能なライフサイクル フェーズは、validate、initialize、generate-sources、process-sources、generate-resources、process-resources、compile、process-classes、generate-test-sources、process-test-sources、generate-test-resources、process-test-resources、test-compile、process-test-classes、test、prepare-package、package、pre-integration-test、integration-test、post-integration-test、verify、install、deploy、pre-clean、clean、post-clean、pre-site、site、post-site、site-deploy です。-> [ヘルプ 1]

解決策: pom.xml の <build> タグに <defaultGoal>install</defaultGoal> を追加します。

次のエラーが発生します: org.codehaus.cargo.container.ContainerException: デプロイに失敗しました、または org.codehaus.cargo.container.ContainerException: [cargo.remote.username] および [cargo.remote.password] プロパティは必須であり、構成で定義する必要があります

解決策: pom.xml の <build> タグに <plugins> を追加します。

<プラグイン>
    <groupId>org.codehaus.cargo</groupId>
    <artifactId>cargo-maven2-プラグイン</artifactId>
    <バージョン>1.4.9</バージョン>
    <構成>
     <コンテナ>
      <!-- コンテナのバージョン名 -->
      <コンテナId>Tomcat 9.x</コンテナId>
      <type>リモート</type>
     </コンテナ>
     <構成>
      <type>ランタイム</type>
      <プロパティ>
       <!-- tomcat 管理インターフェース -->
       <cargo.remote.uri>http://ip:8888/manager/text</cargo.remote.uri>
       <!-- Tomcat 管理インターフェースのユーザー名とパスワード -->
       <cargo.remote.username>ユーザー名</cargo.remote.username>
       <cargo.remote.password>パスワード</cargo.remote.password>
      </プロパティ>
     </構成>
    </構成>
   </プラグイン>

次の問題が発生します: 原因: org.codehaus.cargo.container.tomcat.internal.TomcatManagerException: 指定したユーザー名は、テキストベースの Tomcat Manager の使用を許可されていません
解決策: tomcat の /webapps/manager/META_INF/context.xml ファイルに移動し、ファイル内の制限されたソース設定をコメント アウトします。

<コンテキスト antiResourceLocking="false" privileged="true" >
<!--
 <Valve クラス名="org.apache.catalina.valves.RemoteAddrValve"
   許可="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
--> //コメントアウトします <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</コンテキスト>

Tomcat リモート接続が 403 拒否と表示される場合は、conf/Catalina/localhost の下に manager.xml を追加します。

<?xml バージョン="1.0" エンコーディング="UTF-8"?>
<コンテキスト特権="true" antiResourceLocking="false"
   docBase="${catalina.home}/webapps/manager">
    <Valve クラス名="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</コンテキスト>

このアイデアは、リモート公開用の Jenkins プラグインと組み合わされています。Crumb データが http://ip:8080/crumbIssuer/api/xml?tree=crumb# から取得され、入力されると、CSRF が有効になります -> 欠落または不良な crumb データが表示されます

オンラインで解決策を検索すると、CSRF サービスを有効にするように指示されるものがほとんどです。

しかし、問題はまだ解決できません。解決策は次のとおりです。ユーザー名 -> 設定 -> APIトークン -> 現在のトークンをクリックし、トークン名でトークンを生成し、上記のユーザー名とパスワードを置き換えて、ようやく成功しました。

Jenkins+tomcat 自動リリースのホット デプロイメント/再起動と、発生した問題の解決策 (推奨) に関するこの記事はこれで終わりです。Jenkins tomcat ホット デプロイメントに関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • GitLab+Jenkins+Maven+Tomcatは自動統合、パッケージ化、デプロイメントを実現します
  • Tomcat で Jenkins をデプロイする方法

<<:  MySQL ストレステストツールの使い方

>>:  ES6拡張演算子の理解と使用シナリオ

推薦する

Vue.jsのレンダリング関数の使い方の詳しい説明

Vue では、ほとんどの場合、テンプレートを使用して HTML を作成することを推奨しています。ただ...

CSS3 はアニメーション属性を使用してクールな効果を実現します (推奨)

animation-name アニメーション名。複数のアニメーションがバインドされていることを示す...

CentOS7.6 システムで yum を使用して lnmp 環境を構成する方法

1. インストールバージョンの詳細 サーバー: MariaDB サーバーバージョン: 5.5.60-...

jQuery エディタ プラグイン tinyMCE の使い方

簡略化されたファイル サイズを変更し、サンプルをダウンロードします。ファイルをローカル コンピュータ...

Reactフック入門チュートリアル

ステートフック例: 'react' から useState をインポートします。 関...

デジタル時計効果を実現するJavaScript

この記事では、デジタル時計効果を実現するためのJavaScriptの具体的なコードを参考までに紹介し...

JavaScript イベント キャプチャ バブリングとキャプチャの詳細

目次1. イベントの流れ1. コンセプト2. DOMイベントフロー2. イベントの委任1. イベント...

MySQL リンクを表示し、異常なリンクを削除する方法

序文:データベースの運用や保守の際には、リンクの総数がいくつあるか、アクティブなリンクがいくつあるか...

一般的な Linux ディストリビューションのミラーソース構成の概要

最近 Linux を研究していて、いくつかの Linux ディストリビューションを試してみましたが、...

Ubuntu 18でターミナルを美しいコマンドラインプロンプトに変更する方法

VMware と Ubuntu を再インストールしましたが、コマンドラインプロンプトが単調すぎて美し...

Dockerイメージ作成の完全なプロセス

目次序文作成手順CentOSベースイメージを作成するコンテナを作成してカスタマイズするカスタムコンテ...

Centos に MYSQL8.X をインストールするチュートリアル

MySQLのインストール(4、5、6は省略可能)ステートメント: CentOS のバージョンは 7....

一般的な JavaScript 文字列メソッド 28 個と使用方法のヒントのまとめ

目次序文1. 文字列の長さを取得する2. 文字列の指定された位置の値を取得する(1) charAt(...

KVM 仮想マシンのオンライン ホット マイグレーションを実装する方法 (画像とテキスト)

1. KVM仮想マシンの移行方法と注意すべき点KVM 仮想マシンを移行する方法は 2 つあります。...

MySQL テーブルの読み取り、書き込み、インデックス作成、その他の操作の SQL ステートメントの効率最適化の問題を分析します。

前回は、Explain 実行プランの表示、インデックスの分析など、MySQL での SQL クエリの...