Jenkins を使用して、ワンクリックで SpringBoot アプリケーションをパッケージ化してデプロイする

一般的に、プロジェクトのデプロイメントはプルコード→ビルド→テスト→パッケージ→デプロイなどのプロセスで構成されますが、特にマイクロサービス時代にはサービスがたくさんあるため、頻繁にプロジェクトをデプロイする必要がある場合、継続的なテスト、パッケージ化、デプロイメントは、誰かが一日中これを行う必要があると推定されていますが、これは退屈で反復的で無意味であるため、継続的インテグレーション、継続的デリバリー、継続的デプロイメントが可能な一連の自動ビルドのプロセスが必要です。

Jenkins は、オープンソース CI&CD ソフトウェアのリーダーであり、構築、展開、自動化をサポートし、あらゆるプロジェクトのニーズを満たす 1,000 以上のプラグインを提供しています。Jenkins を使用してプロジェクトをビルドおよびデプロイできます。たとえば、コード リポジトリからコードを取得し、コードを実行可能ファイルにパッケージ化し、リモート SSH ツールを介してスクリプトを実行してプロジェクトを実行します。

1. 準備

実際の運用環境では複数のサーバーが存在する可能性がありますが、私は練習用に使用しており、追加のサーバーは手元になく、1 つだけです。そこで、Jenkins と Spring Boot プロジェクトの両方を 1 つのサーバーにデプロイしました。

今回はJenkinsのインストールにDockerを使用するため、事前に必要なJDK、Maven、Dockerの3つの環境構成をサーバーにインストールしておく必要があります。これら 3 つの環境のインストールについてはここでは詳しく説明しません。情報を確認して自分でインストールできます。

1. JDK環境を確認する

java -version

[root@liulihui home]# java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
[root@liulihui home]# 

2.Maven環境を確認する

[root@liulihui home]# mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/maven/apache-maven-3.6.3
Java version: 1.8.0_231, vendor: Oracle Corporation, runtime: /usr/local/java/jdk/jdk1.8.0_231/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.80.1.el7.x86_64", arch: "amd64", family: "unix"
[root@liulihui home]# 

3. Docker環境を確認する

[root@liulihui home]# docker version
Client: Docker Engine - Community
 Version:           20.10.21
 API version:       1.41
 Go version:        go1.18.7
 Git commit:        baeda1f
 Built:             Tue Oct 25 18:04:24 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.21
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.7
  Git commit:       3056208
  Built:            Tue Oct 25 18:02:38 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.12
  GitCommit:        a05d175400b1145e5e6a735a6710579d181e7fb0
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
[root@liulihui home]# 

2. Jenkinsのインストールと設定

1. Docker検索ジェンキンスイメージ

[root@liulihui home]# docker search jenkins
NAME                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
jenkins                        DEPRECATED; use "jenkins/jenkins:lts" instead   5585      [OK]       
jenkins/jenkins                The leading open source automation server       3330                 
jenkins/jnlp-slave             a Jenkins agent which can connect to Jenkins…   153                  [OK]
jenkins/inbound-agent                                                          81                   
bitnami/jenkins                Bitnami Docker Image for Jenkins                58                   [OK]
jenkins/agent                                                                  49                   
jenkins/slave                  base image for a Jenkins Agent, which includ…   48                   [OK]
jenkins/ssh-slave              A Jenkins slave using SSH to establish conne…   38                   [OK]
jenkins/ssh-agent              Docker image for Jenkins agents connected ov…   28                   
jenkins/jnlp-agent-docker                                                      8                    
jenkins/jnlp-agent-maven       A JNLP-based agent with Maven 3 built in        7                    
jenkins/pct                    Plugin Compat Tester                            5                    [OK]
jenkins/evergreen              An automatically self-updating Jenkins distr…   5                    
jenkins/jnlp-agent-python      A JNLP-based agent with Python built in         3                    
jenkins/jenkins-experimental   Experimental images of Jenkins. These images…   3                    [OK]
jenkins/jnlp-agent-alpine                                                      2                    
jenkins/jnlp-agent-coresdk                                                     2                    
rancher/jenkins-jenkins                                                        1                    
jenkins/jnlp-agent-node                                                        1                    
jenkins/jenkinsfile-runner     Jenkinsfile Runner packages                     1                    
jenkins/core-pr-tester         Docker image for testing pull-requests sent …   1                    
jenkins/ath                    Jenkins Acceptance Test Harness                 1                    [OK]
jenkins/jnlp-agent-ruby                                                        1                    
rancher/jenkins-slave          Jenkins Build Slave                             0                    [OK]
rancher/jenkins-jnlp-slave 

2. Docker が jenkins イメージをダウンロードします

