创建个web项目
我这里直接用Spring Web自动生成的demos
启动项目,访问展示如下默认页面信息
在项目下新建docker目录,新增Dockerfile、docker-compose.yml文件
Dockerfile文件,将mytest.jar 复制到容器的/usr/local/目录下,在/usr/local执行命令java -jar mytest.jar
FROM daocloud.io/library/java:8u40-jdk
COPY mytest.jar /usr/local/
WORKDIR /usr/local
CMD java -jar mytest.jar
docker-compose.yml文件,当前目录以Dockerfile构建镜像,镜像叫mytest,版本v1.0,容器名字mytest,端口7777
version: '3.1'
services:
mytest:
build:
context: ./
dockerfile: Dockerfile
image: mytest:v1.0
container_name: mytest
ports:
- 7777:8080
build下添加配置,让jar包以mytest为名(mytest.jar,Docker构建里也是设置的复制名为这个jar包)
mytest
注意:如果跟我一样用默认生成的web还需修改主类配置,将主类配置修改如下。不然在本地正常运行,打成jar包后默认配置会跳过然后报错:no main manifest attribute, in mytest.jar
true
com.monster.mytest.MytestApplication
将代码上传至Gitlab
现在Gitlab还未做任何动作,先去Gitlab(192.168.170.111:8888)新建项目
这里测试我直接设置的公开的,不想多一步密码的操作
在IDEA添加Git远程
推送到远程仓库
第一次推送会提示要令牌
那我们就去Gitlab生成个令牌,来到用户设置里面 > Access Tokens
Token名称随意,必须授权api、read_user这两个范围,点击创建即可
点击创建按钮后,不要刷新或关闭页面,立马滑到最上面可以看见生成的token
只展示一次,刷新或关闭页面就得重新生成。
将token复制到IDEA提示的令牌款里既可以推送到Gitlab仓库了。
首先来到Jenkins配置 > 系统管理 > 系统配置,滑动到最下面添加SSH远程服务器,这里就是Publish Over SSH插件起到的重要。
将你需要把项目部署到哪台服务器,就添加哪台服务器的链接信息,例如这里我把项目部署到服务器192.168.170.111上(注意:部署的远程服务器需要安装好Docker)
设置好信息可以点击右下角的test configuration 测试一下连通性,是否能正常连接。
密码得点击左下角的“高级”按钮设置,支持使用密钥对的方式远程连接。
新建个任务,构建一个自由风格的软件项目
源码管理处设置你的git仓库地址,我这里设置的公开仓库拉去代码的时候无需账号密码,私有的点击高级按钮上面的“添加”按钮添加账号或密钥
需要注意你的Gitlab仓库的主分支是什么,设置对应不然拉去不到代码
Build Steps设置maven,选中你安装的maven名称,目标命令:拉取完代码后清理构建跳过测试生产target目录此时还在Jenkins服务器。
clean package -DskipTests
SSH Publishers,选择我们要发布到哪台服务器上,就是前面在添加的170.111那台,配置命令做了下面两个步骤。
Transfer SetSource files:将target目录下所有.jar的文件和docker目录下的所有文件复制到远程应用服务器的/usr/local/test目录下。(Jenkins系统设置里面SSH添加服务器时设置的默认远程路径)
target/*.jar docker/*
Exec command:这时170.111的/usr/local/test/目录下有target和docker两个目录。执行下面的代码命令把target目录下人jar包移动到Docker目录里来,然后在执行容器关闭和后台启动构建动作
cd /usr/local/test/docker
mv ../target/*jar ./
docker compose down
docker compose up -d --build
点击Jenkins任务构建按钮,观看日志成功
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.906 s
[INFO] Finished at: 2024-03-11T09:03:12Z
[INFO] ------------------------------------------------------------------------
SSH: Connecting from host [3821aea39450]
SSH: Connecting with configuration [应用服务器-170.111] ...
SSH: EXEC: completed after 3,402 ms
SSH: Disconnecting configuration [应用服务器-170.111] ...
SSH: Transferred 3 file(s)
Build step 'Send files or execute commands over SSH' changed build result to SUCCESS
Finished: SUCCESS
构建完成后,会看见在170.111服务器跑起来个名称叫mytest容器,映射端口7777,镜像mytest,版本v1.0
访问页面,192.168.170.111:7777
这里我修改默认的index.html页面内容
只需要把交代码提交到Gitlab
然后在Jenkins上,重新点击一下构建按钮,构建完成后刷新页面。
已经更新页面内容了,到此完成了CI持续集成动作。
由于每次构建都会产生一个同名称同版本的镜像,导致出现多个为none的镜像,会占用磁盘空间
[root@170.111 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytest v1.0 79953e7736f6 19 hours ago 833MB
341965b30bdb 19 hours ago 833MB
5be66eda3a9f 21 hours ago 833MB
76502810f6e2 21 hours ago 833MB
a081353ee813 46 hours ago 816MB
6274e74dbfe5 46 hours ago 816MB
92517e725bf1 47 hours ago 816MB
3e2cef065c83 47 hours ago 816MB
62562f7fbc8f 47 hours ago 816MB
cd7354c84a9e 2 days ago 816MB
27e5c4ec8cf6 2 days ago 816MB
4c0050b78b5f 2 days ago 816MB
02a8eea88e51 2 days ago 816MB
fb76f18fc433 2 days ago 816MB
6a0d37f91dc0 2 days ago 816MB
可以通过Docker命令清理:docker image prune -f
[root@170.111 ~]# docker image prune -f
Deleted Images:
deleted: sha256:92517e725bf1e5d7da3c1dda813abd0ecfb384e42e24274d688f178edb3274a5
deleted: sha256:6274e74dbfe5859d0c524cf944f4d6367f7ccb838b6959a2305cb3074a7a5db2
deleted: sha256:3e2cef065c83863c4fc72c6daaa91ad863ffb6169da989401439edd7b84da217
deleted: sha256:974684128082884b37b1ed66bdc92a0df158c46651bcc72a10016bc8254f5cc5
deleted: sha256:6a0d37f91dc07c88d018a2e5416a4421dacc03299d16af79fdac03863753cff5
deleted: sha256:ade3c592595e3988a9a11cecfc153d03c9125b3e0c24f0cdaf642cfadebd659a
deleted: sha256:27e5c4ec8cf67ea3e8fc1bf2e18328a63515d19332808480e263732347db96bf
deleted: sha256:4c0050b78b5f40dd2f005f92f7733c92f2ed8618e6e8deedcf72695795d2e07a
deleted: sha256:052d315bd2eb53b89eee437218b2abf0dc1a53db7fd6122fc8c56dcf8b0afb60
deleted: sha256:cd7354c84a9e307819628e3c7ac23c7d0d5a84783c659c3b85355f22fb12673e
deleted: sha256:6923a5cc1787c1a985feeec6efdb28ddb202cad65e6f3454bd2a08e8f1573326
deleted: sha256:02a8eea88e51a5874b2fbd14e267f717398251dc34f073ea5ca1bed4cf2c514e
deleted: sha256:62562f7fbc8f6f059072855fec452aa9ffd4927f130a069c59a0ee097b5d5ab4
deleted: sha256:a081353ee81397bb5464a44409248d0c192e7b57eb247af4ad74ef7f4454da68
deleted: sha256:0461e94f875334812d180c094c2a998d89ae74da08b6f34b0cedcdaf755126de
deleted: sha256:341965b30bdba2baabdddcdf3d5e3e98ff3c58eb696fe186c40646d05ffe7d9d
deleted: sha256:fb76f18fc433d3fbf8aa42dc0e2ee8dfaad6ee722fd1390288c37b7591cd7563
deleted: sha256:5be66eda3a9f5fbb5284e6e785a9cb5ac2484c6d5c53491d595a89192ca6aea3
也加到Jenkins执行命令中,就不用我们手动去清理了