在 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 桌面程序的版本管理與持續集成。