本文讲述在虚拟机环境下(模拟服务器),使用docker方式搭建jenkins,并部署一个简单的Springboot项目。仅记录关键步骤和遇到的坑
目录
[1. 环境](#1. 环境)
[2. yum安装](#2. yum安装)
[3. docker安装](#3. docker安装)
[4. 内网穿透工具安装natapp](#4. 内网穿透工具安装natapp)
[2.0 安装jdk和maven](#2.0 安装jdk和maven)
[2.1 拉取镜像,lts长期稳定的最新版](#2.1 拉取镜像,lts长期稳定的最新版)
[2.2 运行jenkins docker镜像:(注意工作目录挂载)](#2.2 运行jenkins docker镜像:(注意工作目录挂载))
[2.2 使用docker-compose启动jenkins (推荐)](#2.2 使用docker-compose启动jenkins (推荐))
[2.3 配置jenkins](#2.3 配置jenkins)
[三. jenkins构建第一个Springboot项目](#三. jenkins构建第一个Springboot项目)
[3.1 创建任务](#3.1 创建任务)
[3.2 源码配置](#3.2 源码配置)
[3.3 构建触发器](#3.3 构建触发器)
[3.4 构建步骤](#3.4 构建步骤)
[3.5 测试构建](#3.5 测试构建)
[3.6 测试Gitee提交自动构建](#3.6 测试Gitee提交自动构建)
[4.1 Dockerfile](#4.1 Dockerfile)
[4.2 Build Steps配置](#4.2 Build Steps配置)
一、环境准备和基础工具安装
1. 环境
系统环境为本机vmware创建的Ubuntu24.04。
2. yum安装
3. docker安装
Ubuntu安装Docker和Docker Compose-CSDN博客
4. 内网穿透工具安装natapp
因为需要使用gitee的WebHook自动构建任务,所以需要公网地址。选用natappa免费,但是域名可能会变化,运行时选择**config.ini方式运行,映射8080端口,**启动后就可以用域名访问jenkins.
后台运行:
bash
(./natapp &)
查看日志:
参考:NATAPP1分钟快速新手图文教程 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具
二、jenkins安装和配置
注意:安装jenkins前先安装jdk和maven,因为docker启动时要挂载jdk、maven目录,否则在jenkins配置jdk和maven时会报错。安装时尽量安装到用户目录,包括maven仓库地址的配置,否则可能会有权限问题。
2.0 安装jdk和maven
上传jdk和maven:
bash
# 将本地下载的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
配置环境变量、设置立即生效:
bash
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
验证:
bash
mvn -v
java -version
配置maven镜像源为阿里云,配置仓库
bash
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长期稳定的最新版
bash
docker pull jenkins/jenkins:lts
注意:jenkins的版本选择尽量提前确定好,目前lts最新版本为 > 2.346,官方提示2**.346以后最低支持JDK11**,也就是如果是JDK8的项目是会部署失败的(不过后面有插件可以解决解);选择低版本的jenkins可能会有插件安装失败的问题,所以版本要谨慎选择。
也可以安装blueocean版本,界面更加直观
bash
docker pull jenkinsci/blueocean
jenkinsci/blueocean :这是一个专门为Jenkins设计的用户界面,旨在提供更直观、更现代的持续集成和持续部署(CI/CD)体验。Blue Ocean镜像通常包含Jenkins的长期支持(LTS)版本,并且已经预装了Blue Ocean插件,这些插件提供了一套全新的用户界面和交互方式,使得构建、查看和管理Jenkins项目变得更加简单和直观。
海洋版最新版本太低,初始化装插件时候很多都安装失败,建议装传统 lts版本,然后装海洋插件。
2.2 运行jenkins docker镜像:(注意工作目录挂载)
bash
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地址为自己的地址
bash
vim docker-compose.yml
bash
version: "3.8"
services:
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
restart: always
privileged: true
user: root
volumes:
- /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.json
ports:
- "8080:8080"
- "50000:50000"
environment:
TZ: Asia/Shanghai
后台启动:
bash
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)
bash
sudo pip install --ignore-installed 'urllib3<2'
报错2:执行报错pip install:error: externally-managed-environment
解决:强制删除此警告:
bash
sudo mv /usr/lib/python3.x/EXTERNALLY-MANAGED /usr/lib/python3.x/EXTERNALLY-MANAGED.bk
注意python版本号写你自己的别直接抄,不知道到底是多少可以进/user/lib看看:
bash
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脚本命令行执行:
bash
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配置文件。详细可以查看其他教程)
bash
# 基于 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脚本。
bash
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时挂载目录写的有问题,修改后就可以了
bash
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端口访问自己的项目啦~ (*^▽^*)