在 Linux 上定制 Jenkins 构建脚本的实用指南
一 选择项目类型与存放方式
二 Pipeline 方式定制脚本
pipeline {
agent any
parameters {
choice(name: 'DEPLOY_ENV', choices: ['dev','test','prod'], description: '部署环境')
string(name: 'VERSION', defaultValue: '', description: '构建版本/标签')
booleanParam(name: 'ROLLBACK', defaultValue: false, description: '是否回滚')
}
environment {
// 推荐用 withCredentials 绑定 SSH 私钥或用户名/密码
// 例如:withCredentials([sshUserPrivateKey(credentialsId: 'deploy-ssh-key', keyFileVariable: 'SSH_KEY')])
}
stages {
stage('Checkout') {
steps {
checkout scmGit(branches: [[name: env.BRANCH_NAME]], extensions: [], userRemoteConfigs: [[url: 'git@github.com:org/repo.git']])
}
}
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit '**/target/surefire-reports/*.xml'
}
}
}
stage('Deploy') {
when {
expression { !params.ROLLBACK }
}
steps {
script {
if (params.DEPLOY_ENV == 'dev') {
sh 'scp target/app.jar user@dev-server:/opt/app/'
sh 'ssh user@dev-server "systemctl restart app && systemctl is-active --quiet app || exit 1"'
} else if (params.DEPLOY_ENV == 'test') {
sh 'scp target/app.jar user@test-server:/opt/app/'
sh 'ssh user@test-server "systemctl restart app"'
} else if (params.DEPLOY_ENV == 'prod') {
// 生产环境可接入审批、灰度、金丝雀等策略
input '确认部署到生产环境?'
sh 'scp target/app.jar user@prod-server:/opt/app/'
sh 'ssh user@prod-server "systemctl restart app"'
}
}
}
}
}
post {
always {
echo "构建完成,环境:${params.DEPLOY_ENV},版本:${params.VERSION}"
}
failure {
emailext(
subject: "【构建失败】${env.JOB_NAME} #${env.BUILD_NUMBER}",
body: "详情:${env.BUILD_URL}",
to: 'team@example.com'
)
}
success {
emailext(
subject: "【构建成功】${env.JOB_NAME} #${env.BUILD_NUMBER}",
body: "版本:${params.VERSION},环境:${params.DEPLOY_ENV}",
to: 'team@example.com'
)
}
}
}
三 Freestyle 方式定制脚本
#!/usr/bin/env bash
set -euo pipefail
echo "部署环境:$DEPLOY_ENV,版本:$VERSION"
# 示例:打包
tar czf app-${VERSION}.tar.gz target/app.jar
# 示例:备份旧包
ssh user@${DEPLOY_ENV}-server "mkdir -p /opt/backups && [ -f /opt/app/app.jar ] && cp /opt/app/app.jar /opt/backups/app-${VERSION}-$(date +%F_%H%M%S).jar"
# 示例:上传并重启
scp target/app.jar user@${DEPLOY_ENV}-server:/opt/app/app.jar
ssh user@${DEPLOY_ENV}-server "systemctl restart app && systemctl is-active --quiet app || { echo '启动失败'; exit 1; }"
四 多平台与 Linux 节点编排
pipeline {
agent none
stages {
stage('Build on Linux') {
agent { label 'linux' }
steps { sh 'mkdir -p build && cd build && cmake .. && make' }
}
stage('Build on Windows') {
agent { label 'windows' }
steps { bat 'mkdir build && cd build && cmake .. && msbuild MyApp.sln /t:Rebuild /p:Configuration=Release' }
}
}
}
五 最佳实践与排错要点