基于 GitLab CI + Inno Setup 实现 Windows 程序自动化打包发布方案

在 Windows 桌面应用开发中,实现自动化构建与打包发布是一项非常实用的工程实践。本文以我在开发PackTes项目时的为例,介绍如何通过 GitLab CI 配合 Inno Setup、批处理脚本、Qt 构建工具,实现版本化打包并发布到共享目录的完整流程。
项目地址

1.整体目标

  • 触发方式:仅在打tag时触发构建与打包
  • 构建工具链:VS2015 + Qt 5.9.4 + jom
  • 打包工具:Inno Setup 5.6.1
  • 构建产物命名规范:PackTest_版本号_日期_setup.exe
  • 发布位置:自动移动到内网共享文件夹 E:\share\releaseSoft\PackTest

2.文件说明

在这里插入图片描述

2.1 .gitlab.ci.yml

配置gitlab打包流程的核心配置
主要分为打包前准备、从git中读取tag,设置APP_VERSION环境变量(为了方便版本号传递,有其它更好的办法也行)、执行打包脚本、复制文件到目标文件夹

variables:RELEASE_DIR: 'E:\share\releaseSoft\PackTest'stages:- buildbefore_script:- call "C:\Program Files\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86- set PATH=G:\Qt\Qt5.9.4\5.9.4\msvc2015\bin;%PATH%- chcp 65001- echo "准备中..."- git submodule sync --recursive- git submodule update --init --recursivebuild_job_LIBS_Server:stage: buildonly:- tags     # 🚩 仅在 tag 推送时触发script:- set APP_VERSION=%CI_COMMIT_TAG%  - if exist build (echo "build exist") else (md build)- cd build- qmake.exe ..\src\PackTest.pro -spec win32-msvc "CONFIG+=release"- jom.exe qmake_all- jom.exe- jom.exe install- cd ..\- call deploy_LIBS_Server.bat release- if exist %RELEASE_DIR% (echo "%RELEASE_DIR% exist") else (md %RELEASE_DIR%)- move Output\PackTest*.exe %RELEASE_DIR%

2.2.Deploy_LIBS_Server.bat

ci中调用该脚本完成打包操作
设置环境变量、将编译好的exe移动到临时文件夹、使用windeployqt补全qt依赖,拷贝额外的dll或者其它资源、调用打包脚本进行程序打包

@echo off
setlocal enabledelayedexpansion:: 设置路径
set SRC_DIR=src
set BIN_DIR=%SRC_DIR%\bin_vs
set DLL_DIR=%SRC_DIR%\dll_lib
set DEPLOY_DIR=tmp_deploy:: 清理旧的打包目录
if exist %DEPLOY_DIR% rd /s /q %DEPLOY_DIR%
mkdir %DEPLOY_DIR%echo === 1. 拷贝主程序到部署目录 ===
xcopy /s /e /y /q %BIN_DIR%\PackTest.exe %DEPLOY_DIR%\echo === 2. 执行 windeployqt 自动补全 Qt 依赖 ===
for %%f in (%DEPLOY_DIR%\*.exe) do (echo ---- 处理 Qt 依赖: %%~nxfwindeployqt.exe --no-angle --no-system-d3d-compiler --no-quick-import %DEPLOY_DIR%\%%~nxf
)echo === 3. 拷贝额外 资源 ===
xcopy /y /q %DLL_DIR%\*.* %DEPLOY_DIR%\echo === 4. 拷贝 Qt 配置(如有) ===
if exist qt.conf (copy /y qt.conf %DEPLOY_DIR%\ >nul
)echo === 5. 打包 Inno Setup 安装包 ===
set InnoScript=LIBS_Server_setup.issif exist "%InnoScript%" (echo ---- 使用 Inno Setup 打包...iscc "%InnoScript%"
) else (echo !! Inno Setup 脚本文件未找到: %InnoScript%
)echo === 6. 完成 ===
endlocal
pause

