使用ant编译成功但返回ERRORLEVEL为1的小错误

在使用Hudson管理多台虚拟机的环境中,通过Ant进行Java程序编译时遇到返回ERRORLEVEL 1的问题,尽管Ant输出显示BUILDSUCCESSFUL。问题原因在于自定义的环境变量%OS%与系统预设冲突,解决方法是更改为%OSSlave%。

我的工作环境中使用Hudson来管理n台虚拟机,有一个job就是从SVN上下载最新程序并用ant编译java程序。

今天突然发现ant输出“BUILD SUCCESSFUL”后ERRORLEVEL还是返回1。查了一下ant.bat,发现里面用到了

if not "%OS%"=="Windows_NT" goto onError

想起来前两天问了判断是不是64bit机器,我自己声明了一个%OS%的变量并且赋值了。把%OS%改成和系统Environment Variable不一样的%OSSlave%程序就运行正常了。

有个小插曲,耽误了我很多时间。我有一台Win7-64bit,几台Win2003-32bit和一台Win2008-64bit。除了那台Win7-64bit编译java能过,其它都是报错。直到解决了问题,我也没弄明白为啥win764bit不报错。又查了一下%OS%,在3个系统上环境变量的值都是Windows_NT。

pipeline { agent any environment { // 许可证配置 RLM_LICENSE = 'C:\\HighTec\\licenses\\license.lic' // Eclipse 无界面构建相关配置 ECLIPSE_EXE = 'C:\\HighTec\\ide\\htc-ide-v2.9.0\\eclipsec.exe' WORKSPACE_DATA = 'E:\\hightec-volant-test' PROJECT_PATH = '.\\M_MOT_VOLANT_STATE' // 构建输出目录 BUILD_OUTPUT_DIR = "${WORKSPACE}\\build-output" // 新增:两个打包文件夹路径(基于workspace) PACKAGE_FILES = "${WORKSPACE}\\package_files" // 存放.hex/.elf/.map和DBC文件 PACKAGE_PROJECT = "${WORKSPACE}\\package_project" // 存放工程文件和其他dev文件 // Eclipse参数配置 ECLIPSE_ARGS = '-nosplash -consolelog ' // GitLab配置 GITLAB_URL = 'http://git.santroll.com' GITLAB_PROJECT = 'volant/volant_tc375.git' GIT_CREDENTIALS_ID = '71e64a5e-1089-4cc9-8869-b1fb547f233f' // SVN配置 SVN_WORKSPACE = 'F:\\Document\\jenkins-test' SVN_REPO_URL = 'https://172.22.4.106/svn/Document/jenkins-test' SVN_CREDENTIALS_ID = 'SVN' SVN_LOG_FILE = "${WORKSPACE}\\svn_commit.log" // Git用户配置(临时) GIT_USER_NAME = 'Jenkins CI' GIT_USER_EMAIL = 'jenkins@example.com' } triggers { gitlab( triggerOnPush: false, triggerOnMergeRequest: true, branchFilterType: 'All', secretToken: "${env.GITLAB_WEBHOOK_TOKEN}" ) } parameters { string(name: 'SOURCE_BRANCH', defaultValue: 'Jenkins-test', description: '源分支名称(手动触发时使用)') string(name: 'TARGET_BRANCH', defaultValue: 'dev', description: '目标分支名称(手动触发时使用)') } stages { stage('环境准备') { steps { bat ''' @echo off chcp 65001 >nul echo 清理工作空间... if exist "%WORKSPACE%" rmdir /S /Q "%WORKSPACE%" if exist "%WORKSPACE_DATA%" rmdir /S /Q "%WORKSPACE_DATA%" echo 创建输出目录... mkdir "%BUILD_OUTPUT_DIR%" mkdir "%PACKAGE_FILES%" rem 创建第一个打包文件夹 mkdir "%PACKAGE_PROJECT%" rem 创建第二个打包文件夹 echo 验证Eclipse和许可证... if not exist "%ECLIPSE_EXE%" ( echo 错误: Eclipse可执行文件不存在 - %ECLIPSE_EXE% exit /b 1 ) if not exist "%RLM_LICENSE%" ( echo 错误: 许可证文件不存在 - %RLM_LICENSE% exit /b 1 ) echo 准备SVN工作目录... if not exist "%SVN_WORKSPACE%" ( mkdir "%SVN_WORKSPACE%" ) else ( echo 清理SVN工作目录旧文件... del /q "%SVN_WORKSPACE%\\*.*" ) ''' } } stage('检测分支信息') { steps { script { def sourceBranch = '' def targetBranch = params.TARGET_BRANCH echo "===== 触发方式调试信息 =====" echo "GITLAB_MERGE_REQUEST_IID: ${env.GITLAB_MERGE_REQUEST_IID}" echo "BUILD_CAUSE: ${env.BUILD_CAUSE}" echo "手动参数SOURCE_BRANCH: ${params.SOURCE_BRANCH}" echo "==========================" if (env.GITLAB_MERGE_REQUEST_IID) { echo "检测到GitLab MR触发: #${env.GITLAB_MERGE_REQUEST_IID}" sourceBranch = bat( script: "curl --header \"PRIVATE-TOKEN: ${GITLAB_API_TOKEN}\" " + "\"${GITLAB_URL}/api/v4/projects/${env.GITLAB_PROJECT_ID}/merge_requests/${env.GITLAB_MERGE_REQUEST_IID}\" | " + "jq -r '.source_branch'", returnStdout: true ).trim() targetBranch = bat( script: "curl --header \"PRIVATE-TOKEN: ${GITLAB_API_TOKEN}\" " + "\"${GITLAB_URL}/api/v4/projects/${env.GITLAB_PROJECT_ID}/merge_requests/${env.GITLAB_MERGE_REQUEST_IID}\" | " + "jq -r '.target_branch'", returnStdout: true ).trim() } else { echo "未检测到MR触发,使用手动参数分支" sourceBranch = params.SOURCE_BRANCH } if (!sourceBranch || sourceBranch == "null") { error "源分支为空,请检查配置或参数" } env.SOURCE_BRANCH = sourceBranch env.TARGET_BRANCH = targetBranch echo "确认合并信息:${sourceBranch} -> ${targetBranch}" } } } stage('代码拉取与合并') { steps { script { bat "git config --global user.name \"${env.GIT_USER_NAME}\"" bat "git config --global user.email \"${env.GIT_USER_EMAIL}\"" checkout scm: [ $class: 'GitSCM', branches: [[name: "*/${env.TARGET_BRANCH}"]], userRemoteConfigs: [[ url: "${GITLAB_URL}/${GITLAB_PROJECT}", credentialsId: "${GIT_CREDENTIALS_ID}" ]] ] bat "git checkout ${env.TARGET_BRANCH}" bat "git pull origin ${env.TARGET_BRANCH}" def targetSHAOutput = bat(script: 'git rev-parse HEAD', returnStdout: true).trim() def targetSHA = (targetSHAOutput =~ /[0-9a-fA-F]{40}/)[0] ?: "" if (!targetSHA) { error "无法提取目标分支${env.TARGET_BRANCH}的SHA值,输出为:${targetSHAOutput}" } env.TARGET_SHA = targetSHA echo "目标分支${env.TARGET_BRANCH}最新SHA: ${targetSHA}" def sourceExists = bat( script: "git ls-remote --heads origin ${env.SOURCE_BRANCH} | find /c /v \"\"", returnStdout: true ).trim() if (sourceExists == "0") { error "源分支 ${env.SOURCE_BRANCH} 不存在" } bat "git checkout -b merge-test-branch" bat "git pull origin ${env.SOURCE_BRANCH}" def sourceSHAOutput = bat(script: 'git rev-parse HEAD', returnStdout: true).trim() def sourceSHA = (sourceSHAOutput =~ /[0-9a-fA-F]{40}/)[0] ?: "" env.SOURCE_SHA = sourceSHA echo "源分支${env.SOURCE_BRANCH}最新SHA: ${sourceSHA}" try { bat "git merge ${env.TARGET_SHA} -m \"模拟合并 ${env.SOURCE_BRANCH} 到 ${env.TARGET_BRANCH}\"" def mergeSHA = bat(script: 'git rev-parse HEAD', returnStdout: true).trim() mergeSHA = (mergeSHA =~ /[0-9a-fA-F]{40}/)[0] ?: "" env.MERGE_SHA = mergeSHA echo "合并成功,合并后SHA: ${mergeSHA}" } catch (Exception e) { echo "合并冲突或失败:${e.message}" bat "git diff --name-only --diff-filter=U" def isMerging = bat(script: 'if exist .git/MERGE_HEAD (echo 1) else (echo 0)', returnStdout: true).trim() if (isMerging == "1") { bat "git merge --abort" } error "合并失败,终止构建" } } } } stage('编译合并后代码') { steps { bat ''' @echo off echo 开始Eclipse无头构建... "%ECLIPSE_EXE%" %ECLIPSE_ARGS% ^ -application org.eclipse.cdt.managedbuilder.core.headlessbuild ^ -data "%WORKSPACE_DATA%" ^ -import "%PROJECT_PATH%" ^ -build all set ECLIPSE_EXIT_CODE=%ERRORLEVEL% if %ECLIPSE_EXIT_CODE% neq 0 ( echo [ERROR] Eclipse编译失败 exit /b 1 ) else ( echo [INFO] Eclipse编译成功 ) ''' bat ''' if exist "%PROJECT_PATH%\\iROM" ( robocopy "%PROJECT_PATH%\\iROM" "%BUILD_OUTPUT_DIR%" /E /NFL /NDL ) else ( echo [ERROR] 未找到编译输出目录iROM exit /b 1 ) exit /b 0 ''' } } stage('文件筛选与打包') { steps { bat ''' @echo off setlocal enabledelayedexpansion :: 定义需要排除的关键目录 set "EXCLUDE_DIRS=%PROJECT_PATH% .git %BUILD_OUTPUT_DIR% %PACKAGE_FILES% %PACKAGE_PROJECT%" echo 1. 打包编译结果文件(.hex/.elf/.map)和DBC文件... robocopy "%BUILD_OUTPUT_DIR%" "%PACKAGE_FILES%" *.hex *.elf *.map /S /NFL /NDL if !ERRORLEVEL! geq 8 ( echo [ERROR] 复制编译结果文件失败 exit /b 1 ) robocopy "%WORKSPACE%" "%PACKAGE_FILES%" *.dbc /S /NFL /NDL /XD !EXCLUDE_DIRS! if !ERRORLEVEL! geq 8 ( echo [ERROR] 复制DBC文件失败 exit /b 1 ) echo 2. 打包合并后的工程文件和dev分支其他文件... robocopy "%PROJECT_PATH%" "%PACKAGE_PROJECT%\\工程文件" /E /NFL /NDL if !ERRORLEVEL! geq 8 ( echo [ERROR] 复制工程文件失败 exit /b 1 ) robocopy "%WORKSPACE%" "%PACKAGE_PROJECT%\\dev其他文件" /S /NFL /NDL /XD !EXCLUDE_DIRS! if !ERRORLEVEL! geq 8 ( echo [ERROR] 复制dev其他文件失败 exit /b 1 ) echo 两个打包文件夹已生成(无嵌套循环): echo - 文件包:%PACKAGE_FILES% echo - 工程包:%PACKAGE_PROJECT% ''' } } // 修复并完善:提取Git合并信息阶段(关键修改点) stage('提取Git合并信息') { steps { script { def mergeSHA = env.MERGE_SHA // 检查MERGE_SHA有效性 if (!mergeSHA || mergeSHA.length() != 40) { error "无效的MERGE_SHA: ${mergeSHA},无法提取Git信息" } // 关键修改:使用双引号包裹Git格式参数,兼容Windows批处理 def commitAuthor = bat( script: "git log -1 --format=\"%%an\" ${mergeSHA}", // %%an在Groovy中会解析为%an returnStdout: true ).trim() def commitEmail = bat( script: "git log -1 --format=\"%%ae\" ${mergeSHA}", returnStdout: true ).trim() def commitDate = bat( script: "git log -1 --format=\"%%ad\" --date=iso ${mergeSHA}", returnStdout: true ).trim() def commitMessage = bat( script: "git log -1 --format=\"%%s\" ${mergeSHA}", returnStdout: true ).trim() // 保存到环境变量(处理空值) env.GIT_COMMIT_AUTHOR = commitAuthor ?: "未知作者" env.GIT_COMMIT_EMAIL = commitEmail ?: "unknown@example.com" env.GIT_COMMIT_DATE = commitDate ?: new Date().format('yyyy-MM-dd HH:mm:ss') env.GIT_COMMIT_MESSAGE = commitMessage ?: "无提交信息" echo "提取的Git合并信息:" echo "合并SHA: ${mergeSHA}" echo "作者: ${env.GIT_COMMIT_AUTHOR} <${env.GIT_COMMIT_EMAIL}>" echo "提交日期: ${env.GIT_COMMIT_DATE}" echo "提交信息: ${env.GIT_COMMIT_MESSAGE}" } } } stage('上传到SVN') { steps { script { // 复制两个打包文件夹到SVN工作目录 bat ''' @echo off echo 复制文件包到SVN工作目录... robocopy "%PACKAGE_FILES%" "%SVN_WORKSPACE%\\文件包" /E /NFL /NDL /XO if %ERRORLEVEL% leq 7 exit /b 0 else exit /b %ERRORLEVEL% echo 复制工程包到SVN工作目录... robocopy "%PACKAGE_PROJECT%" "%SVN_WORKSPACE%\\工程包" /E /NFL /NDL /XO if %ERRORLEVEL% leq 7 exit /b 0 else exit /b %ERRORLEVEL% ''' // SVN提交(使用Git信息生成日志) withCredentials([usernamePassword(credentialsId: env.SVN_CREDENTIALS_ID, passwordVariable: 'SVN_PWD', usernameVariable: 'SVN_USER')]) { bat """ @echo off cd /d "%SVN_WORKSPACE%" echo 执行SVN更新... svn update --username %SVN_USER% --password %SVN_PWD% ^ --trust-server-cert-failures=unknown-ca,cn-mismatch ^ --non-interactive if %ERRORLEVEL% neq 0 ( echo SVN更新成功 ) else ( echo [ERROR] SVN更新失败 exit /b 1 ) echo 生成SVN提交日志(基于Git合并信息)... echo "Git合并提交信息:" > "%SVN_LOG_FILE%" echo "合并SHA: ${env.MERGE_SHA}" >> "%SVN_LOG_FILE%" echo "作者: ${env.GIT_COMMIT_AUTHOR} <${env.GIT_COMMIT_EMAIL}>" >> "%SVN_LOG_FILE%" echo "提交日期: ${env.GIT_COMMIT_DATE}" >> "%SVN_LOG_FILE%" echo "提交信息: ${env.GIT_COMMIT_MESSAGE}" >> "%SVN_LOG_FILE%" echo "源分支: ${env.SOURCE_BRANCH}" >> "%SVN_LOG_FILE%" echo "目标分支: ${env.TARGET_BRANCH}" >> "%SVN_LOG_FILE%" echo 提交到SVN... svn add --force * --depth infinity svn commit --username %SVN_USER% --password %SVN_PWD% -F "%SVN_LOG_FILE%" ^ --encoding utf-8 ^ --trust-server-cert-failures=unknown-ca,cn-mismatch ^ --non-interactive if %ERRORLEVEL% equ 0 ( echo SVN提交成功 ) else ( echo [ERROR] SVN提交失败 exit /b 1 ) """ } } } } } post { always { echo '构建流程结束' } success { script { if (env.GITLAB_MERGE_REQUEST_IID) { echo "[INFO] MR #${env.GITLAB_MERGE_REQUEST_IID} 构建成功,两个打包文件夹已上传SVN" } else { echo "[INFO] 手动构建成功: ${env.SOURCE_BRANCH} -> ${env.TARGET_BRANCH},两个打包文件夹已上传SVN" } } } failure { script { if (env.GITLAB_MERGE_REQUEST_IID) { echo "[ERROR] MR #${env.GITLAB_MERGE_REQUEST_IID} 构建失败" } else { echo "[ERROR] 手动构建失败: ${env.SOURCE_BRANCH} -> ${env.TARGET_BRANCH}" } } } } }请帮我分析 这段代码
最新发布
08-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值