[root@liulihui home]# docker pull jenkins/jenkins:lts
lts: Pulling from jenkins/jenkins
647acf3d48c2: Pull complete 
832e288237bc: Pull complete 
ea194d1bd1da: Pull complete 
98569593b9fd: Pull complete 
dfe249e8cdf2: Pull complete 
0f6f2e6d37bb: Pull complete 
07fcb98649b6: Pull complete 
1e33c26b1882: Pull complete 
7b24f0e29fe1: Pull complete 
4d90ef3a8f3b: Pull complete 
d98c8e675bea: Pull complete 
b45fc2bf9fd7: Pull complete 
d6e1fda9effc: Pull complete 
3635a44047f2: Pull complete 
486e1776d3bc: Pull complete 
41233d151800: Pull complete 
14a67803c2b3: Pull complete 
Digest: sha256:c1d02293a08ba69483992f541935f7639fb10c6c322785bdabaf7fa94cd5e732
Status: Downloaded newer image for jenkins/jenkins:lts
docker.io/jenkins/jenkins:lts
# 查看镜像
[root@liulihui home]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
jenkins/jenkins   lts       2a4bbe50c40b   13 months ago   441MB
java              8         d23bdf5b1b1b   5 years ago     643MB
[root@liulihui home]# 

3. DockerコンテナでJenkinsを実行する

# 命令如下:
docker run -p 9080:8080 --name liulihui-jenkins \
-u root \
-v /mydata/jenkins_home:/var/jenkins_home \
-v /usr/local/java/jdk/jdk1.8.0_231:/usr/local/jdk1.8 \
-v /usr/local/maven/apache-maven-3.6.3:/usr/local/apache-maven-3.6.3 \
-v $(which docker):/usr/bin/docker \
-v /var/run/docker.sock:/var/run/docker.sock \
-d jenkins/jenkins:lts
# 参数说明:
-p 9080:8080	端口映射(将容器的8080端口【后面的8080】映射到服务器的9080端口【前面的9080】,云服务器需要开通9080端口供外网访问)
--name	容器名字
-u root	用户名
-v /mydata/jenkins_home:/var/jenkins_home	 将配置文件夹挂在到主机(:前面的是主机目录,后面的是容器目录)
-v /usr/local/java/jdk/jdk1.8.0_231:/usr/local/jdk1.8	是把linux下的jdk和容器内的关联(配置Jenkins时使用,:前面的是主机目录,后面的是容器目录)
-v /usr/local/maven/apache-maven-3.6.3:/usr/local/apache-maven-3.6.3	是把linux下的maven和容器内的关联(配置Jenkins时使用,:前面的是主机目录,后面的是容器目录)
-v $(which docker):/usr/bin/docker	是可以在Jenkins容器里使用我们Linux下的docker
-v /var/run/docker.sock:/var/run/docker.sock	是可以在Jenkins容器里使用我们Linux下的docker
-d jenkins/jenkins:lts	后台启动 Jenkins镜像(最新版)
# 查看docker 正在运行的容器
[root@liulihui home]# docker ps 
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
9363f69cc773   jenkins/jenkins:lts   "/sbin/tini -- /usr/…"   19 seconds ago   Up 17 seconds   50000/tcp, 0.0.0.0:9080->8080/tcp, :::9080->8080/tcp   liulihui-jenkins

4. Jenkinsの構成

正常に実行されたら、次のアドレスにアクセスして Jenkins にログインします。最初のログインでは、管理者パスワードを入力する必要があります: http://your ip:9080/
ここに画像の説明を挿入

管理者パスワードを使用してログインします。管理者パスワードは、次のコマンドを使用してコンテナーの起動ログから取得できます。