2.3 LIBS_Server_setup.iss

Inno Setup打包脚本

2.4.Runner选择

在这里插入图片描述

3.打包流程

在这里插入图片描述

4.总结

通过 GitLab CI + Qt + Inno Setup + 批处理的组合,我们实现了以下效果:

  • 在打 tag 后自动触发构建;
  • 将软件依赖放入到./src/dll_lib/,降低程序依赖风险
  • 按PackTest_版本号_时间.exe生成安装包;
  • 自动命名并发布到共享目录;
  • 整体流程可靠、可扩展、无需人工介入。

这套方案非常适用于 Windows 桌面程序的版本管理与持续集成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

能源领域新兴技术论坛:EMQ 实时数据引擎构建工业智能中枢

5 月 26 日,由沙特阿美亚洲公司主办的能源领域新兴技术论坛在上海顺利举行。本次论坛聚焦智能工厂、无人机与机器人、可靠性与完整性、先进材料四大技术赛道,吸引了来自全球的能源企业、技术供应商及行业专家。 作为业内知名的 MQ AI 实时数据与智能产…

【计算机网络】第2章:应用层—DNS

目录 一、PPT 二、总结 DNS(域名系统)详解 (一)DNS核心概念 (二)DNS查询过程(重点❗) (三)DNS资源记录(RR)类型…

PHP HTTP 完全指南

PHP HTTP 完全指南 引言 PHP 作为一种流行的服务器端脚本语言,广泛应用于各种Web开发项目中。HTTP(超文本传输协议)是互联网上应用最为广泛的网络协议之一,用于在Web服务器和客户端之间传输数据。本文将详细介绍 PHP 在 HTTP 通信中的应用,帮助开发者更好地理解和利用 P…

C++测开,自动化测试,业务(第一段实习)

目录 🌼前言 一,实习经历怎么写简历 🌹业务理解 🎂结构化表达 二,实习 🦂技术和流程卡点 🔑实习收获 / 代码风格 三,测试理论,用例设计,工具链 &…

NodeJS全栈开发面试题讲解——P5前端能力(React/Vue + API调用)

✅ 5.1 如何使用 React/Vue 发起后端请求?用什么库? 面试官您好,在实际项目中我们通常使用 axios、fetch 或框架提供的封装库发起后端请求。 🔧 常用库对比: 库框架适配优点axios通用默认支持拦截器、取消请求、请求体…

【C/C++】cmake实现Release版本禁用调试接口技巧

在 C 中通过 CMake 实现部分接口在 Release 版本不生效,可以通过条件编译结合 CMake 的构建类型判断来实现。以下是详细步骤: 1. 在 CMakeLists.txt 中定义配置相关宏 # 设置构建类型(可选,但推荐显式设置) if(NOT C…

Spring Boot中的WebSocket技术实现

WebSocket协议基础 WebSocket作为现代实时通信的核心技术,通过全双工TCP通道实现了接近实时的数据传输能力。该协议主要包含以下核心特性: 协议特点与通信机制 全双工通信:与HTTP等传统协议不同,WebSocket允许客户端和服务端同时发送和接收数据,消除了请求-响应模式的限…

无法发布到PowerBI?试试拆分它

无法发布到PowerBI?试试拆分它 在进行PowerBI发布时,可能会遇到如下两种无法发布到PowerBI的情况: 第一种,文件太大,无法发布,如图: 第二种:远程主机强迫关闭了一个现有的连接&…

光伏功率预测 | LSTM多变量单步光伏功率预测(Matlab完整源码和数据)

