1. 环境准备Docker与Jenkins的安装配置第一次接触自动化部署时我被各种专业术语搞得晕头转向。直到自己动手搭建了一套DockerJenkins环境才发现原来从零开始并没有想象中那么难。我们先从最基础的环境搭建说起我会带你避开我当年踩过的所有坑。1.1 Docker安装详解在CentOS系统上安装Docker其实就像搭积木关键是要按正确顺序摆放组件。我建议先用以下命令清理可能存在的旧版本避免祖传配置带来的兼容性问题yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine接下来这步很关键——配置国内镜像源。我刚开始用官方源时下载速度堪比蜗牛爬换成阿里云镜像后速度直接起飞yum install -y yum-utils yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装核心组件时要注意版本匹配问题。有次我手快装了最新版结果和现有环境冲突不得不重装系统。稳妥起见建议指定稳定版本yum install docker-ce-20.10.12 docker-ce-cli-20.10.12 containerd.io启动服务后别急着欢呼记得运行docker version验证安装。有次我忘了启动服务折腾半天才发现Docker根本没运行。完整的验证流程应该是systemctl start docker systemctl enable docker docker run hello-world如果看到那只熟悉的鲸鱼LOGO说明你的Docker已经准备好扬帆起航了。1.2 Jenkins容器化部署用Docker安装Jenkins就像请了个专业管家连依赖环境都帮你打包好了。这个命令我用了不下20次每个参数都值得细说docker run --name jenkins -u root --rm -d \ -p 8080:8080 -p 50000:50000 \ -v /var/jenkins_home:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ jenkinsci/blueocean-v /var/run/docker.sock这个挂载特别重要它让Jenkins容器能直接操作宿主机的Docker。有次我漏了这个参数Jenkins就无法构建镜像了。-u root以root用户运行可以避免很多权限问题但生产环境建议配置专用用户--rm参数测试时很方便但正式环境建议去掉以便保存数据第一次访问Jenkins管理页面时很多人会被初始密码卡住。其实密码就藏在容器内部用这个组合命令就能看到docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword注意如果8080端口被占用可以改成-p 8081:8080这样的映射。我有次在阿里云上死活连不上后来才发现是安全组没放行端口。2. Jenkins系统配置插件与工具链刚解锁的Jenkins就像毛坯房需要装修才能入住。这部分我会分享如何把Jenkins打造成高效的自动化部署工具。2.1 必装插件全家桶在【系统管理】-【插件管理】里这几个插件是我的黄金搭档Maven IntegrationJava项目的编译利器Git Parameter实现动态分支选择后面会详细演示Publish Over SSH远程部署必备Gitee Plugin国内用户连接码云特别方便安装插件时有个小技巧先安装Maven Integration然后重启Jenkins再安装其他插件。有次我一次性安装所有插件结果依赖冲突导致不断报错。2.2 全局工具配置在【全局工具配置】里Maven配置最让人头疼。推荐直接使用容器内的Maven取消勾选自动安装在MAVEN_HOME输入/usr/share/maven记得在Jenkinsfile里配置对应的settings.xmlJDK配置更简单直接用JAVA_HOME环境变量即可。我遇到过时区问题解决方法是在Docker启动时加上-e JAVA_OPTS-Duser.timezoneAsia/Shanghai。3. 项目配置从代码到部署现在来到最激动人心的部分——让我们的项目实现代码提交即部署。3.1 创建流水线任务新建任务时选择自由风格项目然后重点配置这几个部分源码管理Git仓库地址填你的项目地址添加凭证时建议用SSH密钥方式比账号密码更安全构建触发器轮询SCM适合小型项目如H/5 * * * *表示每5分钟检查一次Webhook方式更高效需要配合Git仓库配置构建环境勾选Delete workspace before build starts保持环境干净添加时间戳变量方便日志追踪3.2 Dockerfile编写实战Spring Boot项目的Dockerfile模板我优化过好几个版本这个是最稳定的FROM openjdk:8-jdk-alpine VOLUME /tmp ARG JAR_FILEtarget/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT [java,-Djava.security.egdfile:/dev/./urandom,-jar,/app.jar]几个经验之谈使用alpine镜像可以大幅减小体积从300MB降到100MB内/dev/./urandom参数能解决Linux系统随机数生成慢的问题生产环境建议加上内存限制参数-Xmx512m3.3 Jenkinsfile自动化脚本在项目根目录创建Jenkinsfile这才是自动化部署的灵魂所在pipeline { agent any parameters { gitParameter name: BRANCH, type: PT_BRANCH, defaultValue: master, description: 选择要构建的分支 } stages { stage(拉取代码) { steps { git branch: params.BRANCH, url: gitgitee.com:your_project.git } } stage(构建) { steps { sh mvn clean package -Dmaven.test.skiptrue } } stage(部署) { steps { sh docker build -t your_image . docker stop your_container || true docker rm your_container || true docker run -d -p 8080:8080 --name your_container your_image } } } }这个脚本实现了动态分支选择需要Git Parameter插件支持三阶段流水线拉代码→构建→部署优雅的容器重启|| true避免首次运行报错4. 高级技巧与避坑指南4.1 动态分支部署安装Git Parameter插件后在任务配置页的参数化构建中添加参数类型分支参数名称BRANCH默认值origin/master选项勾选快速过滤这样每次构建时都会出现分支选择下拉框特别适合多分支并行开发的情况。4.2 构建优化技巧依赖缓存在Maven构建命令前加上mkdir -p $HOME/.m2 docker run -v $HOME/.m2:/root/.m2 -v $PWD:/app -w /app maven:3.6.3-jdk-8 mvn clean package这样Maven仓库就不会每次下载依赖构建速度提升80%以上。镜像清理定期执行这个脚本防止磁盘爆满docker system prune -f --filter until24h4.3 常见问题排查权限问题Jenkins操作Docker报错试试sudo usermod -aG docker jenkins文件无法删除检查SELinux状态setenforce 0网络问题构建时无法拉取依赖在Docker配置中添加国内镜像源Webhook不触发检查Jenkins URL是否配置正确资源限制容器内存泄漏加上-m 512m限制内存构建进程被kill调整JVM参数-Xmx256m