本文讲述在虚拟机环境下(模拟服务器),使用docker方式搭建jenkins,并部署一个简单的Springboot项目。仅记录关键步骤和遇到的坑
目录
一、环境准备和基础工具安装
1. 环境
2. yum安装
3. docker安装
4. 内网穿透工具安装natapp
二、jenkins安装和配置
2.0 安装jdk和maven
2.1 拉取镜像,lts长期稳定的最新版
2.2 运行jenkins docker镜像:(注意工作目录挂载)
2.2 使用docker-compose启动jenkins (推荐)
2.3 配置jenkins
三. jenkins构建第一个Springboot项目
3.1 创建任务
3.2 源码配置
3.3 构建触发器
3.4 构建步骤
3.5 测试构建
3.6 测试Gitee提交自动构建
四、运行项目
4.1 Dockerfile
4.2 Build Steps配置
一、环境准备和基础工具安装
1. 环境
系统环境为本机vmware创建的Ubuntu24.04。
2. yum安装
Ubuntu24.04 yum安装-CSDN博客
3. docker安装
Ubuntu安装Docker和Docker Compose-CSDN博客
4. 内网穿透工具安装natapp
因为需要使用gitee的WebHook自动构建任务,所以需要公网地址。选用natappa免费,但是域名可能会变化,运行时选择config.ini方式运行,映射8080端口,启动后就可以用域名访问jenkins.
后台运行:
(./natapp &)
查看日志:
参考:NATAPP1分钟快速新手图文教程 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具
二、jenkins安装和配置
注意:安装jenkins前先安装jdk和maven,因为docker启动时要挂载jdk、maven目录,否则在jenkins配置jdk和maven时会报错。安装时尽量安装到用户目录,包括maven仓库地址的配置,否则可能会有权限问题。
2.0 安装jdk和maven
上传jdk和maven:
# 将本地下载的jdk和maven上传到服务器用户目录
scp apache-maven-3.8.8-bin.zip root@124.71.152.254:/root/soft/
scp jdk-8u202-linux-x64.tar.gz root@124.71.152.254:/root/soft/
# 解压缩
tar -zxvf jdk-8u202-linux-x64.tar.gz
unzip apache-maven-3.8.8-bin.zip
配置环境变量、设置立即生效:
vim /etc/profile# 末尾添加
export JAVA_HOME=/root/soft/jdk1.8.0_202
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
export MAVEN_HOME=/root/soft/apache-maven-3.8.8
export PATH=$PATH:$MAVEN_HOME/bin# 立刻生效
source /etc/profile
验证:
mvn -v
java -version
配置maven镜像源为阿里云,配置仓库
mkdir repo
#进入maven目录
vim ./config/setting.xml<localRepository>/root/soft/repo</localRepository><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf>
</mirror>
参考:Linux开发环境搭建(二)之安装JDK和Maven_amazon linux2 安装java-CSDN博客
2.1 拉取镜像,lts长期稳定的最新版
docker pull jenkins/jenkins:lts
注意:jenkins的版本选择尽量提前确定好,目前lts最新版本为 > 2.346,官方提示2.346以后最低支持JDK11,也就是如果是JDK8的项目是会部署失败的(不过后面有插件可以解决解);选择低版本的jenkins可能会有插件安装失败的问题,所以版本要谨慎选择。
也可以安装blueocean版本,界面更加直观
docker pull jenkinsci/blueocean
jenkinsci/blueocean:这是一个专门为Jenkins设计的用户界面,旨在提供更直观、更现代的持续集成和持续部署(CI/CD)体验。Blue Ocean镜像通常包含Jenkins的长期支持(LTS)版本,并且已经预装了Blue Ocean插件,这些插件提供了一套全新的用户界面和交互方式,使得构建、查看和管理Jenkins项目变得更加简单和直观。
海洋版最新版本太低,初始化装插件时候很多都安装失败,建议装传统 lts版本,然后装海洋插件。
2.2 运行jenkins docker镜像:(注意工作目录挂载)
docker run --name jenkins -u root --rm -d -p 8080:8080 -p 50000:50000
-v /var/run/docker.sock:/var/run/docker.sock
-v /home/user/jdk1.8.0_202/bin/java:/home/user/jdk1.8.0_202/bin/java
-v /home/user/jdk1.8.0_202:/home/user/jdk1.8.0_202
-v /home/user/apache-maven-3.8.8:/home/user/apache-maven-3.8.8
-v /var/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
2.2 使用docker-compose启动jenkins (推荐)
新建docker-compose.yml,注意挂载maven地址和jdk地址为自己的地址
vim docker-compose.yml
version: "3.8"
services:jenkins:image: jenkins/jenkins:ltscontainer_name: jenkinsrestart: alwaysprivileged: trueuser: rootvolumes:- /var/run/docker.sock:/var/run/docker.sock- /var/jenkins_home:/var/jenkins_home- /root/soft:/root/soft- /usr/bin/docker:/usr/bin/docker- /etc/docker/daemon.json:/etc/docker/daemon.jsonports:- "8080:8080"- "50000:50000"environment:TZ: Asia/Shanghai
后台启动:
docker-compose up -d
报错1:docker-compose启动报错:HTTPConnection.request() got an unexpected keyword argument ‘chunked‘
解决:安装依赖包,忽略警告(否则会报错:Cannot uninstall 'urllib3'. It is a distutils installed project and thus we cannot accurately determ)
sudo pip install --ignore-installed 'urllib3<2'
报错2:执行报错pip install:error: externally-managed-environment
解决:强制删除此警告:
sudo mv /usr/lib/python3.x/EXTERNALLY-MANAGED /usr/lib/python3.x/EXTERNALLY-MANAGED.bk
注意python版本号写你自己的别直接抄,不知道到底是多少可以进/user/lib看看:
find /usr/lib/ -type d -name "*python*"
参考:解决运行pip install时提示错误:error: externally-managed-environment-CSDN博客
2.3 配置jenkins
插件安装
安装完成后访问地址-> http://{部署Jenkins所在服务IP}:8080
此处会有几分钟的等待时间。
先点击安装推荐的插件,然后安装其他插件:
- 安装
Maven Integration
- 安装
Publish Over SSH
(如果不需要远程推送,不用安装) - 如果使用Gitee 码云,安装插件Gitee(Git自带不用安装)
- 中文插件:Locale
配置jdk和maven
配置刚才安装的地址
报错:is not a directory on the Jenkins master(but perhaps it exists on some agents
解决:说明启动jekins时没有挂载jdk和maven目录,或者没有目录权限
配置gitee
gitee API令牌配置
去gitee获取令牌
设置时区
否则时间显示不对
jenkins脚本命令行执行:
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
参考:Jenkins+Docker 实现一键自动化部署项目!步骤齐全,少走坑路 - 爵岚 - 博客园 (cnblogs.com)
三. jenkins构建第一个Springboot项目
3.1 创建任务
选择自由风格
3.2 源码配置
3.3 构建触发器
需要去gitee填写
3.4 构建步骤
clean install -Dmaven.test.skip=true
3.5 测试构建
3.6 测试Gitee提交自动构建
在idea修改代码,可以看到jenkins已经自动构建
问题:
1. WebHook没有生效,gitee测试时候不会自动构建。
后面发现idea提交可以生效能触发自动构建,gitee测试时候显示404
2. 不兼容jdk8的问题,版本号大于2.357时最低兼容jdk11,对jdk8不兼容
解决:不使用maven方式构建; 或者装构建参数的插件,选择jdk8构建,安装 JDK Parameter 插件。
参考:Jenkins升级jdk11后 JAVA项目使用低版本jdk编译的解决办法_jdk低版本编译高版本运行-CSDN博客
新版本Jenkins(Version>2.357)兼容低版本JAVA项目部署_maven projects have to be launched with a java ver-CSDN博客
3. 项目打包报错“Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml
这时候用的spring-boot-maven-plugin插件打包,用idea的maven工具打包没问题,使用命令有问题,后续需要再研究一下。
解决:配置maven-war-plugin插件,如果
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.4.0</version>
</plugin>
参考:踩坑:maven打包失败的解决方式总结_maven打包报错-CSDN博客
四、运行项目
4.1 Dockerfile
在springboot项目根目录新建一个名为Dockerfile的文件,注意没有后缀名,其内容如下:(大致就是使用jdk8,把jar包添加到docker然后运行prd配置文件。详细可以查看其他教程)
# 基于 openjdk:8-jre 为基础镜像进行构建
FROM openjdk:8-jre
# 进入这个容器的目录指定为/app
VOLUME /app
# 将jar包放入/app目录下,并重新命名为app.jar
ADD target/jenkins-test-0.0.1-SNAPSHOT.war app.war
# 该项目使用的是8090端口,所有需要向外暴漏8090端口,日后才能通过映射的端口去访问这个暴漏的端口
EXPOSE 8090
# ENTRYPOINT 和 CMD 结合使用,ENTRYPOINT固定命令,CMD根据参数的不同 运行不同的jar包(动态参数)
ENTRYPOINT ["java","-jar"]
CMD ["app.war"]
# 相当于 java -jar xxx.jar
4.2 Build Steps配置
配置上层maven调用打包、然后执行shell脚本。
cd /var/jenkins_home/workspace/jenkins-test
docker stop jenkins-test || true
docker rm jenkins-test || true
docker rmi jenkins-test || true
docker build -t jenkins-test:latest .
docker run -d -p 8090:8090 jenkins-test
4.3 点击构建
问题:
1. jar包启动报错没有主清单属性
解决:将启动类打包进来,不能跳过
2. 运行shell报错,jenkins打包镜像报错 :docker: command not found,但是手动打包镜像没问题
解决:docker运行jenkins时挂载目录写的有问题,修改后就可以了
volumes:- /var/run/docker.sock:/var/run/docker.sock- /var/jenkins_home:/var/jenkins_home- /root/soft:/root/soft #主要是这个(里面有jdk maven 还有docker-compose.yml)- /usr/bin/docker:/usr/bin/docker #这个也需要- /etc/docker/daemon.json:/etc/docker/daemon.json
参考:Jenkins+Docker 实现一键自动化部署项目!步骤齐全,少走坑路 - 爵岚 - 博客园 (cnblogs.com)
docker-compose 集成Jenkins部署,打包,发布_jenkins打包,发布,部署docker-CSDN博客
成功! 可以通过ip端口访问自己的项目啦~ (*^▽^*)