
Jenkins 部署、Pipeline 脚本编写与运维优化
Jenkins 自动化构建工具涵盖核心概念、快速部署、Pipeline 脚本编写及运维优化。内容包括 Linux 下 War 包安装、环境变量配置、JVM 内存调整。详解声明式与脚本式 Pipeline 语法,涉及 agent、stages、steps 指令及 Docker 集成。提供 Shell 脚本在构建中的调用技巧、错误处理及实用示例。最后总结性能优化、磁盘清理策略及常见问题排查方法。

Jenkins 自动化构建工具涵盖核心概念、快速部署、Pipeline 脚本编写及运维优化。内容包括 Linux 下 War 包安装、环境变量配置、JVM 内存调整。详解声明式与脚本式 Pipeline 语法,涉及 agent、stages、steps 指令及 Docker 集成。提供 Shell 脚本在构建中的调用技巧、错误处理及实用示例。最后总结性能优化、磁盘清理策略及常见问题排查方法。


在深入使用 Jenkins 之前,需要理解它的两个核心概念:自由风格项目和Pipeline 项目。自由风格项目通过 Web 界面进行配置,适合简单的构建任务;而 Pipeline 项目使用代码(通常是 Jenkinsfile)来定义整个构建、测试和部署流程,更适合复杂的工作流。
Jenkins 支持多种安装方式,以下是基于 Linux 系统的 War 包部署步骤:
http://your-server-ip:8080,使用 cat /var/lib/jenkins/secrets/initialAdminPassword 查看初始密码解锁 Jenkins。安装推荐的插件,并创建管理员账户。创建启动脚本 (jenkins.sh):
#!/bin/bash
cd $JENKINS_HOME
nohup java -Dhudson.model.DownloadService.noSignatureCheck=true -Xmx2g -jar jenkins.war --httpPort=8080 > logs/jenkins.log 2>&1 &
tail -f logs/jenkins.log
赋予执行权限并启动:chmod +x jenkins.sh && ./jenkins.sh。
配置环境变量:编辑 /etc/profile,添加以下内容并执行 source /etc/profile 使其生效。
export JENKINS_HOME=/home/ubuntu/jenkins
export PATH=$JENKINS_HOME/bin:$PATH
下载与部署:
# 创建专用目录
mkdir /home/ubuntu/jenkins
cd /home/ubuntu/jenkins
# 从官网下载最新版本的 jenkins.war
wget https://updates.jenkins.io/latest/jenkins.war
Manage Jenkins -> Manage Plugins -> Advanced,将 Update Site 的 URL 替换为国内镜像,如清华大学的 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json。Manage Jenkins -> Global Tool Configuration 中指定 JDK、Git 和 Maven 等工具的路径,避免每个项目单独配置。调整 JVM 内存:为避免内存溢出,在启动参数中(例如在 jenkins.sh 中)设置合适的堆内存大小:
JAVA_OPTS="-Xms512m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m"
Pipeline 脚本定义了自动化流程的各个阶段,其核心结构围绕 pipeline、agent、stages、stage 和 steps 这几个关键块展开。
Jenkins Pipeline 有两种语法:
声明式 Pipeline(Declarative Pipeline):结构更严格,可读性更强,是 Jenkins 推荐的首选。它使用 pipeline 块。
pipeline {
agent any // 表示可以在任何可用的代理上运行
stages {
stage('Checkout') {
steps {
git url: 'https://your-git-repo.com/project.git'
}
}
stage('Build') {
steps {
sh 'mvn clean package'
}
}
}
}
脚本式 Pipeline(Scripted Pipeline):基于 Groovy 的 DSL,提供极大的灵活性,适合有复杂逻辑的高级用户。它使用 node 作为起点。
node('master') {
// 指定在哪个节点上运行
stage('Checkout') {
// 从版本库拉取代码
git credentialsId: 'your-credentials', url: 'https://your-git-repo.com/project.git'
}
stage('Build') {
// 执行构建命令
sh 'mvn clean compile'
}
}
agent:定义整个 Pipeline 或特定 Stage 在何处执行。
any:在任何可用代理上执行。none:当在顶层使用 agent none 时,每个 stage 部分都需要定义自己的 agent。stages 与 stage:stages 包含一系列顺序执行的 stage。每个 stage 代表流程中的一个逻辑阶段,如构建、测试、部署。清晰的阶段划分有助于可视化流程。environment:用于设置环境变量,可以在 pipeline 顶层或 stage 级别定义。
environment {
MAVEN_OPTS = '-Xmx2048m'
CREDENTIALS = credentials('my-aws-credentials') // 安全地引用凭据
}
steps:在 stage 中定义具体要执行的一系列命令。
steps {
sh 'echo "开始构建..."' // 执行 Shell 命令
bat 'echo "在 Windows 上执行..."' // 执行 Windows 批处理命令
script {
// 在声明式 Pipeline 中嵌入脚本式语法以处理复杂逻辑
if (env.BRANCH_NAME == 'main') {
echo '正在构建主分支'
}
}
}
docker:在指定 Docker 容器中运行,确保环境一致性。
agent {
docker {
image 'maven:3.8.6-openjdk-11' // 使用特定的 Maven 镜像
args '-v /home/.m2:/root/.m2' // 挂载本地 Maven 仓库缓存
}
}
错误处理:使用 post 块根据构建结果执行清理或通知操作。
post {
always {
echo "无论构建结果如何都会执行"
junit '**/target/surefire-reports/*.xml' // 总是归档测试报告
}
success {
echo "构建成功时执行"
// mail to: team@com, subject: '构建成功!'
}
failure {
echo "构建失败时执行"
// 发送失败通知
}
}
在步骤中使用 catchError 或 try-catch 块可以捕获并处理错误,避免整个 Pipeline 因单一步骤失败而立即终止。
并行执行:使用 parallel 块加速独立任务。
stage('Test') {
parallel {
stage('Unit Test') {
steps {
sh 'mvn test'
}
}
stage('Integration Test') {
steps {
sh 'mvn integration-test'
}
}
}
}
在 Jenkins 中,Shell 脚本是实现构建、测试等自动化任务的核心手段。
在 Pipeline 或自由风格项目的构建步骤中直接调用 Shell 命令:
steps {
sh ''' # 多行 Shell 脚本
echo "构建开始于 $(date)"
mkdir -p build/output
mvn clean package
echo "构建完成"
'''
// 或者执行单独的脚本文件
sh 'sh /path/to/your/scripts/deploy.sh'
}
关键技巧:默认情况下,Shell 命令以非零状态退出会导致构建失败。你可以控制这种行为:
steps {
sh './some-script.sh' // 如果脚本失败,构建将标记为失败
sh './maybe-failing-script.sh || true' // 即使脚本失败,构建也会继续
// 更精细的控制
script {
try {
sh './script-that-might-fail.sh'
} catch (Exception e) {
echo "脚本执行失败,但构建继续:${e}" // 执行一些清理操作
}
}
}
文件操作与归档:
steps {
sh ''' # 查找并归档生成的 Jar 包
find . -name "*.jar" -exec cp {} build/ \;
# 为构建产物生成版本号
echo "BUILD_VERSION=1.0.${BUILD_NUMBER}" > build-info.properties
'''
// 使用 Jenkins 的 `archiveArtifacts` 步骤永久保存重要文件
archiveArtifacts artifacts: 'build/*.jar, build-info.properties', fingerprint: true
}
条件构建与部署:
#!/bin/bash
# 根据 Git 分支决定部署环境
if [ "$GIT_BRANCH" == "origin/main" ]; then
ENV="production"
SERVER="prod-server.com"
elif [ "$GIT_BRANCH" == "origin/develop" ]; then
ENV="staging"
SERVER="staging-server.com"
else
echo "不部署分支 $GIT_BRANCH"
exit 0
fi
echo "开始部署到 $ENV 环境..."
scp target/myapp.jar user@$SERVER:/deploy/path/
环境检查与清理:
#!/bin/bash
set -x # 开启调试模式,显示执行的命令
echo "当前工作目录:$(pwd)"
echo "Java 版本:$(java -version 2>&1 | head -n 1)"
echo "清理旧构建产物..."
rm -rf build/ dist/
mkdir -p build
set +x # 关闭调试模式
即使配置正确,也可能遇到问题。以下是一些常见场景的解决方案。
日志管理:定期清理 Jenkins 服务器和容器日志。可以创建一个定时任务来执行:
# 清理旧的 Tomcat 或 Jenkins 日志
find /var/log/tomcat -name "*.log" -mtime +30 -exec rm {} \;
丢弃旧构建:定期清理构建历史是释放磁盘空间最有效的方法。可以在项目配置中设置。
对于批量修改,可以使用 Jenkins 脚本命令行(Manage Jenkins -> Script Console)执行 Groovy 脚本:
import jenkins.model.Jenkins
import hudson.model.Job
import jenkins.model.BuildDiscarderProperty
import hudson.tasks.LogRotator
Jenkins.instance.allItems(Job).each { job ->
if (job.isBuildable() && job.supportsLogRotator()) {
// 保留最多 10 个构建,最多保持 7 天
job.addProperty(new BuildDiscarderProperty(new LogRotator(10, 7, -1, -1)))
println "已为 ${job.name} 配置丢弃旧构建策略"
}
}
git clone 失败并提示 Killed by signal 15:这通常是克隆超时导致的。解决方法是在 Jenkins 的系统配置或 Git 插件配置中增加超时时间。exit 0。jenkins.xml 的 arguments 中添加 --prefix=/your-path,然后重启服务。修改 CSRF 防护设置:高版本 Jenkins 默认开启 CSRF 防护。如果某些旧客户端兼容有问题,可能需要调整。可以通过启动参数禁用(不推荐在生产环境使用):
-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
通过掌握以上核心概念、脚本编写方法和运维技巧,你应当能够熟练运用 Jenkins 自动化你的软件开发流程。记得将 Pipeline 脚本纳入版本控制,并充分利用 Jenkins 强大的插件生态来扩展其功能。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online