1. Jenkins
1.1 简介
作为一款开源的自动化服务器,它可以帮助自动化各种任务,包括构建、测试和部署软件。Jenkins 以其灵活性和扩展性而闻名,它可以与许多版本控制系统、构建工具和其他软件交付工具集成。
一些主要的特性和用途:
-
持续集成(Continuous Integration, CI):Jenkins 可以自动运行构建任务,每当代码库发生变化时,它就会触发构建过程,帮助团队及早发现集成错误。
-
持续交付和持续部署(Continuous Delivery and Deployment, CD/CD):Jenkins 支持自动化部署流程,可以将软件自动部署到测试或生产环境,从而加快软件交付速度。
-
丰富的插件生态系统:Jenkins 拥有一个庞大的插件库,这些插件可以帮助用户扩展 Jenkins 的功能,以支持各种工具和服务。
-
易于集成:Jenkins 可以与 Git、Subversion、Maven、Gradle 等多种版本控制系统和构建工具集成,实现无缝的构建和部署流程。
-
多平台支持:Jenkins 可以在多种操作系统上运行,包括 Linux、Windows 和 macOS。
-
分布式构建:Jenkins 支持分布式构建,可以将构建任务分布到多个节点上执行,提高构建效率。
-
易于使用:Jenkins 提供了一个直观的 web 界面,用户可以通过它轻松配置构建任务和管理构建过程。
-
定时和触发构建:用户可以设置定时任务或根据特定的触发器(如代码提交)来运行构建。
-
报告和通知:Jenkins 可以生成构建报告,并在构建成功或失败时发送通知,帮助团队成员跟踪构建状态。
-
可扩展性:用户可以自定义 Jenkins 的行为,创建自定义插件来满足特定的构建和部署需求。
1.2架构图
2. Jenkins尝鲜
该案例使用一个Java后端小demo作为演示。
2.1 安装Jenkins
执行脚本:docker-compose -f docker-compose-jenkins.yml up -d
version: '3.8'# 执行脚本;docker-compose -f docker-compose-v1.0.yml up -d
services:
jenkins:
image: jenkins/jenkins:2.439
container_name: jenkins
privileged: true
user: root
ports:
- "9090:8080"
- "50001:50000"
volumes:
- ./jenkins_home:/var/jenkins_home # 如果不配置到云服务器路径下,则可以配置 jenkins_home 会创建一个数据卷使用
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/local/bin/docker
- ./maven/conf/settings.xml:/usr/local/maven/conf/settings.xml # 这里只提供了 maven 的 settings.xml 主要用于修改 maven 的镜像地址
- ./jdk/jdk1.8.0_202:/usr/local/jdk1.8.0_202 # 提供了 jdk1.8,如果你需要其他版本也可以配置使用。
environment:
- JAVA_OPTS=-Djenkins.install.runSetupWizard=false # 禁止安装向导「如果需要密码则不要配置」docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
restart: unless-stopped
volumes:
jenkins_home:
脚本说明:
-
./jenkins_home:/var/jenkins_home
是在云服务器端挂一个映射路径,方便可以重新安装后 Jenkins 依然存在。你也可以配置为jenkins_home:/var/jenkins_home
这样是自动挂在volumes jenkins_home
数据卷下。 -
docker
两个 docker 的配置是为了可以在 Jenkins 中使用 Docker 命令,这样才能在 Docker 安装的 Jenkins 容器内,使用 Docker 服务。 -
./maven/conf/settings.xml:/usr/local/maven/conf/settings.xml
为了在 Jenkins 中使用映射的 Maven 配置。 -
./jdk/jdk1.8.0_202:/usr/local/jdk1.8.0_202
用于在 Jenkins 中使用 jdk1.8 -
JAVA_OPTS=-Djenkins.install.runSetupWizard=false
这个是一个禁止安装向导,配置为 false 后,则 Jenkins 不会让你设置密码,也不会一开始就安装一堆插件。如果你需要安装向导可以注释掉这个配置。并且当提示你获取密码时,你可以执行;docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
获取到登录密码。
2.2 安装插件
更新镜像源:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
安装docker、git、maven.。可以安装Chinese汉化。
注:安装的插件需要重启后生效
2.3 配置maven、jdk、git、docker文件
文件路径:
jdk--->/usr/java
maven--->/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation
- Maven全局配置
划重点:这个文件需要在Jenkins内部存在
- JDK
划重点:这个文件需要在Jenkins内部存在,bin的上一层,没有该文件就会报如下错误
- Git
-
maven
-
docker
compose启动时已经将文件映射,docker的命令在Jenkins中可以使用
2.4 添加凭证
2.5 新建任务(构建流水线)
工作目录:/var/jenkins_home/workspace
任务名称:决定了项目名称
代码从哪里拉取:https://gitee.com/kaikai99/test-ci-cd.githttps://gitee.com/kaikai99/test-ci-cd.git
项目中需要Dockerfile文件,详解:https://blog.csdn.net/qq_41256535/article/details/139564482
Root POM:clean install -Dmaven.test.skip=true
这个pom文件的位置从当前位置有子目录的话需要用 " . "
构建后执行shell
# 先删除之前的容器和镜像文件
if [ "$(docker ps -a | grep jenkins-demo)" ]; then
if [ "$(docker ps | grep jenkins-demo)" ]; then
docker stop jenkins-demo
fi
docker rm jenkins-demo
fi
if [ "$(docker images -q kaikai/jenkins-demo)" ]; then
docker rmi kaikai/jenkins-demo
fi
# 重新生成
cd /var/jenkins_home/workspace/jenkins-demo
docker build -t kaikai/jenkins-demo .
docker run -itd -p 8811:8811 --name jenkins-demo kaikai/jenkins-demo
3. 注意事项
-
注意环境配置,在构建过程中容易出现找不到maven的settings.xml文件or显示settings.xml是一个目录,那可能是Jenkins中没有安装maven。
解决方案:
下载maven安装包,解压到/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation路径下,然后更改全局配置中maven的配置路径,到settings.xml。
-
找不到jdk,可能是路径没配置对(Jenkins内部也需要jdk)。
解决方案:
将下载的java安装包解压到/usr/java,更改全局配置中Java的配置路径,到bin的上一层。
-
容器构建好之后,运行出现 ‘找不到主类’,说明打包方式不对。
解决方案:在pom.xml文件中添加
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.0</version>
</plugin>
</plugins>
</build>
会打包两次,构建过程中出现repackage说明插件生效。
打包方式参考:https://www.jb51.net/program/306793zgg.htm
-
出现springboot版本异常或者插件版本异常
解决方案:对比需要的版本和拉取的版本
-
jdk17只支持springboot---><version>2.6.0</version>以上的,同理插件版本也是2.6.0以上。