docker-jenkins部署

Jenkins

是什么

​ Jenkins 是一个开源的持续集成和持续交付(CI/CD)工具,用于自动化软件开发过程中的构建、测试和部署任务。它帮助开发团队更高效地管理代码变更,确保软件质量。

主要功能

  1. 持续集成(CI continous intergration):自动构建和测试代码,快速发现并修复问题。
  2. 持续交付/部署(CD continous deliver/deployment):自动化部署流程,确保软件能快速、可靠地发布。
  3. 插件支持:通过丰富的插件扩展功能,支持多种开发工具和平台。
  4. 分布式构建:支持在多台机器上并行构建,提升效率。
  5. 流水线(Pipeline):通过定义流水线脚本,实现复杂工作流的自动化管理。

核心目标

1、提高效率:自动化构建、测试、部署,减少手动繁琐的操作

2、快速交付:缩短从开发到部署的时间,更快响应需求

3、提升质量:通过频繁部署测试和快速反馈,降低错误率

怎么用

参考视频

方便演示,我们采用docker安装jenkins,并且以下效果:
1、github项目main有新提交时触发构建
2、构建时达成jar包
3、调用宿主机的docker生成jar包的镜像
4、docker启动镜像

1、安装

1
docker pull jenkins/jenkins

2、启动jenkins

1
2
3
4
5
6
# 启动jenkins
docker run -u root -itd --name jenkins -p 6001:8080 -v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro -v /volume1/docker/jenkins:/var/jenkins_home jenkins/jenkins
# 进入jenkins
docker exec -it jenkins bash
# 查看密码
cat /var/jenkins_home/secrets/initialAdminPassword

-p 6001:8080

​ Jenkins默认网页访问端口为8080,将端口映射到外部主机

-v $(which docker):/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock\

​ 使Jenkins内部可以使用docker命令

-e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime:ro

​ 配置Jenkins容器的时区

-v /volume1/docker/jenkins:/var/jenkins_home

​ 将Jenkins的配置映射到外部主机卷,容器删除仍可保留配置,且可以把jdk、maven等软件挂载进来

3、初始化jenkins

1、登录 宿主机ip:6001进入jenkins页面,输入密码、设置第一个管理员密码root/root

2、安装推荐的插件

3、安装 Maven 、Publish Over SSH(用于把产物包通过ssh方式传给部署机器并配置执行命令,本次举例就是本机,所以没用到)

4、配置jdk、maven(虽然jenkins docker方式已内置jdk和git,但jdk版本比较高,我们实例项目用的jdk8,所以要配置)
设置maven目录和setting文件,注意文件目录其实就是挂载的目录

image-20250210232437245

image-20250210232504857

配置jdk

image-20250210232643009

5、新建任务:maven项目

1650643032247-9bc9e23e-bdcf-4966-a279-8810560b2cbe.png

6、配置任务

源码管理

image-20250210233023160

触发器(可选)

可以配置push后自动触发构建,由于是本机内网演示

1、利用natap生成一个内网穿透地址

2、在github仓库上设置钩子

进入 GitHub 仓库 → Settings → Webhooks → Add webhook:
Payload URL: http://<JENKINS-IP>/github-webhook/
Content Type: application/json
事件:Just the push event

3、在github上生成acces s token拿到token

4、配置github server secret text的value=token的值

image-20250213000134265

编译