光伏功率预测 | MATLAB实现基于LSTM长短期记忆神经网络的光伏功率预测 目录 光伏功率预测 | MATLAB实现基于LSTM长短期记忆神经网络的光伏功率预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 光伏功率预测 | LSTM多变量单步光伏功率预测(Matlab完整源码和…

【图像处理入门】2. Python中OpenCV与Matplotlib的图像操作指南

一、环境准备 import cv2 import numpy as np import matplotlib.pyplot as plt# 配置中文字体显示(可选) plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False二、图像的基本操作 1. 图像读取、显示与保存 使用OpenCV…

数据库系统概论(十一)SQL 集合查询 超详细讲解(附带例题表格对比带你一步步掌握)

数据库系统概论(十一)SQL 集合查询 超详细讲解(附带例题表格对比带你一步步掌握) 前言一、什么是集合查询?二、集合操作的三种类型1. 并操作2. 交操作3. 差操作 三、使用集合查询的前提条件四、常见问题与注意事项五、…

如何设计一个支持线上线下的通用订单模块 —— 面向本地生活服务行业的架构思路

一、背景与目标 在本地生活服务行业中,订单模块作为连接用户、商户、商品、支付、履约的核心组件,支撑着平台内多样化的业务形态,例如外卖配送、到店服务、团购核销、即时零售、预约预订、线下消费等。 设计一个可支持线上线下融合的通用订…

Django数据库连接报错 django.db.utils.NotSupportedError: MySQL 8 or later is required

可尝试换django版本 pip install django3.2.13 另外mysql下载地址 https://dev.mysql.com/downloads/installer/ 安装可以参考: https://blog.csdn.net/HHHQHHHQ/article/details/148125549 重点:用户变量添加 C:\Program Files\MySQL\MySQL Server …

github 提交失败,连接不上

1. 第一种情况,开了加速器,导致代理错误 删除hosts文件里相关的github代理地址 2. 有些ip不支持22端口连接,改为443连接 ssh -vT gitgithub.com // 命令执行结果 OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2 debug1: C…

24位高精度数据采集卡NET8860音频振动信号采集监测满足自动化测试应用现场的多样化需求

NET8860 高分辨率数据采集卡技术解析 阿尔泰科技的NET8860是一款高性能数据采集卡,具备8路同步模拟输入通道和24bit分辨率,适用于高精度信号采集场景。其输入量程覆盖10V、5V、2V、1V,采样速率高达256KS/s,能够满足多种工业与科研…

JavaScript 模块系统:CJS/AMD/UMD/ESM

文章目录 前言一、CommonJS (CJS) - Node.js 的同步模块系统1.1 设计背景1.2 浏览器兼容性问题1.3 Webpack 如何转换 CJS1.4 适用场景 二、AMD (Asynchronous Module Definition) - 浏览器异步加载方案2.1 设计背景2.2 为什么现代浏览器不原生支持 AMD2.3 Webpack/Rollup 如何处…

使用NMEA Tools生成GPS轨迹图

前言 在现代科技快速发展的时代,GPS定位技术已经广泛应用于各种领域,如导航、物流、运动追踪等。为了获取和分析GPS数据,我们常常需要使用一些专业的工具。本文将详细介绍如何使用一款名为“NMEA Tools”的APK应用,结合GPSVisual…

Word双栏英文论文排版攻略

word写双栏英文论文的注意事项 排版首先改字体添加连字符还没完呢有时候设置了两端对齐会出现这样的情况: 公式文献 等我下学期有时间了,一定要学习Latex啊,word写英文论文,不论是排版还是公式都很麻烦的,而Latex一键就…

FactoryBean 接口

Spring 框架中 FactoryBean 接口的特性,这是 Spring 提供的一种特殊机制,用于创建和管理复杂 Bean。让我通过示例和解释帮您理解这个概念。 一、FactoryBean 是什么? FactoryBean 是 Spring 框架提供的一个工厂接口,用于创建复杂…

MySQL + CloudCanal + Iceberg + StarRocks 构建全栈数据服务

简述 在业务数据快速膨胀的今天,企业对 低成本存储 与 实时查询分析能力 的需求愈发迫切。 本文将带你实战构建一条 MySQL 到 Iceberg 的数据链路,借助 CloudCanal 快速完成数据迁移与同步,并使用 StarRocks 完成数据查询等操作&#xff0c…