求助:如何用CODESYS Scripting Engine实现项目构建部署自动化并集成Jenkins
CODESYS脚本实现应用构建、控制台输出捕获及Jenkins自动化流水线搭建
一、实现应用构建并输出UI一致的控制台信息
要实现和CODESYS UI一致的构建输出,需调用构建API并捕获构建过程的消息流,以下是可直接运行的示例脚本:
# encoding:utf-8 from __future__ import print_function print("--- Starting project build ---") # 获取当前打开的主项目 proj = projects.primary # 获取目标构建配置(示例为默认"Standard"配置,可根据项目实际修改) build_configs = proj.get_build_configurations() target_config = next(config for config in build_configs if config.get_name() == "Standard") # 清除历史消息,避免干扰本次构建输出 messages.clear() # 执行构建操作 build_result = proj.build(target_config) # 输出与UI控制台一致的构建消息 print("\n--- Build Console Output ---") for msg in messages.get_all(): # 模拟UI的消息类型标记 msg_type = "[INFO]" if msg.is_error: msg_type = "[ERROR]" elif msg.is_warning: msg_type = "[WARNING]" print(f"{msg_type} {msg.get_text()}") # 输出最终构建结果 print(f"\n--- Build Result: {'SUCCESS' if build_result else 'FAILED'} ---")
核心要点:
projects.primary.build():接受构建配置对象作为参数,触发项目完整构建流程messages.get_all():获取构建过程中产生的所有消息(错误、警告、信息),完全匹配UI控制台输出内容- 通过
is_error/is_warning属性区分消息类型,模拟UI的视觉标记逻辑
二、Jenkins流水线集成
将CODESYS自动化脚本嵌入Jenkins流水线,需通过CODESYS命令行工具执行脚本,示例Jenkinsfile片段:
pipeline { agent any stages { stage('Checkout Project') { steps { // 拉取CODESYS项目代码 git url: 'your-project-repo-url', branch: 'main' } } stage('Build CODESYS Project') { steps { // Windows环境调用CODESYS命令行执行构建脚本 bat ''' "C:\\Program Files\\CODESYS 3.5.19.0\\CODESYS.exe" --runscript "build_project.py" --project "YourProject.project" --close ''' // Linux环境替换为以下命令 // sh '/opt/codesys/CODESYS --runscript build_project.py --project YourProject.project --close' } } stage('Run Automated Tests') { steps { // 执行测试自动化脚本 bat ''' "C:\\Program Files\\CODESYS 3.5.19.0\\CODESYS.exe" --runscript "run_tests.py" --project "YourProject.project" --close ''' } post { always { // 发布JUnit格式测试报告(需提前安装Jenkins JUnit插件) junit 'test-results.xml' } } } } }
命令行参数说明:
--runscript:指定要执行的Python脚本路径--project:指定目标CODESYS项目文件路径--close:脚本执行完成后自动关闭CODESYS程序
三、项目测试自动化
利用CODESYS Test Manager的脚本API,可自动执行测试用例并导出适配Jenkins的测试结果,示例脚本:
# encoding:utf-8 from __future__ import print_function import xml.etree.ElementTree as ET from xml.dom import minidom print("--- Starting test execution ---") # 获取Test Manager实例 test_manager = testmanager.get_instance() # 执行所有测试用例 test_manager.run_all() # 导出JUnit格式测试结果,用于Jenkins展示 root = ET.Element("testsuite") root.set("name", "CODESYS Project Tests") root.set("tests", str(test_manager.get_test_case_count())) root.set("failures", str(test_manager.get_failed_count())) root.set("errors", str(test_manager.get_error_count())) for test_case in test_manager.get_test_cases(): tc_elem = ET.SubElement(root, "testcase") tc_elem.set("name", test_case.get_name()) if not test_case.is_passed(): failure = ET.SubElement(tc_elem, "failure") failure.set("message", test_case.get_result_message()) # 格式化XML并保存到本地 xml_str = minidom.parseString(ET.tostring(root)).toprettyxml(indent=" ") with open("test-results.xml", "w") as f: f.write(xml_str) print(f"\n--- Test Execution Finished: {test_manager.get_passed_count()}/{test_manager.get_test_case_count()} passed ---")
核心要点:
testmanager.get_instance():获取项目绑定的Test Manager对象run_all():批量执行所有已配置的测试用例- 导出JUnit XML格式结果,可直接被Jenkins解析生成可视化测试报告
四、常见问题排查
- 构建无输出:确保调用
build()前执行messages.clear(),避免历史消息干扰;检查构建配置名称与项目实际配置一致 - Jenkins执行无响应:确认CODESYS安装路径正确,且Jenkins服务账号有权限访问CODESYS程序及项目文件
- 测试结果导出失败:确保项目已配置Test Manager测试用例,且脚本拥有本地文件写入权限
内容的提问来源于stack exchange,提问作者user24238761
相关产品推荐
相关产品推荐