image-20250210233134170编译后触发脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 进入项目工作区
cd /var/jenkins_home/workspace/docker-jenkins-test-pkg-runInDocker
# 检查文件是否存在
ls -l Dockerfile # 应存在
ls -l target/*.jar # 应存在
# 打印 JAR 包路径,方便调试
echo "JAR 包路径: $(find target -name '*.jar')"

# 构建 Docker 镜像
docker build -t docker-jenkins-test-pkg-runindocker:latest .

# 停止并删除之前运行的容器(如果存在)
docker stop docker-jenkins-test-pkg-runindocker || true
docker rm docker-jenkins-test-pkg-runindocker || true

# 运行新的 Docker 容器
docker run -d -p 18080:8080 --name docker-jenkins-test-pkg-runindocker docker-jenkins-test-pkg-runindocker:latest

image-20250210233256531

测试

项目push后自动触发构建

image-20250213000422054

控制台日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
Started by GitHub push by Callme24kHandsome
Running as SYSTEM
Building in workspace /var/jenkins_home/workspace/docker-jenkins-test-pkg-runInDocker
The recommended git tool is: NONE
No credentials specified
> git rev-parse --resolve-git-dir /var/jenkins_home/workspace/docker-jenkins-test-pkg-runInDocker/.git # timeout=10
Fetching changes from the remote Git repository
> git config remote.origin.url https://xxxx/docker-jenkins-test.git # timeout=10
Fetching upstream changes from https://xxxx/docker-jenkins-test.git
> git --version # timeout=10
> git --version # 'git version 2.39.5'
> git fetch --tags --force --progress -- https://github.com/Callme24kHandsome/docker-jenkins-test.git +refs/heads/*:refs/remotes/origin/* # timeout=10
> git rev-parse refs/remotes/origin/main^{commit} # timeout=10
Checking out Revision e02733c6cbff85d5622ede2327dc48549a63bbd8 (refs/remotes/origin/main)
> git config core.sparsecheckout # timeout=10
> git checkout -f e02733c6cbff85d5622ede2327dc48549a63bbd8 # timeout=10
Commit message: "修改Dockerfile"
> git rev-list --no-walk 840813635c7d52b9aa354a225f9eea7feb2a3243 # timeout=10
Parsing POMs
Established TCP socket on 37200
[docker-jenkins-test-pkg-runInDocker] $ /var/jenkins_home/gzip/jdk1.8.0_152/bin/java -cp /var/jenkins_home/plugins/maven-plugin/WEB-INF/lib/maven35-agent-1.14.jar:/var/jenkins_home/gzip/apache-maven-3.8.1/boot/plexus-classworlds-2.6.0.jar:/var/jenkins_home/gzip/apache-maven-3.8.1/conf/logging jenkins.maven3.agent.Maven35Main /var/jenkins_home/gzip/apache-maven-3.8.1 /var/jenkins_home/war/WEB-INF/lib/remoting-3283.v92c105e0f819.jar /var/jenkins_home/plugins/maven-plugin/WEB-INF/lib/maven35-interceptor-1.14.jar /var/jenkins_home/plugins/maven-plugin/WEB-INF/lib/maven3-interceptor-commons-1.14.jar 37200
Exception in thread "main" java.lang.UnsupportedClassVersionError: hudson/remoting/Launcher has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClassFromSelf(ClassRealm.java:425)
at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:42)
at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247)
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239)
at jenkins.maven3.agent.Maven35Main.main(Maven35Main.java:136)
at jenkins.maven3.agent.Maven35Main.main(Maven35Main.java:66)
ERROR: ================================================================================
ERROR: Invalid project setup: Connection reset
ERROR: [JENKINS-18403][JENKINS-28294] JDK 'jdk8' not supported to run Maven projects.
ERROR: Maven projects have to be launched with a Java version greater or equal to the minimum version required by the controller.
ERROR: Use the Maven JDK Toolchains (plugin) to build your maven project with an older JDK.
ERROR: Retrying with agent Java and setting compile/test properties to point to /var/jenkins_home/gzip/jdk1.8.0_152.
ERROR: ================================================================================
Established TCP socket on 42399
[docker-jenkins-test-pkg-runInDocker] $ /opt/java/openjdk/bin/java -cp /var/jenkins_home/plugins/maven-plugin/WEB-INF/lib/maven35-agent-1.14.jar:/var/jenkins_home/gzip/apache-maven-3.8.1/boot/plexus-classworlds-2.6.0.jar:/var/jenkins_home/gzip/apache-maven-3.8.1/conf/logging jenkins.maven3.agent.Maven35Main /var/jenkins_home/gzip/apache-maven-3.8.1 /var/jenkins_home/war/WEB-INF/lib/remoting-3283.v92c105e0f819.jar /var/jenkins_home/plugins/maven-plugin/WEB-INF/lib/maven35-interceptor-1.14.jar /var/jenkins_home/plugins/maven-plugin/WEB-INF/lib/maven3-interceptor-commons-1.14.jar 42399
<===[JENKINS REMOTING CAPACITY]===>���channel started
Executing Maven: -B -f /var/jenkins_home/workspace/docker-jenkins-test-pkg-runInDocker/pom.xml clean package -Dmaven.test.skip=true
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.example:docker-jenkins-test >-------------------
[INFO] Building docker-jenkins-test 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ docker-jenkins-test ---
[INFO] Deleting /var/jenkins_home/workspace/docker-jenkins-test-pkg-runInDocker/target
[INFO]
[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ docker-jenkins-test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] skip non existing resourceDirectory /var/jenkins_home/workspace/docker-jenkins-test-pkg-runInDocker/src/main/resources
[INFO] skip non existing resourceDirectory /var/jenkins_home/workspace/docker-jenkins-test-pkg-runInDocker/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ docker-jenkins-test ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /var/jenkins_home/workspace/docker-jenkins-test-pkg-runInDocker/target/classes
[INFO]
[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ docker-jenkins-test ---
[INFO] Not copying test resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ docker-jenkins-test ---
[INFO] Not compiling test sources
[INFO]
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ docker-jenkins-test ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ docker-jenkins-test ---
[INFO] Building jar: /var/jenkins_home/workspace/docker-jenkins-test-pkg-runInDocker/target/docker-jenkins-test-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.5.6:repackage (repackage) @ docker-jenkins-test ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 55.754 s
[INFO] Finished at: 2025-02-12T23:57:02+08:00
[INFO] ------------------------------------------------------------------------
Waiting for Jenkins to finish collecting data
[JENKINS] Archiving /var/jenkins_home/workspace/docker-jenkins-test-pkg-runInDocker/pom.xml to org.example/docker-jenkins-test/1.0-SNAPSHOT/docker-jenkins-test-1.0-SNAPSHOT.pom
[JENKINS] Archiving /var/jenkins_home/workspace/docker-jenkins-test-pkg-runInDocker/target/docker-jenkins-test-1.0-SNAPSHOT.jar to org.example/docker-jenkins-test/1.0-SNAPSHOT/docker-jenkins-test-1.0-SNAPSHOT.jar
[docker-jenkins-test-pkg-runInDocker] $ /bin/sh -xe /tmp/jenkins5156680462021271743.sh
channel stopped
+ cd /var/jenkins_home/workspace/docker-jenkins-test-pkg-runInDocker
+ ls -l Dockerfile
-rw-r--r--. 1 root root 120 Feb 9 23:21 Dockerfile
+ ls -l target/docker-jenkins-test-1.0-SNAPSHOT.jar
-rw-r--r--. 1 root root 17490950 Feb 12 23:56 target/docker-jenkins-test-1.0-SNAPSHOT.jar
+ find target -name *.jar
+ echo JAR 包路径: target/docker-jenkins-test-1.0-SNAPSHOT.jar
JAR 包路径: target/docker-jenkins-test-1.0-SNAPSHOT.jar
+ docker build -t docker-jenkins-test-pkg-runindocker:latest .
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
Install the buildx component to build images with BuildKit:
https://docs.docker.com/go/buildx/

Sending build context to Docker daemon 17.63MB

Step 1/5 : FROM openjdk:8
---> b273004037cc
Step 2/5 : COPY target/*.jar /app.jar
---> d8d778b1aa35
Step 3/5 : CMD ["--server.port=8080"]
---> Running in d1f198c573e4
---> Removed intermediate container d1f198c573e4
---> 30daec3524db
Step 4/5 : EXPOSE 8080
---> Running in 720318661c76
---> Removed intermediate container 720318661c76
---> 86fb695a5c0c
Step 5/5 : ENTRYPOINT ["java","-jar","/app.jar"]
---> Running in dd1f1629bc7a
---> Removed intermediate container dd1f1629bc7a
---> 88bb368191f9
Successfully built 88bb368191f9
Successfully tagged docker-jenkins-test-pkg-runindocker:latest
+ docker stop docker-jenkins-test-pkg-runindocker
docker-jenkins-test-pkg-runindocker
+ docker rm docker-jenkins-test-pkg-runindocker
docker-jenkins-test-pkg-runindocker
+ docker run -d -p 18080:8080 --name docker-jenkins-test-pkg-runindocker docker-jenkins-test-pkg-runindocker:latest
b983b6731e7c15730605d53681235195bbbb45be4c9bb11d5e74f21743763359
Finished: SUCCESS

3、部署成功

image-20250213000630844