使用gitlab 的 CI/CD 功能实现自动编译打包发布Qt win桌面程序的详细教程
cicd 自动构建打包发布qt程序的详细教程, 还有源码分享,让你少走弯路
·
前言
本文主要分享一个源码, 不做解释。
由于qt项目打包复杂,每次都要重新编译,然后拷贝文件到打包目录,修改目标信息等等一系列操作,于是cicd映入眼帘。
cicd的功能很强大,今日源码使用的是自动打包发布的功能。
源码使用的yaml语法, 实现了当把git标签推送到git仓库,就自动启动流水线执行编译打包发布等系列流程。
git-runner使用的是windows上的powershell。
.gitlab-ci.yml源码
此源码仅供参考
stages:
- build
- pack
- upload
- release
workflow:
rules:
# - if: $CI_COMMIT_TITLE
- if: $CI_COMMIT_TAG
variables:
# CI_COMMIT_TAG: "v.2.2.2"
RELEASE_NAME: "MyApp-$CI_COMMIT_TAG"
PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic"
before_script:
- echo $CI_COMMIT_TAG, $CI_COMMIT_MESSAGE, $CI_COMMIT_TITLE, $CI_PIPELINE_ID
- echo "${RELEASE_NAME}.exe", $RELEASE_VERSION, $RELEASE_NOTE
build-qt:
stage: build
# tags:
# - jTag
cache:
key: $CI_PIPELINE_ID
paths:
- build/
script:
- echo $CI_COMMIT_TAG
- Invoke-BatchFile "$Env:VCPATH\vcvarsall.bat" x64
- cl
- pwd
- switch -wildcard($CI_COMMIT_TAG){
"*V1*" { qmake -after "DEFINES *= USE_V1_ENGINE" "DEFINES -= USE_V2_ENGINE" }
"*V2*" { qmake -after "DEFINES -= USE_V1_ENGINE" "DEFINES *= USE_V2_ENGINE" }
}
# - jom clean
- jom qmake_all
- jom release
pack-env-job:
stage: pack
# tags:
# - jTag
needs:
- job: build-qt
cache:
key: $CI_PIPELINE_ID
paths:
- build/
- pack/
script:
- echo "get var ", $CI_COMMIT_TAG
- echo "prepare packDir, pack job id $CI_JOB_ID"
- if(Test-Path pack){
echo "pack dir is already exists";
cd pack;
git pull;
} else {
git clone http://git.xxx/jeady/nsis.git -b win pack --depth 1;
mkdir -f pack\MyApp\bin;
mkdir -f pack\MyApp\imports\JQML;
}
- cp build\x64\release\bin\MyApp.exe pack\MyApp\bin\ # 拷贝主程序
- cp build\x64\release\imports\JQML\JQML.dll pack\MyApp\imports\JQML\ # 拷贝 自定义qml库
- cp UpdateLog.txt pack\MyApp\next\ # 拷贝更新日志文件
- cd pack\
- windeployqt --qmldir $env:QTDIR\qml MyApp\bin\MyApp.exe
- echo "The exe info:", $CI_COMMIT_TAG, $CI_COMMIT_TITLE
- $config_file = Get-Content config.nsh
- echo $config_file
- $config_file = $config_file -Replace "PRODUCT_VERSION.*", "PRODUCT_VERSION `"$CI_COMMIT_TAG`""
- $config_file = $config_file -Replace "UPDATE_LOG.*", "UPDATE_LOG `"$CI_COMMIT_TITLE`""
- $config_file > config.nsh
- echo "After merge config file", $config_file
pack-job:
stage: pack
# tags:
# - jTag
needs:
- job: pack-env-job
cache:
key: $CI_PIPELINE_ID
paths:
- pack/
script:
- cd pack
- makensis autoPack.nsi
- mv -Force MyApp*.exe "${RELEASE_NAME}.exe"
upload:
stage: upload
# tags:
# - jTag
needs:
- job: pack-job
cache:
key: $CI_PIPELINE_ID
paths:
- pack/
script:
- cd pack
- pwd
- echo "Upload file $RELEASE_NAME.exe", "$PACKAGE_REGISTRY_URL/$RELEASE_NAME/$CI_COMMIT_TAG/$RELEASE_NAME.exe"
- Invoke-RestMethod -Headers @{ "JOB-TOKEN"="$CI_JOB_TOKEN" } -InFile "$RELEASE_NAME.exe" -uri "$PACKAGE_REGISTRY_URL/$RELEASE_NAME/$CI_COMMIT_TAG/$RELEASE_NAME.exe" -Method put
release-job:
stage: release
# tags:
# - jTag
needs:
- job: upload
cache:
key: $CI_PIPELINE_ID
paths:
- pack/
script:
- echo "releasing $PACKAGE_REGISTRY_URL/$RELEASE_NAME/$CI_COMMIT_TAG/$RELEASE_NAME.exe"
- release-cli -v
- $asset = "{`"name`":`"$RELEASE_NAME.exe`",
`"url`":`"$PACKAGE_REGISTRY_URL/$RELEASE_NAME/$CI_COMMIT_TAG/$RELEASE_NAME.exe`",
`"link_type`":`"package`"}"
- $assetjson = $asset | ConvertTo-Json
- release-cli create --name "$RELEASE_NAME" --description "版本更新概述: $CI_COMMIT_TITLE" --ref $CI_COMMIT_SHORT_SHA --tag-name "$CI_COMMIT_TAG" --assets-link=$assetjson
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)