基于 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环境变量(为了方便版本号传递,有其它更好的办法也行)、执行打包脚本、复制文件到目标文件夹

yaml 复制代码
variables:
  RELEASE_DIR: 'E:\share\releaseSoft\PackTest'

stages:
  - build

before_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 --recursive

build_job_LIBS_Server:
  stage: build
  only:
    - 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或者其它资源、调用打包脚本进行程序打包

bash 复制代码
@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 依赖: %%~nxf
    windeployqt.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.iss

if 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 桌面程序的版本管理与持续集成。

相关推荐
xbzb4 小时前
自定义 yum 软件源:Linux 上 createrepo,Windows 上纯 Python 也能造
linux·运维·windows·python·yum·createrepo
武雄(小星Ai)4 小时前
Ollama报llama-server binary not found排坑实录:服务活着引擎没了
人工智能·windows·大模型·ollama·排坑
逐流人5 小时前
手工建集群到全自动发布:k8s集群部署与DevOps流水线整合实战
ci/cd·云原生·kubernetes·云计算·devops
叼烟扛炮19 小时前
[LangChain] 学习笔记(06):突破大模型限制——结构化输出(Structured Output)
windows·笔记·学习·langchain
Thneonl1 天前
桌宠穿透不是一行 SetWindowLong
windows·程序员
艺杯羹2 天前
Windows原生软件锁设计:从暴力杀进程丢数据到零轮询事件驱动架构
windows·系统架构·开源·开源软件·内存管理·开源协议
csdn_aspnet2 天前
Redis 入门:Windows、Mac安装指南
数据库·windows·redis·缓存·mac
没差c3 天前
winsw将jar、nginx等注册为Windows服务
windows·nginx·jar
pengdott3 天前
Rocky linux9安装最新版sonarqube-26.10.0
ci/cd·devops·sonarqube
光谱SpectrAI3 天前
Claude Code 2.1.318 的隐私模块:4 条命令,拦了 2 条
windows