# 查看日志,获取管理员密码
[root@liulihui home]# docker logs liulihui-jenkins
Running from: /usr/share/jenkins/jenkins.war
webroot: EnvVars.masterEnvVars.get("JENKINS_HOME")
2023-01-05 06:02:04.057+0000 [id=1]	INFO	org.eclipse.jetty.util.log.Log#initialized: Logging initialized @707ms to org.eclipse.jetty.util.log.JavaUtilLog
2023-01-05 06:02:04.141+0000 [id=1]	INFO	winstone.Logger#logInternal: Beginning extraction from war file
2023-01-05 06:02:09.723+0000 [id=1]	WARNING	o.e.j.s.handler.ContextHandler#setContextPath: Empty contextPath
2023-01-05 06:02:09.829+0000 [id=1]	INFO	org.eclipse.jetty.server.Server#doStart: jetty-9.4.43.v20210629; built: 2021-06-30T11:07:22.254Z; git: 526006ecfa3af7f1a27ef3a288e2bef7ea9dd7e8; jvm 11.0.13+8
2023-01-05 06:02:10.641+0000 [id=1]	INFO	o.e.j.w.StandardDescriptorProcessor#visitServlet: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
2023-01-05 06:02:10.757+0000 [id=1]	INFO	o.e.j.s.s.DefaultSessionIdManager#doStart: DefaultSessionIdManager workerName=node0
2023-01-05 06:02:10.757+0000 [id=1]	INFO	o.e.j.s.s.DefaultSessionIdManager#doStart: No SessionScavenger set, using defaults
2023-01-05 06:02:10.758+0000 [id=1]	INFO	o.e.j.server.session.HouseKeeper#startScavenging: node0 Scavenging every 660000ms
2023-01-05 06:02:11.848+0000 [id=1]	INFO	hudson.WebAppMain#contextInitialized: Jenkins home directory: /var/jenkins_home found at: EnvVars.masterEnvVars.get("JENKINS_HOME")
2023-01-05 06:02:12.155+0000 [id=1]	INFO	o.e.j.s.handler.ContextHandler#doStart: Started w.@216914{Jenkins v2.319.1,/,file:///var/jenkins_home/war/,AVAILABLE}{/var/jenkins_home/war}
2023-01-05 06:02:12.204+0000 [id=1]	INFO	o.e.j.server.AbstractConnector#doStart: Started ServerConnector@72cf2de5{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
2023-01-05 06:02:12.204+0000 [id=1]	INFO	org.eclipse.jetty.server.Server#doStart: Started @8856ms
2023-01-05 06:02:12.219+0000 [id=23]	INFO	winstone.Logger#logInternal: Winstone Servlet Engine running: controlPort=disabled
2023-01-05 06:02:12.576+0000 [id=30]	INFO	jenkins.InitReactorRunner$1#onAttained: Started initialization
2023-01-05 06:02:12.620+0000 [id=28]	INFO	jenkins.InitReactorRunner$1#onAttained: Listed all plugins
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$2 (file:/var/jenkins_home/war/WEB-INF/lib/guice-4.0.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$2
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2023-01-05 06:02:14.226+0000 [id=28]	INFO	jenkins.InitReactorRunner$1#onAttained: Prepared all plugins
2023-01-05 06:02:14.231+0000 [id=28]	INFO	jenkins.InitReactorRunner$1#onAttained: Started all plugins
2023-01-05 06:02:14.249+0000 [id=28]	INFO	jenkins.InitReactorRunner$1#onAttained: Augmented all extensions
2023-01-05 06:02:15.935+0000 [id=30]	INFO	jenkins.InitReactorRunner$1#onAttained: System config loaded
2023-01-05 06:02:15.936+0000 [id=30]	INFO	jenkins.InitReactorRunner$1#onAttained: System config adapted
2023-01-05 06:02:15.936+0000 [id=30]	INFO	jenkins.InitReactorRunner$1#onAttained: Loaded all jobs
2023-01-05 06:02:15.937+0000 [id=30]	INFO	jenkins.InitReactorRunner$1#onAttained: Configuration for all jobs updated
2023-01-05 06:02:16.146+0000 [id=44]	INFO	hudson.model.AsyncPeriodicWork#lambda$doRun$1: Started Download metadata
2023-01-05 06:02:16.212+0000 [id=44]	INFO	hudson.util.Retrier#start: Attempt #1 to do the action check updates server
2023-01-05 06:02:19.033+0000 [id=28]	INFO	jenkins.install.SetupWizard#init: 

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

f8bf269a288f4cdd92710f2d41eed6a1

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

2023-01-05 06:03:41.112+0000 [id=44]	INFO	h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
2023-01-05 06:03:41.113+0000 [id=44]	INFO	hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1
2023-01-05 06:03:41.115+0000 [id=44]	INFO	hudson.model.AsyncPeriodicWork#lambda$doRun$1: Finished Download metadata. 84,965 ms
2023-01-05 06:03:41.912+0000 [id=30]	INFO	jenkins.InitReactorRunner$1#onAttained: Completed initialization
2023-01-05 06:03:41.930+0000 [id=22]	INFO	hudson.WebAppMain$3#run: Jenkins is fully up and running
[root@liulihui home]#

管理者パスワードを入力した後、インストール インターフェイスに入り、プラグインのインストール方法を選択します。ここでは、推奨プラグインを直接インストールします。インストールが完了したら、管理者アカウントを作成します
写真:

ここに画像の説明を挿入

プラグインのインストール インターフェイスに入り、インターネットに接続し、プラグインのインストールを待ちます。
ここに画像の説明を挿入
インスタンスの構成を実行します。
ここに画像の説明を挿入

[保存して終了] をクリックすると、Jenkins のインストールが完了します。Jenkins
ここに画像の説明を挿入
を起動し、[システム管理] -> [プラグイン管理] をクリックして、カスタム プラグインのインストールを実行します。
ここに画像の説明を挿入

プラグイン サイトを変更し、元のサイト https://updates.jenkins.io/update-center.json を https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center に変更します。 .json プラグインをより速くダウンロードできるようになりました
写真:

以下のプラグインが正しくインストールされていることを確認してください。インストールされていない場合は、オプションのプラグインから検索してインストールしてください: (1) ロールに応じて権限を管理する
プラグイン: ロールベースの認可戦略
( 2) Jenkins によってパッケージ化された jar をアプリケーション サーバーにアップロードします: SSH 経由で公開します。

インストールされたプラグイン ロールベースの認可戦略
ここに画像の説明を挿入
インストールされたプラグイン SSH 経由で公開ここに画像の説明を挿入

インストールが完了したら、jenkins を再起動する必要があります。接続後に restart を追加することで jenkins を再起動するか、次のコマンドを使用します: docker restart コンテナ名 http://ip:9080/restart または docker restart コンテナ名 (ここでは
http ://ip: 9080/再起動)
ここに画像の説明を挿入
ここに画像の説明を挿入

5. JDK と Maven を構成する

システム管理 -> グローバル ツール設定を通じてグローバル ツールを設定します。パスは jenkins のパスです。jdk
設定
ここに画像の説明を挿入
Maven 設定
ここに画像の説明を挿入

[システム管理] -> [システム構成] で、[SSH 経由で公開] を見つけ、接続するアプリケーション サーバーを構成します (次の操作では、jenkins リモート ssh を使用してアプリケーション サーバーに接続し、構築後にアプリケーションをデプロイして実行する必要があります。ユーザー名)とパスワードにより、jar パッケージがアップロードに失敗したため、アプリケーション サーバーで SSH キー ペアを生成する必要があります。)
Centos 7で SSH キーを作成する 表示: https://blog.csdn.net/liulihui1988/article/details /128590218?spm=1001.2014.3001.5502
写真:
Jenkins は ssh を使用します。 リモート Linux スクリプトを実行できます。

