知道自己想要的流程是什么样,可以通过ai直接构建。脚本上手很快
groovy
pipeline {
agent { label 'kylin-arm' } // 指定运行节点标签(ARM 架构)
options {
disableConcurrentBuilds() // 禁止并发执行
}
parameters {
string(name: 'Target', defaultValue: '', description: '目标提交 ID(TARGET_COMMIT)')
string(name: 'BaseCommit', defaultValue: '', description: '基准提交 ID(BASE_COMMIT)')
string(name: 'OutputZip', defaultValue: 'output.zip', description: '差异压缩包名称')
}
environment {
ECDIS_QT_BIN = '/opt/Qt5.12.8/5.12.8/gcc_64/bin'
PATH = "${ECDIS_QT_BIN}:${env.PATH}"
}
stages {
// ---------- 阶段1:拉取目标代码 ----------
stage('Checkout TARGET') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: 'dev-new']],
extensions: [
[$class: 'CloneOption', depth: 1, shallow: true, timeout: 30],
[$class: 'RelativeTargetDirectory', relativeTargetDir: 'TARGET'],
[$class: 'CloneOption', depth: 0, shallow: false], // 改为完整克隆供后续引用
[$class: 'SubmoduleOption',
parentCredentials: true,
recursiveSubmodules: true,
reference: '',
trackingSubmodules: false,
timeout: 60,
disableSubmodules: false]
],
userRemoteConfigs: [[
url: 'http://HNJenkins:HNJenkins2!#@192.168.14.42:10087/HainingECDIS/ECDIS57.git',
credentialsId: 'git-credentials'
]],
doGenerateSubmoduleConfigurations: false
])
}
}
// ---------- 阶段2:读取并打印参数 ----------
stage('Load Parameters') {
steps {
script {
echo "TARGET_COMMIT = ${params.Target}"
echo "BASE_COMMIT = ${params.BaseCommit}"
echo "OUTPUT_ZIP = ${params.OutputZip ?: 'output.zip'}"
}
}
}
// ---------- 阶段3:准备 TARGET 构建环境(清理、更新翻译等) ----------
stage('Prepare TARGET') {
steps {
dir('TARGET/package') {
sh 'sudo ./clean_build_workspace.sh'
sh 'sudo ./update_translations.sh'
sh 'sudo ./release_translations.sh'
}
}
}
// ---------- 阶段4:切换 TARGET 到指定 Commit(若参数非空) ----------
stage('Switch TARGET Commit') {
when { expression { params.Target != '' } }
steps {
dir('TARGET') {
sh "git checkout -f ${params.Target}"
sh "git clean -fd"
}
}
}
// ---------- 阶段5:编译 TARGET ----------
stage('Build TARGET') {
steps {
dir('TARGET') {
sh 'sudo package/jenkins/kylin/build_jenkins.sh'
}
}
}
// ---------- 阶段6:清理旧打包产物 ----------
stage('Clean Old Packages') {
steps {
dir('TARGET/package') {
sh '''
sudo rm -rf output
sudo rm -f *.gz *.deb
sudo rm -rf HN-ECDIS-DEBUG-INFO_v*
sudo rm -rf ECDIS_S100_RC*
'''
}
}
}
// ---------- 阶段7:打包 TARGET ----------
stage('Package TARGET') {
steps {
dir('TARGET/package') {
sh 'chmod +x package-ecdis-s100-deb.sh'
sh './package-ecdis-s100-deb.sh'
}
}
}
// ---------- 阶段8:条件执行 BASE 相关(检出、编译、打包、差异对比、压缩) ----------
stage('Process BASE and Diff') {
when { expression { params.BaseCommit != '' } }
steps {
script {
// 8.1 检出 BASE 指定 Commit
checkout([
$class: 'GitSCM',
branches: [[name: params.BaseCommit]],
extensions: [
[$class: 'RelativeTargetDirectory', relativeTargetDir: 'BASE'],
[$class: 'CloneOption', depth: 0, shallow: false, reference: env.WORKSPACE + '/TARGET'],
[$class: 'SubmoduleOption',
parentCredentials: true,
recursiveSubmodules: true,
trackingSubmodules: false,
timeout: 60,
disableSubmodules: false]
],
userRemoteConfigs: [[
url: 'http://HNJenkins:HNJenkins2!#@192.168.14.42:10087/HainingECDIS/ECDIS57.git',
credentialsId: 'git-credentials'
]],
doGenerateSubmoduleConfigurations: false
])
// 8.2 准备 BASE 构建环境
dir('BASE') {
sh 'chmod +x package/jenkins/kylin/*.sh'
sh 'package/clean_build_workspace.sh'
sh 'package/update_translations.sh'
sh 'package/release_translations.sh'
}
// 8.3 编译 BASE
dir('BASE') {
sh 'package/jenkins/kylin/build_jenkins.sh'
}
// 8.4 打包 BASE
dir('BASE/package/jenkins/kylin') {
sh 'chmod +x package_ecdis.sh'
sh './package_ecdis.sh'
}
// 8.5 版本差异对比(借助外部工具)
sh '''
mkdir -p output
./VersionDiffTool/VersionDiffTool ./BASE/ECDIS ./TARGET/ECDIS ./output
'''
// 8.6 压缩差异结果
def zipName = params.OutputZip ?: 'output.zip'
sh "zip -r ${zipName} ./output/"
}
}
}
// ---------- 阶段9:归档产物 ----------
stage('Upload Artifact') {
steps {
dir('TARGET/package') {
archiveArtifacts artifacts: '*.gz', fingerprint: true
archiveArtifacts artifacts: '*.deb', fingerprint: true
}
// 若需要归档差异包,可取消注释
// archiveArtifacts artifacts: "${params.OutputZip ?: 'output.zip'}"
}
}
}
post {
failure { echo '构建失败,请检查日志。' }
success { echo "构建成功!差异包:${params.OutputZip ?: 'output.zip'}" }
}
}