[システム管理] -> [資格情報] に移動し、Gitee ログイン アカウントの資格情報を追加します。次に、Gitee の認証情報を設定します。これらの認証情報に基づいて、Gitee からコードを取得できます。
ここに画像の説明を挿入
ここに画像の説明を挿入
入力が完了したら、認証情報を選択すると、通常どおり git ウェアハウスに接続できます。

すべての構成作業が完了したら、プロジェクトの構築を開始できます。

3. SpringBoot アプリケーションをパッケージ化してデプロイする

1. Jenkins でタスクを作成して実行する
写真:

タスク名を設定した後、フリー スタイル ソフトウェア プロジェクトをビルドすることを選択します。
ここに画像の説明を挿入
2. git 認証情報の追加
gitee ログイン アカウント認証情報を追加します。次に、gitee の資格情報を構成します。これに基づいて gitee からコードを取得できます。(以前に認証情報を追加した場合は、ここでそれを選択するだけです)
写真:
入力後、認証情報を選択すると、通常どおり git ウェアハウスに接続できます。

3. Maven ビルドの追加
Maven ビルド
ここに画像の説明を挿入
Maven バージョンを選択し、Maven コマンドを設定して、pom ファイルの場所を指定します。
ここに画像の説明を挿入
ビルド後の操作手順を追加します。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

ディレクトリ マッピングは以前に jenkins を実行したときに行われているため、jenkins がパッケージをパックした後、サービスによってマップされたディレクトリにパッケージが実際に同期されます。したがって、ここで jar パッケージをアップロードする必要はありません。xshell コマンドを直接実行し、jar パッケージのディレクトリに入って、jar パッケージを実行するだけです。

シェルスクリプト:

#第一步是进入到服务器中生成好的jar包的目录下
cd /mydata/jenkins_home/workspace/demo/target/
#第二步是根据jar包的名字获取运行的pid,并且将该进程杀死
ps -ef | grep demo-0.0.1-SNAPSHOT.jar   |   grep -v   grep   |   awk '{printf $2}'  |  xargs kill -9
#执行 前加载一下环境变量,否则不会执行java -jar 命令
source /etc/profile
#最后一步就是将这个jar后台启动了,并且将日志输出到warpper.log中。
nohup java -jar demo-0.0.1-SNAPSHOT.jar >demo.log &2>1 &
#睡眠1秒
sleep 1
#输出内容,可不加
echo "启动完成>>>>"

4. 今すぐ構築する

構成が完了したら、「今すぐビルド」をクリックすると、コンソール出力が成功したことがわかります。
写真:
プロジェクト パッケージのブランチを選択します:
ここに画像の説明を挿入
ブランチ構成:
ここに画像の説明を挿入
ここに画像の説明を挿入
サービスは正常にデプロイされ、テスト インターフェイスは正常に戻ります:
ここに画像の説明を挿入

Supongo que te gusta

Origin blog.csdn.net/liulihui1988/article/details/128590305
Recomendado
Clasificación